2019-06-27 02:31:03 -04:00
|
|
|
from datetime import datetime
|
2019-07-02 22:22:29 -04:00
|
|
|
from enum import auto
|
2019-07-06 23:43:51 -04:00
|
|
|
from typing import List, Sequence, Type, Union
|
2019-06-27 02:31:03 -04:00
|
|
|
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
2019-07-02 22:22:29 -04:00
|
|
|
import nio
|
2019-07-06 22:35:42 -04:00
|
|
|
from nio.rooms import MatrixRoom
|
2019-07-02 22:22:29 -04:00
|
|
|
|
|
|
|
from .event import AutoStrEnum, Event
|
2019-06-27 02:31:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class RoomUpdated(Event):
|
2019-07-05 19:54:16 -04:00
|
|
|
user_id: str = field()
|
|
|
|
category: str = field()
|
|
|
|
room_id: str = field()
|
|
|
|
display_name: str = ""
|
|
|
|
avatar_url: str = ""
|
|
|
|
topic: str = ""
|
|
|
|
typing_members: Sequence[str] = ()
|
2019-07-06 23:43:51 -04:00
|
|
|
inviter_id: str = ""
|
2019-07-06 22:35:42 -04:00
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def from_nio(cls,
|
|
|
|
user_id: str,
|
|
|
|
category: str,
|
|
|
|
room: MatrixRoom,
|
2019-07-06 23:43:51 -04:00
|
|
|
info: nio.RoomInfo) -> "RoomUpdated":
|
2019-07-06 22:35:42 -04:00
|
|
|
|
|
|
|
typing: List[str] = []
|
|
|
|
|
|
|
|
if hasattr(info, "ephemeral"):
|
|
|
|
for ev in info.ephemeral:
|
|
|
|
if isinstance(ev, nio.TypingNoticeEvent):
|
|
|
|
typing = ev.users
|
|
|
|
|
|
|
|
name = room.name or room.canonical_alias
|
|
|
|
|
|
|
|
if not name:
|
|
|
|
name = room.group_name()
|
|
|
|
name = "" if name == "Empty room?" else name
|
|
|
|
|
|
|
|
return cls(
|
|
|
|
user_id = user_id,
|
|
|
|
category = category,
|
|
|
|
room_id = room.room_id,
|
|
|
|
display_name = name,
|
|
|
|
avatar_url = room.gen_avatar_url or "",
|
|
|
|
topic = room.topic or "",
|
|
|
|
inviter_id = getattr(room, "inviter", "") or "",
|
|
|
|
typing_members = typing,
|
|
|
|
)
|
2019-06-27 02:31:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class RoomDeleted(Event):
|
2019-06-28 18:12:45 -04:00
|
|
|
user_id: str = field()
|
|
|
|
category: str = field()
|
|
|
|
room_id: str = field()
|
2019-06-27 02:31:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class RoomMemberUpdated(Event):
|
|
|
|
room_id: str = field()
|
|
|
|
user_id: str = field()
|
|
|
|
typing: bool = field()
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class RoomMemberDeleted(Event):
|
|
|
|
room_id: str = field()
|
|
|
|
user_id: str = field()
|
2019-07-02 22:22:29 -04:00
|
|
|
|
|
|
|
|
|
|
|
# Timeline
|
|
|
|
|
|
|
|
class ContentType(AutoStrEnum):
|
|
|
|
html = auto()
|
|
|
|
image = auto()
|
|
|
|
audio = auto()
|
|
|
|
video = auto()
|
|
|
|
file = auto()
|
|
|
|
location = auto()
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class TimelineEventReceived(Event):
|
2019-07-03 21:20:49 -04:00
|
|
|
event_type: Type[nio.Event] = field()
|
|
|
|
room_id: str = field()
|
|
|
|
event_id: str = field()
|
|
|
|
sender_id: str = field()
|
|
|
|
date: datetime = field()
|
|
|
|
content: str = field()
|
|
|
|
content_type: ContentType = ContentType.html
|
|
|
|
is_local_echo: bool = False
|
2019-07-02 22:22:29 -04:00
|
|
|
|
|
|
|
show_name_line: bool = False
|
|
|
|
translatable: Union[bool, Sequence[str]] = True
|
|
|
|
|
2019-07-04 18:37:15 -04:00
|
|
|
target_user_id: str = ""
|
2019-07-02 22:22:29 -04:00
|
|
|
|
|
|
|
@classmethod
|
2019-07-06 22:35:42 -04:00
|
|
|
def from_nio(cls, room: MatrixRoom, ev: nio.Event, **fields
|
|
|
|
) -> "TimelineEventReceived":
|
2019-07-02 22:22:29 -04:00
|
|
|
return cls(
|
|
|
|
event_type = type(ev),
|
|
|
|
room_id = room.room_id,
|
|
|
|
event_id = ev.event_id,
|
|
|
|
sender_id = ev.sender,
|
|
|
|
date = datetime.fromtimestamp(ev.server_timestamp / 1000),
|
2019-07-04 18:37:15 -04:00
|
|
|
target_user_id = getattr(ev, "state_key", "") or "",
|
2019-07-02 22:22:29 -04:00
|
|
|
**fields
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class TimelineMessageReceived(TimelineEventReceived):
|
|
|
|
show_name_line: bool = True
|
|
|
|
translatable: Union[bool, Sequence[str]] = False
|