Skip to content
This repository has been archived by the owner on May 5, 2024. It is now read-only.

Commit

Permalink
Message create event
Browse files Browse the repository at this point in the history
  • Loading branch information
pixeldeee committed Jul 31, 2023
1 parent 6a49f0d commit 7e0fb8b
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 26 deletions.
1 change: 1 addition & 0 deletions pytecord/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from pytecord.client import Client
from pytecord.guild import Guild, GuildChannel, Message
20 changes: 16 additions & 4 deletions pytecord/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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)
20 changes: 20 additions & 0 deletions pytecord/enums.py
Original file line number Diff line number Diff line change
@@ -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
34 changes: 18 additions & 16 deletions pytecord/guild.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,21 @@ 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')
self.roles = data.get('roles')
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')
Expand All @@ -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
Expand Down Expand Up @@ -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')
Expand All @@ -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:
"""
Expand Down Expand Up @@ -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')
Expand Down
2 changes: 1 addition & 1 deletion pytecord/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
17 changes: 12 additions & 5 deletions pytecord/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def __init__(
listener: BaseDataStreamListener,
headers: dict,
token: str,
debug: bool,
intents: int = 0,
afk: bool = False,
status: str = 'online',
Expand All @@ -79,6 +80,7 @@ def __init__(
self._ws = None
self.gateway_version = GATEWAY_VERSION
self.headers = headers
self.debug = debug

self.running = False

Expand Down Expand Up @@ -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(
Expand All @@ -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
Expand Down

0 comments on commit 7e0fb8b

Please sign in to comment.