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:
@@ -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')
|
||||||
@@ -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}")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user