Browse Source

Cleanup event subtype proxying, fix GuildSubType, etc

pull/9/head
Andrei 9 years ago
parent
commit
6a99eab1a2
  1. 51
      disco/gateway/events.py
  2. 4
      disco/types/channel.py
  3. 34
      disco/types/guild.py
  4. 4
      disco/types/user.py

51
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):

4
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):
"""

34
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):
"""

4
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 '<User {} ({})>'.format(self.id, self.to_string())
def on_create(self):

Loading…
Cancel
Save