Authorization fix
This commit is contained in:
parent
c3197cd000
commit
a39c2887cc
|
@ -10,6 +10,7 @@ PERMISSIONS = {
|
||||||
admin: {can_be_edited: true, can_change_info: true, can_post_messages: true, can_edit_messages: true, can_delete_messages: true, can_invite_users: true, can_restrict_members: true, can_pin_messages: true, can_promote_members: false},
|
admin: {can_be_edited: true, can_change_info: true, can_post_messages: true, can_edit_messages: true, can_delete_messages: true, can_invite_users: true, can_restrict_members: true, can_pin_messages: true, can_promote_members: false},
|
||||||
member: TD::Types::ChatPermissions.new(can_send_messages: true, can_send_media_messages: true, can_send_polls: true, can_send_other_messages: true, can_add_web_page_previews: true, can_change_info: true, can_invite_users: true, can_pin_messages: true),
|
member: TD::Types::ChatPermissions.new(can_send_messages: true, can_send_media_messages: true, can_send_polls: true, can_send_other_messages: true, can_add_web_page_previews: true, can_change_info: true, can_invite_users: true, can_pin_messages: true),
|
||||||
readonly: TD::Types::ChatPermissions.new(can_send_messages: false, can_send_media_messages: false, can_send_polls: false, can_send_other_messages: false, can_add_web_page_previews: false, can_change_info: false, can_invite_users: false, can_pin_messages: false),
|
readonly: TD::Types::ChatPermissions.new(can_send_messages: false, can_send_media_messages: false, can_send_polls: false, can_send_other_messages: false, can_add_web_page_previews: false, can_change_info: false, can_invite_users: false, can_pin_messages: false),
|
||||||
|
login: TD::Types::PhoneNumberAuthenticationSettings.new(allow_flash_call: false, is_current_phone_number: false, allow_sms_retriever_api: false),
|
||||||
}
|
}
|
||||||
|
|
||||||
HELP_GATE_CMD = %q{Available commands:
|
HELP_GATE_CMD = %q{Available commands:
|
||||||
|
@ -56,12 +57,13 @@ HELP_CHAT_CMD= %q{Available commands:
|
||||||
}
|
}
|
||||||
|
|
||||||
class TelegramClient
|
class TelegramClient
|
||||||
|
attr_reader :session
|
||||||
|
|
||||||
## configure tdlib (when valid tdlib params specified) or zhabogram
|
## configure tdlib (when valid tdlib params specified) or zhabogram
|
||||||
def self.configure(**config)
|
def self.configure(**config)
|
||||||
@@config = DEFAULTS.merge(config)
|
@@config = config
|
||||||
TD.config.update(config[:tdlib])
|
TD.config.update(config[:tdlib])
|
||||||
TD::Api.set_log_verbosity_level(@@config[:tdlib_verbosity])
|
TD::Api.set_log_verbosity_level(config[:tdlib_verbosity])
|
||||||
end
|
end
|
||||||
|
|
||||||
## initialize telegram client instance (xmpp = XMPP stream, jid = user's jid , login = user's telegram login (for now, it is phone number)
|
## initialize telegram client instance (xmpp = XMPP stream, jid = user's jid , login = user's telegram login (for now, it is phone number)
|
||||||
|
@ -89,18 +91,19 @@ class TelegramClient
|
||||||
@telegram.on(TD::Types::Update::MessageContent) do |u| @logger.debug(u); self.update_messagecontent(u) end
|
@telegram.on(TD::Types::Update::MessageContent) do |u| @logger.debug(u); self.update_messagecontent(u) end
|
||||||
@telegram.on(TD::Types::Update::DeleteMessages) do |u| @logger.debug(u); self.update_deletemessages(u) end
|
@telegram.on(TD::Types::Update::DeleteMessages) do |u| @logger.debug(u); self.update_deletemessages(u) end
|
||||||
@telegram.on(TD::Types::Update::File) do |u| @logger.debug(u); self.update_file(u) end
|
@telegram.on(TD::Types::Update::File) do |u| @logger.debug(u); self.update_file(u) end
|
||||||
@telegram.connect().wait()
|
@telegram.connect()
|
||||||
@resources << resource
|
@resources << resource
|
||||||
end
|
end
|
||||||
|
|
||||||
## disconnect telegram client
|
## disconnect telegram client
|
||||||
def disconnect(resource=nil, quit=false)
|
def disconnect(resource=nil, quit=false)
|
||||||
@resources.delete(resource)
|
@resources.delete(resource)
|
||||||
return unless (@resources.empty? && @session[:keeponline] != 'true') || quit
|
return if ((@resources.count > 0 || @session[:keeponline] == 'true') && !quit)
|
||||||
|
return if not self.online?
|
||||||
@logger.warn 'Disconnecting from Telegram network..'
|
@logger.warn 'Disconnecting from Telegram network..'
|
||||||
@telegram.dispose() if self.online?
|
|
||||||
@telegram = nil
|
|
||||||
@cache[:chats].each_key do |chat| @xmpp.send_presence(@jid, chat, :unavailable) end
|
@cache[:chats].each_key do |chat| @xmpp.send_presence(@jid, chat, :unavailable) end
|
||||||
|
@telegram.dispose()
|
||||||
|
@telegram = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
## resend statuses to (to another resource for example)
|
## resend statuses to (to another resource for example)
|
||||||
|
@ -124,11 +127,10 @@ class TelegramClient
|
||||||
|
|
||||||
## authorization state change
|
## authorization state change
|
||||||
def update_authorizationstate(update)
|
def update_authorizationstate(update)
|
||||||
@state = update.authorization_state.class.name
|
|
||||||
case update.authorization_state
|
case update.authorization_state
|
||||||
when TD::Types::AuthorizationState::WaitPhoneNumber # stage 0: set login
|
when TD::Types::AuthorizationState::WaitPhoneNumber # stage 0: set login
|
||||||
@logger.warn 'Logging in..'
|
@logger.warn 'Logging in..'
|
||||||
@telegram.set_authentication_phone_number(@session[:login]) if @session[:login]
|
@telegram.set_authentication_phone_number(@session[:login], PERMISSIONS[:login]) if @session[:login]
|
||||||
@xmpp.send_message(@jid, nil, 'Please, enter your Telegram login via /login 12345') if not @session[:login]
|
@xmpp.send_message(@jid, nil, 'Please, enter your Telegram login via /login 12345') if not @session[:login]
|
||||||
when TD::Types::AuthorizationState::WaitCode # stage 1: wait for auth code
|
when TD::Types::AuthorizationState::WaitCode # stage 1: wait for auth code
|
||||||
@logger.warn 'Waiting for authorization code..'
|
@logger.warn 'Waiting for authorization code..'
|
||||||
|
@ -179,7 +181,7 @@ class TelegramClient
|
||||||
when TD::Types::MessageContent::Video then [content.video.video, 'video' + content.video.file_name + '.mp4']
|
when TD::Types::MessageContent::Video then [content.video.video, 'video' + content.video.file_name + '.mp4']
|
||||||
when TD::Types::MessageContent::Document then [content.document.document, content.document.file_name]
|
when TD::Types::MessageContent::Document then [content.document.document, content.document.file_name]
|
||||||
end
|
end
|
||||||
@telegram.download_file(file[0].id, 10, 0, 0, false) if file and not file[0].local.is_downloading_completed # download file(s)
|
@telegram.download_file(file[0].id, 1, 0, 0, false) if file and not file[0].local.is_downloading_completed # download file(s)
|
||||||
prefix << (update.message.is_outgoing ? '➡ ' : '⬅ ') + update.message.id.to_s # message direction
|
prefix << (update.message.is_outgoing ? '➡ ' : '⬅ ') + update.message.id.to_s # message direction
|
||||||
prefix << "%s" % self.format_contact(update.message.sender_user_id) if update.message.chat_id < 0 and update.message.sender_user_id # show sender in group chats
|
prefix << "%s" % self.format_contact(update.message.sender_user_id) if update.message.chat_id < 0 and update.message.sender_user_id # show sender in group chats
|
||||||
prefix << "reply: %s" % self.format_message(update.message.chat_id, update.message.reply_to_message_id, true) if update.message.reply_to_message_id.to_i != 0 # reply to
|
prefix << "reply: %s" % self.format_message(update.message.chat_id, update.message.reply_to_message_id, true) if update.message.reply_to_message_id.to_i != 0 # reply to
|
||||||
|
@ -207,7 +209,8 @@ class TelegramClient
|
||||||
|
|
||||||
## new chat discovered
|
## new chat discovered
|
||||||
def update_newchat(update)
|
def update_newchat(update)
|
||||||
@telegram.download_file(update.chat.photo.small.id, 32, 0, 0, false).wait if update.chat.photo
|
puts update.to_json
|
||||||
|
@telegram.download_file(update.chat.photo.small.id, 10, 0, 0, false) if update.chat.photo
|
||||||
@cache[:chats][update.chat.id] = update.chat
|
@cache[:chats][update.chat.id] = update.chat
|
||||||
@xmpp.send_presence(@jid, update.chat.id, :subscribe, nil, nil, update.chat.title.to_s) unless (update.chat.type.instance_of? TD::Types::ChatType::Supergroup and update.chat.type.is_channel and update.chat.last_read_inbox_message_id == 0)
|
@xmpp.send_presence(@jid, update.chat.id, :subscribe, nil, nil, update.chat.title.to_s) unless (update.chat.type.instance_of? TD::Types::ChatType::Supergroup and update.chat.type.is_channel and update.chat.last_read_inbox_message_id == 0)
|
||||||
self.process_status_update(update.chat.id, update.chat.title, :chat) if update.chat.id < 0
|
self.process_status_update(update.chat.id, update.chat.title, :chat) if update.chat.id < 0
|
||||||
|
@ -227,7 +230,7 @@ class TelegramClient
|
||||||
## file downloaded
|
## file downloaded
|
||||||
def update_file(update)
|
def update_file(update)
|
||||||
return unless update.file.local.is_downloading_completed # not really
|
return unless update.file.local.is_downloading_completed # not really
|
||||||
File.symlink(update.file.local.path, "%s/%s%s" % [@@config[:content][:path], Digest::SHA256.hexdigest(update.file.remote.id), File.extname(update.file.local.path)])
|
File.symlink(update.file.local.path, "%s/%s%s" % [@@config[:content][:path], Digest::SHA256.hexdigest(update.file.remote.unique_id), File.extname(update.file.local.path)])
|
||||||
end
|
end
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
@ -284,8 +287,8 @@ class TelegramClient
|
||||||
chat, user = self.get_contact(id) unless id == 0 # get chat information
|
chat, user = self.get_contact(id) unless id == 0 # get chat information
|
||||||
if id == 0 then # transport commands
|
if id == 0 then # transport commands
|
||||||
case cmd
|
case cmd
|
||||||
when '/login' then @telegram.set_authentication_phone_number(args[0]).then{|_| @session[:login] = args[0]} unless @session[:login] # sign in
|
when '/login' then @telegram.set_authentication_phone_number(args[0], PERMISSIONS[:login]).then{@session[:login] = args[0]} unless @session[:login] # sign in
|
||||||
when '/logout' then @telegram.log_out().then{|_| @cache[:chats].each_key do |chat| @xmpp.send_presence(@jid, chat, :unsubscribed); @session[:login] = nil end } # sign out
|
when '/logout' then @telegram.log_out().then{@cache[:chats].each_key do |chat| @xmpp.send_presence(@jid, chat, :unsubscribed); @session[:login] = nil end} # sign out
|
||||||
when '/code' then @telegram.check_authentication_code(args[0]) # check auth code
|
when '/code' then @telegram.check_authentication_code(args[0]) # check auth code
|
||||||
when '/password' then @telegram.check_authentication_password(args[0]) # chech auth password
|
when '/password' then @telegram.check_authentication_password(args[0]) # chech auth password
|
||||||
when '/setusername' then @telegram.set_username(args[0] || '') # set @username
|
when '/setusername' then @telegram.set_username(args[0] || '') # set @username
|
||||||
|
@ -353,7 +356,7 @@ class TelegramClient
|
||||||
end
|
end
|
||||||
|
|
||||||
def format_content(file, fname)
|
def format_content(file, fname)
|
||||||
str = "%s (%d kbytes) | %s/%s%s" % [fname, file.size/1024, @@config[:content][:link], Digest::SHA256.hexdigest(file.remote.id), File.extname(fname).to_s]
|
str = "%s (%d kbytes) | %s/%s%s" % [fname, file.size/1024, @@config[:content][:link], Digest::SHA256.hexdigest(file.remote.unique_id), File.extname(fname).to_s]
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Reference in a new issue