From 0ea8f1f270fdd2b132aa5ce7d9b16ed6fe89e1d2 Mon Sep 17 00:00:00 2001 From: Andrei Date: Wed, 28 Sep 2016 19:25:49 -0500 Subject: [PATCH] Simplify state listeners --- README.md | 14 +++++++------- disco/state.py | 49 +++++++++++++++++++++--------------------------- requirements.txt | 1 + 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index e35d9e0..af65002 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # disco -A Discord Python bot built to be easy to use and scale. +A Pythonic Discord library built for simplicity and extendability. Supports 2.x/3.x versions of Python. Uses gevent. + ## TODOS +- Permissions/Roles support +- Plugin/Library reloading + - Abstract GatewayClient out into the WebsocketProcessProxy + - Abstract VoiceClients to run in a seperate process +- Voice Support -- permissions support -- flesh out API client -- storage/database/config -- flesh out type methods -- plugin reload -- voice support diff --git a/disco/state.py b/disco/state.py index 60d23b2..71b8ae4 100644 --- a/disco/state.py +++ b/disco/state.py @@ -1,3 +1,5 @@ +import inflection + from collections import defaultdict, deque, namedtuple from weakref import WeakValueDictionary @@ -15,9 +17,16 @@ class StateConfig(object): class State(object): + EVENTS = [ + 'Ready', 'GuildCreate', 'GuildUpdate', 'GuildDelete', 'GuildMemberAdd', 'GuildMemberRemove', + 'GuildMemberUpdate', 'GuildMemberChunk', 'GuildRoleCreate', 'GuildRoleUpdate', 'GuildRoleDelete', + 'ChannelCreate', 'ChannelUpdate', 'ChannelDelete', 'VoiceStateUpdate' + ] + def __init__(self, client, config=None): self.client = client self.config = config or StateConfig() + self.listeners = [] self.me = None @@ -27,36 +36,20 @@ class State(object): self.users = WeakValueDictionary() self.voice_states = WeakValueDictionary() - self.client.events.on('Ready', self.on_ready) - self.messages = defaultdict(lambda: deque(maxlen=self.config.track_messages_size)) if self.config.track_messages: - self.client.events.on('MessageCreate', self.on_message_create) - self.client.events.on('MessageDelete', self.on_message_delete) - - # Guilds - self.client.events.on('GuildCreate', self.on_guild_create) - self.client.events.on('GuildUpdate', self.on_guild_update) - self.client.events.on('GuildDelete', self.on_guild_delete) - - # Guild members - self.client.events.on('GuildMemberAdd', self.on_guild_member_add) - self.client.events.on('GuildMemberRemove', self.on_guild_member_remove) - self.client.events.on('GuildMemberUpdate', self.on_guild_member_update) - self.client.events.on('GuildMemberChunk', self.on_guild_member_chunk) - - # Guild roles - self.client.events.on('GuildRoleCreate', self.on_guild_role_create) - self.client.events.on('GuildRoleUpdate', self.on_guild_role_update) - self.client.events.on('GuildROleDelete', self.on_guild_role_delete) - - # Channels - self.client.events.on('ChannelCreate', self.on_channel_create) - self.client.events.on('ChannelUpdate', self.on_channel_update) - self.client.events.on('ChannelDelete', self.on_channel_delete) - - # Voice states - self.client.events.on('VoiceStateUpdate', self.on_voice_state_update) + self.EVENTS += ['MessageCreate', 'MessageDelete'] + + self.bind() + + def unbind(self): + map(lambda k: k.unbind(), self.listeners) + self.listeners = [] + + def bind(self): + for event in self.EVENTS: + func = 'on_' + inflection.underscore(event) + self.listeners.append(self.client.events.on(event, getattr(self, func))) def on_ready(self, event): self.me = event.user diff --git a/requirements.txt b/requirements.txt index 7c84120..80711cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ cryptography==1.5 enum34==1.1.6 Flask==0.11.1 gevent==1.1.2 +gipc==0.6.0 greenlet==0.4.10 holster==1.0.0 idna==2.1