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:
parent
a947e558bf
commit
804148dfe3
133
lib/content.py
Normal file
133
lib/content.py
Normal 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
|
||||||
@ -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
|
||||||
|
|||||||
@ -1 +1,6 @@
|
|||||||
# TODO Add Room class
|
# TODO Add Room class
|
||||||
|
|
||||||
|
|
||||||
|
class Room:
|
||||||
|
def __init__(self, room_id: str):
|
||||||
|
self.id = room_id
|
||||||
|
|||||||
85
lib/utils.py
Normal file
85
lib/utils.py
Normal 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
|
||||||
Loading…
x
Reference in New Issue
Block a user