# -*- coding: utf-8 -*-
# cython: language_level=3
# Copyright (c) 2021-present VincentRPS
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE
from typing import Dict, List, Union
from .enums import FormatType
from .state import ConnectionState
from .user import User
def channel_parse(type, data: Dict, state: ConnectionState):
if type == 0:
return TextChannel(data, state)
elif type == 1:
return DMChannel(data, state)
elif type == 2:
return VoiceChannel(data, state)
elif type == 3:
return GroupDMChannel(data, state)
elif type == 4:
return Category(data, state)
elif type == 5:
return TextChannel(data, state)
elif type in (10, 11, 12):
return Thread(data, state)
elif type == 13:
return VoiceChannel(data, state)
else:
raise NotImplementedError('Channel is not a currently provided type')
[docs]class Category:
"""Represents a Discord Category
.. versionadded:: 0.8.0
Parameters
----------
data: :class:`dict`
The raw category data
state: :class:`state`
The connection state
"""
def __init__(self, data: Dict, state: ConnectionState):
self.from_dict = data
self.state = state
[docs] def permission_overwrites(self) -> List[Union[int, str]]:
"""Gives a list of permission overwrites
Returns
-------
list[:class:`str`]
list[:class:`int`]
"""
return self.from_dict['permission_overwrites']
@property
def position(self) -> int:
"""Gives the category position
Returns
-------
:class:`int`
"""
return self.from_dict['position']
@property
def id(self) -> int:
"""Gives the snowflake id of the channel
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def name(self) -> str:
"""Gives the name of the category
Returns
-------
:class:`str`
"""
return self.from_dict['name']
[docs] def guild_id(self) -> int:
"""Gives the guild' snowflake id
Returns
-------
:class:`int`
"""
return self.from_dict['guild_id']
[docs]class TextChannel:
"""Represents a Discord Text Channel
Parameters
----------
data: :class:`dict`
The raw json data
state: :class:`ConnectionState`
The connection state
"""
def __init__(self, data: Dict, state: ConnectionState):
self.from_dict = data
self.state = state
@property
def id(self) -> int:
"""Gives the channel' id
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def guild(self):
"""The guild this channel is in
Returns
-------
:class:`Guild`
"""
id = self.from_dict['guild_id']
raw = self.state.app.fetch_guild(guild_id=id)
return raw
@property
def guild_id(self) -> int:
"""Gives the guild id of the channel
Returns
-------
:class:`int`
"""
return self.from_dict['guild_id']
@property
def name(self) -> str:
"""Gives the name of the channel
Returns
-------
:class:`str`
"""
return self.from_dict['name']
@property
def position(self) -> int:
"""Gives the position of the channel
Returns
-------
:class:`int`
"""
return self.from_dict['position']
[docs] def permission_overwrites(self) -> List[Union[int, str]]:
"""Gives the permission overwrites of the channel"""
return self.from_dict['permission_overwrites']
@property
def nsfw(self) -> bool:
"""If the channel is nsfw
Returns
-------
:class:`bool`
"""
return self.from_dict['nsfw']
[docs] def topic(self) -> str:
"""Gives the channel' topic
Returns
-------
:class:`str`
"""
return self.from_dict['topic']
[docs] def last_message_id(self) -> int:
"""Gives the snowflake id of the last message
Returns
-------
:class:`int`
"""
return self.from_dict['last_message_id']
[docs] def category_id(self) -> int:
"""Gives the id of the category this channel is in
Returns
-------
:class:`int`
"""
return self.from_dict['parent_id']
[docs]class VoiceChannel:
"""Represents a Discord Voice Channel
.. versionadded:: 0.8.0
Parameters
----------
data: :class:`dict`
The raw channel data
state: :class:`ConnectionState`
The connection state
"""
def __init__(self, data: Dict, state: ConnectionState):
self.state = state
self.from_dict = data
@property
def id(self) -> int:
"""Gives the Voice Channel' Snowflake ID
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def guild(self):
"""The guild this channel is in
Returns
-------
:class:`Guild`
"""
id = self.from_dict['guild_id']
raw = self.state.app.fetch_guild(guild_id=id)
return raw
@property
def name(self) -> str:
"""The name of the voice channel
Returns
-------
:class:`str`
"""
return self.from_dict['name']
@property
def position(self) -> int:
"""The voice channel' position
Returns
-------
:class:`int`
"""
return self.from_dict['position']
def permission_overwrites(self) -> List[Union[int, str]]:
return self.from_dict['permission_overwrites']
[docs]class DMChannel:
"""Represents a Discord DM Channel
.. versionadded:: 0.8.0
Parameters
----------
data: :class:`dict`
The raw data
state: :class:`ConnectionState`
The connection state
"""
def __init__(self, data: Dict, state: ConnectionState):
self.from_dict = data
self.state = state
[docs] def last_message_id(self) -> int:
"""The snowflake id of the last message
Returns
-------
:class:`int`
"""
return self.from_dict['last_message_id']
@property
def id(self) -> int:
"""The snowflake id of the channel
Returns
-------
:class:`int`
"""
return self.from_dict['id']
[docs] def recipients(self):
"""The list of users in the channel
Returns
-------
List[:class:`User`]
"""
return [User(user_data) for user_data in self.from_dict['recipients']]
def parse_groupdm_icon(format: FormatType, group_id: int, group_icon_hash: str) -> str:
return f'https://cdn.discordapp.com/icons/{group_id}/{group_icon_hash}.{format}'
[docs]class GroupDMChannel(DMChannel):
"""Represents a Discord Group DM Channel
.. versionadded:: 0.8.0
Parameters
-----------
data: :class:`dict`
"""
[docs] def name(self) -> str:
"""Gives the name of the Group DM
Returns
-------
:class:`str`
"""
return self.from_dict['name']
[docs] def icon(self, format: FormatType = FormatType.PNG) -> str:
"""Gives the link of the channel' icon
Returns
-------
:class:`str`
"""
return parse_groupdm_icon(format, self.id, self.from_dict['icon'])
[docs] def owner(self) -> User:
"""Returns the User which is the owner of this Group DM
Returns
-------
:class:`User`
"""
user = self.state.app.factory.guilds.get_user(self.from_dict['owner'])
return User(user)
[docs]class Thread:
"""Represents a Discord Thread
.. versionadded:: 0.8.0
Parameters
----------
data: :class:`dict`
The raw thread data
state: :class:`ConnectionState`
The connection state
"""
def __init__(self, data: Dict, state: ConnectionState):
self.from_dict = data
self.state = state
@property
def id(self) -> int:
"""The thread' snowflake id
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def guild_id(self) -> int:
"""The guild id of the thread
Returns
-------
:class:`int`
"""
return self.from_dict['guild_id']
@property
def channel_id(self) -> int:
"""The channel id of the thread
Returns
-------
:class:`int`
"""
return self.from_dict['parent_id']
@property
def owner_id(self) -> int:
"""Gives the owner id of the Thread
Returns
-------
:class:`int`
"""
return self.from_dict['owner_id']
@property
def name(self) -> str:
"""Gives the name of the thread
Returns
-------
:class:`str`
"""
return self.from_dict['name']
[docs] def last_message_id(self) -> int:
"""Gives the last message id in the thread
Returns
-------
:class:`int`
"""
return self.from_dict['last_message_id']
[docs] def message_count(self) -> int:
"""Gives the amount of messages in the thread
Returns
-------
:class:`int`
"""
return self.from_dict['message_count']
[docs] def member_count(self) -> int:
"""Gives the thread' member count
Returns
-------
:class:`int`
"""
return self.from_dict['member_count']
@property
def metadata(self) -> 'ThreadMetadata':
"""Gives the thread' metadata
Returns
-------
:class:`ThreadMetadata`
"""
return ThreadMetadata(self.from_dict['thread_metadata'])
[docs]class ThreadMember:
"""Represents a Discord Thread Member
.. versionadded:: 0.8.0
Parameters
----------
data: :class:`dict`
The raw Member data
"""
def __init__(self, data: Dict):
self.from_dict = data
@property
def id(self) -> int:
"""Gives the thread id
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def user_id(self) -> int:
"""Gives the thread members user id
Returns
-------
:class:`int`
"""
return self.from_dict['user_id']
@property
def join_timestamp(self) -> str:
"""Gives the thread members join time
Returns
-------
:class:`str`
"""
return self.from_dict['join_timestamp']
@property
def flags(self) -> int:
"""Gives the thread members flags
Returns
-------
:class:`int`
"""
return self.from_dict['flags']
[docs]class StageInstance:
"""Represents a Discord Stage Instance
.. versionadded:: 0.8.0
Parameters
-----------
data: :class:`dict`
The raw stage instance data
"""
def __init__(self, data: Dict):
self.from_dict = data
@property
def id(self) -> int:
"""Gives the stage instance id
Returns
-------
:class:`int`
"""
return self.from_dict['id']
@property
def guild_id(self) -> int:
"""Gives the guild id of the stage instance
Returns
-------
:class:`int`
"""
return self.from_dict['guild_id']
@property
def channel_id(self) -> int:
"""Gives the channel id of the stage instance
Returns
-------
:class:`int`
"""
return self.from_dict['channel_id']
@property
def topic(self) -> str:
"""Gives the stage instance' topic
Returns
-------
:class:`str`
"""
return self.from_dict['topic']
[docs] def privacy_level(self) -> int:
"""Gives the stage instance' privacy level
Returns
-------
:class:`int`
"""
return self.from_dict['privacy_level']