From 0db8c901690bf23c1b05cdd309a7b68c0fbc34fb Mon Sep 17 00:00:00 2001 From: annelin Date: Tue, 3 Jul 2018 01:26:45 +0000 Subject: [PATCH] [SVN] Release 0.4.1 [UPD] [BROKE] New config to database is added, please, re-create it, it is broken! [UPD] `Long time ago` contacts now is offline instead of XA [ADD] Contacts last seen later than `status_xa_interval` (configurable via !configure) hours now have XA status --- xmpp_tg/mtproto.py | 11 +++-------- xmpp_tg/xmpp.py | 34 ++++++++++++++-------------------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/xmpp_tg/mtproto.py b/xmpp_tg/mtproto.py index ed4247f..04b549d 100644 --- a/xmpp_tg/mtproto.py +++ b/xmpp_tg/mtproto.py @@ -22,14 +22,9 @@ from telethon.tl.functions.channels import ReadHistoryRequest as ReadHistoryChan from telethon.tl.functions.updates import GetDifferenceRequest from telethon.tl.functions.contacts import ResolveUsernameRequest -import hashlib -import os -import queue -import threading -import time +import os, threading, queue, hashlib, time, datetime from xmpp_tg.utils import localtime, display_tg_name -from .utils import var_dump import xmpp_tg.monkey import traceback @@ -171,12 +166,12 @@ class TelegramGateClient(TelegramClient): # Status Updates # if type(obj) is UpdateUserStatus: - # process status update # if type(obj.status) is UserStatusOnline: self._status_updates[str(obj.user_id)] = { 'status': None, 'message': 'Online' } elif type(obj.status) is UserStatusOffline: - self._status_updates[str(obj.user_id)] = { 'status': 'away', 'message': localtime(obj.status.was_online).strftime('Last seen at %H:%M %d/%m/%Y') } + status = 'away' if datetime.datetime.utcnow() - obj.status.was_online < datetime.timedelta(hours = self.xmpp_gate.accounts[self.jid]['status_xa_interval'] ) else 'xa' + self._status_updates[str(obj.user_id)] = { 'status': status, 'message': localtime(obj.status.was_online).strftime('Last seen at %H:%M %d/%m/%Y') } elif type(obj.status) is UserStatusRecently: self._status_updates[str(obj.user_id)] = { 'status': 'dnd', 'message': 'Last seen recently' } else: diff --git a/xmpp_tg/xmpp.py b/xmpp_tg/xmpp.py index 95e54d4..96e9504 100644 --- a/xmpp_tg/xmpp.py +++ b/xmpp_tg/xmpp.py @@ -1,27 +1,20 @@ -import sqlite3 -import re -import sys -import os -import io -import time -import hashlib - -import sleekxmpp -from sleekxmpp.componentxmpp import ComponentXMPP +import re, sys, os, io, sqlite3, hashlib, time, datetime import xml.etree.ElementTree as ET +from sleekxmpp.componentxmpp import ComponentXMPP +from sleekxmpp import Presence, Message + from telethon.tl.functions.messages import GetDialogsRequest, SendMessageRequest, SendMediaRequest, EditMessageRequest, DeleteMessagesRequest, 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, ImportContactsRequest from telethon.tl.functions.channels import JoinChannelRequest, LeaveChannelRequest, InviteToChannelRequest, EditBannedRequest, CreateChannelRequest, DeleteMessagesRequest as DeleteMessagesChannel -from telethon.tl.types import InputPeerEmpty, InputPeerUser, InputPeerChat, InputPeerChannel, InputPhoneContact +from telethon.tl.types import InputPeerEmpty, InputPeerUser, InputPeerChat, InputPeerChannel, InputPhoneContact, InputMediaPhotoExternal 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 PeerChannel, PeerChat, PeerUser, Chat, ChatForbidden, Channel, ChannelForbidden, ChannelBannedRights from telethon.tl.types import UserStatusOnline, UserStatusRecently, UserStatusOffline from telethon.tl.types import Updates, UpdateShortSentMessage, UpdateMessageID -from telethon.tl.types import ChannelBannedRights -from telethon.tl.types import InputMediaPhotoExternal + from telethon.tl.types.messages import Dialogs, DialogsSlice from telethon.helpers import generate_random_long @@ -585,7 +578,7 @@ class XMPPTelegram(ComponentXMPP): def roster_exchange(self, tojid, contacts): - message = sleekxmpp.Message() + message = Message() message['from'] = self.boundjid.bare message['to'] = tojid rawxml = "" @@ -601,7 +594,7 @@ class XMPPTelegram(ComponentXMPP): def roster_fill(self, tojid, contacts): for jid, nick in contacts.items(): - presence = sleekxmpp.Presence() + presence = Presence() presence['from'] = jid presence['to'] = tojid presence['type'] = 'subscribe' @@ -694,9 +687,10 @@ class XMPPTelegram(ComponentXMPP): elif type(usr.status) is UserStatusRecently: self.send_presence(pto=jid, pfrom=u_jid, pshow='dnd', pstatus='Last seen recently') elif type(usr.status) is UserStatusOffline: - self.send_presence(pto=jid, pfrom=u_jid, pshow='away', pstatus=localtime(usr.status.was_online).strftime('Last seen at %H:%M %d/%m/%Y') ) + phow = 'away' if datetime.datetime.utcnow() - usr.status.was_online < datetime.timedelta(hours = self.accounts[jid]['status_xa_interval'] ) else 'xa' + self.send_presence(pto=jid, pfrom=u_jid, pshow=phow, 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='xa', pstatus='Last seen a long time ago') + self.send_presence(pto=jid, pfrom=u_jid, ptype='unavailable', pstatus='Last seen a long time ago') if type(dlg.peer) in [PeerChat, PeerChannel]: cht = None @@ -799,7 +793,7 @@ class XMPPTelegram(ComponentXMPP): return (msg_id, edited) def publish_photo(self, jid, fromjid, photo): - presence = sleekxmpp.Presence() + presence = Presence() presence['to'] = jid presence['from'] = fromjid presence.appendxml(ET.fromstring("%s" % photo)) @@ -820,6 +814,6 @@ class XMPPTelegram(ComponentXMPP): conn = sqlite3.connect(self.config['db_connect'], isolation_level=None, check_same_thread=False) conn.row_factory = dict_factory - conn.execute("CREATE TABLE IF NOT EXISTS accounts(jid VARCHAR(255), tg_phone VARCHAR(25), use_roster_exchange BOOLEAN default false, keep_online BOOLEAN default false, status_update_interval INTEGER default 30, enable_avatars BOOLEAN default false)") + conn.execute("CREATE TABLE IF NOT EXISTS accounts(jid VARCHAR(255), tg_phone VARCHAR(25), use_roster_exchange BOOLEAN default false, keep_online BOOLEAN default false, status_update_interval INTEGER default 30, status_xa_interval INTEGER default 24, enable_avatars BOOLEAN default false)") return conn