From 9145ebdc64a8962d9671b1cb20e40173fb27a2ec Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 6 Feb 2018 14:05:53 +0200 Subject: [PATCH] Fix message ID mapping for channels. Fixes #51 --- mautrix_telegram/db.py | 4 ++-- mautrix_telegram/formatter.py | 13 +++++++------ mautrix_telegram/portal.py | 19 ++++++++++++------- mautrix_telegram/user.py | 1 + 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/mautrix_telegram/db.py b/mautrix_telegram/db.py index 4aa218b4..fb3a8dc2 100644 --- a/mautrix_telegram/db.py +++ b/mautrix_telegram/db.py @@ -44,9 +44,9 @@ class Message(Base): mxid = Column(String) mx_room = Column(String) tgid = Column(Integer, primary_key=True) - user = Column(Integer, ForeignKey("user.tgid"), primary_key=True) + tg_space = Column(Integer, primary_key=True) - __table_args__ = (UniqueConstraint('mxid', 'mx_room', 'user', name='_mx_id_room'),) + __table_args__ = (UniqueConstraint('mxid', 'mx_room', 'tg_space', name='_mx_id_room'),) class User(Base): diff --git a/mautrix_telegram/formatter.py b/mautrix_telegram/formatter.py index 004cea3a..ec186337 100644 --- a/mautrix_telegram/formatter.py +++ b/mautrix_telegram/formatter.py @@ -37,9 +37,9 @@ class MatrixParser(HTMLParser): mention_regex = re.compile("https://matrix.to/#/(@.+)") reply_regex = re.compile(r"https://matrix.to/#/(!.+?)/(\$.+)") - def __init__(self, user_id=None): + def __init__(self, tg_space=None): super().__init__() - self._user_id = user_id + self._tg_space = tg_space self.text = "" self.entities = [] self._building_entities = {} @@ -91,13 +91,14 @@ class MatrixParser(HTMLParser): else: entity_type = MessageEntityMentionName args["user_id"] = user.tgid - elif reply and self._user_id and (len(self.entities) == 0 + elif reply and self._tg_space and (len(self.entities) == 0 and len(self._building_entities) == 0): room_id = reply.group(1) message_id = reply.group(2) message = DBMessage.query.filter(DBMessage.mxid == message_id and DBMessage.mx_room == room_id - and DBMessage.user == self._user_id).one_or_none() + and DBMessage.tg_space == self._tg_space + ).one_or_none() if not message: return entity_type = MessageEntityReply @@ -178,9 +179,9 @@ class MatrixParser(HTMLParser): self.entities.append(entity) -def matrix_to_telegram(html, user_id=None): +def matrix_to_telegram(html, tg_space=None): try: - parser = MatrixParser(user_id) + parser = MatrixParser(tg_space) parser.feed(html) return parser.text, parser.entities except Exception: diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index 435a6f5b..0a522068 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -379,8 +379,8 @@ class Portal: type = message["msgtype"] if type in {"m.text", "m.emote"}: if "format" in message and message["format"] == "org.matrix.custom.html": - message, entities = formatter.matrix_to_telegram(message["formatted_body"], - sender.tgid) + space = self.tgid if self.peer_type == "channel" else sender.tgid + message, entities = formatter.matrix_to_telegram(message["formatted_body"], space) if type == "m.emote": message = "/me " + message reply_to = None @@ -410,13 +410,17 @@ class Portal: self.log.debug("Unhandled Matrix event: %s", message) return self.is_duplicate(response) - self.db.add( - DBMessage(tgid=response.id, mx_room=self.mxid, mxid=event_id, user=sender.tgid)) + self.db.add(DBMessage( + tgid=response.id, + tg_space=self.tgid if self.peer_type == "channel" else sender.tgid, + mx_room=self.mxid, + mxid=event_id)) self.db.commit() def handle_matrix_deletion(self, deleter, event_id): + space = self.tgid if self.peer_type == "channel" else deleter.tgid message = DBMessage.query.filter(DBMessage.mxid == event_id and - DBMessage.user == deleter.tgid and + DBMessage.tg_space == space and DBMessage.mx_room == self.mxid).one_or_none() if not message: return @@ -696,7 +700,7 @@ class Portal: return self.db.add(DBMessage(tgid=evt.id, mx_room=self.mxid, mxid=response["event_id"], - user=source.tgid)) + tg_space=self.tgid if self.peer_type == "channel" else source.tgid)) self.db.commit() def handle_telegram_action(self, source, sender, action): @@ -742,7 +746,8 @@ class Portal: self.main_intent.set_power_levels(self.mxid, levels) def update_telegram_pin(self, source, id): - message = DBMessage.query.get((id, source.tgid)) + space = self.tgid if self.peer_type == "channel" else source.tgid + message = DBMessage.query.get((id, space)) if message: self.main_intent.set_pinned_messages(self.mxid, [message.mxid]) else: diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py index a7329e21..44c7082d 100644 --- a/mautrix_telegram/user.py +++ b/mautrix_telegram/user.py @@ -177,6 +177,7 @@ class User: if not portal or not portal.mxid: return + # We check that these are user read receipts, so tg_space is always the user ID. message = DBMessage.query.get((update.max_id, self.tgid)) if not message: return