zhabogram/inc/telegram.rb
annelin 854b61ada0 Initial release
Implemented authorization and simple messages
2019-04-06 09:12:54 +03:00

91 lines
4.3 KiB
Ruby

require 'tdlib-ruby'
class TelegramClient
# tdlib configuration, shared within all instances #
def self.configure(params)
TD.configure do |config|
config.lib_path = params[:lib_path] || 'lib/'
config.client.api_id = params[:api_id] || 430850
config.client.api_hash = params[:api_hash] || '3d3cfcbd30d0805f757c5fc521004861'
end
TD::Api.set_log_verbosity_level(params[:verbose] || 1)
end
# instance initialization #
def initialize(xmpp, login)
@xmpp = xmpp
@login = login
Logging.log.info '[TelegramClient] [%s] Initializing..' % @login
@client = TD::Client.new(database_directory: 'sessions/' + @login, files_directory: 'sessions/' + @login + '/files/') # create telegram client instance
@client.on(TD::Types::Update::AuthorizationState) do |update| self.auth_handler(update) end # register auth update handler
@client.on(TD::Types::Update::NewMessage) do |update| self.message_handler(update) end # register new message update handler
@client.connect #
# we will check new messages in queue and auth data in forever loop #
#begin
loop do
self.process_outgoing_msg(@xmpp.message_queue.pop) unless @xmpp.message_queue.empty? # found something in message queue
self.process_auth(:code, @xmpp.tg_auth_data[:code]) unless @xmpp.tg_auth_data[:code].nil? # found code in auth queue
self.process_auth(:password, @xmpp.tg_auth_data[:password]) unless @xmpp.tg_auth_data[:password].nil? # found 2fa password in auth queue
sleep 0.5
end
#ensure
#Logging.log.info '[TelegramClient] Exitting gracefully...'
#@client.dispose
#end
end
# authorization handler #
def auth_handler(update)
Logging.log.debug '[TelegramClient] [%s] Authorization state changed: %s' % [@login, update.authorization_state]
case update.authorization_state
# auth stage 0: specify login #
when TD::Types::AuthorizationState::WaitPhoneNumber
Logging.log.debug '[TelegramClient] [%s] Logging in..' % @login
@client.set_authentication_phone_number(@login)
# auth stage 1: wait for authorization code #
when TD::Types::AuthorizationState::WaitCode
@xmpp.send_message(nil, 'Please, enter authorization code via /code 12345')
Logging.log.debug '[TelegramClient] [%s] Waiting for Authorization code..' % @login
# auth stage 2: wait for 2fa passphrase #
when TD::Types::AuthorizationState::WaitPassword
@xmpp.send_message(nil, 'Please, enter 2FA passphrase via /password 12345')
Logging.log.debug '[TelegramClient] [%s] Waiting for 2FA password..' % @login
# authorizatio successful #
when TD::Types::AuthorizationState::Ready
@xmpp.send_message(nil, 'Authorization successful.')
Logging.log.debug '[TelegramClient] [%s] Authorization successful.' % @login
end
end
# message from telegram network handler #
def message_handler(update)
Logging.log.debug '[TelegramClient] [%s] Got NewMessage update <%s>' % [@login, update.message]
from = update.message.chat_id
text = update.message.content.text.text
@xmpp.send_message(from, text) if not update.message.is_outgoing
end
##################################################
# processing authorization #
def process_auth(typ, data)
Logging.log.debug '[TelegramClient] [%s] Authorizing with <%s> in Telegram...' % [@login, typ.to_s]
@client.check_authentication_code(data) if typ == :code
@client.check_authentication_password(data) if typ == :password
@xmpp.tg_auth = {} # unset it to prevent extracting 2fa password from memory
end
# processing outgoing message from queue #
def process_outgoing_msg(msg)
Logging.log.debug '[TelegramClient] [%s] Sending message to user/chat <%s> within Telegram network..' % [@login, msg[:to]]
message = TD::Types::InputMessageContent::Text.new(:text => { :text => msg[:text], :entities => []}, :disable_web_page_preview => false, :clear_draft => false )
@client.send_message(msg[:to].to_i, message)
end
end