Ensure first event for each rooms is a visible one

Dependening on the user's config, request for the first sync that
profile changes, membership changes or unknown events be filtered out.
This ensures we have something to show as the room subtitle (last
message) in the UI.
This commit is contained in:
miruka 2020-04-07 09:54:32 -04:00
parent aba2fd1b4b
commit a4c33f8edb
2 changed files with 33 additions and 7 deletions

View File

@ -16,8 +16,8 @@ from datetime import datetime, timedelta
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
from typing import ( from typing import (
TYPE_CHECKING, Any, ClassVar, DefaultDict, Dict, List, NamedTuple, TYPE_CHECKING, Any, ClassVar, Dict, List, NamedTuple, Optional, Set, Tuple,
Optional, Set, Tuple, Type, Union, Type, Union,
) )
from urllib.parse import urlparse from urllib.parse import urlparse
from uuid import UUID, uuid4 from uuid import UUID, uuid4
@ -109,6 +109,27 @@ class MatrixClient(nio.AsyncClient):
}, },
} }
no_profile_events_filter: ClassVar[Dict[str, Any]] = {
"room": {
"timeline": {"not_types": ["m.room.member"]},
},
}
no_unknown_events_filter: ClassVar[Dict[str, Any]] = {
"room": {
"timeline": {
"not_types": [
"m.room.message.feedback",
"m.room.pinned_events",
"m.call.*",
"m.room.third_part_invite",
"m.room.tombstone",
"m.reaction",
],
},
},
}
def __init__(self, def __init__(self,
backend, backend,
@ -155,8 +176,6 @@ class MatrixClient(nio.AsyncClient):
self.loaded_once_rooms: Set[str] = set() # {room_id} self.loaded_once_rooms: Set[str] = set() # {room_id}
self.cleared_events_rooms: Set[str] = set() # {room_id} self.cleared_events_rooms: Set[str] = set() # {room_id}
self.skipped_events: DefaultDict[str, int] = DefaultDict(lambda: 0)
self.nio_callbacks = NioCallbacks(self) self.nio_callbacks = NioCallbacks(self)
@ -299,6 +318,16 @@ class MatrixClient(nio.AsyncClient):
filter1 = deepcopy(self.lazy_load_filter) filter1 = deepcopy(self.lazy_load_filter)
utils.dict_update_recursive(filter1, self.limit_1_filter) utils.dict_update_recursive(filter1, self.limit_1_filter)
cfg = self.backend.ui_settings
if cfg["hideProfileChangeEvents"] or cfg["hideMembershipEvents"]:
utils.dict_update_recursive(filter1, self.no_profile_events_filter)
if cfg["hideUnknownEvents"]:
filter1["room"]["timeline"]["not_types"].extend(
self.no_unknown_events_filter["room"]["timeline"]["not_types"],
)
while True: while True:
try: try:
self.sync_task = asyncio.ensure_future(self.sync_forever( self.sync_task = asyncio.ensure_future(self.sync_forever(

View File

@ -264,7 +264,6 @@ class NioCallbacks:
# Membership changes # Membership changes
if not prev or membership != prev_membership: if not prev or membership != prev_membership:
if self.client.backend.ui_settings["hideMembershipEvents"]: if self.client.backend.ui_settings["hideMembershipEvents"]:
self.client.skipped_events[room.room_id] += 1
return None return None
reason = f", reason: {now['reason']}" if now.get("reason") else "" reason = f", reason: {now['reason']}" if now.get("reason") else ""
@ -327,7 +326,6 @@ class NioCallbacks:
account.avatar_url = now.get("avatar_url") or "" account.avatar_url = now.get("avatar_url") or ""
if self.client.backend.ui_settings["hideProfileChangeEvents"]: if self.client.backend.ui_settings["hideProfileChangeEvents"]:
self.client.skipped_events[room.room_id] += 1
return None return None
return ( return (
@ -419,7 +417,6 @@ class NioCallbacks:
async def onUnknownEvent(self, room, ev) -> None: async def onUnknownEvent(self, room, ev) -> None:
if self.client.backend.ui_settings["hideUnknownEvents"]: if self.client.backend.ui_settings["hideUnknownEvents"]:
self.client.skipped_events[room.room_id] += 1
return return
co = f"%1 sent an unsupported <b>{ev.type}</b> event" co = f"%1 sent an unsupported <b>{ev.type}</b> event"