aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--discord/client.py21
-rw-r--r--docs/api.rst11
2 files changed, 30 insertions, 2 deletions
diff --git a/discord/client.py b/discord/client.py
index 85070fd3..e44eec55 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -94,7 +94,8 @@ class Client(object):
'on_response': _null_event,
'on_message': _null_event,
'on_message_delete': _null_event,
- 'on_message_edit': _null_event
+ 'on_message_edit': _null_event,
+ 'on_status': _null_event,
}
self.ws = WebSocketClient(endpoints.WEBSOCKET_HUB, protocols=['http-only', 'chat'])
@@ -169,7 +170,6 @@ class Client(object):
self.events['on_message_delete'](found)
self.messages.remove(found)
elif event == 'MESSAGE_UPDATE':
- # {u'edited_timestamp': u'2015-08-22T01:19:23.002892+00:00', u'attachments': [], u'channel_id': u'81840769509363712', u'tts': False, u'timestamp': u'2015-08-22T01:19:20.377000+00:00', u'author': {u'username': u'Danny', u'discriminator': u'9173', u'id': u'80088516616269824', u'avatar': u'd9dab18704d8cdcf5a022f9e913420fa'}, u'content': u'goodbye', u'embeds': [], u'mention_everyone': False, u'mentions': [], u'id': u'84456339153092608'}
older_message = self._get_message(data.get('id'))
if older_message is not None:
message = Message(channel=older_message.channel, **data)
@@ -180,6 +180,23 @@ class Client(object):
channel = self.get_channel(data.get('channel_id'))
message = Message(channel=channel, **data)
self.messages.append(message)
+ elif event == 'PRESENCE_UPDATE':
+ guild_id = data.get('guild_id')
+ 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'))
+ # 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)
+ if status == 'online':
+ if member is None:
+ server.members.append(user)
+ if status == 'offline':
+ server.members.remove(user)
+
+ # call the event now
+ self.events['on_status'](server, user, status, data.get('game_id'))
+
def _opened(self):
diff --git a/docs/api.rst b/docs/api.rst
index 937eff70..173964f2 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -50,6 +50,17 @@ This page outlines the different types of events listened to by :meth:`Client.ev
: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):
+
+ Called whenever a user 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.
+
Data Classes
--------------