mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-07-07 10:31:59 +00:00
Implement TextChannel.follow()
This commit is contained in:
parent
80702df1bc
commit
dab2519a09
@ -33,7 +33,7 @@ from .enums import ChannelType, try_enum
|
|||||||
from .mixins import Hashable
|
from .mixins import Hashable
|
||||||
from . import utils
|
from . import utils
|
||||||
from .asset import Asset
|
from .asset import Asset
|
||||||
from .errors import ClientException, NoMoreItems
|
from .errors import ClientException, NoMoreItems, InvalidArgument
|
||||||
from .webhook import Webhook
|
from .webhook import Webhook
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -455,6 +455,46 @@ class TextChannel(discord.abc.Messageable, discord.abc.GuildChannel, Hashable):
|
|||||||
data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason)
|
data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason)
|
||||||
return Webhook.from_state(data, state=self._state)
|
return Webhook.from_state(data, state=self._state)
|
||||||
|
|
||||||
|
async def follow(self, *, destination):
|
||||||
|
"""
|
||||||
|
Follows a channel using a webhook.
|
||||||
|
|
||||||
|
Only news channels can be followed.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The webhook returned will not provide a token to do webhook
|
||||||
|
actions, as Discord does not provide it.
|
||||||
|
|
||||||
|
.. versionadded:: 1.3.0
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
-----------
|
||||||
|
destination: :class:`TextChannel`
|
||||||
|
The channel you would like to follow from.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
HTTPException
|
||||||
|
Following the channel failed.
|
||||||
|
Forbidden
|
||||||
|
You do not have the permissions to create a webhook.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
--------
|
||||||
|
:class:`Webhook`
|
||||||
|
The created webhook.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not self.is_news():
|
||||||
|
raise ClientException('The channel must be a news channel.')
|
||||||
|
|
||||||
|
if not isinstance(destination, TextChannel):
|
||||||
|
raise InvalidArgument('Expected TextChannel received {0.__name__}'.format(type(destination)))
|
||||||
|
|
||||||
|
data = await self._state.http.follow_webhook(self.id, webhook_channel_id=destination.id)
|
||||||
|
return Webhook._as_follower(data, channel=destination, user=self._state.user)
|
||||||
|
|
||||||
class VoiceChannel(discord.abc.Connectable, discord.abc.GuildChannel, Hashable):
|
class VoiceChannel(discord.abc.Connectable, discord.abc.GuildChannel, Hashable):
|
||||||
"""Represents a Discord guild voice channel.
|
"""Represents a Discord guild voice channel.
|
||||||
|
|
||||||
|
@ -564,6 +564,12 @@ class HTTPClient:
|
|||||||
def get_webhook(self, webhook_id):
|
def get_webhook(self, webhook_id):
|
||||||
return self.request(Route('GET', '/webhooks/{webhook_id}', webhook_id=webhook_id))
|
return self.request(Route('GET', '/webhooks/{webhook_id}', webhook_id=webhook_id))
|
||||||
|
|
||||||
|
def follow_webhook(self, channel_id, webhook_channel_id):
|
||||||
|
payload = {
|
||||||
|
'webhook_channel_id': str(webhook_channel_id)
|
||||||
|
}
|
||||||
|
return self.request(Route('POST', '/channels/{channel_id}/followers', channel_id=channel_id), json=payload)
|
||||||
|
|
||||||
# Guild management
|
# Guild management
|
||||||
|
|
||||||
def get_guilds(self, limit, before=None, after=None):
|
def get_guilds(self, limit, before=None, after=None):
|
||||||
|
@ -499,6 +499,25 @@ class Webhook:
|
|||||||
raise InvalidArgument('Invalid webhook URL given.')
|
raise InvalidArgument('Invalid webhook URL given.')
|
||||||
return cls(m.groupdict(), adapter=adapter)
|
return cls(m.groupdict(), adapter=adapter)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _as_follower(cls, data, *, channel, user):
|
||||||
|
name = "{} #{}".format(channel.guild, channel)
|
||||||
|
feed = {
|
||||||
|
'id': data['webhook_id'],
|
||||||
|
'name': name,
|
||||||
|
'channel_id': channel.id,
|
||||||
|
'guild_id': channel.guild.id,
|
||||||
|
'user': {
|
||||||
|
'username': user.name,
|
||||||
|
'discriminator': user.discriminator,
|
||||||
|
'id': user.id,
|
||||||
|
'avatar': user.avatar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session = channel._state.http._HTTPClient__session
|
||||||
|
return cls(feed, adapter=AsyncWebhookAdapter(session=session))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_state(cls, data, state):
|
def from_state(cls, data, state):
|
||||||
session = state.http._HTTPClient__session
|
session = state.http._HTTPClient__session
|
||||||
|
Loading…
x
Reference in New Issue
Block a user