aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2015-08-21 22:02:03 -0400
committerRapptz <[email protected]>2015-08-21 22:02:03 -0400
commitef7dd42f2821ccc2a70af96889c653733a91a065 (patch)
tree257dad5f5c031ce0b7cd75cecf6463914ee3b18a
parentAdd the ability to delete messages (diff)
downloaddiscord.py-ef7dd42f2821ccc2a70af96889c653733a91a065.tar.xz
discord.py-ef7dd42f2821ccc2a70af96889c653733a91a065.zip
Add on_message_edit event.
-rw-r--r--discord/client.py21
-rw-r--r--docs/api.rst8
-rw-r--r--examples/edits.py16
3 files changed, 42 insertions, 3 deletions
diff --git a/discord/client.py b/discord/client.py
index 19b84b8b..bcd15177 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -93,7 +93,8 @@ class Client(object):
'on_error': _null_event,
'on_response': _null_event,
'on_message': _null_event,
- 'on_message_delete': _null_event
+ 'on_message_delete': _null_event,
+ 'on_message_edit': _null_event
}
self.ws = WebSocketClient(endpoints.WEBSOCKET_HUB, protocols=['http-only', 'chat'])
@@ -114,6 +115,9 @@ class Client(object):
'authorization': self.token,
}
+ def _get_message(self, msg_id):
+ return next((m for m in self.messages if m.id == msg_id), None)
+
def _received_message(self, msg):
response = json.loads(str(msg))
if response.get('op') != 0:
@@ -152,10 +156,23 @@ class Client(object):
elif event == 'MESSAGE_DELETE':
channel = self.get_channel(data.get('channel_id'))
message_id = data.get('id')
- found = next((m for m in self.messages if m.id == message_id), None)
+ found = self._get_message(message_id)
if found is not None:
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)
+ self.events['on_message_edit'](older_message, message)
+ older_message.edited_timestamp = message.edited_timestamp
+ else:
+ # if we couldn't find the message in our cache, just add it to the list
+ channel = self.get_channel(data.get('channel_id'))
+ message = Message(channel=channel, **data)
+ self.messages.append(message)
+
def _opened(self):
print('Opened at {}'.format(int(time.time())))
diff --git a/docs/api.rst b/docs/api.rst
index e407c6e6..dcfc8bbf 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -39,10 +39,16 @@ This page outlines the different types of events listened to by :meth:`Client.ev
:param response: The received message response after gone through ``json.loads``.
.. function:: on_message_delete(message)
+.. function:: on_message_edit(before, after)
- Called when a message is deleted from any given server.
+ 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
+ is too old or the client is participating in high traffic servers. To fix this, increase
+ the ``max_length`` option of :class:`Client`.
:param message: A :class:`Message` of the deleted message.
+ :param before: A :class:`Message` of the previous version of the message.
+ :param after: A :class:`Message` of the current version of the message.
Data Classes
diff --git a/examples/edits.py b/examples/edits.py
new file mode 100644
index 00000000..c1619cec
--- /dev/null
+++ b/examples/edits.py
@@ -0,0 +1,16 @@
+import discord
+
+client = discord.Client()
+client.login('email', 'password')
+
+def on_ready():
+ print('Connected!')
+ print('Username: ' + client.user.name)
+ print('ID: ' + client.user.id)
+
+def on_message_edit(before, after):
+ client.send_message(after.channel, '**{}** edited their message:\n{}'.format(after.author.name, before.content))
+
+client.run()