Rewrite presence a little bit (#1853)

* such presence many good

* Update PresenceStore.js

* Update index.js

* Update ClientPresenceStore.js

* Update Presence.js

* Update ClientPresenceStore.js

* Update ClientUser.js

* Update Presence.js

* add timestamps and party

* Update Presence.js

* Update PresenceStore.js

* Update ClientPresenceStore.js

* Update ClientPresenceStore.js
This commit is contained in:
Gus Caplan
2017-09-02 17:57:02 -05:00
committed by Amish Shah
parent 765b652e6a
commit c4df2502ec
17 changed files with 263 additions and 159 deletions

View File

@@ -9,7 +9,6 @@ const ClientVoiceManager = require('./voice/ClientVoiceManager');
const WebSocketManager = require('./websocket/WebSocketManager');
const ActionsManager = require('./actions/ActionsManager');
const Collection = require('../util/Collection');
const { Presence } = require('../structures/Presence');
const VoiceRegion = require('../structures/VoiceRegion');
const Webhook = require('../structures/Webhook');
const Invite = require('../structures/Invite');
@@ -19,6 +18,7 @@ const VoiceBroadcast = require('./voice/VoiceBroadcast');
const UserStore = require('../stores/UserStore');
const ChannelStore = require('../stores/ChannelStore');
const GuildStore = require('../stores/GuildStore');
const ClientPresenceStore = require('../stores/ClientPresenceStore');
const { Error, TypeError, RangeError } = require('../errors');
/**
@@ -115,9 +115,9 @@ class Client extends EventEmitter {
/**
* Presences that have been received for the client user's friends, mapped by user IDs
* <warn>This is only filled when using a user account.</warn>
* @type {Collection<Snowflake, Presence>}
* @type {ClientPresenceStore<Snowflake, Presence>}
*/
this.presences = new Collection();
this.presences = new ClientPresenceStore(this);
Object.defineProperty(this, 'token', { writable: true });
if (!this.token && 'CLIENT_TOKEN' in process.env) {
@@ -199,7 +199,7 @@ class Client extends EventEmitter {
* @readonly
*/
get status() {
return this.ws.connection.status;
return this.ws.connection ? this.ws.connection.status : null;
}
/**
@@ -481,20 +481,6 @@ class Client extends EventEmitter {
this.ws.lastHeartbeatAck = true;
}
/**
* Adds/updates a friend's presence in {@link Client#presences}.
* @param {Snowflake} id ID of the user
* @param {Object} presence Raw presence object from Discord
* @private
*/
_setPresence(id, presence) {
if (this.presences.has(id)) {
this.presences.get(id).update(presence);
return;
}
this.presences.set(id, new Presence(presence));
}
/**
* Calls {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval} on a script
* with the client as `this`.

View File

@@ -7,7 +7,7 @@ class GuildSync extends Action {
const guild = client.guilds.get(data.id);
if (guild) {
if (data.presences) {
for (const presence of data.presences) guild._setPresence(presence.user.id, presence);
for (const presence of data.presences) guild.presences.create(presence);
}
if (data.members) {

View File

@@ -2,6 +2,7 @@ const UserAgentManager = require('./UserAgentManager');
const handlers = require('./handlers');
const APIRequest = require('./APIRequest');
const routeBuilder = require('./APIRouter');
const Constants = require('../../util/Constants');
const { Error } = require('../../errors');
class RESTManager {
@@ -17,6 +18,10 @@ class RESTManager {
return routeBuilder(this);
}
get cdn() {
return Constants.Endpoints.CDN(this.client.options.http.cdn);
}
destroy() {
for (const handler of Object.values(this.handlers)) {
if (handler.destroy) handler.destroy();

View File

@@ -35,17 +35,17 @@ class PresenceUpdateHandler extends AbstractHandler {
}
if (member) {
if (client.listenerCount(Constants.Events.PRESENCE_UPDATE) === 0) {
guild._setPresence(user.id, data);
guild.presences.create(data);
return;
}
const oldMember = member._clone();
if (member.presence) {
oldMember.frozenPresence = member.presence._clone();
}
guild._setPresence(user.id, data);
guild.presences.create(data);
client.emit(Constants.Events.PRESENCE_UPDATE, oldMember, member);
} else {
guild._setPresence(user.id, data);
guild.presences.create(data);
}
}
}

View File

@@ -29,11 +29,7 @@ class ReadyHandler extends AbstractHandler {
}
}
data.presences = data.presences || [];
for (const presence of data.presences) {
client.users.create(presence.user);
client._setPresence(presence.user.id, presence);
}
for (const presence of data.presences || []) client.presences.create(presence);
if (data.notes) {
for (const user in data.notes) {
@@ -52,7 +48,7 @@ class ReadyHandler extends AbstractHandler {
avatar: 'https://discordapp.com/assets/f78426a064bc9dd24847519259bc42af.png',
bot: true,
status: 'online',
game: null,
activity: null,
verified: true,
});
}