seyfert 2.2.1-dev-12797288169.0 → 2.2.1-dev-12848723720.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,7 +30,7 @@ type ReturnManagers = {
30
30
  [K in NonGuildBased | GuildBased | GuildRelated]: NonNullable<Awaited<ReturnType<NonNullable<Cache[K]>['get']>>>;
31
31
  };
32
32
  export * from './adapters/index';
33
- export type CachedEvents = 'READY' | 'GUILD_CREATE' | 'GUILD_UPDATE' | 'GUILD_DELETE' | 'CHANNEL_CREATE' | 'CHANNEL_UPDATE' | 'CHANNEL_DELETE' | 'GUILD_ROLE_CREATE' | 'GUILD_ROLE_UPDATE' | 'GUILD_ROLE_DELETE' | 'GUILD_BAN_ADD' | 'GUILD_BAN_REMOVE' | 'GUILD_EMOJIS_UPDATE' | 'GUILD_STICKERS_UPDATE' | 'GUILD_MEMBER_ADD' | 'GUILD_MEMBER_UPDATE' | 'GUILD_MEMBER_REMOVE' | 'MESSAGE_CREATE' | 'PRESENCE_UPDATE' | 'THREAD_DELETE' | 'THREAD_CREATE' | 'THREAD_UPDATE' | 'USER_UPDATE' | 'VOICE_STATE_UPDATE' | 'STAGE_INSTANCE_CREATE' | 'STAGE_INSTANCE_UPDATE' | 'STAGE_INSTANCE_DELETE';
33
+ export type CachedEvents = 'READY' | 'GUILD_CREATE' | 'GUILD_UPDATE' | 'GUILD_DELETE' | 'CHANNEL_CREATE' | 'CHANNEL_UPDATE' | 'CHANNEL_DELETE' | 'GUILD_ROLE_CREATE' | 'GUILD_ROLE_UPDATE' | 'GUILD_ROLE_DELETE' | 'GUILD_BAN_ADD' | 'GUILD_BAN_REMOVE' | 'GUILD_EMOJIS_UPDATE' | 'GUILD_STICKERS_UPDATE' | 'GUILD_MEMBER_ADD' | 'GUILD_MEMBER_UPDATE' | 'GUILD_MEMBER_REMOVE' | 'MESSAGE_CREATE' | 'PRESENCE_UPDATE' | 'THREAD_DELETE' | 'THREAD_CREATE' | 'THREAD_UPDATE' | 'USER_UPDATE' | 'VOICE_STATE_UPDATE' | 'STAGE_INSTANCE_CREATE' | 'STAGE_INSTANCE_UPDATE' | 'STAGE_INSTANCE_DELETE' | 'GUILD_MEMBERS_CHUNK';
34
34
  export type DisabledCache = {
35
35
  [P in NonGuildBased | GuildBased | GuildRelated | SeyfertBased]?: boolean;
36
36
  };
@@ -376,6 +376,23 @@ class Cache {
376
376
  await this.stickers?.set(CacheFrom.Gateway, event.d.stickers.map(x => [x.id, x]), event.d.guild_id);
377
377
  }
378
378
  break;
379
+ case 'GUILD_MEMBERS_CHUNK': {
380
+ const data = [];
381
+ if (this.members) {
382
+ for (const member of event.d.members) {
383
+ data.push([CacheFrom.Gateway, 'members', member, member.user.id, event.d.guild_id], [CacheFrom.Gateway, 'users', member.user, member.user.id]);
384
+ }
385
+ }
386
+ if (this.presences && event.d.presences) {
387
+ for (const presence of event.d.presences) {
388
+ data.push([CacheFrom.Gateway, 'presences', presence, presence.user.id, event.d.guild_id]);
389
+ }
390
+ }
391
+ if (data.length) {
392
+ await this.bulkSet(data);
393
+ }
394
+ break;
395
+ }
379
396
  case 'GUILD_MEMBER_ADD':
380
397
  case 'GUILD_MEMBER_UPDATE':
381
398
  if (event.d.user)
@@ -310,7 +310,7 @@ class WorkerClient extends base_1.BaseClient {
310
310
  case 'DISCONNECT_ALL_SHARDS_RESHARDING':
311
311
  {
312
312
  for (const i of this.shards.values()) {
313
- await i.disconnect();
313
+ await i.disconnect(websocket_1.ShardSocketCloseCodes.Resharding);
314
314
  }
315
315
  this.postMessage({
316
316
  type: 'DISCONNECTED_ALL_SHARDS_RESHARDING',
@@ -1,9 +1,11 @@
1
1
  import { Logger, type MakeRequired } from '../../common';
2
- import { type GatewayReceivePayload, type GatewaySendPayload } from '../../types';
2
+ import { type APIGuildMember, type GatewayGuildMembersChunkPresence, type GatewayReceivePayload, type GatewaySendPayload } from '../../types';
3
+ import type { GatewayRequestGuildMembersDataWithQuery, GatewayRequestGuildMembersDataWithUserIds } from '../../types/gateway';
3
4
  import { DynamicBucket } from '../structures';
4
5
  import { ConnectTimeout } from '../structures/timeout';
5
6
  import { BaseSocket } from './basesocket';
6
7
  import type { ShardData, ShardOptions } from './shared';
8
+ import { ShardSocketCloseCodes } from './shared';
7
9
  export interface ShardHeart {
8
10
  interval: number;
9
11
  nodeInterval?: NodeJS.Timeout;
@@ -24,6 +26,7 @@ export declare class Shard {
24
26
  pendingGuilds: Set<string>;
25
27
  options: MakeRequired<ShardOptions, 'properties' | 'ratelimitOptions'>;
26
28
  isReady: boolean;
29
+ private requestGuildMembersChunk;
27
30
  constructor(id: number, options: ShardOptions);
28
31
  get latency(): number;
29
32
  get isOpen(): boolean;
@@ -37,9 +40,13 @@ export declare class Shard {
37
40
  get resumable(): boolean;
38
41
  resume(): Promise<void>;
39
42
  heartbeat(requested: boolean): void;
40
- disconnect(): void;
43
+ disconnect(code?: ShardSocketCloseCodes): void;
41
44
  reconnect(): Promise<void>;
42
45
  onpacket(packet: GatewayReceivePayload): void | Promise<void>;
46
+ requestGuildMember(options: Omit<GatewayRequestGuildMembersDataWithQuery, 'nonce'> | Omit<GatewayRequestGuildMembersDataWithUserIds, 'nonce'>): Promise<{
47
+ members: APIGuildMember[];
48
+ presences: GatewayGuildMembersChunkPresence[];
49
+ }>;
43
50
  protected handleClosed(close: {
44
51
  code: number;
45
52
  reason: string;
@@ -27,6 +27,7 @@ class Shard {
27
27
  pendingGuilds = new Set();
28
28
  options;
29
29
  isReady = false;
30
+ requestGuildMembersChunk = new Map();
30
31
  constructor(id, options) {
31
32
  this.id = id;
32
33
  this.options = (0, common_1.MergeOptions)({
@@ -144,13 +145,13 @@ class Shard {
144
145
  d: this.data.resume_seq ?? null,
145
146
  }));
146
147
  }
147
- disconnect() {
148
+ disconnect(code = shared_1.ShardSocketCloseCodes.Shutdown) {
148
149
  this.debugger?.info(`[Shard #${this.id}] Disconnecting`);
149
- this.close(shared_1.ShardSocketCloseCodes.Shutdown, 'Shard down request');
150
+ this.close(code, 'Shard down request');
150
151
  }
151
152
  async reconnect() {
152
153
  this.debugger?.info(`[Shard #${this.id}] Reconnecting`);
153
- this.disconnect();
154
+ this.disconnect(shared_1.ShardSocketCloseCodes.Reconnect);
154
155
  await this.connect();
155
156
  }
156
157
  onpacket(packet) {
@@ -239,6 +240,30 @@ class Shard {
239
240
  this.options.handlePayload(this.id, packet);
240
241
  }
241
242
  break;
243
+ case types_1.GatewayDispatchEvents.GuildMembersChunk:
244
+ {
245
+ if (!packet.d.nonce) {
246
+ this.options.handlePayload(this.id, packet);
247
+ break;
248
+ }
249
+ const guildMemberChunk = this.requestGuildMembersChunk.get(packet.d.nonce);
250
+ if (!guildMemberChunk) {
251
+ this.options.handlePayload(this.id, packet);
252
+ break;
253
+ }
254
+ guildMemberChunk.members.push(...packet.d.members);
255
+ if (packet.d.presences)
256
+ guildMemberChunk.presences.push(...packet.d.presences);
257
+ if (packet.d.chunk_index + 1 === packet.d.chunk_count) {
258
+ this.requestGuildMembersChunk.delete(packet.d.nonce);
259
+ guildMemberChunk.resolve({
260
+ members: guildMemberChunk.members,
261
+ presences: guildMemberChunk.presences,
262
+ });
263
+ }
264
+ this.options.handlePayload(this.id, packet);
265
+ }
266
+ break;
242
267
  default:
243
268
  this.options.handlePayload(this.id, packet);
244
269
  break;
@@ -247,6 +272,33 @@ class Shard {
247
272
  break;
248
273
  }
249
274
  }
275
+ async requestGuildMember(options) {
276
+ const nonce = Date.now().toString() + Math.random().toString(36);
277
+ let resolve = () => {
278
+ //
279
+ };
280
+ let reject = () => {
281
+ //
282
+ };
283
+ const promise = new Promise((res, rej) => {
284
+ resolve = res;
285
+ reject = rej;
286
+ });
287
+ this.requestGuildMembersChunk.set(nonce, {
288
+ members: [],
289
+ presences: [],
290
+ reject,
291
+ resolve,
292
+ });
293
+ this.send(false, {
294
+ op: types_1.GatewayOpcodes.RequestGuildMembers,
295
+ d: {
296
+ ...options,
297
+ nonce,
298
+ },
299
+ });
300
+ return promise;
301
+ }
250
302
  async handleClosed(close) {
251
303
  this.isReady = false;
252
304
  clearInterval(this.heart.nodeInterval);
@@ -4,7 +4,7 @@ import { type GatewaySendPayload, type GatewayUpdatePresence, type GatewayVoiceS
4
4
  import { ShardManagerDefaults } from '../constants';
5
5
  import { ConnectQueue } from '../structures/timeout';
6
6
  import { Shard } from './shard';
7
- import type { ShardData, ShardManagerOptions } from './shared';
7
+ import { type ShardData, type ShardManagerOptions, ShardSocketCloseCodes } from './shared';
8
8
  export declare class ShardManager extends Map<number, Shard> {
9
9
  connectQueue: ConnectQueue;
10
10
  options: MakeRequired<ShardManagerOptions, keyof typeof ShardManagerDefaults>;
@@ -22,8 +22,8 @@ export declare class ShardManager extends Map<number, Shard> {
22
22
  startResharder(): Promise<void>;
23
23
  spawnBuckets(): Shard[][];
24
24
  forceIdentify(shardId: number): Promise<void>;
25
- disconnect(shardId: number): void | undefined;
26
- disconnectAll(): void;
25
+ disconnect(shardId: number, code?: ShardSocketCloseCodes): void | undefined;
26
+ disconnectAll(code?: ShardSocketCloseCodes): void;
27
27
  setShardPresence(shardId: number, payload: GatewayUpdatePresence['d']): void;
28
28
  setPresence(payload: GatewayUpdatePresence['d']): void;
29
29
  joinVoice(guild_id: string, channel_id: string, options: Pick<GatewayVoiceStateUpdate['d'], 'self_deaf' | 'self_mute'>): void;
@@ -7,6 +7,7 @@ const constants_1 = require("../constants");
7
7
  const structures_1 = require("../structures");
8
8
  const timeout_1 = require("../structures/timeout");
9
9
  const shard_1 = require("./shard");
10
+ const shared_1 = require("./shared");
10
11
  let parentPort;
11
12
  let workerData;
12
13
  class ShardManager extends Map {
@@ -117,7 +118,7 @@ class ShardManager extends Map {
117
118
  handlePayload = () => {
118
119
  //
119
120
  };
120
- this.disconnectAll();
121
+ this.disconnectAll(shared_1.ShardSocketCloseCodes.Resharding);
121
122
  this.clear();
122
123
  this.options.totalShards = this.options.shardEnd = this.options.info.shards = info.shards;
123
124
  for (const [id, shard] of sharder) {
@@ -169,13 +170,13 @@ class ShardManager extends Map {
169
170
  this.debugger?.info(`Shard #${shardId} force identify`);
170
171
  return this.create(shardId).identify();
171
172
  }
172
- disconnect(shardId) {
173
+ disconnect(shardId, code) {
173
174
  this.debugger?.info(`Shard #${shardId} force disconnect`);
174
- return this.get(shardId)?.disconnect();
175
+ return this.get(shardId)?.disconnect(code);
175
176
  }
176
- disconnectAll() {
177
+ disconnectAll(code = shared_1.ShardSocketCloseCodes.ShutdownAll) {
177
178
  this.debugger?.info('Disconnect all shards');
178
- this.forEach(shard => shard.disconnect());
179
+ this.forEach(shard => shard.disconnect(code));
179
180
  }
180
181
  setShardPresence(shardId, payload) {
181
182
  this.debugger?.info(`Shard #${shardId} update presence`);
@@ -108,7 +108,10 @@ export interface ShardOptions extends ShardDetails {
108
108
  }
109
109
  export declare enum ShardSocketCloseCodes {
110
110
  Shutdown = 3000,
111
- ZombiedConnection = 3010
111
+ ZombiedConnection = 3010,
112
+ Reconnect = 3020,
113
+ Resharding = 3030,
114
+ ShutdownAll = 3040
112
115
  }
113
116
  export interface WorkerData {
114
117
  intents: number;
@@ -5,4 +5,7 @@ var ShardSocketCloseCodes;
5
5
  (function (ShardSocketCloseCodes) {
6
6
  ShardSocketCloseCodes[ShardSocketCloseCodes["Shutdown"] = 3000] = "Shutdown";
7
7
  ShardSocketCloseCodes[ShardSocketCloseCodes["ZombiedConnection"] = 3010] = "ZombiedConnection";
8
+ ShardSocketCloseCodes[ShardSocketCloseCodes["Reconnect"] = 3020] = "Reconnect";
9
+ ShardSocketCloseCodes[ShardSocketCloseCodes["Resharding"] = 3030] = "Resharding";
10
+ ShardSocketCloseCodes[ShardSocketCloseCodes["ShutdownAll"] = 3040] = "ShutdownAll";
8
11
  })(ShardSocketCloseCodes || (exports.ShardSocketCloseCodes = ShardSocketCloseCodes = {}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seyfert",
3
- "version": "2.2.1-dev-12797288169.0",
3
+ "version": "2.2.1-dev-12848723720.0",
4
4
  "description": "The most advanced framework for discord bots",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./lib/index.js",