mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-10 08:33:30 +01:00
Presence tracking
This commit is contained in:
@@ -71,6 +71,7 @@ class WebSocketManager {
|
||||
if (unavailableCount === 0) {
|
||||
this.client.emit(Constants.Events.READY);
|
||||
this.emittedReady = true;
|
||||
this.packetManager.handleQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,18 @@
|
||||
|
||||
const Constants = require('../../../util/Constants');
|
||||
|
||||
const BeforeReadyWhitelist = [
|
||||
Constants.WSEvents.READY,
|
||||
Constants.WSEvents.GUILD_CREATE,
|
||||
Constants.WSEvents.GUILD_DELETE,
|
||||
];
|
||||
|
||||
class WebSocketPacketManager {
|
||||
|
||||
constructor(websocketManager) {
|
||||
this.ws = websocketManager;
|
||||
this.handlers = {};
|
||||
this.queue = [];
|
||||
|
||||
this.register(Constants.WSEvents.READY, 'Ready');
|
||||
this.register(Constants.WSEvents.GUILD_CREATE, 'GuildCreate');
|
||||
@@ -23,6 +30,7 @@ class WebSocketPacketManager {
|
||||
this.register(Constants.WSEvents.CHANNEL_CREATE, 'ChannelCreate');
|
||||
this.register(Constants.WSEvents.CHANNEL_DELETE, 'ChannelDelete');
|
||||
this.register(Constants.WSEvents.CHANNEL_UPDATE, 'ChannelUpdate');
|
||||
this.register(Constants.WSEvents.PRESENCE_UPDATE, 'PresenceUpdate');
|
||||
}
|
||||
|
||||
get client() {
|
||||
@@ -34,7 +42,22 @@ class WebSocketPacketManager {
|
||||
this.handlers[event] = new Handler(this);
|
||||
}
|
||||
|
||||
handleQueue() {
|
||||
for (let packetIndex in this.queue) {
|
||||
this.handle(this.queue[packetIndex]);
|
||||
this.queue.splice(packetIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
handle(packet) {
|
||||
|
||||
if (!this.ws.emittedReady) {
|
||||
if (BeforeReadyWhitelist.indexOf(packet.t) === -1) {
|
||||
this.queue.push(packet);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.handlers[packet.t]) {
|
||||
return this.handlers[packet.t].handle(packet);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ class GuildDeleteHandler extends AbstractHandler {
|
||||
} else {
|
||||
// delete guild
|
||||
client.store.KillGuild(guild);
|
||||
this.packetManager.ws.checkIfReady();
|
||||
}
|
||||
} else {
|
||||
// it's not there! :(
|
||||
|
||||
77
src/client/websocket/packets/handlers/PresenceUpdate.js
Normal file
77
src/client/websocket/packets/handlers/PresenceUpdate.js
Normal file
@@ -0,0 +1,77 @@
|
||||
'use strict';
|
||||
|
||||
const AbstractHandler = require('./AbstractHandler');
|
||||
const Structure = name => require(`../../../../structures/${name}`);
|
||||
const Constants = require('../../../../util/Constants');
|
||||
const CloneObject = require('../../../../util/CloneObject');
|
||||
|
||||
const Role = Structure('User');
|
||||
|
||||
class PresenceUpdateHandler extends AbstractHandler {
|
||||
|
||||
constructor(packetManager) {
|
||||
super(packetManager);
|
||||
}
|
||||
|
||||
handle(packet) {
|
||||
let data = packet.d;
|
||||
let client = this.packetManager.client;
|
||||
let user = client.store.get('users', data.user.id);
|
||||
let guild = client.store.get('guilds', data.guild_id);
|
||||
|
||||
function makeUser(user) {
|
||||
return client.store.NewUser(user);
|
||||
}
|
||||
|
||||
// step 1
|
||||
if (!user) {
|
||||
if (data.user.username) {
|
||||
user = makeUser(data.user);
|
||||
}else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (guild) {
|
||||
let memberInGuild = guild.store.get('members', user.id);
|
||||
if (!memberInGuild) {
|
||||
let member = guild._addMember({
|
||||
user,
|
||||
roles: data.roles,
|
||||
deaf: false,
|
||||
mute: false,
|
||||
}, true);
|
||||
client.emit(Constants.Events.GUILD_MEMBER_AVAILABLE, guild, member);
|
||||
}
|
||||
}
|
||||
|
||||
data.user.username = data.user.username || user.username;
|
||||
data.user.id = data.user.id || user.id;
|
||||
data.user.discriminator = data.user.discriminator || user.discriminator;
|
||||
data.user.avatar = data.user.avatar || user.avatar;
|
||||
data.user.status = data.status || user.status;
|
||||
data.user.game = data.game;
|
||||
|
||||
let same = (
|
||||
data.user.username === user.username &&
|
||||
data.user.id === user.id &&
|
||||
data.user.discriminator === user.discriminator &&
|
||||
data.user.avatar === user.avatar &&
|
||||
data.user.status === user.status &&
|
||||
!(
|
||||
(data.user.game && !user.game) ||
|
||||
(!data.user.game && user.game) ||
|
||||
(data.user.game && user.game && data.user.game.name !== user.game.name)
|
||||
)
|
||||
);
|
||||
|
||||
if (!same) {
|
||||
let oldUser = CloneObject(user);
|
||||
user.setup(data.user);
|
||||
client.emit(Constants.Events.PRESENCE_UPDATE, oldUser, user);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = PresenceUpdateHandler;
|
||||
Reference in New Issue
Block a user