Add MessageCreate handler, set up Message class and add ability to Cache messages

This commit is contained in:
hydrabolt
2016-04-18 17:55:21 +01:00
parent 7f4751e7c4
commit c947e172d6
7 changed files with 93 additions and 1 deletions

View File

@@ -37,6 +37,7 @@ class WebSocketPacketManager {
this.register(Constants.WSEvents.USER_UPDATE, 'UserUpdate'); this.register(Constants.WSEvents.USER_UPDATE, 'UserUpdate');
this.register(Constants.WSEvents.VOICE_STATE_UPDATE, 'VoiceStateUpdate'); this.register(Constants.WSEvents.VOICE_STATE_UPDATE, 'VoiceStateUpdate');
this.register(Constants.WSEvents.TYPING_START, 'TypingStart'); this.register(Constants.WSEvents.TYPING_START, 'TypingStart');
this.register(Constants.WSEvents.MESSAGE_CREATE, 'MessageCreate');
} }
get client() { get client() {

View File

@@ -0,0 +1,31 @@
'use strict';
const AbstractHandler = require('./AbstractHandler');
const Structure = name => require(`../../../../structures/${name}`);
const Constants = require('../../../../util/Constants');
const Message = Structure('Message');
const Guild = Structure('Guild');
class MessageCreateHandler 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 = new Message(channel, data);
channel._cacheMessage(message);
client.emit(Constants.Events.MESSAGE_CREATE, message);
}
}
};
module.exports = MessageCreateHandler;

View File

@@ -2,10 +2,26 @@
const Channel = require('./Channel'); const Channel = require('./Channel');
const User = require('./User'); const User = require('./User');
const TextChannelDataStore = require('./datastore/TextChannelDataStore');
class DMChannel extends Channel{ class DMChannel extends Channel{
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);
this.store = new TextChannelDataStore();
}
_cacheMessage(message) {
let maxSize = this.client.options.max_message_cache;
if (maxSize === 0) {
// saves on performance
return;
}
let storeKeys = Object.keys(this.store);
if (storeKeys.length >= maxSize) {
this.store.remove(storeKeys[0]);
this.store.add('messages', message);
}
} }
setup(data) { setup(data) {

View File

@@ -1,8 +1,31 @@
'use strict'; 'use strict';
class Message { class Message {
constructor() { constructor(serverChannel, data) {
this.channel = serverChannel;
this.guild = serverChannel.guild;
if (data) {
this.setup(data);
}
}
setup(data) {
this.author = this.guild.client.store.get('users', data.author.id);
this.content = data.content;
this.timestamp = new Date(data.timestamp);
this.editedTimestamp = data.edited_timestamp ? new Date(data.edited_timestamp) : null;
this.tts = data.tts;
this.mentionEveryone = data.mention_everyone;
this.nonce = data.nonce;
this.embeds = data.embeds;
this.attachments = data.attachments;
this.mentions = [];
for (let mention of data.mentions) {
let user = this.guild.client.store.get('users', mention.id);
if (user) {
this.mentions.push(user);
}
}
} }
} }

View File

@@ -4,10 +4,25 @@ const ServerChannel = require('./ServerChannel');
const TextChannelDataStore = require('./datastore/TextChannelDataStore'); const TextChannelDataStore = require('./datastore/TextChannelDataStore');
class TextChannel extends ServerChannel { class TextChannel extends ServerChannel {
constructor(guild, data) { constructor(guild, data) {
super(guild, data); super(guild, data);
this.store = new TextChannelDataStore(); this.store = new TextChannelDataStore();
} }
_cacheMessage(message) {
let maxSize = this.client.options.max_message_cache;
if (maxSize === 0) {
// saves on performance
return;
}
let storeKeys = Object.keys(this.store);
if (storeKeys.length >= maxSize) {
this.store.remove(storeKeys[0]);
this.store.add('messages', message);
}
}
} }
module.exports = TextChannel; module.exports = TextChannel;

View File

@@ -11,6 +11,7 @@ const DefaultOptions = exports.DefaultOptions = {
}, },
}, },
protocol_version: 4, protocol_version: 4,
max_message_cache: 20,
}; };
const Package = exports.Package = require('../../package.json'); const Package = exports.Package = require('../../package.json');
@@ -98,6 +99,7 @@ const Events = exports.Events = {
TYPING_STOP: 'typingStop', TYPING_STOP: 'typingStop',
WARN: 'warn', WARN: 'warn',
GUILD_MEMBERS_CHUNK: 'guildMembersChunk', GUILD_MEMBERS_CHUNK: 'guildMembersChunk',
MESSAGE_CREATE: 'message',
}; };
const WSEvents = exports.WSEvents = { const WSEvents = exports.WSEvents = {

View File

@@ -66,3 +66,7 @@ client.on('typingStop.', (channel, user, data) => {
if (user.username === 'hydrabolt') if (user.username === 'hydrabolt')
console.log(user.username, 'stopped typing in', channel.name, 'after', data.elapsedTime + 'ms'); console.log(user.username, 'stopped typing in', channel.name, 'after', data.elapsedTime + 'ms');
}); });
client.on('message', message => {
console.log(message.author.username, 'said', message.content, 'in', message.channel.name);
});