Stateful Message and remove Invite.xkcd since it is removed.
This commit is contained in:
123
discord/abc.py
123
discord/abc.py
@ -32,6 +32,7 @@ import asyncio
|
||||
from .message import Message
|
||||
from .iterators import LogsFromIterator
|
||||
from .context_managers import Typing
|
||||
from .errors import ClientException, NoMoreMessages
|
||||
|
||||
class Snowflake(metaclass=abc.ABCMeta):
|
||||
__slots__ = ()
|
||||
@ -287,6 +288,40 @@ class MessageChannel(metaclass=abc.ABCMeta):
|
||||
data = yield from self._state.http.get_message(self.id, id)
|
||||
return Message(channel=self, state=self._state, data=data)
|
||||
|
||||
@asyncio.coroutine
|
||||
def delete_messages(self, messages):
|
||||
"""|coro|
|
||||
|
||||
Deletes a list of messages. This is similar to :meth:`Message.delete`
|
||||
except it bulk deletes multiple messages.
|
||||
|
||||
Usable only by bot accounts.
|
||||
|
||||
Parameters
|
||||
-----------
|
||||
messages : iterable of :class:`Message`
|
||||
An iterable of messages denoting which ones to bulk delete.
|
||||
|
||||
Raises
|
||||
------
|
||||
ClientException
|
||||
The number of messages to delete is less than 2 or more than 100.
|
||||
Forbidden
|
||||
You do not have proper permissions to delete the messages or
|
||||
you're not using a bot account.
|
||||
HTTPException
|
||||
Deleting the messages failed.
|
||||
"""
|
||||
|
||||
messages = list(messages)
|
||||
if len(messages) > 100 or len(messages) < 2:
|
||||
raise ClientException('Can only delete messages in the range of [2, 100]')
|
||||
|
||||
message_ids = [m.id for m in messages]
|
||||
channel_id, guild_id = self._get_destination()
|
||||
|
||||
yield from self._state.http.delete_messages(channel_id, message_ids, guild_id)
|
||||
|
||||
@asyncio.coroutine
|
||||
def pins(self):
|
||||
"""|coro|
|
||||
@ -367,3 +402,91 @@ class MessageChannel(metaclass=abc.ABCMeta):
|
||||
counter += 1
|
||||
"""
|
||||
return LogsFromIterator(self, limit=limit, before=before, after=after, around=around, reverse=reverse)
|
||||
|
||||
@asyncio.coroutine
|
||||
def purge(self, *, limit=100, check=None, before=None, after=None, around=None):
|
||||
"""|coro|
|
||||
|
||||
Purges a list of messages that meet the criteria given by the predicate
|
||||
``check``. If a ``check`` is not provided then all messages are deleted
|
||||
without discrimination.
|
||||
|
||||
You must have :attr:`Permissions.manage_messages` permission to
|
||||
delete messages even if they are your own. The
|
||||
:attr:`Permissions.read_message_history` permission is also needed to
|
||||
retrieve message history.
|
||||
|
||||
Usable only by bot accounts.
|
||||
|
||||
Parameters
|
||||
-----------
|
||||
limit: int
|
||||
The number of messages to search through. This is not the number
|
||||
of messages that will be deleted, though it can be.
|
||||
check: predicate
|
||||
The function used to check if a message should be deleted.
|
||||
It must take a :class:`Message` as its sole parameter.
|
||||
before
|
||||
Same as ``before`` in :meth:`history`.
|
||||
after
|
||||
Same as ``after`` in :meth:`history`.
|
||||
around
|
||||
Same as ``around`` in :meth:`history`.
|
||||
|
||||
Raises
|
||||
-------
|
||||
Forbidden
|
||||
You do not have proper permissions to do the actions required or
|
||||
you're not using a bot account.
|
||||
HTTPException
|
||||
Purging the messages failed.
|
||||
|
||||
Examples
|
||||
---------
|
||||
|
||||
Deleting bot's messages ::
|
||||
|
||||
def is_me(m):
|
||||
return m.author == client.user
|
||||
|
||||
deleted = await channel.purge(limit=100, check=is_me)
|
||||
await channel.send_message('Deleted {} message(s)'.format(len(deleted)))
|
||||
|
||||
Returns
|
||||
--------
|
||||
list
|
||||
The list of messages that were deleted.
|
||||
"""
|
||||
|
||||
if check is None:
|
||||
check = lambda m: True
|
||||
|
||||
iterator = self.history(limit=limit, before=before, after=after, around=around)
|
||||
ret = []
|
||||
count = 0
|
||||
|
||||
while True:
|
||||
try:
|
||||
msg = yield from iterator.get()
|
||||
except NoMoreMessages:
|
||||
# no more messages to poll
|
||||
if count >= 2:
|
||||
# more than 2 messages -> bulk delete
|
||||
to_delete = ret[-count:]
|
||||
yield from self.delete_messages(to_delete)
|
||||
elif count == 1:
|
||||
# delete a single message
|
||||
yield from ret[-1].delete()
|
||||
|
||||
return ret
|
||||
else:
|
||||
if count == 100:
|
||||
# we've reached a full 'queue'
|
||||
to_delete = ret[-100:]
|
||||
yield from self.delete_messages(to_delete)
|
||||
count = 0
|
||||
yield from asyncio.sleep(1)
|
||||
|
||||
if check(msg):
|
||||
count += 1
|
||||
ret.append(msg)
|
||||
|
Reference in New Issue
Block a user