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.tgid = None
self.mxid = None
self.is_relaybot = False
async def _init_client(self):
self.log.debug(f"Initializing client for {self.name}")
+1
View File
@@ -41,6 +41,7 @@ class Bot(AbstractUser):
self.token = token
self.whitelisted = True
self.username = None
self.is_relaybot = True
self.chats = {chat.id: chat.type for chat in BotChat.query.all()}
self.tg_whitelist = []
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)
displayname = Column(String, nullable=True)
displayname_source = Column(Integer, nullable=True)
username = Column(String, nullable=True)
photo_id = Column(String, nullable=True)
is_bot = Column(Boolean, nullable=True)
+19 -5
View File
@@ -36,13 +36,14 @@ class Puppet:
hs_domain = None
cache = {}
def __init__(self, id=None, username=None, displayname=None, photo_id=None, is_bot=None,
db_instance=None):
def __init__(self, id=None, username=None, displayname=None, displayname_source=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.displayname_source = displayname_source
self.photo_id = photo_id
self.is_bot = is_bot
self._db_instance = db_instance
@@ -64,16 +65,19 @@ class Puppet:
def new_db_instance(self):
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
def from_db(cls, db_puppet):
return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname, db_puppet.photo_id,
db_puppet.is_bot, db_instance=db_puppet)
return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname,
db_puppet.displayname_source, 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.displayname_source = self.displayname_source
self.db_instance.photo_id = self.photo_id
self.db_instance.is_bot = self.is_bot
self.db.commit()
@@ -130,10 +134,20 @@ class Puppet:
self.save()
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)
if displayname != self.displayname:
await self.intent.set_display_name(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
async def update_avatar(self, source, photo):