From 7e0fb8ba19ddaa4afddc75e8457111cb88e7130a Mon Sep 17 00:00:00 2001 From: pixeldeee Date: Mon, 31 Jul 2023 23:40:46 +0300 Subject: [PATCH] Message create event --- pytecord/__init__.py | 1 + pytecord/client.py | 20 ++++++++++++++++---- pytecord/enums.py | 20 ++++++++++++++++++++ pytecord/guild.py | 34 ++++++++++++++++++---------------- pytecord/utils.py | 2 +- pytecord/web.py | 17 ++++++++++++----- 6 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 pytecord/enums.py diff --git a/pytecord/__init__.py b/pytecord/__init__.py index 97aed25..1537c07 100644 --- a/pytecord/__init__.py +++ b/pytecord/__init__.py @@ -1 +1,2 @@ from pytecord.client import Client +from pytecord.guild import Guild, GuildChannel, Message \ No newline at end of file diff --git a/pytecord/client.py b/pytecord/client.py index 1745df3..1eda46a 100644 --- a/pytecord/client.py +++ b/pytecord/client.py @@ -3,20 +3,32 @@ from typing import TYPE_CHECKING, Literal, Callable, Coroutine, Any +from pytecord.guild import Message +from pytecord.enums import GatewayIntents + if TYPE_CHECKING: from pytecord.web import GatewayOutput from pytecord.guild import Guild, GuildChannel class Client: - def __init__(self, token: str) -> None: - self.webhook = BaseWebhook(token) + def __init__(self, token: str, debug: bool = False) -> None: + self.webhook = BaseWebhook(token, debug) + self.token = token + self.__intents = 0 - def listen(self, name: Literal['ready']): + def listen(self, name: Literal['ready', 'message_create']): def decorator(func_to_decorate: Callable[..., Coroutine[Any, Any, Any]]): match name: case 'ready': async def func(data: 'GatewayOutput'): await func_to_decorate() + case 'message_create': + self.__intents += GatewayIntents.GUILD_MESSAGES + self.__intents += GatewayIntents.MESSAGE_CONTENT + self.__intents += GatewayIntents.DIRECT_MESSAGES + async def func(data: 'GatewayOutput'): + message = Message(data.d, self.token) + await func_to_decorate(message) self.webhook.add_event(name.upper(), func) @@ -30,6 +42,6 @@ def get_channel(self, id: int) -> 'GuildChannel': def run(self): try: - arun(self.webhook.run()) + arun(self.webhook.run(self.__intents)) except KeyboardInterrupt: exit(0) diff --git a/pytecord/enums.py b/pytecord/enums.py new file mode 100644 index 0000000..0d7b53b --- /dev/null +++ b/pytecord/enums.py @@ -0,0 +1,20 @@ +class GatewayIntents: + GUILDS = 1 << 0 + GUILD_MEMBERS = 1 << 1 + GUILD_MODERATION = 1 << 2 + GUILD_EMOJIS_AND_STICKERS = 1 << 3 + GUILD_INTEGRATIONS = 1 << 4 + GUILD_WEBHOOKS = 1 << 5 + GUILD_INVITES = 1 << 6 + GUILD_VOICE_STATES = 1 << 7 + GUILD_PRESENCES = 1 << 8 + GUILD_MESSAGES = 1 << 9 + GUILD_MESSAGE_REACTIONS = 1 << 10 + GUILD_MESSAGE_TYPING = 1 << 11 + DIRECT_MESSAGES = 1 << 12 + DIRECT_MESSAGE_REACTIONS = 1 << 13 + DIRECT_MESSAGE_TYPING = 1 << 14 + MESSAGE_CONTENT = 1 << 15 + GUILD_SCHEDULED_EVENTS = 1 << 16 + AUTO_MODERATION_CONFIGURATION = 1 << 20 + AUTO_MODERATION_EXECUTION = 1 << 21 \ No newline at end of file diff --git a/pytecord/guild.py b/pytecord/guild.py index 97f7f87..4f074c7 100644 --- a/pytecord/guild.py +++ b/pytecord/guild.py @@ -15,10 +15,10 @@ def __init__(self, data: dict[str, Any], token: str): self.owner_id = data.get('owner_id') self.permissions = data.get('permissions') self.region = data.get('region ') - self.afk_channel_id = int(data.get('afk_channel_id')) + self.afk_channel_id = int(x) if (x := data.get('afk_channel_id')) else None self.afk_timeout = data.get('afk_timeout') self.widget_enabled = data.get('widget_enabled') - self.widget_channel_id = int(data.get('widget_channel_id')) + self.widget_channel_id = int(x) if (x := data.get('widget_channel_id')) else None self.verification_level = data.get('verification_level') self.default_message_notifications = data.get('default_message_notifications') self.explicit_content_filter = data.get('explicit_content_filter') @@ -26,10 +26,10 @@ def __init__(self, data: dict[str, Any], token: str): self.emojis = data.get('emojis') self.features = data.get('features') self.mfa_level = data.get('mfa_level') - self.application_id = int(data.get('application_id')) - self.system_channel_id = int(data.get('system_channel_id')) + self.application_id = int(x) if (x := data.get('application_id')) else None + self.system_channel_id = int(x) if (x := data.get('application_id')) else None self.system_channel_flags = data.get('system_channel_flags') - self.rules_channel_id = int(data.get('rules_channel_id')) + self.rules_channel_id = int(x) if (x := data.get('rules_channel_id')) else None self.max_presences = data.get('max_presences') self.max_members = data.get('max_members') self.vanity_url_code = data.get('vanity_url_code') @@ -47,7 +47,7 @@ def __init__(self, data: dict[str, Any], token: str): self.nsfw_level = data.get('nsfw_level') 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.safety_alerts_channel_id = int(x) if (x := data.get('safety_alerts_channel_id')) else None self.__token = token self.__data = data @@ -94,16 +94,16 @@ def __init__(self, data: dict[str, Any], token: str): self.name = data.get('name') self.topic = data.get('topic') self.nsfw = data.get('nsfw') - self.last_message_id = int(data.get('last_message_id')) + self.last_message_id = int(x) if (x := data.get('last_message_id')) else None self.bitrate = data.get('bitrate') self.user_limit = data.get('user_limit') self.rate_limit_per_user = data.get('rate_limit_per_user') self.recipients = data.get('recipients') self.icon = data.get('icon') - self.owner_id = int(data.get('owner_id')) - self.application_id = data.get('application_id') + self.owner_id = int(x) if (x := data.get('owner_id')) else None + self.application_id = int(x) if (x := data.get('application_id')) else None self.managed = data.get('managed') - self.parent_id = int(data.get('parent_id')) + self.parent_id = int(x) if (x := data.get('parent_id')) else None self.last_pin_timestamp = data.get('last_pin_timestamp') self.rtc_region = data.get('rtc_region') self.video_quality_mode = data.get('video_quality_mode') @@ -122,14 +122,16 @@ def __init__(self, data: dict[str, Any], token: str): 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.__guild_id = int(x) if (x := data.get('guild_id')) else None 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 guild(self) -> Guild | None: + if self.__guild_id: + data = rget('guild', self.__guild_id, self.__token).json() + return Guild(data, self.__token) + return None def __int__(self) -> int: """ @@ -181,11 +183,11 @@ def __init__(self, data: dict[str, Any], token: str) -> None: self.reactions = data.get('reactions') self.nonce = data.get('nonce') self.pinned = data.get('pinned') - self.webhook_id = int(data.get('webhook_id')) + self.webhook_id = int(x) if (x := data.get('webhook_id')) else None self.type = data.get('type') self.activity = data.get('activity') self.application = data.get('application') - self.application_id = int(data.get('application_id')) + self.application_id = int(x) if (x := data.get('application_id')) else None self.message_reference = data.get('message_reference') self.flags = data.get('flags') self.referenced_message = data.get('referenced_message') diff --git a/pytecord/utils.py b/pytecord/utils.py index 47178f0..0b654bb 100644 --- a/pytecord/utils.py +++ b/pytecord/utils.py @@ -5,7 +5,7 @@ from pytecord.config import API_VERSION def get_headers(token: str): - return {'Authorization': f'Bot {token}'}} + 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: diff --git a/pytecord/web.py b/pytecord/web.py index 68e411c..937ca6b 100644 --- a/pytecord/web.py +++ b/pytecord/web.py @@ -70,6 +70,7 @@ def __init__( listener: BaseDataStreamListener, headers: dict, token: str, + debug: bool, intents: int = 0, afk: bool = False, status: str = 'online', @@ -79,6 +80,7 @@ def __init__( self._ws = None self.gateway_version = GATEWAY_VERSION self.headers = headers + self.debug = debug self.running = False @@ -132,10 +134,14 @@ async def check_events(self): ... else: continue + if self.debug: + print(f'DEBUG op:{data.op} s:{data.s} t:{data.t} d:{data.d}') await self.listener.listen(data) - async def run(self): + async def run(self, intents: int = None): self.running = True + if intents: + self.intents = intents async with ClientSession(headers=self.headers) as session: async with session.ws_connect( @@ -153,19 +159,20 @@ async def run(self): class BaseWebhook: - def __init__(self, token: str) -> None: + def __init__(self, token: str, debug: bool) -> None: self.token = token + self.debug = debug self.headers = {'Authorization': f'Bot {self.token}',} self.listener = DataStreamListener() - self.stream = DataStream(self.listener, self.headers, self.token) + self.stream = DataStream(self.listener, self.headers, self.token, self.debug) self.api_connector = ApiConnector(10) def add_event(self, event_type:str, function: Callable): self.listener.events[event_type] = function - async def run(self): - await self.stream.run() + async def run(self, intents: int = 0): + await self.stream.run(intents) def get_guild(self, id: int) -> 'Guild': from pytecord.guild import Guild