[+] New config options (see config.yml.example)
[+] Storing transport sessions in sqlite db
[+] Auto connecting if we have stored session JID that came online
[+] Auto disconnecting when JID going offline
[+] Roster and status synchronisation with Telegram contact list
[+] Added Edited and Deleted Messages support
[+] Add Files (Audio, Photo, Documents, Stickers) support
[+] Added incoming text formatting with MSG ID, user names and login
[~] Some new config options (see config.yml.example)
[~] Some code refactoring
text="[%s (%s), %d bytes] | %s | %s"%[content[1],content[2],content[0].size.to_i,self.format_content_link(content[0].id,content[1]),text]ifcontent# content format
text="[FWD From %s] %s"%[self.format_username(update.message.forward_info.sender_user_id),text]ifupdate.message.forward_info.instance_of?TD::Types::MessageForwardInfo::MessageForwardedFromUser# fwd
text="[Reply to MSG %s] %s"%[update.message.reply_to_message_id.to_s,text]ifupdate.message.reply_to_message_id.to_i!=0# reply
query=(delete)?"DELETE FROM users where jid = '%s';"%jid.to_s:"INSERT OR REPLACE INTO users(jid, tg_login) VALUES('%s', '%s');"%[jid.to_s,@sessions[jid].tg_login.to_s]
@logger.debugquery
@db.execute(query)
end
# transport initialization & connecting to XMPP server #
@logger.info'Found %s sessions in database.'%@sessions.count
@sessions.eachdo|jid,session|
@logger.info"Sending presence to %s"%jid
p=Jabber::Presence.new()
p.to=jid
p.from=@@transport.jid
p.type=:subscribe
@logger.debugp
@@transport.send(p)
end
Thread.stop()
rescueException=>e
@logger.info'Connection failed: %s'%e
@db.close
exit1
end
end
@ -38,8 +77,21 @@ class XMPPComponent
# new message to XMPP component #
defmessage_handler(msg)
@logger.info'New message from [%s] to [%s]'%[msg.from,msg.to]
returnself.process_internal_command(msg.from.bare,msg.first_element_text('body'))ifmsg.to==@@transport.jid# treat message as internal command if received as transport jid
return@sessions[msg.from.bare].queue_message(msg.to.to_s,msg.first_element_text('body'))if@sessions.key?msg.from.bareand@sessions[msg.from.bare].online?# queue message for processing session is active for jid from
returnself.process_internal_command(msg.from.bare.to_s,msg.first_element_text('body'))ifmsg.to==@@transport.jid# treat message as internal command if received as transport jid
return@sessions[msg.from.bare.to_s].queue_message(msg.to.to_s,msg.first_element_text('body'))if@sessions.key?msg.from.bare.to_sand@sessions[msg.from.bare.to_s].online?# queue message for processing session is active for jid from
end
defpresence_handler(presence)
@logger.info"New presence iq received"
@logger.debug(presence)
ifpresence.type==:subscribethenreply=presence.answer(false);reply.type=:subscribed;@@transport.send(reply);end# send "subscribed" reply to "subscribe" presence
ifpresence.to==@@transport.jidand@sessions.key?presence.from.bare.to_sandpresence.type==:unavailablethen@sessions[presence.from.bare.to_s].offline!;return;end# go offline when received offline presence from jabber user
ifpresence.to==@@transport.jidand@sessions.key?presence.from.bare.to_sthen@sessions[presence.from.bare.to_s].connect();return;end# connect if we have session
when'/login'then@sessions[jfrom]=XMPPSession.new(jfrom,body.split[1])# create new session for jid <jfrom> and spawn tg instance
when'/code','/password'then@sessions[jfrom].enter_auth_data(body.split[0][1..8],body.split[1])if@sessions.key?jfrom# pass auth data to telegram instance
when'/logout'then@sessions[jfrom].offline!if@sessions.key?jfrom# go offline
elsereply=Jabber::Message.new;reply.from,reply.to,reply.body,reply.type=@@transport.jid,jfrom,::HELP_MESSAGE,:chat;@@transport.send(reply)# unknown command -- we will display sort of help message.
when'/login'# creating new session if not exists and connect if user already has session