mirror of
https://github.com/MelisaDev/melisa.git
synced 2024-11-11 19:07:28 +03:00
BREAKING CHANGE: new channels model parsing method
This commit is contained in:
parent
d192833508
commit
bdb4ffc074
3 changed files with 51 additions and 12 deletions
|
@ -6,9 +6,6 @@
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<a class="github-badge" href="https://scrutinizer-ci.com/g/MelisaDev/melisa/" tabindex="-1">
|
|
||||||
<img src="https://scrutinizer-ci.com/g/MelisaDev/melisa/badges/quality-score.png?b=master" alt="Scrutinizer" />
|
|
||||||
</a>
|
|
||||||
<a class="github-badge" href="https://melisa.readthedocs.io/en/latest/?badge=latest" tabindex="-1">
|
<a class="github-badge" href="https://melisa.readthedocs.io/en/latest/?badge=latest" tabindex="-1">
|
||||||
<img src="https://readthedocs.org/projects/melisa/badge/?version=latest" alt="Documentation Status"/>
|
<img src="https://readthedocs.org/projects/melisa/badge/?version=latest" alt="Documentation Status"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -28,6 +28,13 @@ if TYPE_CHECKING:
|
||||||
from .thread import ThreadMember, ThreadMetadata
|
from .thread import ThreadMember, ThreadMetadata
|
||||||
|
|
||||||
|
|
||||||
|
def _choose_channel_type(data):
|
||||||
|
data.update({"type": ChannelType(data.pop("type"))})
|
||||||
|
|
||||||
|
channel_cls = channel_types_for_converting.get(data["type"], NoneTypedChannel)
|
||||||
|
return channel_cls.from_dict(data)
|
||||||
|
|
||||||
|
|
||||||
class ChannelType(IntEnum):
|
class ChannelType(IntEnum):
|
||||||
"""Channel Type
|
"""Channel Type
|
||||||
NOTE: Type 10, 11 and 12 are only available in Discord API v9.
|
NOTE: Type 10, 11 and 12 are only available in Discord API v9.
|
||||||
|
@ -97,6 +104,8 @@ class VideoQualityModes(IntEnum):
|
||||||
class Channel(APIModelBase):
|
class Channel(APIModelBase):
|
||||||
"""Represents a guild or DM channel within Discord
|
"""Represents a guild or DM channel within Discord
|
||||||
|
|
||||||
|
**It will be never returned!**
|
||||||
|
|
||||||
Attributes
|
Attributes
|
||||||
----------
|
----------
|
||||||
id: :class:`~melisa.utils.types.Snowflake`
|
id: :class:`~melisa.utils.types.Snowflake`
|
||||||
|
@ -213,12 +222,9 @@ class Channel(APIModelBase):
|
||||||
headers={"X-Audit-Log-Reason": reason},
|
headers={"X-Audit-Log-Reason": reason},
|
||||||
)
|
)
|
||||||
|
|
||||||
data.update({"type": ChannelType(data.pop("type"))})
|
return _choose_channel_type(data)
|
||||||
|
|
||||||
channel_cls = channel_types_for_converting.get(data["type"], Channel)
|
async def delete(self, *, reason: Optional[str] = None):
|
||||||
return channel_cls.from_dict(data)
|
|
||||||
|
|
||||||
async def delete(self, *, reason: Optional[str] = None) -> Dict[str, Any]:
|
|
||||||
"""|coro|
|
"""|coro|
|
||||||
|
|
||||||
Delete a channel, or close a private message.
|
Delete a channel, or close a private message.
|
||||||
|
@ -247,7 +253,7 @@ class Channel(APIModelBase):
|
||||||
f"/channels/{self.id}", headers={"X-Audit-Log-Reason": reason}
|
f"/channels/{self.id}", headers={"X-Audit-Log-Reason": reason}
|
||||||
)
|
)
|
||||||
|
|
||||||
return Channel.from_dict(data)
|
return _choose_channel_type(data)
|
||||||
|
|
||||||
|
|
||||||
class MessageableChannel(Channel):
|
class MessageableChannel(Channel):
|
||||||
|
@ -602,7 +608,7 @@ class MessageableChannel(Channel):
|
||||||
count = 0
|
count = 0
|
||||||
|
|
||||||
async for message in iterator:
|
async for message in iterator:
|
||||||
message_ids.append(message["id"])
|
message_ids.append(message.id)
|
||||||
count += 1
|
count += 1
|
||||||
|
|
||||||
if count == 100:
|
if count == 100:
|
||||||
|
@ -678,6 +684,40 @@ class MessageableChannel(Channel):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class NoneTypedChannel(Channel):
|
||||||
|
"""It represents a channel, that is unknown,
|
||||||
|
so we don't know this type of the channel,
|
||||||
|
And also we can't convert it to something, but it has
|
||||||
|
every method, that Channel has.
|
||||||
|
|
||||||
|
You can use ``raw`` attribute to access to the original data,
|
||||||
|
returned from the discord.
|
||||||
|
|
||||||
|
Attributes
|
||||||
|
----------
|
||||||
|
id: :class:`~melisa.utils.snowflake.Snowflake`
|
||||||
|
Id of the channel
|
||||||
|
raw: Dict[:class:`str`, Any]
|
||||||
|
Raw value channel data (returned from the discord)
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, data: Dict[str, Any]):
|
||||||
|
"""Generate a channel with unknown type from the given data.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
data: :class:`dict`
|
||||||
|
The dictionary to convert into an unknown channel.
|
||||||
|
"""
|
||||||
|
self: NoneTypedChannel = super().__new__(cls)
|
||||||
|
|
||||||
|
self.id = data["id"]
|
||||||
|
self.raw = data
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
class TextChannel(MessageableChannel):
|
class TextChannel(MessageableChannel):
|
||||||
"""A subclass of ``Channel`` representing text channels with all the same attributes."""
|
"""A subclass of ``Channel`` representing text channels with all the same attributes."""
|
||||||
|
|
||||||
|
@ -960,5 +1000,8 @@ class ThreadsList(APIModelBase):
|
||||||
|
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
channel_types_for_converting: Dict[ChannelType, Channel] = {
|
channel_types_for_converting: Dict[ChannelType, Channel] = {
|
||||||
ChannelType.GUILD_TEXT: TextChannel
|
ChannelType.GUILD_TEXT: TextChannel,
|
||||||
|
ChannelType.GUILD_NEWS_THREAD: Thread,
|
||||||
|
ChannelType.GUILD_PUBLIC_THREAD: Thread,
|
||||||
|
ChannelType.GUILD_PRIVATE_THREAD: Thread
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,7 +320,6 @@ class Guild(APIModelBase):
|
||||||
system_channel_flags: APINullable[int] = UNDEFINED
|
system_channel_flags: APINullable[int] = UNDEFINED
|
||||||
rules_channel_id: APINullable[Snowflake] = UNDEFINED
|
rules_channel_id: APINullable[Snowflake] = UNDEFINED
|
||||||
joined_at: APINullable[Timestamp] = UNDEFINED
|
joined_at: APINullable[Timestamp] = UNDEFINED
|
||||||
# TODO: Deal with joined_at
|
|
||||||
|
|
||||||
large: APINullable[bool] = UNDEFINED
|
large: APINullable[bool] = UNDEFINED
|
||||||
unavailable: APINullable[bool] = UNDEFINED
|
unavailable: APINullable[bool] = UNDEFINED
|
||||||
|
|
Loading…
Reference in a new issue