diff --git a/discord/guild.py b/discord/guild.py index c51a46310..697537afc 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -1460,6 +1460,29 @@ class Guild(Hashable): data = await self._state.http.prune_members(self.id, days, compute_prune_count=compute_prune_count, roles=roles, reason=reason) return data['pruned'] + + async def templates(self): + """|coro| + + Gets the list of templates from this guild. + + Requires :attr:`~.Permissions.manage_guild` permissions. + + .. versionadded:: 1.7 + + Raises + ------- + Forbidden + You don't have permissions to get the templates. + + Returns + -------- + List[:class:`Template`] + The templates for this guild. + """ + from .template import Template + data = await self._state.http.guild_templates(self.id) + return [Template(data=d, state=self._state) for d in data] async def webhooks(self): """|coro| @@ -1546,6 +1569,36 @@ class Guild(Hashable): result.append(Invite(state=self._state, data=invite)) return result + + async def create_template(self, *, name, description=None): + """|coro| + + Creates a template for the guild. + + You must have the :attr:`~Permissions.manage_guild` permission to + do this. + + .. versionadded:: 1.7 + + Parameters + ----------- + name: :class:`str` + The name of the template. + description: Optional[:class:`str`] + The description of the template. + """ + from .template import Template + + payload = { + 'name': name + } + + if description: + payload['description'] = description + + data = await self._state.http.create_template(self.id, payload) + + return Template(state=self._state, data=data) async def create_integration(self, *, type, id): """|coro| diff --git a/discord/http.py b/discord/http.py index edfe031cb..f151188d6 100644 --- a/discord/http.py +++ b/discord/http.py @@ -670,6 +670,28 @@ class HTTPClient: def get_template(self, code): return self.request(Route('GET', '/guilds/templates/{code}', code=code)) + def guild_templates(self, guild_id): + return self.request(Route('GET', '/guilds/{guild_id}/templates', guild_id=guild_id)) + + def create_template(self, guild_id, payload): + return self.request(Route('POST', '/guilds/{guild_id}/templates', guild_id=guild_id), json=payload) + + def sync_template(self, guild_id, code): + return self.request(Route('PUT', '/guilds/{guild_id}/templates/{code}', guild_id=guild_id, code=code)) + + def edit_template(self, guild_id, code, payload): + valid_keys = ( + 'name', + 'description', + ) + payload = { + k: v for k, v in payload.items() if k in valid_keys + } + return self.request(Route('PATCH', '/guilds/{guild_id}/templates/{code}', guild_id=guild_id, code=code), json=payload) + + def delete_template(self, guild_id, code): + return self.request(Route('DELETE', '/guilds/{guild_id}/templates/{code}', guild_id=guild_id, code=code)) + def create_from_template(self, code, name, region, icon): payload = { 'name': name, diff --git a/discord/template.py b/discord/template.py index 1c3333803..f528120c8 100644 --- a/discord/template.py +++ b/discord/template.py @@ -105,7 +105,9 @@ class Template: def __init__(self, *, state, data): self._state = state - + self._store(data) + + def _store(self, data): self.code = data['code'] self.uses = data['usage_count'] self.name = data['name'] @@ -117,11 +119,16 @@ class Template: 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) + guild = self._state._get_guild(id) + + if guild is None: + source_serialised = data['serialized_source_guild'] + source_serialised['id'] = id + state = _PartialTemplateState(state=self._state) + guild = Guild(data=source_serialised, state=state) + + self.source_guild = guild def __repr__(self): return '