Add What I think are the basic event and content classes

Create skeleton room class
Create util classes for content
This commit is contained in:
Dusty Pianalto 2019-10-20 01:02:54 -08:00
parent a947e558bf
commit 804148dfe3
4 changed files with 262 additions and 1 deletions

133
lib/content.py Normal file
View File

@ -0,0 +1,133 @@
from dataclasses import dataclass, field
from typing import Optional, List, Dict
from .utils import EncryptedFile, ImageInfo, FileInfo, AudioInfo, VideoInfo, LocationInfo, PreviousRoom, Invite
@dataclass
class ContentBase:
pass
@dataclass
class MessageContentBase(ContentBase):
body: str
msgtype: str
@dataclass
class MTextContent(MessageContentBase):
format: Optional[str] = None
formatted_body: Optional[str] = None
msgtype = 'm.text'
@dataclass
class MEmoteContent(MTextContent):
msgtype = 'm.emote'
@dataclass
class MNoticeContent(MTextContent):
msgtype = 'm.notice'
@dataclass
class MImageContent(MessageContentBase):
msgtype = 'm.image'
info: ImageInfo
url: Optional[str] = None
file: Optional[EncryptedFile] = None
@dataclass
class MFileContent(MessageContentBase):
msgtype = 'm.file'
filename: str
info: FileInfo
url: Optional[str] = None
file: Optional[EncryptedFile] = None
@dataclass
class MAudioContent(MessageContentBase):
msgtype = 'm.audio'
info: AudioInfo
url: Optional[str] = None
file: Optional[EncryptedFile] = None
@dataclass
class MLocationContent(MessageContentBase):
msgtype = 'm.location'
geo_uri: str
info: LocationInfo
@dataclass
class MVideoContent(MessageContentBase):
msgtype = 'm.video'
info: VideoInfo
url: Optional[str] = None
file: Optional[EncryptedFile] = None
@dataclass
class PresenceContent(ContentBase):
presence: str
last_active_ago: int
currently_active: bool
avatar_url: Optional[str] = None
displayname: Optional[str] = None
status_message: Optional[str] = None
@dataclass
class MRoomAliasesContent(ContentBase):
aliases: List[str]
@dataclass
class MRoomCanonicalAliasContent(ContentBase):
alias: str
@dataclass
class MRoomCreateContent(ContentBase):
creator: str
room_version: Optional[str] = '1'
m_federate: Optional[bool] = True
predecessor: Optional[PreviousRoom] = None
@dataclass
class MRoomJoinRulesContent(ContentBase):
join_rule: str
@dataclass
class MRoomMemberContent(ContentBase):
membership: str
is_direct: bool
third_party_invite: Optional[Invite] = None
avatar_url: Optional[str] = None
displayname: str = None
@dataclass
class MRoomPowerLevelsContent(ContentBase):
ban: int = 50
events: Dict[str, int] = field(default_factory=dict)
events_default: int = 0
invite: int = 50
kick: int = 50
redact: int = 50
state_default: int = 50
users: Dict[str, int] = field(default_factory=dict)
users_default: int = 0
notifications: Dict[str, int] = field(default={'room': 50})
@dataclass
class MRoomRedactionContent(ContentBase):
reason: str

View File

@ -1 +1,39 @@
# TODO Add Event classes
from dataclasses import dataclass
from typing import Optional, List
from .room import Room
from .content import ContentBase
@dataclass
class EventBase:
content: ContentBase
type: str
sender: str
@dataclass
class UnsignedData:
age: int
redacted_because: Optional[EventBase] = None
transaction_id: Optional[str] = None
invite_room_state: Optional[List[EventBase]] = None
@dataclass
class RoomEvent(EventBase):
event_id: str
origin_server_id: int
unsigned: UnsignedData
room: Room
@dataclass
class StateEvent(RoomEvent):
state_key: str
prev_content: Optional[EventBase] = None
@dataclass
class RedactionEvent(RoomEvent):
redacts: EventBase

View File

@ -1 +1,6 @@
# TODO Add Room class
class Room:
def __init__(self, room_id: str):
self.id = room_id

85
lib/utils.py Normal file
View File

@ -0,0 +1,85 @@
from dataclasses import dataclass
from typing import Optional, List, Dict
@dataclass
class JSONWebKey:
key_opts: List[str]
k: str
ext: bool = True
alg: str = 'A256CTR'
kty: str = 'oct'
@dataclass
class EncryptedFile:
url: str
key: JSONWebKey
iv: str
hashes: Dict[str, str]
v: str = 'v2'
@dataclass
class ImageInfoBase:
h: int
w: int
mimetype: str
size: int
@dataclass
class ImageInfo(ImageInfoBase):
thumbnail_info: ImageInfoBase
thumbnail_url: Optional[str] = None
thumbnail_file: Optional[EncryptedFile] = None
@dataclass
class FileInfo:
mimetype: str
size: int
thumbnail_info: ImageInfoBase
thumbnail_url: Optional[str] = None
thumbnail_file: Optional[EncryptedFile] = None
@dataclass
class AudioInfo:
duration: int
mimetype: str
size: int
@dataclass
class LocationInfo:
thumbnail_info: ImageInfoBase
thumbnail_url: Optional[str] = None
thumbnail_file: Optional[EncryptedFile] = None
@dataclass
class VideoInfo(ImageInfoBase):
duration: int
thumbnail_info: ImageInfoBase
thumbnail_url: Optional[str] = None
thumbnail_file: Optional[EncryptedFile] = None
@dataclass
class PreviousRoom:
room_id: str
event_id: str
@dataclass
class Signed:
mxid: str
signatures: Dict[str, Dict[str, str]]
token: str
@dataclass
class Invite:
display_name: str
signed: Signed