Store member presence information

This commit is contained in:
miruka 2020-06-01 21:00:22 -04:00
parent e91a1f93e0
commit 50e17e950d
4 changed files with 46 additions and 3 deletions

View File

@ -39,7 +39,9 @@ from .errors import (
)
from .html_markdown import HTML_PROCESSOR as HTML
from .media_cache import Media, Thumbnail
from .models.items import Event, Member, Room, Upload, UploadStatus, ZeroDate
from .models.items import (
Event, Member, Presence, Room, Upload, UploadStatus, ZeroDate,
)
from .models.model_store import ModelStore
from .nio_callbacks import NioCallbacks
from .pyotherside_events import AlertRequested, LoopException
@ -1573,6 +1575,13 @@ class MatrixClient(nio.AsyncClient):
typing = user_id in room.typing_users,
power_level = member.power_level,
invited = member.invited,
last_active_ago = -1 if member.last_active_ago is None else
member.last_active_ago,
currently_active = member.currently_active or False,
presence = member.presence or Presence.Offline,
status_message = member.status_msg or "",
)
if member.display_name:

View File

@ -10,6 +10,7 @@ from typing import Any, Dict, List, Optional, Tuple, Type, Union
from uuid import UUID
import lxml # nosec
import nio
from ..utils import AutoStrEnum, auto
@ -28,6 +29,12 @@ class TypeSpecifier(AutoStrEnum):
MembershipChange = auto()
class Presence(AutoStrEnum):
Offline = auto() # can mean offline, invisible or unknwon
Unavailable = auto()
Online = auto()
@dataclass
class Account(ModelItem):
"""A logged in matrix account."""
@ -172,9 +179,16 @@ class Member(ModelItem):
power_level: int = 0
invited: bool = False
profile_updated: datetime = ZeroDate
last_read_event: str = ""
last_read_at: datetime = ZeroDate
last_active_ago: int = -1
currently_active: bool = False
presence: Presence = Presence.Offline
status_message: str = ""
def __lt__(self, other: "Member") -> bool:
"""Sort by power level, then by display name/user ID."""

View File

@ -11,7 +11,7 @@ from urllib.parse import quote
import nio
from .html_markdown import HTML_PROCESSOR
from .models.items import TypeSpecifier
from .models.items import Presence, TypeSpecifier
from .pyotherside_events import DevicesUpdated
from .utils import classes_defined_in, plain2html
@ -60,6 +60,8 @@ class NioCallbacks:
self.client.add_to_device_callback(method, event_class)
elif issubclass(event_class, nio.AccountDataEvent):
self.client.add_room_account_data_callback(method, event_class)
elif issubclass(event_class, nio.PresenceEvent):
self.client.add_presence_callback(method, event_class)
else:
self.client.add_event_callback(method, event_class)
@ -585,3 +587,19 @@ class NioCallbacks:
last_read_event = receipt.event_id,
last_read_at = datetime.fromtimestamp(timestamp),
)
# Presence event callbacks
async def onPresenceEvent(self, ev: nio.PresenceEvent) -> None:
for room_id in self.models[self.user_id, "rooms"]:
member = \
self.models[self.user_id, room_id, "members"].get(ev.user_id)
if member:
member.last_active_ago = \
-1 if ev.last_active_ago is None else ev.last_active_ago
member.currently_active = ev.currently_active or False
member.presence = ev.presence or Presence.Offline
member.status_message = ev.status_msg or ""

View File

@ -41,7 +41,9 @@ HTile {
SubtitleLabel {
tile: member
text: model.display_name ? model.id : ""
// text: model.display_name ? model.id : ""
text: [model.last_active_ago, model.currently_active,
model.presence, model.status_message].join(" | ")
color: theme.chat.roomPane.listView.member.subtitle
}
}