Skip to content
This repository has been archived by the owner on Aug 1, 2021. It is now read-only.

Commit

Permalink
APIClient fixes, emitter priority support, etc fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
b1naryth1ef committed Oct 7, 2016
1 parent cde368e commit 2c8f73f
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 25 deletions.
8 changes: 4 additions & 4 deletions disco/api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,17 @@ def guilds_members_list(self, guild):
return GuildMember.create_map(self.client, r.json())

def guilds_members_get(self, guild, member):
r = self.http(Routes.GUILD_MEMBERS_GET, dict(guild=guild, member=member))
r = self.http(Routes.GUILDS_MEMBERS_GET, dict(guild=guild, member=member))
return GuildMember.create(self.client, r.json())

def guilds_members_modify(self, guild, member, **kwargs):
self.http(Routes.GUILD_MEMBERS_MODIFY, dict(guild=guild, member=member), json=kwargs)
self.http(Routes.GUILDS_MEMBERS_MODIFY, dict(guild=guild, member=member), json=kwargs)

def guilds_members_kick(self, guild, member):
self.http(Routes.GUILD_MEMBERS_KICK, dict(guild=guild, member=member))
self.http(Routes.GUILDS_MEMBERS_KICK, dict(guild=guild, member=member))

def guilds_bans_list(self, guild):
r = self.http(Routes.GUILD_BANS_LIST, dict(guild=guild))
r = self.http(Routes.GUILDS_BANS_LIST, dict(guild=guild))
return User.create_map(self.client, r.json())

def guilds_bans_create(self, guild, user, delete_message_days):
Expand Down
15 changes: 11 additions & 4 deletions disco/bot/plugin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import inspect
import functools

from holster.emitter import Priority

from disco.util.logging import LoggingClass
from disco.bot.command import Command, CommandError

Expand All @@ -10,6 +12,8 @@ class PluginDeco(object):
A utility mixin which provides various function decorators that a plugin
author can use to create bound event/command handlers.
"""
Prio = Priority

@staticmethod
def add_meta_deco(meta):
def deco(f):
Expand All @@ -22,13 +26,14 @@ def deco(f):
return deco

@classmethod
def listen(cls, event_name):
def listen(cls, event_name, priority=None):
"""
Binds the function to listen for a given event name
"""
return cls.add_meta_deco({
'type': 'listener',
'event_name': event_name,
'priority': priority
})

@classmethod
Expand Down Expand Up @@ -118,7 +123,7 @@ def __init__(self, bot, config):
if hasattr(member, 'meta'):
for meta in member.meta:
if meta['type'] == 'listener':
self.register_listener(member, meta['event_name'])
self.register_listener(member, meta['event_name'], meta['priority'])
elif meta['type'] == 'command':
self.register_command(member, *meta['args'], **meta['kwargs'])
elif meta['type'].startswith('pre_') or meta['type'].startswith('post_'):
Expand Down Expand Up @@ -155,7 +160,7 @@ def _dispatch(self, typ, func, event, *args, **kwargs):

return True

def register_listener(self, func, name):
def register_listener(self, func, name, priority):
"""
Registers a listener
Expand All @@ -165,9 +170,11 @@ def register_listener(self, func, name):
The function to be registered.
name : string
Name of event to listen for.
priority : Priority
The priority of this listener.
"""
func = functools.partial(self._dispatch, 'listener', func)
self.listeners.append(self.bot.client.events.on(name, func))
self.listeners.append(self.bot.client.events.on(name, func, priority=priority or Priority.NONE))

def register_command(self, func, *args, **kwargs):
"""
Expand Down
3 changes: 2 additions & 1 deletion disco/gateway/client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import gevent
import zlib
import six
import ssl

from disco.gateway.packets import OPCode
from disco.gateway.events import GatewayEvent
Expand Down Expand Up @@ -99,7 +100,7 @@ def connect_and_run(self):
self.ws.emitter.on('on_close', self.on_close)
self.ws.emitter.on('on_message', self.on_message)

self.ws.run_forever()
self.ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

def on_message(self, msg):
# Detect zlib and decompress
Expand Down
13 changes: 6 additions & 7 deletions disco/gateway/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import six

from disco.types import Guild, Channel, User, GuildMember, Role, Message, VoiceState
from disco.types.base import Model, snowflake, alias, listof
from disco.types.base import Model, snowflake, alias, listof, text


# TODO: clean this... use BaseType, etc
Expand Down Expand Up @@ -121,10 +121,9 @@ class GuildMemberRemove(GatewayEvent):
user = User


@wraps_model(GuildMember, alias='member')
class GuildMemberUpdate(GatewayEvent):
guild_id = snowflake
user = User
roles = listof(snowflake)
pass


class GuildRoleCreate(GatewayEvent):
Expand Down Expand Up @@ -166,14 +165,14 @@ class PresenceUpdate(GatewayEvent):
class Game(Model):
# TODO enum
type = int
name = str
url = str
name = text
url = text

user = User
guild_id = snowflake
roles = listof(snowflake)
game = Game
status = str
status = text


class TypingStart(GatewayEvent):
Expand Down
6 changes: 3 additions & 3 deletions disco/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,11 @@ def on_guild_member_add(self, event):
self.guilds[event.member.guild_id].members[event.member.id] = event.member

def on_guild_member_update(self, event):
if event.guild_id not in self.guilds:
if event.member.guild_id not in self.guilds:
return

self.guilds[event.guild_id].members[event.user.id].roles = event.roles
self.guilds[event.guild_id].members[event.user.id].user.update(event.user)
event.member.guild = self.guilds[event.member.guild_id]
self.guilds[event.member.guild_id].members[event.member.id].update(event.member)

def on_guild_member_remove(self, event):
if event.guild_id not in self.guilds:
Expand Down
16 changes: 11 additions & 5 deletions disco/types/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ def _make(typ, data, client):
args, _, _, _ = inspect.getargspec(typ)
if 'client' in args:
return typ(data, client)
elif issubclass(typ, Model):
if not client:
raise Exception()
return typ(data, client)
return typ(data)


Expand Down Expand Up @@ -125,15 +129,14 @@ def __init__(self, obj, client=None):
v = typ(obj[name], client)
else:
v = typ(obj[name])
elif inspect.isclass(typ) and issubclass(typ, Model):
v = typ(obj[name], client)
else:
v = typ(obj[name])
except Exception:
print('Failed during parsing of field {} => {} (`{}`)'.format(name, typ, obj[name]))
print('Failed during parsing of field {} => {}'.format(name, typ))
raise

if client and isinstance(v, Model):
v.client = client

setattr(self, dest_name, v)

def update(self, other):
Expand All @@ -145,7 +148,10 @@ def update(self, other):
# Clear cached properties
for name in dir(type(self)):
if isinstance(getattr(type(self), name), property):
delattr(self, name)
try:
delattr(self, name)
except:
pass

@classmethod
def create(cls, client, data):
Expand Down
19 changes: 19 additions & 0 deletions disco/types/guild.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from disco.api.http import APIException
from disco.util import to_snowflake
from disco.util.functional import cached_property
from disco.types.base import Model, snowflake, listof, dictof, datetime, text, binary, enum
from disco.types.user import User
from disco.types.voice import VoiceState
Expand Down Expand Up @@ -82,6 +83,8 @@ class GuildMember(Model):
The user object of this member.
guild_id : snowflake
The guild this member is part of.
nick : str
The nickname of the member.
mute : bool
Whether this member is server voice-muted.
deaf : bool
Expand All @@ -93,6 +96,7 @@ class GuildMember(Model):
"""
user = User
guild_id = snowflake
nick = text
mute = bool
deaf = bool
joined_at = datetime
Expand Down Expand Up @@ -125,6 +129,21 @@ def ban(self, delete_message_days=0):
"""
self.client.api.guilds_bans_create(self.guild.id, self.user.id, delete_message_days)

def set_nickname(self, nickname=None):
"""
Sets the members nickname (or clears it if None).
Args
----
nickname : Optional[str]
The nickname (or none to reset) to set.
"""
self.client.api.guilds_members_modify(self.guild.id, self.user.id, nick=nickname or '')

@cached_property
def guild(self):
return self.client.state.guilds.get(self.guild_id)

@property
def id(self):
"""
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
gevent==1.1.2
holster==1.0.1
holster==1.0.3
inflection==0.3.1
requests==2.11.1
six==1.10.0
Expand Down

0 comments on commit 2c8f73f

Please sign in to comment.