1 changed files with 201 additions and 0 deletions
@ -0,0 +1,201 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
""" |
|||
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 Any, Dict, List, Optional, TYPE_CHECKING |
|||
|
|||
from .enums import FriendFlags, StickerAnimationOptions, Theme, UserContentFilter, try_enum |
|||
from .guild_folder import GuildFolder |
|||
|
|||
if TYPE_CHECKING: |
|||
from .guild import Guild |
|||
from .state import ConnectionState |
|||
|
|||
|
|||
class Settings: |
|||
"""Represents the Discord client settings. |
|||
|
|||
Attributes |
|||
---------- |
|||
afk_timeout: :class:`int` |
|||
How long (in seconds) the user needs to be AFK until Discord |
|||
sends push notifications to your mobile device. |
|||
allow_accessibility_detection: :class:`bool` |
|||
Whether or not to allow Discord to track screen reader usage. |
|||
animate_emojis: :class:`bool` |
|||
Whether or not to animate emojis in the chat. |
|||
contact_sync_enabled: :class:`bool` |
|||
Whether or not to enable the contact sync on Discord mobile. |
|||
convert_emoticons: :class:`bool` |
|||
Whether or not to automatically convert emoticons into emojis. |
|||
e.g. :-) -> 😃 |
|||
default_guilds_restricted: :class:`bool` |
|||
Whether or not to automatically disable DMs between you and |
|||
members of new guilds you join. |
|||
detect_platform_accounts: :class:`bool` |
|||
Whether or not to automatically detect accounts from services |
|||
like Steam and Blizzard when you open the Discord client. |
|||
developer_mode: :class:`bool` |
|||
Whether or not to enable developer mode. |
|||
disable_games_tab: :class:`bool` |
|||
Whether or not to disable the showing of the Games tab. |
|||
enable_tts_command: :class:`bool` |
|||
Whether or not to allow tts messages to be played/sent. |
|||
gif_auto_play: :class:`bool` |
|||
Whether or not to automatically play gifs that are in the chat. |
|||
inline_attachment_media: :class:`bool` |
|||
Whether or not to display attachments when they are uploaded in chat. |
|||
inline_embed_media: :class:`bool` |
|||
Whether or not to display videos and images from links posted in chat. |
|||
locale: :class:`str` |
|||
The :rfc:`3066` language identifier of the locale to use for the language |
|||
of the Discord client. |
|||
message_display_compact: :class:`bool` |
|||
Whether or not to use the compact Discord display mode. |
|||
native_phone_integration_enabled: :class:`bool` |
|||
Whether or not to enable the new Discord mobile phone number friend |
|||
requesting features. |
|||
render_embeds: :class:`bool` |
|||
Whether or not to render embeds that are sent in the chat. |
|||
render_reactions: :class:`bool` |
|||
Whether or not to render reactions that are added to messages. |
|||
show_current_game: :class:`bool` |
|||
Whether or not to display the game that you are currently playing. |
|||
stream_notifications_enabled: :class:`bool` |
|||
Unknown. |
|||
timezone_offset: :class:`int` |
|||
The timezone offset to use. |
|||
view_nsfw_guilds: :class:`bool` |
|||
Whether or not to show NSFW guilds on iOS. |
|||
""" |
|||
|
|||
if TYPE_CHECKING: # Fuck me |
|||
afk_timeout: int |
|||
allow_accessibility_detection: bool |
|||
animate_emojis: bool |
|||
animate_stickers: StickerAnimationOptions |
|||
contact_sync_enabled: bool |
|||
convert_emoticons: bool |
|||
default_guilds_restricted: bool |
|||
detect_platform_accounts: bool |
|||
developer_mode: bool |
|||
disable_games_tab: bool |
|||
enable_tts_command: bool |
|||
explicit_content_filter: UserContentFilter |
|||
friend_source_flags: FriendFlags |
|||
gif_auto_play: bool |
|||
guild_positions: List[Guild] |
|||
inline_attachment_media: bool |
|||
inline_embed_media: bool |
|||
locale: str |
|||
message_display_compact: bool |
|||
native_phone_integration_enabled: bool |
|||
render_embeds: bool |
|||
render_reactions: bool |
|||
restricted_guilds: List[Guild] |
|||
show_current_game: bool |
|||
stream_notifications_enabled: bool |
|||
theme: Theme |
|||
timezone_offset: int |
|||
view_nsfw_guilds: bool |
|||
|
|||
def __init__(self, *, data, state: ConnectionState) -> None: |
|||
self._state = state |
|||
self._update(data) |
|||
|
|||
def __repr__(self) -> str: |
|||
return '<Settings>' |
|||
|
|||
def _update(self, data: Dict[str, Any]) -> None: |
|||
RAW_VALUES = { |
|||
'afk_timeout', |
|||
'allow_accessibility_detection', |
|||
'animate_emojis', |
|||
'contact_sync_enabled', |
|||
'convert_emoticons', |
|||
'default_guilds_restricted', |
|||
'detect_platform_accounts', |
|||
'developer_mode', |
|||
'disable_games_tab', |
|||
'enable_tts_command', |
|||
'inline_attachment_media', |
|||
'inline_embed_media', |
|||
'locale', |
|||
'message_display_compact', |
|||
'native_phone_integration_enabled', |
|||
'render_embeds', |
|||
'render_reactions', |
|||
'show_current_game', |
|||
'stream_notifications_enabled', |
|||
'timezone_offset', |
|||
'view_nsfw_guilds', |
|||
} |
|||
|
|||
for key, value in data.items(): |
|||
if key in RAW_VALUES: |
|||
setattr(self, key, value) |
|||
else: |
|||
setattr(self, '_' + key, value) |
|||
|
|||
@property |
|||
def animate_stickers(self) -> StickerAnimationOptions: |
|||
"""Whether or not to animate stickers in the chat.""" |
|||
return try_enum(StickerAnimationOptions, self._animate_stickers) |
|||
|
|||
@property |
|||
def explicit_content_filter(self) -> UserContentFilter: |
|||
"""The filter for explicit content in all messages.""" |
|||
return try_enum(UserContentFilter, self._explicit_content_filter) |
|||
|
|||
@property |
|||
def friend_source_flags(self) -> FriendFlags: |
|||
"""Who can add you as a friend.""" |
|||
return FriendFlags._from_dict(self._friend_source_flags) |
|||
|
|||
@property |
|||
def guild_folders(self) -> List[GuildFolder]: |
|||
"""A list of guild folders.""" |
|||
state = self._state |
|||
return [GuildFolder(data=folder, state=state) for folder in self._guild_folders] |
|||
|
|||
@property |
|||
def guild_positions(self) -> List[Guild]: |
|||
"""A list of guilds in order of the guild/guild icons that are on |
|||
the left hand side of the UI. |
|||
""" |
|||
return list(filter(None, map(self._get_guild, self._guild_positions))) |
|||
|
|||
@property |
|||
def restricted_guilds(self) -> List[Guild]: |
|||
"""A list of guilds that you will not receive DMs from.""" |
|||
return list(filter(None, map(self._get_guild, self._restricted_guilds))) |
|||
|
|||
@property |
|||
def theme(self) -> Theme: |
|||
"""The theme of the Discord UI.""" |
|||
return try_enum(Theme, self._theme) |
|||
|
|||
def _get_guild(self, id: int) -> Optional[Guild]: |
|||
return self._state._get_guild(int(id)) |
Loading…
Reference in new issue