mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-09 16:13:31 +01:00
Presence tracking
This commit is contained in:
@@ -71,6 +71,7 @@ class WebSocketManager {
|
|||||||
if (unavailableCount === 0) {
|
if (unavailableCount === 0) {
|
||||||
this.client.emit(Constants.Events.READY);
|
this.client.emit(Constants.Events.READY);
|
||||||
this.emittedReady = true;
|
this.emittedReady = true;
|
||||||
|
this.packetManager.handleQueue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,18 @@
|
|||||||
|
|
||||||
const Constants = require('../../../util/Constants');
|
const Constants = require('../../../util/Constants');
|
||||||
|
|
||||||
|
const BeforeReadyWhitelist = [
|
||||||
|
Constants.WSEvents.READY,
|
||||||
|
Constants.WSEvents.GUILD_CREATE,
|
||||||
|
Constants.WSEvents.GUILD_DELETE,
|
||||||
|
];
|
||||||
|
|
||||||
class WebSocketPacketManager {
|
class WebSocketPacketManager {
|
||||||
|
|
||||||
constructor(websocketManager) {
|
constructor(websocketManager) {
|
||||||
this.ws = websocketManager;
|
this.ws = websocketManager;
|
||||||
this.handlers = {};
|
this.handlers = {};
|
||||||
|
this.queue = [];
|
||||||
|
|
||||||
this.register(Constants.WSEvents.READY, 'Ready');
|
this.register(Constants.WSEvents.READY, 'Ready');
|
||||||
this.register(Constants.WSEvents.GUILD_CREATE, 'GuildCreate');
|
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_CREATE, 'ChannelCreate');
|
||||||
this.register(Constants.WSEvents.CHANNEL_DELETE, 'ChannelDelete');
|
this.register(Constants.WSEvents.CHANNEL_DELETE, 'ChannelDelete');
|
||||||
this.register(Constants.WSEvents.CHANNEL_UPDATE, 'ChannelUpdate');
|
this.register(Constants.WSEvents.CHANNEL_UPDATE, 'ChannelUpdate');
|
||||||
|
this.register(Constants.WSEvents.PRESENCE_UPDATE, 'PresenceUpdate');
|
||||||
}
|
}
|
||||||
|
|
||||||
get client() {
|
get client() {
|
||||||
@@ -34,7 +42,22 @@ class WebSocketPacketManager {
|
|||||||
this.handlers[event] = new Handler(this);
|
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) {
|
handle(packet) {
|
||||||
|
|
||||||
|
if (!this.ws.emittedReady) {
|
||||||
|
if (BeforeReadyWhitelist.indexOf(packet.t) === -1) {
|
||||||
|
this.queue.push(packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.handlers[packet.t]) {
|
if (this.handlers[packet.t]) {
|
||||||
return this.handlers[packet.t].handle(packet);
|
return this.handlers[packet.t].handle(packet);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class GuildDeleteHandler extends AbstractHandler {
|
|||||||
} else {
|
} else {
|
||||||
// delete guild
|
// delete guild
|
||||||
client.store.KillGuild(guild);
|
client.store.KillGuild(guild);
|
||||||
|
this.packetManager.ws.checkIfReady();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// it's not there! :(
|
// 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;
|
||||||
@@ -26,12 +26,18 @@ class Guild {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_addMember(guildUser) {
|
_addMember(guildUser, noEvent) {
|
||||||
guildUser.user = this.client.store.NewUser(guildUser.user);
|
if (!(guildUser.user instanceof User)) {
|
||||||
|
guildUser.user = this.client.store.NewUser(guildUser.user);
|
||||||
|
}
|
||||||
|
|
||||||
|
guildUser.joined_at = guildUser.joined_at || 0;
|
||||||
let member = this.store.add('members', new GuildMember(this, guildUser));
|
let member = this.store.add('members', new GuildMember(this, guildUser));
|
||||||
if (this.client.ws.emittedReady) {
|
if (this.client.ws.emittedReady && !noEvent) {
|
||||||
this.client.emit(Constants.Events.GUILD_MEMBER_ADD, this, member);
|
this.client.emit(Constants.Events.GUILD_MEMBER_ADD, this, member);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return member;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateMember(member, data) {
|
_updateMember(member, data) {
|
||||||
@@ -89,7 +95,17 @@ class Guild {
|
|||||||
for (let role of data.roles) {
|
for (let role of data.roles) {
|
||||||
this.store.add('roles', new Role(this, role));
|
this.store.add('roles', new Role(this, role));
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
if (data.presences) {
|
||||||
|
for (let presence of data.presences) {
|
||||||
|
let user = this.client.store.get('users', presence.user.id);
|
||||||
|
if (user) {
|
||||||
|
user.status = presence.status;
|
||||||
|
user.game = presence.game;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ class User {
|
|||||||
this.discriminator = data.discriminator;
|
this.discriminator = data.discriminator;
|
||||||
this.avatar = data.avatar;
|
this.avatar = data.avatar;
|
||||||
this.bot = Boolean(data.bot);
|
this.bot = Boolean(data.bot);
|
||||||
|
this.status = data.status || 'offline';
|
||||||
|
this.game = data.game;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,9 +87,11 @@ const Events = exports.Events = {
|
|||||||
GUILD_ROLE_CREATE: 'guildRoleCreate',
|
GUILD_ROLE_CREATE: 'guildRoleCreate',
|
||||||
GUILD_ROLE_DELETE: 'guildRoleDelete',
|
GUILD_ROLE_DELETE: 'guildRoleDelete',
|
||||||
GUILD_ROLE_UPDATE: 'guildRoleUpdate',
|
GUILD_ROLE_UPDATE: 'guildRoleUpdate',
|
||||||
|
GUILD_MEMBER_AVAILABLE: 'guildMemberAvailable',
|
||||||
CHANNEL_CREATE: 'channelCreate',
|
CHANNEL_CREATE: 'channelCreate',
|
||||||
CHANNEL_DELETE: 'channelDelete',
|
CHANNEL_DELETE: 'channelDelete',
|
||||||
CHANNEL_UPDATE: 'channelUpdate',
|
CHANNEL_UPDATE: 'channelUpdate',
|
||||||
|
PRESENCE_UPDATE: 'presenceUpdate',
|
||||||
WARN: 'warn',
|
WARN: 'warn',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -48,3 +48,7 @@ client.on('guildRoleDelete', (guild, role) => {
|
|||||||
client.on('guildRoleUpdate', (guild, old, newRole) => {
|
client.on('guildRoleUpdate', (guild, old, newRole) => {
|
||||||
console.log('updated role', old.name, 'to', newRole.name, 'in', guild.name);
|
console.log('updated role', old.name, 'to', newRole.name, 'in', guild.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
client.on('presenceUpdate', (oldUser, newUser) => {
|
||||||
|
console.log('presence from', oldUser.username, 'to', newUser.username);
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user