Files
python-client-sdk/revolt/state.py
T
2021-10-17 02:47:07 +01:00

96 lines
2.9 KiB
Python
Executable File

from __future__ import annotations
from collections import deque
from typing import TYPE_CHECKING, Optional
from .channel import Channel, channel_factory
from .member import Member
from .message import Message
from .server import Server
from .user import User
if TYPE_CHECKING:
from .http import HttpClient
from .types import ApiInfo
from .types import Channel as ChannelPayload
from .types import Member as MemberPayload
from .types import Message as MessagePayload
from .types import Server as ServerPayload
from .types import User as UserPayload
__all__ = ("State",)
class State:
__slots__ = ("http", "api_info", "max_messages", "users", "channels", "servers", "messages")
def __init__(self, http: HttpClient, api_info: ApiInfo, max_messages: int):
self.http = http
self.api_info = api_info
self.max_messages = max_messages
self.users: dict[str, User] = {}
self.channels: dict[str, Channel] = {}
self.servers: dict[str, Server] = {}
self.messages: deque[Message] = deque()
def get_user(self, id: str) -> User:
return self.users[id]
def get_member(self, server_id: str, member_id: str) -> Member:
server = self.servers[server_id]
return server.get_member(member_id)
def get_channel(self, id: str) -> Channel:
return self.channels[id]
def get_server(self, id: str) -> Server:
return self.servers[id]
def add_user(self, payload: UserPayload) -> User:
user = User(payload, self)
self.users[user.id] = user
return user
def add_member(self, server_id: str, payload: MemberPayload) -> Member:
server = self.get_server(server_id)
member = Member(payload, server, self)
server._members[member.id] = member
return member
def add_channel(self, payload: ChannelPayload) -> Channel:
channel = channel_factory(payload, self)
self.channels[channel.id] = channel
return channel
def add_server(self, payload: ServerPayload) -> Server:
server = Server(payload, self)
self.servers[server.id] = server
return server
def add_message(self, payload: MessagePayload) -> Message:
message = Message(payload, self)
if len(self.messages) >= self.max_messages:
self.messages.pop()
self.messages.appendleft(message)
return message
def get_message(self, message_id: str) -> Message:
for msg in self.messages:
if msg.id == message_id:
return msg
raise KeyError
async def fetch_all_server_members(self):
for server_id in self.servers.keys():
data = await self.http.fetch_members(server_id)
for user in data["users"]:
self.add_user(user)
for member in data["members"]:
self.add_member(server_id, member)