From 00327a577690cdbcc7e4a8d591cf3d8559a88d93 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 18 Apr 2016 18:12:57 +0100 Subject: [PATCH] Add MessageUpdate handling --- .../packets/WebSocketPacketManager.js | 1 + .../packets/handlers/MessageUpdate.js | 35 +++++++++++++++++++ src/structures/Message.js | 32 +++++++++++++++++ src/util/Constants.js | 3 +- test/random.js | 5 +++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/client/websocket/packets/handlers/MessageUpdate.js diff --git a/src/client/websocket/packets/WebSocketPacketManager.js b/src/client/websocket/packets/WebSocketPacketManager.js index 1cfeb9362..8e0341757 100644 --- a/src/client/websocket/packets/WebSocketPacketManager.js +++ b/src/client/websocket/packets/WebSocketPacketManager.js @@ -39,6 +39,7 @@ class WebSocketPacketManager { this.register(Constants.WSEvents.TYPING_START, 'TypingStart'); this.register(Constants.WSEvents.MESSAGE_CREATE, 'MessageCreate'); this.register(Constants.WSEvents.MESSAGE_DELETE, 'MessageDelete'); + this.register(Constants.WSEvents.MESSAGE_UPDATE, 'MessageUpdate'); } get client() { diff --git a/src/client/websocket/packets/handlers/MessageUpdate.js b/src/client/websocket/packets/handlers/MessageUpdate.js new file mode 100644 index 000000000..e6daf2bbc --- /dev/null +++ b/src/client/websocket/packets/handlers/MessageUpdate.js @@ -0,0 +1,35 @@ +'use strict'; + +const AbstractHandler = require('./AbstractHandler'); +const Structure = name => require(`../../../../structures/${name}`); +const Constants = require('../../../../util/Constants'); +const CloneObject = require('../../../../util/CloneObject'); + +const Message = Structure('Message'); +const Guild = Structure('Guild'); + +class MessageUpdateHandler extends AbstractHandler { + + constructor(packetManager) { + super(packetManager); + } + + handle(packet) { + let data = packet.d; + let client = this.packetManager.client; + let channel = client.store.get('channels', data.channel_id); + + if (channel) { + let message = channel.store.get('messages', data.id); + if (message) { + let oldMessage = CloneObject(message); + message.patch(data); + client.emit(Constants.Events.MESSAGE_UPDATE, oldMessage, message); + } + } + + } + +}; + +module.exports = MessageUpdateHandler; diff --git a/src/structures/Message.js b/src/structures/Message.js index 8f600f929..025547e32 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -28,6 +28,38 @@ class Message { } } } + + patch(data) { + if (data.author) + this.author = this.guild.client.store.get('users', data.author.id); + if (data.content) + this.content = data.content; + if (data.timestamp) + this.timestamp = new Date(data.timestamp); + if (data.edited_timestamp) + this.editedTimestamp = data.edited_timestamp ? new Date(data.edited_timestamp) : null; + if (data.tts) + this.tts = data.tts; + if (data.mention_everyone) + this.mentionEveryone = data.mention_everyone; + if (data.nonce) + this.nonce = data.nonce; + if (data.embeds) + this.embeds = data.embeds; + if (data.attachments) + this.attachments = data.attachments; + if (data.mentions) { + for (let mention of data.mentions) { + let user = this.guild.client.store.get('users', mention.id); + if (user) { + this.mentions.push(user); + } + } + } + + if (data.id) + this.id = data.id; + } } module.exports = Message; diff --git a/src/util/Constants.js b/src/util/Constants.js index ad5713e18..2b1705e0a 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -11,7 +11,7 @@ const DefaultOptions = exports.DefaultOptions = { }, }, protocol_version: 4, - max_message_cache: 20, + max_message_cache: 200, }; const Package = exports.Package = require('../../package.json'); @@ -101,6 +101,7 @@ const Events = exports.Events = { GUILD_MEMBERS_CHUNK: 'guildMembersChunk', MESSAGE_CREATE: 'message', MESSAGE_DELETE: 'messageDelete', + MESSAGE_UPDATE: 'messageUpdate', }; const WSEvents = exports.WSEvents = { diff --git a/test/random.js b/test/random.js index 54fde3c24..f55fcecac 100644 --- a/test/random.js +++ b/test/random.js @@ -75,3 +75,8 @@ client.on('message', message => { client.on('messageDelete', message => { console.log('Message deleted by', message.author.username); }); + +client.on('messageUpdate', (old, message) => { + if (message.author.username === 'hydrabolt') + console.log('Message updated from', old.content, 'to', message.content); +});