From 6a49f0da649b7d4a045f955e5c01e349e7b7a914 Mon Sep 17 00:00:00 2001 From: pixeldeee Date: Mon, 31 Jul 2023 00:24:47 +0300 Subject: [PATCH] Better support for Guild, GuildChannel, Message --- pytecord/client.py | 7 +++ pytecord/config.py | 2 + pytecord/guild.py | 144 ++++++++++++++++++++++++++++++++++++++++++--- pytecord/utils.py | 13 ++++ pytecord/web.py | 24 ++++++-- 5 files changed, 177 insertions(+), 13 deletions(-) create mode 100644 pytecord/config.py create mode 100644 pytecord/utils.py diff --git a/pytecord/client.py b/pytecord/client.py index 576ca8c..1745df3 100644 --- a/pytecord/client.py +++ b/pytecord/client.py @@ -5,6 +5,7 @@ if TYPE_CHECKING: from pytecord.web import GatewayOutput + from pytecord.guild import Guild, GuildChannel class Client: def __init__(self, token: str) -> None: @@ -20,6 +21,12 @@ async def func(data: 'GatewayOutput'): self.webhook.add_event(name.upper(), func) return decorator + + def get_guild(self, id: int) -> 'Guild': + return self.webhook.get_guild(id) + + def get_channel(self, id: int) -> 'GuildChannel': + return self.webhook.get_channel(id) def run(self): try: diff --git a/pytecord/config.py b/pytecord/config.py new file mode 100644 index 0000000..6233c8f --- /dev/null +++ b/pytecord/config.py @@ -0,0 +1,2 @@ +GATEWAY_VERSION = 10 +API_VERSION = 10 \ No newline at end of file diff --git a/pytecord/guild.py b/pytecord/guild.py index a632105..97f7f87 100644 --- a/pytecord/guild.py +++ b/pytecord/guild.py @@ -1,18 +1,17 @@ from typing import Any from pytecord.interfaces import Object +from pytecord.utils import rget class Guild(Object): - def __init__(self, data: dict[str, Any]): - self.data = data - + def __init__(self, data: dict[str, Any], token: str): self.id = int(data.get('id')) self.name = data.get('name') self.icon = data.get('icon') self.icon_hash = data.get('icon_hash') self.splash = data.get('splash') self.discovery_splash = data.get('discovery_splash') - self.owner = data.get('owner ') + self.owner = data.get('owner') self.owner_id = data.get('owner_id') self.permissions = data.get('permissions') self.region = data.get('region ') @@ -49,6 +48,9 @@ def __init__(self, data: dict[str, Any]): self.stickers = data.get('stickers') self.premium_progress_bar_enabled = data.get('premium_progress_bar_enabled') self.safety_alerts_channel_id = int(data.get('safety_alerts_channel_id')) + + self.__token = token + self.__data = data def __int__(self) -> int: """ @@ -61,22 +63,32 @@ def __int__(self) -> int: """ return self.id + def __str__(self) -> str: + """ + Returns a guild name + + ``` + >>> guild = Guild() + >>> str(guild) + ``` + """ + return self.name + def eval(self) -> dict[str, Any]: """ - Returns a dict representation of object + Returns a dict representation of guild ``` >>> guild = Guild() >>> guild.eval() ``` """ - return self.data + return self.__data class GuildChannel(Object): - def __init__(self, data: dict[str, Any]): + def __init__(self, data: dict[str, Any], token: str): self.id = int(data.get('id')) self.type = data.get('type') - self.guild_id = int(data.get('guild_id')) self.position = data.get('position') self.permission_overwrites = data.get('permission_overwrites') self.name = data.get('name') @@ -110,5 +122,119 @@ def __init__(self, data: dict[str, Any]): self.default_sort_order = data.get('default_sort_order') self.default_forum_layout = data.get('default_forum_layout') + self.__guild_id = int(data.get('guild_id')) + self.__token = token + self.__data = data + + @property + def guild(self) -> Guild: + data = rget('guild', self.__guild_id, self.__token).json() + return Guild(data, self.__token) + + def __int__(self) -> int: + """ + Returns a channel id + + ``` + >>> channel = GuildChannel() + >>> int(channel) + ``` + """ + return self.id + + def __str__(self) -> str: + """ + Returns a channel name + + ``` + >>> channel = GuildChannel() + >>> str(channel) + ``` + """ + return self.name + + def eval(self) -> dict[str, Any]: + """ + Returns a dict representation of channel + + ``` + >>> channel = GuildChannel() + >>> channel.eval() + ``` + """ + return self.__data + class Message: - ... \ No newline at end of file + def __init__(self, data: dict[str, Any], token: str) -> None: + self.id = int(data.get('id')) + self.author = data.get('author') + self.content = data.get('content') + self.timestamp = data.get('timestamp') + self.edited_timestamp = data.get('edited_timestamp') + self.tts = data.get('tts') + self.mention_everyone = data.get('mention_everyone') + self.mentions = data.get('mentions') + self.mention_roles = data.get('mention_roles') + self.mention_channels = data.get('mention_channels') + self.attachments = data.get('attachments') + self.embeds = data.get('embeds') + self.reactions = data.get('reactions') + self.nonce = data.get('nonce') + self.pinned = data.get('pinned') + self.webhook_id = int(data.get('webhook_id')) + self.type = data.get('type') + self.activity = data.get('activity') + self.application = data.get('application') + self.application_id = int(data.get('application_id')) + self.message_reference = data.get('message_reference') + self.flags = data.get('flags') + self.referenced_message = data.get('referenced_message') + self.interaction = data.get('interaction') + self.thread = data.get('thread') + self.components = data.get('components') + self.sticker_items = data.get('sticker_items') + self.stickers = data.get('stickers') + self.position = data.get('position') + self.role_subscription_data = data.get('role_subscription_data') + + self.__channel_id = data.get('channel_id') + self.__token = token + self.__data = data + + @property + def channel(self) -> GuildChannel: + data = rget('channel', self.__channel_id, self.__token).json() + return GuildChannel(data, self.__token) + + def __int__(self) -> int: + """ + Returns a message id + + ``` + >>> message = Message() + >>> int(message) + ``` + """ + return self.id + + def __str__(self) -> str: + """ + Returns a message content + + ``` + >>> message = Message() + >>> str(message) + ``` + """ + return self.content + + def eval(self) -> dict[str, Any]: + """ + Returns a dict representation of channel + + ``` + >>> message = Message() + >>> message.eval() + ``` + """ + return self.__data diff --git a/pytecord/utils.py b/pytecord/utils.py new file mode 100644 index 0000000..47178f0 --- /dev/null +++ b/pytecord/utils.py @@ -0,0 +1,13 @@ +from requests import get, post + +from typing import Literal, Any + +from pytecord.config import API_VERSION + +def get_headers(token: str): + return {'Authorization': f'Bot {token}'}} + +def rget(what_to_get: Literal['channel', 'guild', 'user'], id: int, token: str = None, headers: dict[str, Any] = None): + if token: + headers = get_headers(token) + return get(f'https://discord.com/api/v{API_VERSION}/{what_to_get}s/{id}', headers=headers) \ No newline at end of file diff --git a/pytecord/web.py b/pytecord/web.py index 4948dd6..68e411c 100644 --- a/pytecord/web.py +++ b/pytecord/web.py @@ -1,11 +1,16 @@ from pytecord.interfaces import BaseDataStreamListener -from typing import Callable, Coroutine, Any +from typing import Callable, Coroutine, Any, TYPE_CHECKING from aiohttp import ClientSession from datetime import datetime from time import mktime from asyncio import gather, create_task from asyncio import sleep as asleep +from pytecord.config import GATEWAY_VERSION +from pytecord.utils import rget + +if TYPE_CHECKING: + from pytecord.guild import Guild, GuildChannel class ApiRequest: ... @@ -63,7 +68,6 @@ class DataStream: def __init__( self, listener: BaseDataStreamListener, - gateway_version: int, headers: dict, token: str, intents: int = 0, @@ -73,7 +77,7 @@ def __init__( ) -> None: self.listener = listener self._ws = None - self.gateway_version = gateway_version + self.gateway_version = GATEWAY_VERSION self.headers = headers self.running = False @@ -154,7 +158,7 @@ def __init__(self, token: str) -> None: self.headers = {'Authorization': f'Bot {self.token}',} self.listener = DataStreamListener() - self.stream = DataStream(self.listener, 10, self.headers, self.token) + self.stream = DataStream(self.listener, self.headers, self.token) self.api_connector = ApiConnector(10) def add_event(self, event_type:str, function: Callable): @@ -162,3 +166,15 @@ def add_event(self, event_type:str, function: Callable): async def run(self): await self.stream.run() + + def get_guild(self, id: int) -> 'Guild': + from pytecord.guild import Guild + + data = rget('guild', id, self.token).json() + return Guild(data, self.token) + + def get_channel(self, id: int) -> 'GuildChannel': + from pytecord.guild import GuildChannel + + data = rget('channel', id, self.token).json() + return GuildChannel(data, self.token)