Cleanup Part 2: Electric Boogaloo (Reloaded) (#594)

* Cleanup Part 2: Electric Boogaloo (Reloaded)

* Moar cleanup

* Tweak NOT_A_PERMISSION error
This commit is contained in:
Schuyler Cebulskie
2016-09-04 05:08:09 -04:00
committed by Amish Shah
parent 5a9c42061f
commit 0b908f5bce
95 changed files with 946 additions and 1526 deletions

View File

@@ -10,7 +10,6 @@ const BeforeReadyWhitelist = [
];
class WebSocketPacketManager {
constructor(websocketManager) {
this.ws = websocketManager;
this.handlers = {};
@@ -62,9 +61,7 @@ class WebSocketPacketManager {
}
setSequence(s) {
if (s && s > this.ws.sequence) {
this.ws.sequence = s;
}
if (s && s > this.ws.sequence) this.ws.sequence = s;
}
handle(packet) {
@@ -93,13 +90,9 @@ class WebSocketPacketManager {
}
}
if (this.handlers[packet.t]) {
return this.handlers[packet.t].handle(packet);
}
if (this.handlers[packet.t]) return this.handlers[packet.t].handle(packet);
return false;
}
}
module.exports = WebSocketPacketManager;

View File

@@ -1,5 +1,4 @@
class AbstractHandler {
constructor(packetManager) {
this.packetManager = packetManager;
}

View File

@@ -3,25 +3,18 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class ChannelCreateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const response = client.actions.ChannelCreate.handle(data);
if (response.channel) {
client.emit(Constants.Events.CHANNEL_CREATE, response.channel);
}
if (response.channel) client.emit(Constants.Events.CHANNEL_CREATE, response.channel);
}
}
/**
* Emitted whenever a Channel is created.
*
* @event Client#channelCreate
* @param {Channel} channel The channel that was created
*/
* Emitted whenever a Channel is created.
* @event Client#channelCreate
* @param {Channel} channel The channel that was created
*/
module.exports = ChannelCreateHandler;

View File

@@ -3,25 +3,18 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class ChannelDeleteHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const response = client.actions.ChannelDelete.handle(data);
if (response.channel) {
client.emit(Constants.Events.CHANNEL_DELETE, response.channel);
}
if (response.channel) client.emit(Constants.Events.CHANNEL_DELETE, response.channel);
}
}
/**
* Emitted whenever a Channel is deleted.
*
* @event Client#channelDelete
* @param {Channel} channel The channel that was deleted
*/
* Emitted whenever a Channel is deleted.
* @event Client#channelDelete
* @param {Channel} channel The channel that was deleted
*/
module.exports = ChannelDeleteHandler;

View File

@@ -8,31 +8,24 @@ const Constants = require('../../../../util/Constants');
d:
{ last_pin_timestamp: '2016-08-28T17:37:13.171774+00:00',
channel_id: '314866471639044027' } }
*/
*/
class ChannelPinsUpdate extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const channel = client.channels.get(data.channel_id);
const time = new Date(data.last_pin_timestamp);
if (channel && time) {
client.emit(Constants.Events.CHANNEL_PINS_UPDATE, channel, time);
}
if (channel && time) client.emit(Constants.Events.CHANNEL_PINS_UPDATE, channel, time);
}
}
/**
* Emitted whenever the pins of a Channel are updated. Due to the nature of the WebSocket event, not much information
* can be provided easily here - you need to manually check the pins yourself.
*
* @event Client#channelPinsUpdate
* @param {Channel} channel The channel that the pins update occured in
* @param {Date} time the time of the pins update
*/
* Emitted whenever the pins of a Channel are updated. Due to the nature of the WebSocket event, not much information
* can be provided easily here - you need to manually check the pins yourself.
* @event Client#channelPinsUpdate
* @param {Channel} channel The channel that the pins update occured in
* @param {Date} time The time of the pins update
*/
module.exports = ChannelPinsUpdate;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class ChannelUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.ChannelUpdate.handle(data);
}
}
module.exports = ChannelUpdateHandler;

View File

@@ -4,27 +4,20 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class GuildBanAddHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
const user = client.users.get(data.user.id);
if (guild && user) {
client.emit(Constants.Events.GUILD_BAN_ADD, guild, user);
}
if (guild && user) client.emit(Constants.Events.GUILD_BAN_ADD, guild, user);
}
}
/**
* Emitted whenever a member is banned from a guild.
*
* @event Client#guildBanAdd
* @param {Guild} guild The guild that the ban occurred in
* @param {User} user The user that was banned
*/
* Emitted whenever a member is banned from a guild.
* @event Client#guildBanAdd
* @param {Guild} guild The guild that the ban occurred in
* @param {User} user The user that was banned
*/
module.exports = GuildBanAddHandler;

View File

@@ -3,22 +3,18 @@
const AbstractHandler = require('./AbstractHandler');
class GuildBanRemoveHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildBanRemove.handle(data);
}
}
/**
* Emitted whenever a member is unbanned from a guild.
*
* @event Client#guildBanRemove
* @param {Guild} guild The guild that the unban occurred in
* @param {User} user The user that was unbanned
*/
* Emitted whenever a member is unbanned from a guild.
* @event Client#guildBanRemove
* @param {Guild} guild The guild that the unban occurred in
* @param {User} user The user that was unbanned
*/
module.exports = GuildBanRemoveHandler;

View File

@@ -1,13 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildCreateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.id);
if (guild) {
if (!guild.available && !data.unavailable) {
// a newly available guild
@@ -19,7 +17,6 @@ class GuildCreateHandler extends AbstractHandler {
client.dataManager.newGuild(data);
}
}
}
module.exports = GuildCreateHandler;

View File

@@ -2,25 +2,18 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class GuildDeleteHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const response = client.actions.GuildDelete.handle(data);
if (response.guild) {
client.emit(Constants.Events.GUILD_DELETE, response.guild);
}
if (response.guild) client.emit(Constants.Events.GUILD_DELETE, response.guild);
}
}
/**
* Emitted whenever a Guild is deleted/left.
*
* @event Client#guildDelete
* @param {Guild} guild The guild that was deleted
*/
* Emitted whenever a Guild is deleted/left.
* @event Client#guildDelete
* @param {Guild} guild The guild that was deleted
*/
module.exports = GuildDeleteHandler;

View File

@@ -3,19 +3,15 @@
const AbstractHandler = require('./AbstractHandler');
class GuildMemberAddHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
if (guild) {
guild.memberCount++;
guild._addMember(data);
}
}
}
module.exports = GuildMemberAddHandler;

View File

@@ -3,14 +3,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildMemberRemoveHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildMemberRemove.handle(data);
}
}
module.exports = GuildMemberRemoveHandler;

View File

@@ -3,21 +3,16 @@
const AbstractHandler = require('./AbstractHandler');
class GuildMemberUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
if (guild) {
const member = guild.members.get(data.user.id);
if (member) {
guild._updateMember(member, data);
}
if (member) guild._updateMember(member, data);
}
}
}
module.exports = GuildMemberUpdateHandler;

View File

@@ -4,31 +4,26 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class GuildMembersChunkHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
const members = [];
if (guild) {
for (const member of data.members) {
members.push(guild._addMember(member, true));
}
for (const member of data.members) members.push(guild._addMember(member, true));
}
guild._checkChunks();
client.emit(Constants.Events.GUILD_MEMBERS_CHUNK, guild, members);
}
}
/**
* Emitted whenever a chunk of Guild members is received
*
* @event Client#guildMembersChunk
* @param {Guild} guild The guild that the chunks relate to
* @param {Array<GuildMember>} members The members in the chunk
*/
* Emitted whenever a chunk of Guild members is received
* @event Client#guildMembersChunk
* @param {Guild} guild The guild that the chunks relate to
* @param {GuildMember[]} members The members in the chunk
*/
module.exports = GuildMembersChunkHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildRoleCreateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildRoleCreate.handle(data);
}
}
module.exports = GuildRoleCreateHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildRoleDeleteHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildRoleDelete.handle(data);
}
}
module.exports = GuildRoleDeleteHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildRoleUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildRoleUpdate.handle(data);
}
}
module.exports = GuildRoleUpdateHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildSyncHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildSync.handle(data);
}
}
module.exports = GuildSyncHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class GuildUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.GuildUpdate.handle(data);
}
}
module.exports = GuildUpdateHandler;

View File

@@ -2,25 +2,18 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class MessageCreateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const response = client.actions.MessageCreate.handle(data);
if (response.message) {
client.emit(Constants.Events.MESSAGE_CREATE, response.message);
}
if (response.message) client.emit(Constants.Events.MESSAGE_CREATE, response.message);
}
}
/**
* Emitted whenever a message is created
*
* @event Client#message
* @param {Message} message The created message
*/
* Emitted whenever a message is created
* @event Client#message
* @param {Message} message The created message
*/
module.exports = MessageCreateHandler;

View File

@@ -2,25 +2,18 @@ const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class MessageDeleteHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const response = client.actions.MessageDelete.handle(data);
if (response.message) {
client.emit(Constants.Events.MESSAGE_DELETE, response.message);
}
if (response.message) client.emit(Constants.Events.MESSAGE_DELETE, response.message);
}
}
/**
* Emitted whenever a message is deleted
*
* @event Client#messageDelete
* @param {Message} message The deleted message
*/
* Emitted whenever a message is deleted
* @event Client#messageDelete
* @param {Message} message The deleted message
*/
module.exports = MessageDeleteHandler;

View File

@@ -1,21 +1,17 @@
const AbstractHandler = require('./AbstractHandler');
class MessageDeleteBulkHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.MessageDeleteBulk.handle(data);
}
}
/**
* Emitted whenever a messages are deleted in bulk
*
* @event Client#messageDeleteBulk
* @param {Collection<string, Message>} messages The deleted messages, mapped by their ID
*/
* Emitted whenever messages are deleted in bulk
* @event Client#messageDeleteBulk
* @param {Collection<string, Message>} messages The deleted messages, mapped by their ID
*/
module.exports = MessageDeleteBulkHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class MessageUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.MessageUpdate.handle(data);
}
}
module.exports = MessageUpdateHandler;

View File

@@ -3,21 +3,16 @@ const Constants = require('../../../../util/Constants');
const cloneObject = require('../../../../util/CloneObject');
class PresenceUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
let user = client.users.get(data.user.id);
const guild = client.guilds.get(data.guild_id);
function makeUser(newUser) {
return client.dataManager.newUser(newUser);
}
// step 1
if (!user) {
if (data.user.username) {
user = makeUser(data.user);
user = client.dataManager.newUser(data.user);
} else {
return;
}
@@ -39,7 +34,6 @@ class PresenceUpdateHandler extends AbstractHandler {
data.user.username = data.user.username || user.username;
data.user.id = data.user.id || user.id;
data.user.discriminator = data.user.discriminator || user.discriminator;
// comment out avatar patching as it causes bugs (see #297)
// data.user.avatar = data.user.avatar || user.avatar;
data.user.status = data.status || user.status;
@@ -58,24 +52,20 @@ class PresenceUpdateHandler extends AbstractHandler {
client.emit(Constants.Events.PRESENCE_UPDATE, oldUser, user);
}
}
}
/**
* Emitted whenever a user changes one of their details or starts/stop playing a game
*
* @event Client#presenceUpdate
* @param {User} oldUser the user before the presence update
* @param {User} newUser the user after the presence update
*/
* Emitted whenever a user changes one of their details or starts/stop playing a game
* @event Client#presenceUpdate
* @param {User} oldUser The user before the presence update
* @param {User} newUser The user after the presence update
*/
/**
* Emitted whenever a member becomes available in a large Guild
*
* @event Client#guildMemberAvailable
* @param {Guild} guild The guild that the member became available in
* @param {GuildMember} member the member that became available
*/
* Emitted whenever a member becomes available in a large Guild
* @event Client#guildMemberAvailable
* @param {Guild} guild The guild that the member became available in
* @param {GuildMember} member The member that became available
*/
module.exports = PresenceUpdateHandler;

View File

@@ -4,40 +4,28 @@ const getStructure = name => require(`../../../../structures/${name}`);
const ClientUser = getStructure('ClientUser');
class ReadyHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const clientUser = new ClientUser(client, data.user);
client.user = clientUser;
client.readyTime = Date.now();
client.users.set(clientUser.id, clientUser);
for (const guild of data.guilds) {
client.dataManager.newGuild(guild);
}
for (const privateDM of data.private_channels) {
client.dataManager.newChannel(privateDM);
}
if (!client.user.bot) {
client.setInterval(client.syncGuilds.bind(client), 30000);
}
for (const guild of data.guilds) client.dataManager.newGuild(guild);
for (const privateDM of data.private_channels) client.dataManager.newChannel(privateDM);
if (!client.user.bot) client.setInterval(client.syncGuilds.bind(client), 30000);
client.once('ready', client.syncGuilds.bind(client));
client.setTimeout(() => {
if (!client.ws.normalReady) {
client.ws._emitReady(false);
}
if (!client.ws.normalReady) client.ws._emitReady(false);
}, 1200 * data.guilds.length);
this.packetManager.ws.sessionID = data.session_id;
this.packetManager.ws.checkIfReady();
}
}
module.exports = ReadyHandler;

View File

@@ -1,28 +1,10 @@
const AbstractHandler = require('./AbstractHandler');
const Constants = require('../../../../util/Constants');
class TypingData {
constructor(since, lastTimestamp, _timeout) {
this.since = since;
this.lastTimestamp = lastTimestamp;
this._timeout = _timeout;
}
resetTimeout(_timeout) {
clearTimeout(this._timeout);
this._timeout = _timeout;
}
get elapsedTime() {
return Date.now() - this.since;
}
}
class TypingStartHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
const channel = client.channels.get(data.channel_id);
const user = client.users.get(data.user_id);
const timestamp = new Date(data.timestamp * 1000);
@@ -46,23 +28,37 @@ class TypingStartHandler extends AbstractHandler {
}
}
}
}
class TypingData {
constructor(since, lastTimestamp, _timeout) {
this.since = since;
this.lastTimestamp = lastTimestamp;
this._timeout = _timeout;
}
resetTimeout(_timeout) {
clearTimeout(this._timeout);
this._timeout = _timeout;
}
get elapsedTime() {
return Date.now() - this.since;
}
}
/**
* Emitted whenever a user starts typing in a channel
*
* @event Client#typingStart
* @param {Channel} channel the channel the user started typing in
* @param {User} user the user that started typing
*/
* Emitted whenever a user starts typing in a channel
* @event Client#typingStart
* @param {Channel} channel The channel the user started typing in
* @param {User} user The user that started typing
*/
/**
* Emitted whenever a user stops typing in a channel
*
* @event Client#typingStop
* @param {Channel} channel the channel the user stopped typing in
* @param {User} user the user that stopped typing
*/
* Emitted whenever a user stops typing in a channel
* @event Client#typingStop
* @param {Channel} channel The channel the user stopped typing in
* @param {User} user The user that stopped typing
*/
module.exports = TypingStartHandler;

View File

@@ -1,14 +1,11 @@
const AbstractHandler = require('./AbstractHandler');
class UserUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
client.actions.UserUpdate.handle(data);
}
}
module.exports = UserUpdateHandler;

View File

@@ -9,16 +9,13 @@ const AbstractHandler = require('./AbstractHandler');
*/
class VoiceServerUpdate extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const data = packet.d;
if (client.voice.pending.has(data.guild_id)) {
client.voice._receivedVoiceServer(data.guild_id, data.token, data.endpoint);
}
}
}
module.exports = VoiceServerUpdate;

View File

@@ -4,12 +4,11 @@ const Constants = require('../../../../util/Constants');
const cloneObject = require('../../../../util/CloneObject');
class VoiceStateUpdateHandler extends AbstractHandler {
handle(packet) {
const data = packet.d;
const client = this.packetManager.client;
const guild = client.guilds.get(data.guild_id);
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
if (guild) {
const member = guild.members.get(data.user_id);
if (member) {
@@ -19,18 +18,14 @@ class VoiceStateUpdateHandler extends AbstractHandler {
}
// if the member left the voice channel, unset their speaking property
if (!data.channel_id) {
member.speaking = null;
}
if (!data.channel_id) member.speaking = null;
if (client.voice.pending.has(guild.id) && member.user.id === client.user.id && data.channel_id) {
client.voice._receivedVoiceStateUpdate(data.guild_id, data.session_id);
}
const newChannel = client.channels.get(data.channel_id);
if (newChannel) {
newChannel.members.set(member.user.id, member);
}
if (newChannel) newChannel.members.set(member.user.id, member);
member.serverMute = data.mute;
member.serverDeaf = data.deaf;
@@ -42,15 +37,13 @@ class VoiceStateUpdateHandler extends AbstractHandler {
}
}
}
}
/**
* Emitted whenever a user changes voice state - e.g. joins/leaves a channel, mutes/unmutes.
*
* @event Client#voiceStateUpdate
* @param {GuildMember} oldMember the member before the voice state update
* @param {GuildMember} newMember the member before the voice state update
*/
* Emitted whenever a user changes voice state - e.g. joins/leaves a channel, mutes/unmutes.
* @event Client#voiceStateUpdate
* @param {GuildMember} oldMember The member before the voice state update
* @param {GuildMember} newMember The member after the voice state update
*/
module.exports = VoiceStateUpdateHandler;