[SVN] updated to version 0.3.1
[DEP] [BROKE] new dependency: pytz (pip3 install pytz)
[FIX] fixed media downloading with telethon 0.18
[FIX] now using server time zone in status messages instead of UTC
[UPD] now removing chats & supergroups completely after we leaving with !leave command
[ADD] added commands:
!remove — completely remove current user from contact list
!import phone firstname lastname — try to add contact with phone number (untested)
This commit is contained in:
@@ -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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user