committed by
GitHub
18 changed files with 1349 additions and 75 deletions
@ -0,0 +1,192 @@ |
|||
""" |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2021-present Dolfies |
|||
|
|||
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 __future__ import annotations |
|||
|
|||
from typing import TYPE_CHECKING, Optional, Union |
|||
|
|||
from .enums import DirectoryCategory, DirectoryEntryType, try_enum |
|||
from .scheduled_event import ScheduledEvent |
|||
from .utils import MISSING, parse_time |
|||
|
|||
if TYPE_CHECKING: |
|||
from datetime import datetime |
|||
|
|||
from .channel import DirectoryChannel |
|||
from .member import Member |
|||
from .state import ConnectionState |
|||
from .types.directory import ( |
|||
DirectoryEntry as DirectoryEntryPayload, |
|||
PartialDirectoryEntry as PartialDirectoryEntryPayload, |
|||
) |
|||
|
|||
__all__ = ('DirectoryEntry',) |
|||
|
|||
|
|||
class DirectoryEntry: |
|||
"""Represents a directory entry for a channel. |
|||
|
|||
.. container:: operations |
|||
|
|||
.. describe:: x == y |
|||
|
|||
Checks if two entries are equal. |
|||
|
|||
.. describe:: x != y |
|||
|
|||
Checks if two entries are not equal. |
|||
|
|||
.. describe:: hash(x) |
|||
|
|||
Returns the entry's hash. |
|||
|
|||
.. versionadded:: 2.1 |
|||
|
|||
Attributes |
|||
----------- |
|||
channel: :class:`DirectoryChannel` |
|||
The channel this entry is from. |
|||
type: :class:`DirectoryEntryType` |
|||
The type of this entry. |
|||
category: :class:`DirectoryCategory` |
|||
The primary category of this entry. |
|||
author_id: :class:`int` |
|||
The ID of the user who created this entry. |
|||
created_at: :class:`datetime.datetime` |
|||
When this entry was created. |
|||
description: Optional[:class:`str`] |
|||
The description of the entry's guild. |
|||
Only applicable for entries of type :attr:`DirectoryEntryType.guild`. |
|||
entity_id: :class:`int` |
|||
The ID of the entity this entry represents. |
|||
guild: Optional[:class:`Guild`] |
|||
The guild this entry represents. |
|||
For entries of type :attr:`DirectoryEntryType.scheduled_event`, |
|||
this is the guild the scheduled event is from. |
|||
Not available in all contexts. |
|||
featurable: :class:`bool` |
|||
Whether this entry's guild can be featured in the directory. |
|||
Only applicable for entries of type :attr:`DirectoryEntryType.guild`. |
|||
scheduled_event: Optional[:class:`ScheduledEvent`] |
|||
The scheduled event this entry represents. |
|||
Only applicable for entries of type :attr:`DirectoryEntryType.scheduled_event`. |
|||
rsvp: :class:`bool` |
|||
Whether the current user has RSVP'd to the scheduled event. |
|||
Only applicable for entries of type :attr:`DirectoryEntryType.scheduled_event`. |
|||
""" |
|||
|
|||
def __init__( |
|||
self, |
|||
*, |
|||
data: Union[DirectoryEntryPayload, PartialDirectoryEntryPayload], |
|||
state: ConnectionState, |
|||
channel: DirectoryChannel, |
|||
): |
|||
self.channel = channel |
|||
self._state = state |
|||
self._update(data) |
|||
|
|||
def __repr__(self) -> str: |
|||
return f'<DirectoryEntry channel={self.channel!r} type={self.type!r} category={self.category!r} author_id={self.author_id!r} guild={self.guild!r}>' |
|||
|
|||
def __hash__(self) -> int: |
|||
return hash((self.channel.id, self.entity_id)) |
|||
|
|||
def __eq__(self, other: object) -> bool: |
|||
if isinstance(other, DirectoryEntry): |
|||
return self.channel == other.channel and self.entity_id == other.entity_id |
|||
return NotImplemented |
|||
|
|||
def _update(self, data: Union[DirectoryEntryPayload, PartialDirectoryEntryPayload]): |
|||
from .guild import Guild |
|||
|
|||
state = self._state |
|||
self.type: DirectoryEntryType = try_enum(DirectoryEntryType, data['type']) |
|||
self.category: DirectoryCategory = try_enum(DirectoryCategory, data.get('primary_category_id', 0)) |
|||
self.author_id: int = int(data['author_id']) |
|||
self.created_at: datetime = parse_time(data['created_at']) |
|||
self.description: Optional[str] = data.get('description') or None |
|||
self.entity_id: int = int(data['entity_id']) |
|||
|
|||
guild_data = data.get('guild', data.get('guild_scheduled_event', {}).get('guild')) |
|||
self.guild: Optional[Guild] = Guild(data=guild_data, state=state) if guild_data is not None else None |
|||
self.featurable: bool = guild_data.get('featurable_in_directory', False) if guild_data is not None else False |
|||
|
|||
event_data = data.get('guild_scheduled_event') |
|||
self.scheduled_event: Optional[ScheduledEvent] = ( |
|||
ScheduledEvent(data=event_data, state=state) if event_data is not None else None |
|||
) |
|||
self.rsvp: bool = event_data.get('user_rsvp', False) if event_data is not None else False |
|||
|
|||
@property |
|||
def author(self) -> Optional[Member]: |
|||
"""Optional[:class:`Member`]: The member that created this entry.""" |
|||
return self.channel.guild.get_member(self.author_id) |
|||
|
|||
async def edit(self, *, description: Optional[str] = MISSING, category: DirectoryCategory = MISSING) -> None: |
|||
"""|coro| |
|||
|
|||
Edits this directory entry. |
|||
Only entries of type :attr:`DirectoryEntryType.guild` can be edited. |
|||
|
|||
You must be the author of the entry or have |
|||
:attr:`~Permissions.manage_guild` in the represented guild to edit it. |
|||
|
|||
Parameters |
|||
----------- |
|||
description: Optional[:class:`str`] |
|||
The new description of the entry's guild. |
|||
category: :class:`DirectoryCategory` |
|||
The new primary category of the entry. |
|||
|
|||
Raises |
|||
------- |
|||
Forbidden |
|||
You do not have permissions to edit this entry. |
|||
HTTPException |
|||
Editing the entry failed. |
|||
""" |
|||
data = await self._state.http.edit_directory_entry( |
|||
self.channel.id, |
|||
self.entity_id, |
|||
description=description, |
|||
primary_category_id=category.value if category is not MISSING else MISSING, |
|||
) |
|||
self._update(data) |
|||
|
|||
async def delete(self) -> None: |
|||
"""|coro| |
|||
|
|||
Deletes this directory entry. |
|||
|
|||
You must be the author of the entry or have |
|||
:attr:`~Permissions.manage_guild` in the represented guild to delete it. |
|||
|
|||
Raises |
|||
------- |
|||
Forbidden |
|||
You do not have permissions to delete this entry. |
|||
HTTPException |
|||
Deleting the entry failed. |
|||
""" |
|||
await self._state.http.delete_directory_entry(self.channel.id, self.entity_id) |
@ -0,0 +1,81 @@ |
|||
""" |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2021-present Dolfies |
|||
|
|||
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, Literal, Optional, TypedDict, Union |
|||
from typing_extensions import NotRequired |
|||
|
|||
from .guild import PartialGuild, _GuildCounts |
|||
from .scheduled_event import ExternalScheduledEvent, StageInstanceScheduledEvent, VoiceScheduledEvent |
|||
from .snowflake import Snowflake |
|||
|
|||
|
|||
class _DirectoryScheduledEvent(TypedDict): |
|||
guild: PartialGuild |
|||
user_rsvp: bool |
|||
user_count: int |
|||
|
|||
|
|||
class _DirectoryStageInstanceScheduledEvent(_DirectoryScheduledEvent, StageInstanceScheduledEvent): |
|||
... |
|||
|
|||
|
|||
class _DirectoryVoiceScheduledEvent(_DirectoryScheduledEvent, VoiceScheduledEvent): |
|||
... |
|||
|
|||
|
|||
class _DirectoryExternalScheduledEvent(_DirectoryScheduledEvent, ExternalScheduledEvent): |
|||
... |
|||
|
|||
|
|||
DirectoryScheduledEvent = Union[ |
|||
_DirectoryStageInstanceScheduledEvent, _DirectoryVoiceScheduledEvent, _DirectoryExternalScheduledEvent |
|||
] |
|||
|
|||
|
|||
class DirectoryGuild(PartialGuild, _GuildCounts): |
|||
featurable_in_directory: bool |
|||
|
|||
|
|||
DirectoryEntryType = Literal[0, 1] |
|||
DirectoryCategory = Literal[0, 1, 2, 3, 5] |
|||
DirectoryCounts = Dict[DirectoryCategory, int] |
|||
|
|||
|
|||
class PartialDirectoryEntry(TypedDict): |
|||
type: DirectoryEntryType |
|||
primary_category_id: NotRequired[DirectoryCategory] |
|||
directory_channel_id: Snowflake |
|||
author_id: Snowflake |
|||
entity_id: Snowflake |
|||
created_at: str |
|||
description: Optional[str] |
|||
|
|||
|
|||
class DirectoryEntry(PartialDirectoryEntry): |
|||
guild: NotRequired[DirectoryGuild] |
|||
guild_scheduled_event: NotRequired[DirectoryScheduledEvent] |
|||
|
|||
|
|||
class DirectoryBroadcast(TypedDict): |
|||
can_broadcast: bool |
@ -0,0 +1,52 @@ |
|||
""" |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2021-present Dolfies |
|||
|
|||
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 List, Optional, TypedDict |
|||
from typing_extensions import NotRequired |
|||
|
|||
from .guild import Guild |
|||
from .snowflake import Snowflake |
|||
|
|||
|
|||
class HubWaitlist(TypedDict): |
|||
email: str |
|||
email_domain: str |
|||
school: str |
|||
user_id: Snowflake |
|||
|
|||
|
|||
class HubGuild(TypedDict): |
|||
id: Snowflake |
|||
name: str |
|||
icon: Optional[str] |
|||
|
|||
|
|||
class EmailDomainLookup(TypedDict): |
|||
guilds_info: NotRequired[List[HubGuild]] |
|||
has_matching_guild: bool |
|||
|
|||
|
|||
class EmailDomainVerification(TypedDict): |
|||
guild: Guild |
|||
joined: bool |
Loading…
Reference in new issue