mirror of
https://github.com/stoatchat/python-client-sdk.git
synced 2026-07-21 01:55:23 -04:00
fetch all members at startup
This commit is contained in:
@@ -32,6 +32,15 @@ class TextChannel(Channel, Messageable):
|
||||
super().__init__(data, state)
|
||||
Messageable.__init__(self, state)
|
||||
|
||||
class PartialTextChannel(Messageable):
|
||||
def __init__(self, channel_id: str, state: State):
|
||||
super().__init__(state)
|
||||
|
||||
self.id = channel_id
|
||||
self.name = "Unknown Channel"
|
||||
self.channel_type = "TextChannel"
|
||||
self.server = None
|
||||
|
||||
class VoiceChannel(Channel):
|
||||
def __init__(self, data: ChannelPayload, state: State):
|
||||
super().__init__(data, state)
|
||||
|
||||
+7
-1
@@ -1,6 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any, Optional, TYPE_CHECKING, Literal
|
||||
from typing import Any, Coroutine, Optional, TYPE_CHECKING, Literal, TypeVar
|
||||
import aiohttp
|
||||
import ulid
|
||||
|
||||
@@ -17,6 +17,9 @@ if TYPE_CHECKING:
|
||||
from .types import ApiInfo, Autumn as AutumnPayload, Message as MessagePayload, Embed as EmbedPayload, GetServerMembers
|
||||
from .file import File
|
||||
|
||||
T = TypeVar("T")
|
||||
Request = Coroutine[Any, Any, T]
|
||||
|
||||
class HttpClient:
|
||||
def __init__(self, session: aiohttp.ClientSession, token: str, api_url: str, api_info: ApiInfo):
|
||||
self.session = session
|
||||
@@ -95,3 +98,6 @@ class HttpClient:
|
||||
json["attachments"] = attachment_ids
|
||||
|
||||
return await self.request("POST", f"/channels/{channel}/messages", json=json)
|
||||
|
||||
def get_server_members(self, server_id: str) -> Request[GetServerMembers]:
|
||||
return self.request("GET", f"/servers/{server_id}/members")
|
||||
|
||||
+12
-3
@@ -2,16 +2,25 @@ from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from .user import User
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .state import State
|
||||
from .types import Member as MemberPayload
|
||||
from .server import Server
|
||||
|
||||
class Member:
|
||||
def flattern_user(member: Member, user: User):
|
||||
for attr in user.__flattern_attributes__:
|
||||
setattr(member, attr, getattr(user, attr))
|
||||
|
||||
class Member(User):
|
||||
def __init__(self, data: MemberPayload, server: Server, state: State):
|
||||
user = state.get_user(data["_id"]["user"])
|
||||
assert user
|
||||
flattern_user(self, user)
|
||||
|
||||
self._state = state
|
||||
self.id = data["_id"]
|
||||
self.id = data["_id"]["user"]
|
||||
self.nickname = data.get("nickname")
|
||||
self.roles = [server.get_role(role_id) for role_id in data.get("roles", [])]
|
||||
|
||||
self.server = server
|
||||
|
||||
+9
-7
@@ -1,11 +1,10 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from .asset import Asset
|
||||
from .embed import Embed
|
||||
from .channel import TextChannel
|
||||
from .channel import TextChannel, PartialTextChannel, Messageable
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .state import State
|
||||
@@ -16,14 +15,17 @@ class Message:
|
||||
self.state = state
|
||||
|
||||
self.id = data["_id"]
|
||||
self.content = data['content']
|
||||
self.attachments = [Asset(attachment, state) for attachment in data.get('attachments', [])]
|
||||
self.content = data["content"]
|
||||
self.attachments = [Asset(attachment, state) for attachment in data.get("attachments", [])]
|
||||
self.embeds = [Embed.from_dict(embed) for embed in data.get("embeds", [])]
|
||||
|
||||
self.channel = state.get_channel(data['channel'])
|
||||
channel = state.get_channel(data["channel"]) or PartialTextChannel(data["channel"], state)
|
||||
assert isinstance(channel, Messageable)
|
||||
self.channel = channel
|
||||
|
||||
self.server = self.channel and self.channel.server
|
||||
|
||||
if isinstance(self.channel, TextChannel) and self.server:
|
||||
self.author = state.get_member(self.server.id, data['author'])
|
||||
self.author = state.get_member(self.server.id, data["author"])
|
||||
else:
|
||||
self.author = state.get_user(data['author'])
|
||||
self.author = state.get_user(data["author"])
|
||||
|
||||
@@ -75,3 +75,13 @@ class State:
|
||||
|
||||
self.messages.appendleft(message)
|
||||
return message
|
||||
|
||||
async def fetch_all_server_members(self):
|
||||
for server_id in self.servers.keys():
|
||||
data = await self.http.get_server_members(server_id)
|
||||
|
||||
for user in data["users"]:
|
||||
self.add_user(user)
|
||||
|
||||
for member in data["members"]:
|
||||
self.add_member(server_id, member)
|
||||
|
||||
@@ -7,6 +7,8 @@ if TYPE_CHECKING:
|
||||
from .types import User as UserPayload
|
||||
|
||||
class User:
|
||||
__flattern_attributes__ = ("name", "bot", "owner", "badges", "online", "flags")
|
||||
|
||||
def __init__(self, data: UserPayload, state: State):
|
||||
self.state = state
|
||||
self.id = data["_id"]
|
||||
|
||||
Reference in New Issue
Block a user