Implement audit logs.
This commit is contained in:
@ -41,6 +41,7 @@ from .enums import GuildRegion, Status, ChannelType, try_enum, VerificationLevel
|
||||
from .mixins import Hashable
|
||||
from .user import User
|
||||
from .invite import Invite
|
||||
from .iterators import AuditLogIterator
|
||||
|
||||
BanEntry = namedtuple('BanEntry', 'reason user')
|
||||
|
||||
@ -921,7 +922,7 @@ class Guild(Hashable):
|
||||
return role
|
||||
|
||||
@asyncio.coroutine
|
||||
def kick(self, user):
|
||||
def kick(self, user, *, reason=None):
|
||||
"""|coro|
|
||||
|
||||
Kicks a user from the guild.
|
||||
@ -935,6 +936,8 @@ class Guild(Hashable):
|
||||
-----------
|
||||
user: :class:`abc.Snowflake`
|
||||
The user to kick from their guild.
|
||||
reason: Optional[str]
|
||||
The reason the user got kicked.
|
||||
|
||||
Raises
|
||||
-------
|
||||
@ -943,10 +946,10 @@ class Guild(Hashable):
|
||||
HTTPException
|
||||
Kicking failed.
|
||||
"""
|
||||
yield from self._state.http.kick(user.id, self.id)
|
||||
yield from self._state.http.kick(user.id, self.id, reason=reason)
|
||||
|
||||
@asyncio.coroutine
|
||||
def ban(self, user, *, delete_message_days=1):
|
||||
def ban(self, user, *, reason=None, delete_message_days=1):
|
||||
"""|coro|
|
||||
|
||||
Bans a user from the guild.
|
||||
@ -963,6 +966,8 @@ class Guild(Hashable):
|
||||
delete_message_days: int
|
||||
The number of days worth of messages to delete from the user
|
||||
in the guild. The minimum is 0 and the maximum is 7.
|
||||
reason: Optional[str]
|
||||
The reason the user got banned.
|
||||
|
||||
Raises
|
||||
-------
|
||||
@ -971,7 +976,7 @@ class Guild(Hashable):
|
||||
HTTPException
|
||||
Banning failed.
|
||||
"""
|
||||
yield from self._state.http.ban(user.id, self.id, delete_message_days)
|
||||
yield from self._state.http.ban(user.id, self.id, delete_message_days, reason=reason)
|
||||
|
||||
@asyncio.coroutine
|
||||
def unban(self, user):
|
||||
@ -1017,3 +1022,60 @@ class Guild(Hashable):
|
||||
if state.is_bot:
|
||||
raise ClientException('Must not be a bot account to ack messages.')
|
||||
return state.http.ack_guild(self.id)
|
||||
|
||||
def audit_logs(self, *, limit=100, before=None, after=None, reverse=None, user=None, action=None):
|
||||
"""Return an :class:`AsyncIterator` that enables receiving the guild's audit logs.
|
||||
|
||||
You must have :attr:`Permissions.view_audit_log` permission to use this.
|
||||
|
||||
Parameters
|
||||
-----------
|
||||
limit: Optional[int]
|
||||
The number of entries to retrieve. If ``None`` retrieve all entries.
|
||||
before: Union[:class:`abc.Snowflake`, datetime]
|
||||
Retrieve entries before this date or entry.
|
||||
If a date is provided it must be a timezone-naive datetime representing UTC time.
|
||||
after: Union[:class:`abc.Snowflake`, datetime]
|
||||
Retrieve entries after this date or entry.
|
||||
If a date is provided it must be a timezone-naive datetime representing UTC time.
|
||||
reverse: bool
|
||||
If set to true, return entries in oldest->newest order. If unspecified,
|
||||
this defaults to ``False`` for most cases. However if passing in a
|
||||
``after`` parameter then this is set to ``True``. This avoids getting entries
|
||||
out of order in the ``after`` case.
|
||||
user: :class:`abc.Snowflake`
|
||||
The moderator to filter entries from.
|
||||
action: :class:`AuditLogAction`
|
||||
The action to filter with.
|
||||
|
||||
Yields
|
||||
--------
|
||||
:class:`AuditLogEntry`
|
||||
The audit log entry.
|
||||
|
||||
Examples
|
||||
----------
|
||||
|
||||
Getting the first 100 entries: ::
|
||||
|
||||
async for entry in guild.audit_logs(limit=100):
|
||||
print('{0.user} did {0.action} to {0.target}'.format(entry))
|
||||
|
||||
Getting entries for a specific action: ::
|
||||
|
||||
async for entry in guild.audit_logs(action=discord.AuditLogAction.ban):
|
||||
print('{0.user} banned {0.target}'.format(entry))
|
||||
|
||||
Getting entries made by a specific user: ::
|
||||
|
||||
entries = await guild.audit_logs(limit=None, user=guild.me).flatten()
|
||||
await guild.default_channel.send('I made {} moderation actions.'.format(len(entries)))
|
||||
"""
|
||||
if user:
|
||||
user = user.id
|
||||
|
||||
if action:
|
||||
action = action.value
|
||||
|
||||
return AuditLogIterator(self, before=before, after=after, limit=limit,
|
||||
reverse=reverse, user_id=user, action_type=action)
|
||||
|
Reference in New Issue
Block a user