Compare commits

...

3 Commits

Author SHA1 Message Date
Joe Groocock
daf7d2dedd
Merge b0bd20ea7f into 472fb9f6ac 2024-09-26 18:23:37 +00:00
Tulir Asokan
472fb9f6ac Remove outdated comment
[skip ci]
2024-09-08 00:58:55 +03:00
Joe Groocock
b0bd20ea7f
Don't update displayname/avatar when unset
Avoid sending no-op updates to the homeserver when there is no
displayname or avatar_url set. The database stores these as empty
strings, but the homeserver returns them as None, so when compared they
appear different and permit an update.

This is a workaround that should fix https://github.com/maubot/maubot/issues/235
by coercing empty strings that are stored in the database to/from
null/None values during saves/loads.

Signed-off-by: Joe Groocock <me@frebib.net>
2024-04-22 22:15:16 +00:00
3 changed files with 10 additions and 11 deletions

View File

@ -105,8 +105,8 @@ class Client(DBClient):
sync=bool(sync), sync=bool(sync),
autojoin=bool(autojoin), autojoin=bool(autojoin),
online=bool(online), online=bool(online),
displayname=displayname, displayname=(displayname if displayname != "" else None),
avatar_url=avatar_url, avatar_url=(avatar_url if avatar_url != "" else None),
) )
self._postinited = False self._postinited = False
@ -287,9 +287,9 @@ class Client(DBClient):
) )
) )
await self.update() await self.update()
if self.displayname != "disable": if self.displayname not in ("disable", None):
await self.client.set_displayname(self.displayname) await self.client.set_displayname(self.displayname)
if self.avatar_url != "disable": if self.avatar_url not in ("disable", None):
await self.client.set_avatar_url(self.avatar_url) await self.client.set_avatar_url(self.avatar_url)
if self.crypto: if self.crypto:
await self._start_crypto() await self._start_crypto()
@ -376,7 +376,7 @@ class Client(DBClient):
await self.update() await self.update()
async def update_displayname(self, displayname: str | None, save: bool = True) -> None: async def update_displayname(self, displayname: str | None, save: bool = True) -> None:
if displayname is None or displayname == self.displayname: if displayname == self.displayname:
return return
self.displayname = displayname self.displayname = displayname
if self.displayname != "disable": if self.displayname != "disable":
@ -387,7 +387,7 @@ class Client(DBClient):
await self.update() await self.update()
async def update_avatar_url(self, avatar_url: ContentURI, save: bool = True) -> None: async def update_avatar_url(self, avatar_url: ContentURI, save: bool = True) -> None:
if avatar_url is None or avatar_url == self.avatar_url: if avatar_url == self.avatar_url:
return return
self.avatar_url = avatar_url self.avatar_url = avatar_url
if self.avatar_url != "disable": if self.avatar_url != "disable":

View File

@ -44,8 +44,8 @@ class Client(SyncStore):
autojoin: bool autojoin: bool
online: bool online: bool
displayname: str displayname: str | None
avatar_url: ContentURI avatar_url: ContentURI | None
@classmethod @classmethod
def _from_row(cls, row: Record | None) -> Client | None: def _from_row(cls, row: Record | None) -> Client | None:
@ -71,8 +71,8 @@ class Client(SyncStore):
self.sync, self.sync,
self.autojoin, self.autojoin,
self.online, self.online,
self.displayname, self.displayname or "",
self.avatar_url, self.avatar_url or "",
) )
@classmethod @classmethod

View File

@ -1,5 +1,4 @@
# The full URI to the database. SQLite and Postgres are fully supported. # The full URI to the database. SQLite and Postgres are fully supported.
# Other DBMSes supported by SQLAlchemy may or may not work.
# Format examples: # Format examples:
# SQLite: sqlite:filename.db # SQLite: sqlite:filename.db
# Postgres: postgresql://username:password@hostname/dbname # Postgres: postgresql://username:password@hostname/dbname