|
|
|
|
@@ -7,12 +7,12 @@ import sleekxmpp
|
|
|
|
|
from sleekxmpp.componentxmpp import ComponentXMPP
|
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
|
|
|
|
|
from telethon.tl.functions.messages import GetDialogsRequest, SendMessageRequest, ImportChatInviteRequest, GetFullChatRequest, AddChatUserRequest, DeleteChatUserRequest, CreateChatRequest
|
|
|
|
|
from telethon.tl.functions.messages import GetDialogsRequest, SendMessageRequest, ImportChatInviteRequest, GetFullChatRequest, AddChatUserRequest, DeleteChatUserRequest, CreateChatRequest, DeleteHistoryRequest
|
|
|
|
|
from telethon.tl.functions.account import UpdateStatusRequest, GetAuthorizationsRequest, UpdateProfileRequest, UpdateUsernameRequest
|
|
|
|
|
from telethon.tl.functions.contacts import DeleteContactRequest, BlockRequest, UnblockRequest
|
|
|
|
|
from telethon.tl.functions.contacts import DeleteContactRequest, BlockRequest, UnblockRequest, ImportContactsRequest
|
|
|
|
|
from telethon.tl.functions.channels import JoinChannelRequest, LeaveChannelRequest, InviteToChannelRequest, EditBannedRequest, CreateChannelRequest
|
|
|
|
|
|
|
|
|
|
from telethon.tl.types import InputPeerEmpty, InputPeerUser, InputPeerChat, InputPeerChannel
|
|
|
|
|
from telethon.tl.types import InputPeerEmpty, InputPeerUser, InputPeerChat, InputPeerChannel, InputPhoneContact
|
|
|
|
|
from telethon.tl.types import User, Chat, Channel
|
|
|
|
|
from telethon.tl.types import PeerChannel, PeerChat, PeerUser, Chat, ChatForbidden, Channel, ChannelForbidden
|
|
|
|
|
from telethon.tl.types import UserStatusOnline, UserStatusRecently, UserStatusOffline
|
|
|
|
|
@@ -24,7 +24,7 @@ from telethon.helpers import generate_random_long
|
|
|
|
|
from telethon.errors import SessionPasswordNeededError
|
|
|
|
|
|
|
|
|
|
from xmpp_tg.mtproto import TelegramGateClient
|
|
|
|
|
from xmpp_tg.utils import var_dump, display_tg_name, get_contact_jid
|
|
|
|
|
from xmpp_tg.utils import var_dump, display_tg_name, get_contact_jid, localtime
|
|
|
|
|
import xmpp_tg.monkey # Патчим баги в библиотеках
|
|
|
|
|
|
|
|
|
|
class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
@@ -43,7 +43,7 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
|
|
|
|
|
self.auto_authorize = True
|
|
|
|
|
# self.auto_subscribe = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.config = config_dict
|
|
|
|
|
self.accounts = dict() # personal configuration per JID
|
|
|
|
|
self.tg_connections = dict()
|
|
|
|
|
@@ -77,7 +77,7 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
|
|
|
|
|
vcard = self.plugin['xep_0054'].make_vcard()
|
|
|
|
|
vcard['FN'] = self.config['title']
|
|
|
|
|
vcard['DESC'] = 'Send /help for information'
|
|
|
|
|
vcard['DESC'] = 'Send !help for information'
|
|
|
|
|
self.plugin['xep_0054'].publish_vcard(jid=self.boundjid.bare, vcard=vcard)
|
|
|
|
|
|
|
|
|
|
def __del__(self):
|
|
|
|
|
@@ -268,6 +268,7 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
'!reload_dialogs - Reloads dialogs list from Telegram\n\n'
|
|
|
|
|
'!add - Find and add Telegram contact. Any formats accepted (nickname or t.me link)\n\n'
|
|
|
|
|
'!join - Join Telegram conference via invite link \n\n'
|
|
|
|
|
'!import phone firstname lastname - Add Telegram contact with phone number \n\n'
|
|
|
|
|
'!group GroupName @InviteContact - Create a normal group\n'
|
|
|
|
|
'!supergroup SupergroupName - Create a supergroup\n'
|
|
|
|
|
'!channel ChannelName - Create a channel\n\n'
|
|
|
|
|
@@ -394,6 +395,15 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
elif parsed[0] == '!about' and len(parsed) >= 2: # create new channel
|
|
|
|
|
about = iq['body'][7:]
|
|
|
|
|
self.tg_connections[jid].invoke(UpdateProfileRequest(about = about))
|
|
|
|
|
|
|
|
|
|
elif parsed[0] == '!import' and len(parsed) >= 3: # create new channel
|
|
|
|
|
phone = parsed[1]
|
|
|
|
|
firstname = parsed[2]
|
|
|
|
|
lastname = parsed[3] if len(parsed) > 3 else None
|
|
|
|
|
|
|
|
|
|
contact = InputPhoneContact(client_id=generate_random_long(), phone=phone, first_name=firstname, last_name=lastname)
|
|
|
|
|
self.tg_connections[jid].invoke(ImportContactsRequest([contact]))
|
|
|
|
|
self.tg_process_dialogs(jid)
|
|
|
|
|
|
|
|
|
|
else: # --------------------------------------------------
|
|
|
|
|
self.gate_reply_message(iq, 'Unknown command. Try !help for list all commands.')
|
|
|
|
|
@@ -407,6 +417,7 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
'!help - Displays this text\n'
|
|
|
|
|
'!block - Blacklists current user\n'
|
|
|
|
|
'!unblock - Unblacklists current user\n'
|
|
|
|
|
'!remove - Removes history and contact from your contact list\n'
|
|
|
|
|
)
|
|
|
|
|
elif parsed[0] == '!block':
|
|
|
|
|
tg_id = int(iq['to'].node[1:])
|
|
|
|
|
@@ -420,6 +431,16 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
self.tg_connections[jid].invoke(UnblockRequest( InputPeerUser(tg_id, self.tg_dialogs[jid]['users'][tg_id].access_hash) ) )
|
|
|
|
|
self.gate_reply_message(iq, 'User %s unblacklisted!' % nickname)
|
|
|
|
|
|
|
|
|
|
elif parsed[0] == '!remove':
|
|
|
|
|
tg_id = int(iq['to'].node[1:])
|
|
|
|
|
peer = InputPeerUser(tg_id, self.tg_dialogs[jid]['users'][tg_id].access_hash)
|
|
|
|
|
c_jid = get_contact_jid(self.tg_dialogs[jid]['users'][tg_id], self.boundjid.bare)
|
|
|
|
|
self.tg_connections[jid].invoke( DeleteContactRequest(peer) )
|
|
|
|
|
self.tg_connections[jid].invoke( DeleteHistoryRequest( peer, max_id = 0, just_clear = None ) )
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unavailable')
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unsubscribed')
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unsubscribe')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_chat_group_command(self, iq):
|
|
|
|
|
@@ -436,13 +457,16 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
elif parsed[0] == '!leave':
|
|
|
|
|
tg_id = int(iq['to'].node[1:])
|
|
|
|
|
if tg_id in self.tg_dialogs[jid]['supergroups']:
|
|
|
|
|
self.tg_connections[jid].invoke(LeaveChannelRequest( InputPeerChannel(tg_id, self.tg_dialogs[jid]['supergroups'][tg_id].access_hash) ) )
|
|
|
|
|
peer = InputPeerChannel(tg_id, self.tg_dialogs[jid]['supergroups'][tg_id].access_hash)
|
|
|
|
|
self.tg_connections[jid].invoke( LeaveChannelRequest(peer) )
|
|
|
|
|
self.tg_connections[jid].invoke( DeleteHistoryRequest( peer, max_id = 0, just_clear = None ) )
|
|
|
|
|
c_jid = get_contact_jid(self.tg_dialogs[jid]['supergroups'][tg_id], self.boundjid.bare)
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unavailable')
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unsubscribed')
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unsubscribe')
|
|
|
|
|
if tg_id in self.tg_dialogs[jid]['groups']:
|
|
|
|
|
self.tg_connections[jid].invoke( DeleteChatUserRequest(tg_id, self.tg_connections[jid].me) )
|
|
|
|
|
self.tg_connections[jid].invoke( DeleteHistoryRequest( InputPeerChat(tg_id), max_id = 0, just_clear = None ) )
|
|
|
|
|
c_jid = get_contact_jid(self.tg_dialogs[jid]['groups'][tg_id], self.boundjid.bare)
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unavailable')
|
|
|
|
|
self.send_presence(pto = jid, pfrom = c_jid, ptype = 'unsubscribed')
|
|
|
|
|
@@ -603,7 +627,7 @@ class XMPPTelegram(ComponentXMPP):
|
|
|
|
|
elif type(usr.status) is UserStatusRecently:
|
|
|
|
|
self.send_presence(pto=jid, pfrom=u_jid, pshow='away', pstatus='Last seen recently')
|
|
|
|
|
elif type(usr.status) is UserStatusOffline:
|
|
|
|
|
self.send_presence(pto=jid, pfrom=u_jid, pshow='xa', pstatus=usr.status.was_online.strftime('Last seen at %H:%M %d/%m/%Y') )
|
|
|
|
|
self.send_presence(pto=jid, pfrom=u_jid, pshow='xa', pstatus=localtime(usr.status.was_online).strftime('Last seen at %H:%M %d/%m/%Y') )
|
|
|
|
|
else:
|
|
|
|
|
self.send_presence(pto=jid, pfrom=u_jid, pshow='dnd', pstatus='Last seen a long time ago')
|
|
|
|
|
|
|
|
|
|
|