Implement Telegram -> Matrix formatted message bridging

This commit is contained in:
Tulir Asokan
2018-01-21 15:15:13 +02:00
parent 130a428641
commit f1d8312806
8 changed files with 161 additions and 23 deletions
+33 -3
View File
@@ -27,9 +27,10 @@ class User:
by_mxid = {}
by_tgid = {}
def __init__(self, mxid, tgid=None):
def __init__(self, mxid, tgid=None, username=None):
self.mxid = mxid
self.tgid = tgid
self.username = username
self.command_status = None
self.connected = False
@@ -44,7 +45,7 @@ class User:
return self.client.is_user_authorized()
def to_db(self):
return self.db.merge(DBUser(self.mxid, self.tgid))
return self.db.merge(DBUser(mxid=self.mxid, tgid=self.tgid, tg_username=self.username))
def save(self):
self.to_db()
@@ -52,7 +53,7 @@ class User:
@classmethod
def from_db(cls, db_user):
return User(db_user.mxid, db_user.tgid)
return User(db_user.mxid, db_user.tgid, db_user.tg_username)
def start(self):
self.client = TelegramClient(self.mxid,
@@ -62,9 +63,27 @@ class User:
self.connected = self.client.connect()
if self.logged_in:
self.sync_dialogs()
self.update_info()
self.client.add_update_handler(self.update_catch)
return self
def update_info(self, info=None):
info = info or self.client.get_me()
self.username = info.username
if self.tgid != info.id:
self.tgid = info.id
self.by_tgid[self.tgid] = self
self.save()
def log_out(self):
self.connected = False
if self.tgid:
try:
del self.tgid[self.tgid]
except KeyError:
pass
return self.client.log_out()
def stop(self):
self.client.disconnect()
self.client = None
@@ -137,6 +156,17 @@ class User:
return None
@classmethod
def find_by_username(cls, username):
for _, user in cls.by_tgid.items():
if user.username == username:
return user
puppet = DBUser.query.filter(DBUser.tg_username == username).one_or_none()
if puppet:
return cls.from_db(puppet)
return None
def init(context):
global config