Browse Source

Checkpoint progress

pull/35/head
Andrei 8 years ago
parent
commit
fb70f43508
  1. 25
      disco/api/client.py
  2. 1
      disco/api/http.py
  3. 2
      disco/types/channel.py
  4. 104
      disco/types/guild.py
  5. 13
      disco/types/invite.py
  6. 3
      disco/util/functional.py
  7. 7
      examples/basic_plugin.py

25
disco/api/client.py

@ -2,13 +2,14 @@ import six
import json import json
import warnings import warnings
from six.moves.urllib.parse import quote
from disco.api.http import Routes, HTTPClient from disco.api.http import Routes, HTTPClient
from disco.util.logging import LoggingClass from disco.util.logging import LoggingClass
from disco.util.sanitize import S from disco.util.sanitize import S
from disco.types.user import User from disco.types.user import User
from disco.types.message import Message from disco.types.message import Message
from disco.types.guild import Guild, GuildMember, GuildBan, Role, GuildEmoji from disco.types.guild import Guild, GuildMember, GuildBan, Role, GuildEmoji, AuditLogEntry
from disco.types.channel import Channel from disco.types.channel import Channel
from disco.types.invite import Invite from disco.types.invite import Invite
from disco.types.webhook import Webhook from disco.types.webhook import Webhook
@ -25,7 +26,7 @@ def optional(**kwargs):
def _reason_header(value): def _reason_header(value):
return optional(**{'X-Audit-Log-Reason': value}) return optional(**{'X-Audit-Log-Reason': quote(value)})
class APIClient(LoggingClass): class APIClient(LoggingClass):
@ -190,20 +191,20 @@ class APIClient(LoggingClass):
'type': typ, 'type': typ,
}, headers=_reason_header(reason)) }, headers=_reason_header(reason))
def channels_permissions_delete(self, channel, permission): def channels_permissions_delete(self, channel, permission, reason=None):
self.http(Routes.CHANNELS_PERMISSIONS_DELETE, dict(channel=channel, permission=permission)) self.http(Routes.CHANNELS_PERMISSIONS_DELETE, dict(channel=channel, permission=permission), headers=_reason_header(reason))
def channels_invites_list(self, channel): def channels_invites_list(self, channel):
r = self.http(Routes.CHANNELS_INVITES_LIST, dict(channel=channel)) r = self.http(Routes.CHANNELS_INVITES_LIST, dict(channel=channel))
return Invite.create_map(self.client, r.json()) return Invite.create_map(self.client, r.json())
def channels_invites_create(self, channel, max_age=86400, max_uses=0, temporary=False, unique=False): def channels_invites_create(self, channel, max_age=86400, max_uses=0, temporary=False, unique=False, reason=None):
r = self.http(Routes.CHANNELS_INVITES_CREATE, dict(channel=channel), json={ r = self.http(Routes.CHANNELS_INVITES_CREATE, dict(channel=channel), json={
'max_age': max_age, 'max_age': max_age,
'max_uses': max_uses, 'max_uses': max_uses,
'temporary': temporary, 'temporary': temporary,
'unique': unique 'unique': unique
}) }, headers=_reason_header(reason))
return Invite.create(self.client, r.json()) return Invite.create(self.client, r.json())
def channels_pins_list(self, channel): def channels_pins_list(self, channel):
@ -380,6 +381,16 @@ class APIClient(LoggingClass):
dict(guild=guild, emoji=emoji), dict(guild=guild, emoji=emoji),
headers=_reason_header(reason)) headers=_reason_header(reason))
def guilds_auditlogs_list(self, guild, before, user_id=None, action_type=None, limit=50):
r = self.http(Routes.GUILDS, dict(guild=guild), json=optional(
before=before,
user_id=user_id,
action_type=action_type,
limit=limit,
))
return AuditLogEntry.create_map(self.client, r.json()['audit_log_entries'])
def users_me_get(self): def users_me_get(self):
return User.create(self.client, self.http(Routes.USERS_ME_GET).json()) return User.create(self.client, self.http(Routes.USERS_ME_GET).json())

1
disco/api/http.py

@ -102,6 +102,7 @@ class Routes(object):
GUILDS_EMOJIS_CREATE = (HTTPMethod.POST, GUILDS + '/emojis') GUILDS_EMOJIS_CREATE = (HTTPMethod.POST, GUILDS + '/emojis')
GUILDS_EMOJIS_MODIFY = (HTTPMethod.PATCH, GUILDS + '/emojis/{emoji}') GUILDS_EMOJIS_MODIFY = (HTTPMethod.PATCH, GUILDS + '/emojis/{emoji}')
GUILDS_EMOJIS_DELETE = (HTTPMethod.DELETE, GUILDS + '/emojis/{emoji}') GUILDS_EMOJIS_DELETE = (HTTPMethod.DELETE, GUILDS + '/emojis/{emoji}')
GUILDS_AUDITLOGS_LIST = (HTTPMethod.GET, GUILDS + '/audit-logs')
# Users # Users
USERS = '/users' USERS = '/users'

2
disco/types/channel.py

@ -232,7 +232,7 @@ class Channel(SlottedModel, Permissible):
def create_invite(self, *args, **kwargs): def create_invite(self, *args, **kwargs):
from disco.types.invite import Invite from disco.types.invite import Invite
return Invite.create(self, *args, **kwargs) return Invite.create_for_channel(self, *args, **kwargs)
def get_pins(self): def get_pins(self):
""" """

104
disco/types/guild.py

@ -7,7 +7,7 @@ from disco.api.http import APIException
from disco.util.snowflake import to_snowflake from disco.util.snowflake import to_snowflake
from disco.util.functional import cached_property from disco.util.functional import cached_property
from disco.types.base import ( from disco.types.base import (
SlottedModel, Field, ListField, AutoDictField, snowflake, text, binary, enum, datetime SlottedModel, Field, ListField, AutoDictField, DictField, snowflake, text, binary, enum, datetime
) )
from disco.types.user import User from disco.types.user import User
from disco.types.voice import VoiceState from disco.types.voice import VoiceState
@ -448,3 +448,105 @@ class Guild(SlottedModel, Permissible):
def get_emojis(self): def get_emojis(self):
return self.client.api.guilds_emojis_list(self.id) return self.client.api.guilds_emojis_list(self.id)
AuditLogActionTypes = Enum(
GUILD_UPDATE=1,
CHANNEL_CREATE=10,
CHANNEL_UPDATE=11,
CHANNEL_DELETE=12,
CHANNEL_OVERWRITE_CREATE=13,
CHANNEL_OVERWRITE_UPDATE=14,
CHANNEL_OVERWRITE_DELETE=15,
MEMBER_KICK=20,
MEMBER_PRUNE=21,
MEMBER_BAN_ADD=22,
MEMBER_BAN_REMOVE=23,
MEMBER_UPDATE=24,
MEMBER_ROLE_UPDATE=25,
ROLE_CREATE=30,
ROLE_UPDATE=31,
ROLE_DELETE=32,
INVITE_CREATE=40,
INVITE_UPDATE=41,
INVITE_DELETE=42,
WEBHOOK_CREATE=50,
WEBHOOK_UPDATE=51,
WEBHOOK_DELETE=52,
EMOJI_CREATE=60,
EMOJI_UPDATE=61,
EMOJI_DELETE=62,
MESSAGE_DELETE=72,
)
GUILD_ACTIONS = (
AuditLogActionTypes.GUILD_UPDATE,
)
CHANNEL_ACTIONS = (
AuditLogActionTypes.CHANNEL_CREATE,
AuditLogActionTypes.CHANNEL_UPDATE,
AuditLogActionTypes.CHANNEL_DELETE,
AuditLogActionTypes.CHANNEL_OVERWRITE_CREATE,
AuditLogActionTypes.CHANNEL_OVERWRITE_UPDATE,
AuditLogActionTypes.CHANNEL_OVERWRITE_DELETE,
)
MEMBER_ACTIONS = (
AuditLogActionTypes.MEMBER_KICK,
AuditLogActionTypes.MEMBER_PRUNE,
AuditLogActionTypes.MEMBER_BAN_ADD,
AuditLogActionTypes.MEMBER_BAN_REMOVE,
AuditLogActionTypes.MEMBER_UPDATE,
AuditLogActionTypes.MEMBER_ROLE_UPDATE,
)
ROLE_ACTIONS = (
AuditLogActionTypes.ROLE_CREATE,
AuditLogActionTypes.ROLE_UPDATE,
AuditLogActionTypes.ROLE_DELETE,
)
INVITE_ACTIONS = (
AuditLogActionTypes.INVITE_CREATE,
AuditLogActionTypes.INVITE_UPDATE,
AuditLogActionTypes.INVITE_DELETE,
)
WEBHOOK_ACTIONS = (
AuditLogActionTypes.WEBHOOK_CREATE,
AuditLogActionTypes.WEBHOOK_UPDATE,
AuditLogActionTypes.WEBHOOK_DELETE,
)
EMOJI_ACTIONS = (
AuditLogActionTypes.EMOJI_CREATE,
AuditLogActionTypes.EMOJI_UPDATE,
AuditLogActionTypes.EMOJI_DELETE,
)
MESSAGE_ACTIONS = (
AuditLogActionTypes.MESSAGE_DELETE,
)
class AuditLogObjectChange(SlottedModel):
key = Field(text)
new_value = Field(text)
old_value = Field(text)
class AuditLogEntry(SlottedModel):
id = Field(snowflake)
guild = Field(None)
user_id = Field(snowflake)
target_id = Field(snowflake)
action_type = Field(enum(AuditLogActionTypes))
changes = ListField(AuditLogObjectChange)
options = DictField(text, text)
reason = Field(text)
@cached_property
def user(self):
return self.client.state.users.get(self.user_id)

13
disco/types/invite.py

@ -40,13 +40,8 @@ class Invite(SlottedModel):
created_at = Field(datetime) created_at = Field(datetime)
@classmethod @classmethod
def create_for_channel(cls, channel, max_age=86400, max_uses=0, temporary=False, unique=False): def create_for_channel(cls, channel, *args, **kwargs):
return channel.client.api.channels_invites_create( return channel.client.api.channels_invites_create(channel.id, *args, **kwargs)
channel.id,
max_age=max_age,
max_uses=max_uses,
temporary=temporary,
unique=unique)
def delete(self): def delete(self, *args, **kwargs):
self.client.api.invites_delete(self.code) self.client.api.invites_delete(self.code, *args, **kwargs)

3
disco/util/functional.py

@ -56,6 +56,9 @@ class CachedSlotProperty(object):
self.function = function self.function = function
self.__doc__ = getattr(function, '__doc__') self.__doc__ = getattr(function, '__doc__')
def set(self, value):
setattr(self.stored_name, value)
def __get__(self, instance, owner): def __get__(self, instance, owner):
if instance is None: if instance is None:
return self return self

7
examples/basic_plugin.py

@ -2,6 +2,13 @@ from disco.bot import Plugin
class BasicPlugin(Plugin): class BasicPlugin(Plugin):
@Plugin.command('auditme')
def on_auditme(self, event):
invite = event.channel.create_invite(reason='TEST AUDIT')
invite.delete(reason='TEST AUDIT 2')
# channel = event.guild.create_channel('audit-log-test', 'text', reason='TEST CREATE')
# channel.delete(reason='TEST AUDIT 2')
@Plugin.command('reload') @Plugin.command('reload')
def on_reload(self, event): def on_reload(self, event):
self.reload() self.reload()

Loading…
Cancel
Save