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
+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):