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>
This commit is contained in:
Joe Groocock 2024-04-22 23:15:16 +01:00
parent 91f214819a
commit b0bd20ea7f
No known key found for this signature in database
GPG Key ID: A5571FCDC53ADDE6
2 changed files with 10 additions and 10 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