From 795b8ceffefa64262c8ebecaaaf4e1f051162fae Mon Sep 17 00:00:00 2001
From: Rapptz <rapptz@gmail.com>
Date: Thu, 27 Aug 2015 17:44:31 -0400
Subject: [PATCH] on_status now takes only a member.

---
 discord/client.py | 18 +++++++++++-------
 discord/server.py |  6 +++---
 docs/api.rst      | 13 ++++---------
 3 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/discord/client.py b/discord/client.py
index f5e86bb9d..46f23bda8 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -264,17 +264,21 @@ class Client(object):
             server = next((s for s in self.servers if s.id == guild_id), None)
             if server is not None:
                 status = data.get('status')
-                user = User(**data.get('user'))
+                member_id = data['user']['id']
                 # check to see if the member is in our server list of members
-                member = next((u for u in server.members if u == user), None)
+                member = next((u for u in server.members if u.id == member_id), None)
+
+                if member is None:
+                    # create the member if it doesn't exist
+                    member = Member(**data)
+
                 if status == 'online':
-                    if member is None:
-                        server.members.append(user)
-                if status == 'offline' and user in server.members:
-                    server.members.remove(user)
+                    server.members.append(member)
+                elif status == 'offline' and self.no_offline_members:
+                    server.members.remove(member)
 
                 # call the event now
-                self._invoke_event('on_status', server, user, status, data.get('game_id'))
+                self._invoke_event('on_status', member)
         elif event == 'USER_UPDATE':
             self.user = User(**data)
         elif event == 'CHANNEL_DELETE':
diff --git a/discord/server.py b/discord/server.py
index 727dfb7d5..0c0172b6c 100644
--- a/discord/server.py
+++ b/discord/server.py
@@ -81,15 +81,15 @@ class Member(User):
         The :class:`Server` that the member belongs to.
     """
 
-    def __init__(self, deaf, joined_at, user, roles, mute):
+    def __init__(self, deaf, joined_at, user, roles, mute, **kwargs):
         super(Member, self).__init__(**user)
         self.deaf = deaf
         self.mute = mute
         self.joined_at = datetime.datetime(*map(int, re.split(r'[^\d]', joined_at.replace('+00:00', ''))))
         self.roles = roles
         self.status = 'offline'
-        self.game_id = None
-        self.server = None
+        self.game_id = kwargs.get('game_id', None)
+        self.server = kwargs.get('server', None)
 
 class Server(object):
     """Represents a Discord server.
diff --git a/docs/api.rst b/docs/api.rst
index c9b6de0bf..08ec33944 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -45,7 +45,7 @@ All events are 'sandboxed', in that if an exception is thrown while the event is
     :param response: The received message response after gone through ``json.loads``.
 
 .. function:: on_message_delete(message)
-.. function:: on_message_edit(before, after)
+              on_message_edit(before, after)
 
     Called when a message is deleted or edited from any given server. If the message is not found in the
     :attr:`Client.messages` cache, then these events will not be called. This happens if the message
@@ -56,16 +56,11 @@ All events are 'sandboxed', in that if an exception is thrown while the event is
     :param before: A :class:`Message` of the previous version of the message.
     :param after: A :class:`Message` of the current version of the message.
 
-.. function:: on_status(server, user, status, game_id):
+.. function:: on_status(member):
 
-    Called whenever a user changes their status or game playing status.
+    Called whenever a :class:`Member` changes their status or game playing status.
 
-    The status is usually either "idle", "online" or "offline".
-
-    :param server: The :class:`Server` the user belongs to.
-    :param user: The :class:`User` whose status changed.
-    :param status: The new status of the user.
-    :param game_id: The game ID that the user is playing. Can be None.
+    :param server: The :class:`Member` who has had their status changed.
 
 .. function:: on_channel_delete(channel)
               on_channel_create(channel)