Add option to send bot messages as m.notice. Fixes #121
This commit is contained in:
@@ -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')
|
||||||
@@ -85,6 +85,8 @@ bridge:
|
|||||||
highlight_edits: false
|
highlight_edits: false
|
||||||
# Whether or not Matrix bot messages (type m.notice) should be bridged.
|
# Whether or not Matrix bot messages (type m.notice) should be bridged.
|
||||||
bridge_notices: true
|
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
|
# 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
|
# synced when they send messages. The maximum is 10000, after which the Telegram server
|
||||||
# will not send any more members.
|
# will not send any more members.
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ class Config(DictWithRecursion):
|
|||||||
copy("bridge.edits_as_replies")
|
copy("bridge.edits_as_replies")
|
||||||
copy("bridge.highlight_edits")
|
copy("bridge.highlight_edits")
|
||||||
copy("bridge.bridge_notices")
|
copy("bridge.bridge_notices")
|
||||||
|
copy("bridge.bot_messages_as_notices")
|
||||||
copy("bridge.max_initial_member_sync")
|
copy("bridge.max_initial_member_sync")
|
||||||
copy("bridge.max_telegram_delete")
|
copy("bridge.max_telegram_delete")
|
||||||
copy("bridge.allow_matrix_login")
|
copy("bridge.allow_matrix_login")
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ class Puppet(Base):
|
|||||||
displayname = Column(String, nullable=True)
|
displayname = Column(String, nullable=True)
|
||||||
username = Column(String, nullable=True)
|
username = Column(String, nullable=True)
|
||||||
photo_id = 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:<
|
# Fucking Telegram not telling bots what chats they are in 3:<
|
||||||
|
|||||||
@@ -1149,12 +1149,14 @@ class Portal:
|
|||||||
"m.relates_to": relates_to or None,
|
"m.relates_to": relates_to or None,
|
||||||
}, timestamp=evt.date, external_url=self.get_external_url(evt))
|
}, 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}")
|
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)
|
text, html, relates_to = await formatter.telegram_to_matrix(evt, source, self.main_intent)
|
||||||
await intent.set_typing(self.mxid, is_typing=False)
|
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,
|
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):
|
async def handle_telegram_edit(self, source, sender, evt):
|
||||||
if not self.mxid:
|
if not self.mxid:
|
||||||
@@ -1229,7 +1231,8 @@ class Portal:
|
|||||||
allowed_media) else None
|
allowed_media) else None
|
||||||
intent = sender.intent if sender else self.main_intent
|
intent = sender.intent if sender else self.main_intent
|
||||||
if not media and evt.message:
|
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:
|
elif media:
|
||||||
relates_to = formatter.telegram_reply_to_matrix(evt, source)
|
relates_to = formatter.telegram_reply_to_matrix(evt, source)
|
||||||
if isinstance(media, MessageMediaPhoto):
|
if isinstance(media, MessageMediaPhoto):
|
||||||
|
|||||||
@@ -36,13 +36,14 @@ class Puppet:
|
|||||||
hs_domain = None
|
hs_domain = None
|
||||||
cache = {}
|
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.id = id
|
||||||
self.mxid = self.get_mxid_from_id(self.id)
|
self.mxid = self.get_mxid_from_id(self.id)
|
||||||
|
|
||||||
self.username = username
|
self.username = username
|
||||||
self.displayname = displayname
|
self.displayname = displayname
|
||||||
self.photo_id = photo_id
|
self.photo_id = photo_id
|
||||||
|
self.is_bot = is_bot
|
||||||
self._db_instance = db_instance
|
self._db_instance = db_instance
|
||||||
|
|
||||||
self.intent = self.az.intent.user(self.mxid)
|
self.intent = self.az.intent.user(self.mxid)
|
||||||
@@ -62,17 +63,18 @@ class Puppet:
|
|||||||
|
|
||||||
def new_db_instance(self):
|
def new_db_instance(self):
|
||||||
return DBPuppet(id=self.id, username=self.username, displayname=self.displayname,
|
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
|
@classmethod
|
||||||
def from_db(cls, db_puppet):
|
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)
|
db_instance=db_puppet)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
self.db_instance.username = self.username
|
self.db_instance.username = self.username
|
||||||
self.db_instance.displayname = self.displayname
|
self.db_instance.displayname = self.displayname
|
||||||
self.db_instance.photo_id = self.photo_id
|
self.db_instance.photo_id = self.photo_id
|
||||||
|
self.db_instance.is_bot = self.is_bot
|
||||||
self.db.commit()
|
self.db.commit()
|
||||||
|
|
||||||
def similarity(self, query):
|
def similarity(self, query):
|
||||||
@@ -121,6 +123,8 @@ class Puppet:
|
|||||||
if isinstance(info.photo, UserProfilePhoto):
|
if isinstance(info.photo, UserProfilePhoto):
|
||||||
changed = await self.update_avatar(source, info.photo.photo_big) or changed
|
changed = await self.update_avatar(source, info.photo.photo_big) or changed
|
||||||
|
|
||||||
|
self.is_bot = info.bot
|
||||||
|
|
||||||
if changed:
|
if changed:
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user