# SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING, List, Optional, Union from . import utils from .partial_emoji import PartialEmoji, _EmojiTag if TYPE_CHECKING: from .emoji import Emoji from .guild import Guild from .invite import PartialInviteGuild from .state import ConnectionState from .types.welcome_screen import ( WelcomeScreen as WelcomeScreenPayload, WelcomeScreenChannel as WelcomeScreenChannelPayload, ) __all__ = ( "WelcomeScreen", "WelcomeScreenChannel", ) MISSING = utils.MISSING class WelcomeScreenChannel: """Represents a Discord welcome screen channel. .. versionadded:: 2.5 Attributes ---------- id: :class:`int` The ID of the guild channel this welcome screen channel represents. description: :class:`str` The description of this channel in the official UI. emoji: Optional[Union[:class:`Emoji`, :class:`PartialEmoji`]] The emoji associated with this channel's welcome message, if any. """ __slots__ = ( "id", "description", "emoji", ) def __init__( self, *, id: int, description: str, emoji: Optional[Union[str, Emoji, PartialEmoji]] = None, ) -> None: self.id: int = id self.description: str = description self.emoji: Optional[Union[Emoji, PartialEmoji]] = None if emoji is None: self.emoji = None elif isinstance(emoji, str): self.emoji = PartialEmoji.from_str(emoji) elif isinstance(emoji, _EmojiTag): self.emoji = emoji else: raise TypeError("emoji must be None, a str, PartialEmoji, or Emoji instance.") def __repr__(self) -> str: return f"" @classmethod def _from_data( cls, *, data: WelcomeScreenChannelPayload, state: ConnectionState, ) -> WelcomeScreenChannel: emoji = state._get_emoji_from_fields( name=data.get("emoji_name"), id=utils._get_as_snowflake(data, "emoji_id"), ) return cls(id=int(data["channel_id"]), description=data["description"], emoji=emoji) def to_dict(self) -> WelcomeScreenChannelPayload: result: WelcomeScreenChannelPayload = {} # type: ignore result["channel_id"] = self.id result["description"] = self.description if self.emoji is not None: if self.emoji.id: result["emoji_id"] = self.emoji.id result["emoji_name"] = self.emoji.name return result class WelcomeScreen: """Represents a Discord welcome screen for a :class:`Guild`. .. versionadded:: 2.5 Attributes ---------- description: Optional[:class:`str`] The guild description in the welcome screen. channels: List[:class:`WelcomeScreenChannel`] The welcome screen's channels. """ __slots__ = ( "description", "channels", "_guild", "_state", ) def __init__( self, *, data: WelcomeScreenPayload, state: ConnectionState, guild: Union[Guild, PartialInviteGuild], ) -> None: self._state = state self._guild = guild self.description: Optional[str] = data.get("description") self.channels: List[WelcomeScreenChannel] = [ WelcomeScreenChannel._from_data(data=channel, state=state) for channel in data["welcome_channels"] ] def __repr__(self) -> str: return f"" @property def enabled(self) -> bool: """:class:`bool`: Whether the welcome screen is displayed to users. This is equivalent to checking if ``WELCOME_SCREEN_ENABLED`` is present in :attr:`Guild.features`. """ return "WELCOME_SCREEN_ENABLED" in self._guild.features async def edit( self, *, enabled: bool = MISSING, description: Optional[str] = MISSING, channels: Optional[List[WelcomeScreenChannel]] = MISSING, reason: Optional[str] = None, ) -> WelcomeScreen: """|coro| Edits the welcome screen. You must have the :attr:`~Permissions.manage_guild` permission to use this. This requires 'COMMUNITY' in :attr:`.Guild.features`. Parameters ---------- enabled: :class:`bool` Whether the welcome screen is enabled. description: Optional[:class:`str`] The new guild description in the welcome screen. channels: Optional[List[:class:`WelcomeScreenChannel`]] The new welcome channels. reason: Optional[:class:`str`] The reason for editing the welcome screen. Shows up on the audit log. Raises ------ Forbidden You do not have permissions to change the welcome screen or the guild is not allowed to create welcome screens. HTTPException Editing the welcome screen failed. TypeError ``channels`` is not a list of :class:`~disnake.WelcomeScreenChannel` instances Returns ------- :class:`WelcomeScreen` The newly edited welcome screen. """ from .guild import Guild if not isinstance(self._guild, Guild): raise TypeError("May not edit a WelcomeScreen from a PartialInviteGuild.") return await self._guild.edit_welcome_screen( enabled=enabled, channels=channels, description=description, reason=reason, )