From 73e7b8f635aa6ce0ffccdf8890ed00f2a03a60a3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 29 Apr 2018 23:48:02 +0300 Subject: [PATCH] Add option to send bot messages as m.notice. Fixes #121 --- ...fa46383a9d3_add_is_bot_field_to_puppets.py | 24 +++++++++++++++++++ example-config.yaml | 2 ++ mautrix_telegram/config.py | 1 + mautrix_telegram/db.py | 1 + mautrix_telegram/portal.py | 9 ++++--- mautrix_telegram/puppet.py | 10 +++++--- 6 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 alembic/versions/1fa46383a9d3_add_is_bot_field_to_puppets.py diff --git a/alembic/versions/1fa46383a9d3_add_is_bot_field_to_puppets.py b/alembic/versions/1fa46383a9d3_add_is_bot_field_to_puppets.py new file mode 100644 index 00000000..81a63015 --- /dev/null +++ b/alembic/versions/1fa46383a9d3_add_is_bot_field_to_puppets.py @@ -0,0 +1,24 @@ +"""Add is_bot field to puppets + +Revision ID: 1fa46383a9d3 +Revises: 30eca60587f1 +Create Date: 2018-04-29 23:44:40.102333 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1fa46383a9d3' +down_revision = '30eca60587f1' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('puppet', sa.Column('is_bot', sa.Boolean(), nullable=True)) + + +def downgrade(): + op.drop_column('puppet', 'is_bot') diff --git a/example-config.yaml b/example-config.yaml index 0edd70d9..8f237ba3 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -85,6 +85,8 @@ bridge: highlight_edits: false # Whether or not Matrix bot messages (type m.notice) should be bridged. bridge_notices: true + # Whether to bridge Telegram bot messages as m.notices or m.texts. + bot_messages_as_notices: true # Maximum number of members to sync per portal when starting up. Other members will be # synced when they send messages. The maximum is 10000, after which the Telegram server # will not send any more members. diff --git a/mautrix_telegram/config.py b/mautrix_telegram/config.py index 157751bd..6af886c1 100644 --- a/mautrix_telegram/config.py +++ b/mautrix_telegram/config.py @@ -171,6 +171,7 @@ class Config(DictWithRecursion): copy("bridge.edits_as_replies") copy("bridge.highlight_edits") copy("bridge.bridge_notices") + copy("bridge.bot_messages_as_notices") copy("bridge.max_initial_member_sync") copy("bridge.max_telegram_delete") copy("bridge.allow_matrix_login") diff --git a/mautrix_telegram/db.py b/mautrix_telegram/db.py index 3f859557..3a3d1327 100644 --- a/mautrix_telegram/db.py +++ b/mautrix_telegram/db.py @@ -94,6 +94,7 @@ class Puppet(Base): displayname = Column(String, nullable=True) username = Column(String, nullable=True) photo_id = Column(String, nullable=True) + is_bot = Column(Boolean, nullable=True) # Fucking Telegram not telling bots what chats they are in 3:< diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index a0cd9cc5..260b4522 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -1149,12 +1149,14 @@ class Portal: "m.relates_to": relates_to or None, }, timestamp=evt.date, external_url=self.get_external_url(evt)) - async def handle_telegram_text(self, source, intent, evt): + async def handle_telegram_text(self, source, intent, is_bot, evt): self.log.debug(f"Sending {evt.message} to {self.mxid} by {intent.mxid}") text, html, relates_to = await formatter.telegram_to_matrix(evt, source, self.main_intent) await intent.set_typing(self.mxid, is_typing=False) + msgtype = "m.notice" if is_bot and config["bridge.bot_messages_as_notices"] else "m.text" return await intent.send_text(self.mxid, text, html=html, relates_to=relates_to, - timestamp=evt.date, external_url=self.get_external_url(evt)) + msgtype=msgtype, timestamp=evt.date, + external_url=self.get_external_url(evt)) async def handle_telegram_edit(self, source, sender, evt): if not self.mxid: @@ -1229,7 +1231,8 @@ class Portal: allowed_media) else None intent = sender.intent if sender else self.main_intent if not media and evt.message: - response = await self.handle_telegram_text(source, intent, evt) + is_bot = sender.is_bot if sender else False + response = await self.handle_telegram_text(source, intent, is_bot, evt) elif media: relates_to = formatter.telegram_reply_to_matrix(evt, source) if isinstance(media, MessageMediaPhoto): diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 75660906..466cc7e9 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -36,13 +36,14 @@ class Puppet: hs_domain = None cache = {} - def __init__(self, id=None, username=None, displayname=None, photo_id=None, db_instance=None): + def __init__(self, id=None, username=None, displayname=None, photo_id=None, is_bot=None, db_instance=None): self.id = id self.mxid = self.get_mxid_from_id(self.id) self.username = username self.displayname = displayname self.photo_id = photo_id + self.is_bot = is_bot self._db_instance = db_instance self.intent = self.az.intent.user(self.mxid) @@ -62,17 +63,18 @@ class Puppet: def new_db_instance(self): return DBPuppet(id=self.id, username=self.username, displayname=self.displayname, - photo_id=self.photo_id) + photo_id=self.photo_id, is_bot=self.is_bot) @classmethod def from_db(cls, db_puppet): - return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname, db_puppet.photo_id, + return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname, db_puppet.photo_id, db_puppet.is_bot, db_instance=db_puppet) def save(self): self.db_instance.username = self.username self.db_instance.displayname = self.displayname self.db_instance.photo_id = self.photo_id + self.db_instance.is_bot = self.is_bot self.db.commit() def similarity(self, query): @@ -121,6 +123,8 @@ class Puppet: if isinstance(info.photo, UserProfilePhoto): changed = await self.update_avatar(source, info.photo.photo_big) or changed + self.is_bot = info.bot + if changed: self.save()