From 6a99eab1a204f5674d44bf0edc68cb679756260b Mon Sep 17 00:00:00 2001 From: Andrei Date: Fri, 28 Oct 2016 19:19:24 -0500 Subject: [PATCH] Cleanup event subtype proxying, fix GuildSubType, etc --- disco/gateway/events.py | 51 +++++++++++++++++++++++++++++++++++------ disco/types/channel.py | 4 ++++ disco/types/guild.py | 34 ++++++++++++++++----------- disco/types/user.py | 4 ++-- 4 files changed, 71 insertions(+), 22 deletions(-) diff --git a/disco/gateway/events.py b/disco/gateway/events.py index d1e3dd5..9afb9c0 100644 --- a/disco/gateway/events.py +++ b/disco/gateway/events.py @@ -62,11 +62,9 @@ class GatewayEvent(six.with_metaclass(GatewayEventMeta, Model)): return cls(obj, client) def __getattr__(self, name): - if hasattr(self, '_wraps_model'): - modname, _ = self._wraps_model - if hasattr(self, modname) and hasattr(getattr(self, modname), name): - return getattr(getattr(self, modname), name) - raise AttributeError(name) + if hasattr(self, '_proxy'): + return getattr(getattr(self, self._proxy), name) + return object.__getattribute__(self, name) def debug(func=None): @@ -93,6 +91,14 @@ def wraps_model(model, alias=None): cls._fields[alias] = Field(model) cls._fields[alias].set_name(alias) cls._wraps_model = (alias, model) + cls._proxy = alias + return cls + return deco + + +def proxy(field): + def deco(cls): + cls._proxy = field return cls return deco @@ -252,6 +258,10 @@ class GuildBanAdd(GatewayEvent): """ guild_id = Field(snowflake) + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + @wraps_model(User) class GuildBanRemove(GuildBanAdd): @@ -266,6 +276,10 @@ class GuildBanRemove(GuildBanAdd): The user being unbanned from the guild. """ + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + class GuildEmojisUpdate(GatewayEvent): """ @@ -308,6 +322,10 @@ class GuildMembersChunk(GatewayEvent): guild_id = Field(snowflake) members = Field(listof(GuildMember)) + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + @wraps_model(GuildMember, alias='member') class GuildMemberAdd(GatewayEvent): @@ -321,6 +339,7 @@ class GuildMemberAdd(GatewayEvent): """ +@proxy('user') class GuildMemberRemove(GatewayEvent): """ Sent when a user leaves a guild (via leaving, kicking, or banning). @@ -332,8 +351,12 @@ class GuildMemberRemove(GatewayEvent): user : :class:`disco.types.user.User` The user who was removed from the guild. """ - guild_id = Field(snowflake) user = Field(User) + guild_id = Field(snowflake) + + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) @wraps_model(GuildMember, alias='member') @@ -348,6 +371,7 @@ class GuildMemberUpdate(GatewayEvent): """ +@proxy('role') class GuildRoleCreate(GatewayEvent): """ Sent when a role is created. @@ -359,10 +383,15 @@ class GuildRoleCreate(GatewayEvent): role : :class:`disco.types.guild.Role` The role that was created. """ - guild_id = Field(snowflake) role = Field(Role) + guild_id = Field(snowflake) + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + +@proxy('role') class GuildRoleUpdate(GuildRoleCreate): """ Sent when a role is updated. @@ -375,6 +404,10 @@ class GuildRoleUpdate(GuildRoleCreate): The role that was created. """ + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + class GuildRoleDelete(GatewayEvent): """ @@ -390,6 +423,10 @@ class GuildRoleDelete(GatewayEvent): guild_id = Field(snowflake) role_id = Field(snowflake) + @property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + @wraps_model(Message) class MessageCreate(GatewayEvent): diff --git a/disco/types/channel.py b/disco/types/channel.py index 76e1420..836c315 100644 --- a/disco/types/channel.py +++ b/disco/types/channel.py @@ -144,6 +144,10 @@ class Channel(SlottedModel, Permissible): return base + @property + def mention(self): + return '<#{}>'.format(self.id) + @property def is_guild(self): """ diff --git a/disco/types/guild.py b/disco/types/guild.py index 14b781a..b058d71 100644 --- a/disco/types/guild.py +++ b/disco/types/guild.py @@ -23,17 +23,7 @@ VerificationLevel = Enum( ) -class GuildSubType(object): - __slots__ = [] - - guild_id = Field(None) - - @cached_property - def guild(self): - return self.client.state.guilds.get(self.guild_id) - - -class GuildEmoji(Emoji, GuildSubType): +class GuildEmoji(Emoji): """ An emoji object @@ -56,8 +46,12 @@ class GuildEmoji(Emoji, GuildSubType): managed = Field(bool) roles = Field(listof(snowflake)) + @cached_property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + -class Role(SlottedModel, GuildSubType): +class Role(SlottedModel): """ A role object @@ -87,6 +81,9 @@ class Role(SlottedModel, GuildSubType): position = Field(int) mentionable = Field(bool) + def __str__(self): + return self.name + def delete(self): self.guild.delete_role(self) @@ -97,8 +94,12 @@ class Role(SlottedModel, GuildSubType): def mention(self): return '<@{}>'.format(self.id) + @cached_property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + -class GuildMember(SlottedModel, GuildSubType): +class GuildMember(SlottedModel): """ A GuildMember object @@ -127,6 +128,9 @@ class GuildMember(SlottedModel, GuildSubType): joined_at = Field(str) roles = Field(listof(snowflake)) + def __str__(self): + return self.user.__str__() + def get_voice_state(self): """ Returns @@ -186,6 +190,10 @@ class GuildMember(SlottedModel, GuildSubType): """ return self.user.id + @cached_property + def guild(self): + return self.client.state.guilds.get(self.guild_id) + class Guild(SlottedModel, Permissible): """ diff --git a/disco/types/user.py b/disco/types/user.py index cad2cb8..15507d9 100644 --- a/disco/types/user.py +++ b/disco/types/user.py @@ -18,10 +18,10 @@ class User(SlottedModel, with_equality('id'), with_hash('id')): def mention(self): return '<@{}>'.format(self.id) - def to_string(self): + def __str__(self): return '{}#{}'.format(self.username, self.discriminator) - def __str__(self): + def __repr__(self): return ''.format(self.id, self.to_string()) def on_create(self):