Initial solution and database update for #11

The database now contains a displayname_source field which is the
telegram user ID of the user whose point of view the displayname
is from.

Updates from the relaybot user always take precendence, but currently
the relaybot will never automatically fetch displaynames.
This commit is contained in:
Tulir Asokan
2018-05-19 17:16:42 +03:00
parent 0833850f4f
commit 1f5261ff8f
5 changed files with 45 additions and 5 deletions
@@ -0,0 +1,23 @@
"""Add displayname source fields for puppets
Revision ID: bcfefa1f1299
Revises: bdadd173ee02
Create Date: 2018-05-19 17:00:21.078098
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'bcfefa1f1299'
down_revision = 'bdadd173ee02'
branch_labels = None
depends_on = None
def upgrade():
op.add_column('puppet', sa.Column('displayname_source', sa.Integer(), nullable=True))
def downgrade():
op.drop_column('puppet', 'displayname_source')
+1
View File
@@ -42,6 +42,7 @@ class AbstractUser:
self.client = None self.client = None
self.tgid = None self.tgid = None
self.mxid = None self.mxid = None
self.is_relaybot = False
async def _init_client(self): async def _init_client(self):
self.log.debug(f"Initializing client for {self.name}") self.log.debug(f"Initializing client for {self.name}")
+1
View File
@@ -41,6 +41,7 @@ class Bot(AbstractUser):
self.token = token self.token = token
self.whitelisted = True self.whitelisted = True
self.username = None self.username = None
self.is_relaybot = True
self.chats = {chat.id: chat.type for chat in BotChat.query.all()} self.chats = {chat.id: chat.type for chat in BotChat.query.all()}
self.tg_whitelist = [] self.tg_whitelist = []
self.whitelist_group_admins = config["bridge.relaybot.whitelist_group_admins"] or False self.whitelist_group_admins = config["bridge.relaybot.whitelist_group_admins"] or False
+1
View File
@@ -92,6 +92,7 @@ class Puppet(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
displayname = Column(String, nullable=True) displayname = Column(String, nullable=True)
displayname_source = Column(Integer, 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) is_bot = Column(Boolean, nullable=True)
+19 -5
View File
@@ -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, is_bot=None, def __init__(self, id=None, username=None, displayname=None, displayname_source=None,
db_instance=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.displayname_source = displayname_source
self.photo_id = photo_id self.photo_id = photo_id
self.is_bot = is_bot self.is_bot = is_bot
self._db_instance = db_instance self._db_instance = db_instance
@@ -64,16 +65,19 @@ 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, is_bot=self.is_bot) displayname_source=self.displayname_source, 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.is_bot, db_instance=db_puppet) db_puppet.displayname_source, db_puppet.photo_id, db_puppet.is_bot,
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.displayname_source = self.displayname_source
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_instance.is_bot = self.is_bot
self.db.commit() self.db.commit()
@@ -130,10 +134,20 @@ class Puppet:
self.save() self.save()
async def update_displayname(self, source, info): async def update_displayname(self, source, info):
ignore_source = (not source.is_relaybot
and self.displayname_source is not None
and self.displayname_source != source.tgid)
if ignore_source:
return
displayname = self.get_displayname(info) displayname = self.get_displayname(info)
if displayname != self.displayname: if displayname != self.displayname:
await self.intent.set_display_name(displayname) await self.intent.set_display_name(displayname)
self.displayname = displayname self.displayname = displayname
self.displayname_source = source.tgid
return True
elif source.is_relaybot or self.displayname_source is None:
self.displayname_source = source.tgid
return True return True
async def update_avatar(self, source, photo): async def update_avatar(self, source, photo):