aboutsummaryrefslogtreecommitdiff
path: root/discord/template.py
diff options
context:
space:
mode:
authorNadir Chowdhury <[email protected]>2020-06-28 19:48:04 +0100
committerGitHub <[email protected]>2020-06-28 14:48:04 -0400
commit2b3c6e0d4776fae080191e605c2caf89fa132e1b (patch)
treedd870ce057115cd852d59749092709caee2b4d78 /discord/template.py
parent[commands] Raise TypeError when Optional is used with Greedy converter (diff)
downloaddiscord.py-2b3c6e0d4776fae080191e605c2caf89fa132e1b.tar.xz
discord.py-2b3c6e0d4776fae080191e605c2caf89fa132e1b.zip
Add support for Discord templates
Diffstat (limited to 'discord/template.py')
-rw-r--r--discord/template.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/discord/template.py b/discord/template.py
new file mode 100644
index 00000000..905f5515
--- /dev/null
+++ b/discord/template.py
@@ -0,0 +1,140 @@
+from .utils import parse_time, _get_as_snowflake
+from .enums import VoiceRegion
+from .guild import Guild
+
+__all__ = (
+ 'Template'
+)
+
+class _FriendlyHttpAttributeErrorHelper:
+ __slots__ = ()
+
+ def __getattr__(self, attr):
+ raise AttributeError('PartialTemplateState does not support http methods.')
+
+class _PartialTemplateState:
+ def __init__(self, *, state):
+ self.__state = state
+ self.http = _FriendlyHttpAttributeErrorHelper()
+
+ @property
+ def is_bot(self):
+ return self.__state.is_bot
+
+ @property
+ def shard_count(self):
+ return self.__state.shard_count
+
+ @property
+ def user(self):
+ return self.__state.user
+
+ @property
+ def self_id(self):
+ return self.__state.user.id
+
+ def store_emoji(self, guild, packet):
+ return None
+
+ def _get_voice_client(self, id):
+ return None
+
+ def _get_message(self, id):
+ return None
+
+ async def query_members(self, **kwargs):
+ return []
+
+ def __getattr__(self, attr):
+ raise AttributeError('PartialTemplateState does not support {0!r}.'.format(attr))
+
+class Template:
+ """Represents a Discord template.
+
+ .. versionadded:: 1.4
+
+ Attributes
+ -----------
+ code: :code:`str`
+ The template code.
+ uses: :class:`int`
+ How many time the template has been used.
+ name: :class:`str`
+ The name of the template.
+ description: :class:`str`
+ The description of the template.
+ creator: :class:`User`
+ The creator of the template.
+ created_at: :class:`datetime.datetime`
+ When the template was created.
+ updated_at: :class:`datetime.datetime`
+ When the template was last updated (referred to as "last synced" in the client).
+ source_guild: :class:`TemplateGuild`
+ The source guild.
+ """
+
+ def __init__(self, *, state, data):
+ self._state = state
+
+ self.code = data['code']
+ self.uses = data['usage_count']
+ self.name = data['name']
+ self.description = data['description']
+ creator_data = data.get('creator')
+ self.creator = None if creator_data is None else self._state.store_user(creator_data)
+
+ self.created_at = parse_time(data.get('created_at'))
+ self.updated_at = parse_time(data.get('updated_at'))
+
+ id = _get_as_snowflake(data, 'source_guild_id')
+ source_serialised = data['serialized_source_guild']
+ source_serialised['id'] = id
+ state = _PartialTemplateState(state=self._state)
+
+ self.source_guild = Guild(data=source_serialised, state=state)
+
+ def __repr__(self):
+ return '<Template code={0.code!r} uses={0.uses} name={0.name!r}' \
+ ' creator={0.creator!r} source_guild={0.source_guild!r}>'.format(self)
+
+ async def create_guild(self, name, region=None, icon=None):
+ """|coro|
+
+ Creates a :class:`.Guild` using the template.
+
+ Bot accounts in more than 10 guilds are not allowed to create guilds.
+
+ Parameters
+ ----------
+ name: :class:`str`
+ The name of the guild.
+ region: :class:`.VoiceRegion`
+ The region for the voice communication server.
+ Defaults to :attr:`.VoiceRegion.us_west`.
+ icon: :class:`bytes`
+ The :term:`py:bytes-like object` representing the icon. See :meth:`.ClientUser.edit`
+ for more details on what is expected.
+
+ Raises
+ ------
+ :exc:`.HTTPException`
+ Guild creation failed.
+ :exc:`.InvalidArgument`
+ Invalid icon image format given. Must be PNG or JPG.
+
+ Returns
+ -------
+ :class:`.Guild`
+ The guild created. This is not the same guild that is
+ added to cache.
+ """
+ if icon is not None:
+ icon = _bytes_to_base64_data(icon)
+
+ if region is None:
+ region = VoiceRegion.us_west.value
+ else:
+ region = region.value
+
+ data = await self._state.http.create_from_template(self.code, name, region, icon)
+ return Guild(data=data, state=self._sate)