[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
This commit is contained in:
annelin
2018-07-03 01:26:45 +00:00
parent 2f2d534f09
commit 0db8c90169
2 changed files with 17 additions and 28 deletions

View File

@@ -22,14 +22,9 @@ from telethon.tl.functions.channels import ReadHistoryRequest as ReadHistoryChan
from telethon.tl.functions.updates import GetDifferenceRequest from telethon.tl.functions.updates import GetDifferenceRequest
from telethon.tl.functions.contacts import ResolveUsernameRequest from telethon.tl.functions.contacts import ResolveUsernameRequest
import hashlib import os, threading, queue, hashlib, time, datetime
import os
import queue
import threading
import time
from xmpp_tg.utils import localtime, display_tg_name from xmpp_tg.utils import localtime, display_tg_name
from .utils import var_dump
import xmpp_tg.monkey import xmpp_tg.monkey
import traceback import traceback
@@ -171,12 +166,12 @@ class TelegramGateClient(TelegramClient):
# Status Updates # # Status Updates #
if type(obj) is UpdateUserStatus: if type(obj) is UpdateUserStatus:
# process status update # # process status update #
if type(obj.status) is UserStatusOnline: if type(obj.status) is UserStatusOnline:
self._status_updates[str(obj.user_id)] = { 'status': None, 'message': 'Online' } self._status_updates[str(obj.user_id)] = { 'status': None, 'message': 'Online' }
elif type(obj.status) is UserStatusOffline: 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: elif type(obj.status) is UserStatusRecently:
self._status_updates[str(obj.user_id)] = { 'status': 'dnd', 'message': 'Last seen recently' } self._status_updates[str(obj.user_id)] = { 'status': 'dnd', 'message': 'Last seen recently' }
else: else:

View File

@@ -1,27 +1,20 @@
import sqlite3 import re, sys, os, io, sqlite3, hashlib, time, datetime
import re
import sys
import os
import io
import time
import hashlib
import sleekxmpp
from sleekxmpp.componentxmpp import ComponentXMPP
import xml.etree.ElementTree as ET 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.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.account import UpdateStatusRequest, GetAuthorizationsRequest, UpdateProfileRequest, UpdateUsernameRequest
from telethon.tl.functions.contacts import DeleteContactRequest, BlockRequest, UnblockRequest, ImportContactsRequest 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.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 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 UserStatusOnline, UserStatusRecently, UserStatusOffline
from telethon.tl.types import Updates, UpdateShortSentMessage, UpdateMessageID 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.tl.types.messages import Dialogs, DialogsSlice
from telethon.helpers import generate_random_long from telethon.helpers import generate_random_long
@@ -585,7 +578,7 @@ class XMPPTelegram(ComponentXMPP):
def roster_exchange(self, tojid, contacts): def roster_exchange(self, tojid, contacts):
message = sleekxmpp.Message() message = Message()
message['from'] = self.boundjid.bare message['from'] = self.boundjid.bare
message['to'] = tojid message['to'] = tojid
rawxml = "<x xmlns='http://jabber.org/protocol/rosterx'>" rawxml = "<x xmlns='http://jabber.org/protocol/rosterx'>"
@@ -601,7 +594,7 @@ class XMPPTelegram(ComponentXMPP):
def roster_fill(self, tojid, contacts): def roster_fill(self, tojid, contacts):
for jid, nick in contacts.items(): for jid, nick in contacts.items():
presence = sleekxmpp.Presence() presence = Presence()
presence['from'] = jid presence['from'] = jid
presence['to'] = tojid presence['to'] = tojid
presence['type'] = 'subscribe' presence['type'] = 'subscribe'
@@ -694,9 +687,10 @@ class XMPPTelegram(ComponentXMPP):
elif type(usr.status) is UserStatusRecently: elif type(usr.status) is UserStatusRecently:
self.send_presence(pto=jid, pfrom=u_jid, pshow='dnd', pstatus='Last seen recently') self.send_presence(pto=jid, pfrom=u_jid, pshow='dnd', pstatus='Last seen recently')
elif type(usr.status) is UserStatusOffline: 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: 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]: if type(dlg.peer) in [PeerChat, PeerChannel]:
cht = None cht = None
@@ -799,7 +793,7 @@ class XMPPTelegram(ComponentXMPP):
return (msg_id, edited) return (msg_id, edited)
def publish_photo(self, jid, fromjid, photo): def publish_photo(self, jid, fromjid, photo):
presence = sleekxmpp.Presence() presence = Presence()
presence['to'] = jid presence['to'] = jid
presence['from'] = fromjid presence['from'] = fromjid
presence.appendxml(ET.fromstring("<x xmlns='vcard-temp:x:update'><photo>%s</photo></x>" % photo)) presence.appendxml(ET.fromstring("<x xmlns='vcard-temp:x:update'><photo>%s</photo></x>" % photo))
@@ -820,6 +814,6 @@ class XMPPTelegram(ComponentXMPP):
conn = sqlite3.connect(self.config['db_connect'], isolation_level=None, check_same_thread=False) conn = sqlite3.connect(self.config['db_connect'], isolation_level=None, check_same_thread=False)
conn.row_factory = dict_factory 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 return conn