From 322c70fda9bef3550b2b02fb6995275d24c40444 Mon Sep 17 00:00:00 2001
From: Rapptz <rapptz@gmail.com>
Date: Fri, 5 May 2017 20:47:25 -0400
Subject: [PATCH] Rework some events to make more sense.

This is a breaking change.

1. Change on_guild_emojis_update to have 3 arguments.
    - The first parameter is now the guild object
2. Remove on_channel_create, on_channel_delete, and on_channel_update
	- They are now split into two.
	- on_guild_channel_[create|delete|update]
	- on_private_channel_[create|delete|update]
3. Change on_member_ban to allow User.
    - (member) -> (guild, user)
    - user can also be a Member
---
 discord/state.py | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/discord/state.py b/discord/state.py
index c0e30ed2f..9e9316977 100644
--- a/discord/state.py
+++ b/discord/state.py
@@ -386,13 +386,14 @@ class ConnectionState:
             channel = guild.get_channel(channel_id)
             if channel is not None:
                 guild._remove_channel(channel)
-                self.dispatch('channel_delete', channel)
+                self.dispatch('guild_channel_delete', channel)
         else:
             # the reason we're doing this is so it's also removed from the
             # private channel by user cache as well
             channel = self._get_private_channel(channel_id)
             if channel is not None:
                 self._remove_private_channel(channel)
+                self.dispatch('private_channel_delete', channel)
 
     def parse_channel_update(self, data):
         channel_type = try_enum(ChannelType, data.get('type'))
@@ -401,7 +402,7 @@ class ConnectionState:
             channel = self._get_private_channel(channel_id)
             old_channel = copy.copy(channel)
             channel._update_group(data)
-            self.dispatch('channel_update', old_channel, channel)
+            self.dispatch('private_channel_update', old_channel, channel)
             return
 
         guild_id = utils._get_as_snowflake(data, 'guild_id')
@@ -411,7 +412,7 @@ class ConnectionState:
             if channel is not None:
                 old_channel = copy.copy(channel)
                 channel._update(guild, data)
-                self.dispatch('channel_update', old_channel, channel)
+                self.dispatch('guild_channel_update', old_channel, channel)
             else:
                 log.warning('CHANNEL_UPDATE referencing an unknown channel ID: %s. Discarding.', channel_id)
         else:
@@ -423,17 +424,18 @@ class ConnectionState:
         if ch_type in (ChannelType.group, ChannelType.private):
             channel = factory(me=self.user, data=data, state=self)
             self._add_private_channel(channel)
+            self.dispatch('private_channel_create', channel)
         else:
             guild_id = utils._get_as_snowflake(data, 'guild_id')
             guild = self._get_guild(guild_id)
             if guild is not None:
                 channel = factory(guild=guild, state=self, data=data)
                 guild._add_channel(channel)
+                self.dispatch('guild_channel_create', channel)
             else:
                 log.warning('CHANNEL_CREATE referencing an unknown guild ID: %s. Discarding.', guild_id)
                 return
 
-        self.dispatch('channel_create', channel)
 
     def parse_channel_pins_update(self, data):
         channel = self.get_channel(int(data['channel_id']))
@@ -503,7 +505,7 @@ class ConnectionState:
 
         before_emojis = guild.emojis
         guild.emojis = tuple(map(lambda d: self.store_emoji(guild, d), data['emojis']))
-        self.dispatch('guild_emojis_update', before_emojis, guild.emojis)
+        self.dispatch('guild_emojis_update', guild, before_emojis, guild.emojis)
 
     def _get_create_guild(self, data):
         if data.get('unavailable') == False:
@@ -613,13 +615,12 @@ class ConnectionState:
         guild = self._get_guild(int(data['guild_id']))
         if guild is not None:
             try:
-                user_id = int(data['user']['id'])
+                user = User(data=data['user'], state=self)
             except KeyError:
                 pass
             else:
-                member = guild.get_member(user_id)
-                if member is not None:
-                    self.dispatch('member_ban', member)
+                member = guild.get_member(user.id) or user
+                self.dispatch('member_ban', guild, member)
 
     def parse_guild_ban_remove(self, data):
         guild = self._get_guild(int(data['guild_id']))