feat: reimplement SessionManager

#1490
This commit is contained in:
Elysia
2025-02-07 19:21:27 +07:00
parent a4c8972144
commit 821df54c6f
5 changed files with 166 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ const ClientUserSettingManager = require('../managers/ClientUserSettingManager')
const GuildManager = require('../managers/GuildManager'); const GuildManager = require('../managers/GuildManager');
const PresenceManager = require('../managers/PresenceManager'); const PresenceManager = require('../managers/PresenceManager');
const RelationshipManager = require('../managers/RelationshipManager'); const RelationshipManager = require('../managers/RelationshipManager');
const SessionManager = require('../managers/SessionManager');
const UserManager = require('../managers/UserManager'); const UserManager = require('../managers/UserManager');
const UserNoteManager = require('../managers/UserNoteManager'); const UserNoteManager = require('../managers/UserNoteManager');
const VoiceStateManager = require('../managers/VoiceStateManager'); const VoiceStateManager = require('../managers/VoiceStateManager');
@@ -156,6 +157,12 @@ class Client extends BaseClient {
*/ */
this.billing = new BillingManager(this); this.billing = new BillingManager(this);
/**
* All of the sessions of the client
* @type {SessionManager}
*/
this.sessions = new SessionManager(this);
/** /**
* All of the settings {@link Object} * All of the settings {@link Object}
* @type {ClientUserSettingManager} * @type {ClientUserSettingManager}

View File

@@ -64,6 +64,7 @@ exports.PresenceManager = require('./managers/PresenceManager');
exports.ReactionManager = require('./managers/ReactionManager'); exports.ReactionManager = require('./managers/ReactionManager');
exports.ReactionUserManager = require('./managers/ReactionUserManager'); exports.ReactionUserManager = require('./managers/ReactionUserManager');
exports.RoleManager = require('./managers/RoleManager'); exports.RoleManager = require('./managers/RoleManager');
exports.SessionManager = require('./managers/SessionManager');
exports.StageInstanceManager = require('./managers/StageInstanceManager'); exports.StageInstanceManager = require('./managers/StageInstanceManager');
exports.ThreadManager = require('./managers/ThreadManager'); exports.ThreadManager = require('./managers/ThreadManager');
exports.ThreadMemberManager = require('./managers/ThreadMemberManager'); exports.ThreadMemberManager = require('./managers/ThreadMemberManager');
@@ -132,6 +133,7 @@ exports.ReactionCollector = require('./structures/ReactionCollector');
exports.ReactionEmoji = require('./structures/ReactionEmoji'); exports.ReactionEmoji = require('./structures/ReactionEmoji');
exports.RichPresenceAssets = require('./structures/Presence').RichPresenceAssets; exports.RichPresenceAssets = require('./structures/Presence').RichPresenceAssets;
exports.Role = require('./structures/Role').Role; exports.Role = require('./structures/Role').Role;
exports.Session = require('./structures/Session');
exports.StageChannel = require('./structures/StageChannel'); exports.StageChannel = require('./structures/StageChannel');
exports.StageInstance = require('./structures/StageInstance').StageInstance; exports.StageInstance = require('./structures/StageInstance').StageInstance;
exports.Sticker = require('./structures/Sticker').Sticker; exports.Sticker = require('./structures/Sticker').Sticker;

View File

@@ -0,0 +1,53 @@
'use strict';
const CachedManager = require('./CachedManager');
const Session = require('../structures/Session');
/**
* Manages API methods for users and stores their cache.
* @extends {CachedManager}
*/
class SessionManager extends CachedManager {
constructor(client, iterable) {
super(client, Session, iterable);
}
/**
* The cache of Sessions
* @type {Collection<string, Session>}
* @name SessionManager#cache
*/
/**
* Fetch all sessions of the client.
* @returns {Promise<SessionManager>}
*/
fetch() {
return new Promise((resolve, reject) => {
this.client.api.auth.sessions
.get()
.then(data => {
const allData = data.user_sessions;
this.cache.clear();
for (const session of allData) {
this._add(new Session(this.client, session), true, { id: session.id_hash });
}
resolve(this);
})
.catch(reject);
});
}
/**
* Logout all client (remote).
* @returns {Promise<void>}
*/
logoutAllDevices() {
return this.client.api.auth.sessions.logout({
data: {
session_id_hashes: this.cache.map(session => session.id),
},
});
}
}
module.exports = SessionManager;

81
src/structures/Session.js Normal file
View File

@@ -0,0 +1,81 @@
'use strict';
const Base = require('./Base');
/**
* @typedef {Object} SessionClientInfo
* @property {string} location Location of the client (using IP address)
* @property {string} platform Platform of the client
* @property {string} os Operating system of the client
*/
/**
* Represents a Client OAuth2 Application Team.
* @extends {Base}
*/
class Session extends Base {
constructor(client, data) {
super(client);
this._patch(data);
}
_patch(data) {
if ('id_hash' in data) {
/**
* The session hash id
* @type {string}
*/
this.id = data.id_hash;
}
if ('approx_last_used_time' in data) {
/**
* The approximate last used time
* @type {string}
*/
this.approxLastUsedTime = data.approx_last_used_time;
}
if ('client_info' in data) {
/**
* The client info
* @type {SessionClientInfo}
*/
this.clientInfo = data.client_info;
}
}
/**
* The timestamp the client was last used at.
* @type {number}
* @readonly
*/
get createdTimestamp() {
return this.createdAt.getTime();
}
/**
* The time the client was last used at.
* @type {Date}
* @readonly
*/
get createdAt() {
return new Date(this.approxLastUsedTime);
}
/**
* Logout the client (remote).
* @returns {Promise<void>}
*/
logout() {
return this.client.api.auth.sessions.logout({
data: {
session_id_hashes: [this.id],
},
});
}
toJSON() {
return super.toJSON();
}
}
module.exports = Session;

23
typings/index.d.ts vendored
View File

@@ -779,6 +779,7 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public notes: UserNoteManager; public notes: UserNoteManager;
public relationships: RelationshipManager; public relationships: RelationshipManager;
public voiceStates: VoiceStateManager; public voiceStates: VoiceStateManager;
public sessions: SessionManager;
public presences: PresenceManager; public presences: PresenceManager;
public billing: BillingManager; public billing: BillingManager;
public settings: ClientUserSettingManager; public settings: ClientUserSettingManager;
@@ -2449,6 +2450,12 @@ export class WebEmbed {
public static hiddenEmbed: string; public static hiddenEmbed: string;
} }
export class SessionManager extends CachedManager<string, Session, any> {
private constructor(client: Client, iterable: Iterable<any>);
public fetch(): Promise<this>;
public logoutAllDevices(): Promise<void>;
}
export class BillingManager extends BaseManager { export class BillingManager extends BaseManager {
constructor(client: Client); constructor(client: Client);
public paymentSources: Collection<Snowflake, object>; public paymentSources: Collection<Snowflake, object>;
@@ -2459,6 +2466,22 @@ export class BillingManager extends BaseManager {
public fetchCurrentSubscription(): Promise<Collection<Snowflake, object>>; public fetchCurrentSubscription(): Promise<Collection<Snowflake, object>>;
} }
export class Session extends Base {
constructor(client: Client);
public id?: string;
public clientInfo?: SessionClientInfo;
public approxLastUsedTime: string;
public readonly createdTimestamp: number;
public readonly createdAt: Date;
public logout(): Promise<void>;
}
export interface SessionClientInfo {
location?: string;
platform?: string;
os?: string;
}
export class GuildBoost extends Base { export class GuildBoost extends Base {
constructor(client: Client, data: object); constructor(client: Client, data: object);
public id: Snowflake; public id: Snowflake;