@fluxerjs/core 1.0.6 → 1.0.8

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.
Files changed (59) hide show
  1. package/dist/{Channel-2WNJ445K.mjs → Channel-TWPDKW2P.mjs} +3 -1
  2. package/dist/{ClientUser-J6HQVSDJ.mjs → ClientUser-2K2BACK7.mjs} +1 -2
  3. package/dist/{Guild-GOQZ7XP4.mjs → Guild-CMZGA6DW.mjs} +3 -1
  4. package/dist/GuildMember-DW2N6ITI.mjs +7 -0
  5. package/dist/{Webhook-NUQCJAWZ.mjs → Message-G2QIKZQK.mjs} +3 -3
  6. package/dist/MessageReaction-XRPYZDSC.mjs +7 -0
  7. package/dist/Role-SVLWIAMN.mjs +7 -0
  8. package/dist/{Webhook-2RHBXH7R.mjs → Webhook-2MQESB7Z.mjs} +1 -1
  9. package/dist/chunk-4GCZFOS5.mjs +86 -0
  10. package/dist/chunk-CO5EL5LH.mjs +168 -0
  11. package/dist/chunk-CZIO2D7F.mjs +207 -0
  12. package/dist/chunk-HBF5QEDH.mjs +42 -0
  13. package/dist/chunk-JVEOQFUX.mjs +52 -0
  14. package/dist/chunk-SQVCCSNN.mjs +41 -0
  15. package/dist/chunk-TJVZEILY.mjs +120 -0
  16. package/dist/{chunk-BUEXP5SZ.mjs → chunk-ZGMM6IPQ.mjs} +12 -3
  17. package/dist/index.d.mts +539 -73
  18. package/dist/index.d.ts +539 -73
  19. package/dist/index.js +1125 -355
  20. package/dist/index.mjs +520 -194
  21. package/package.json +27 -8
  22. package/dist/Channel-HM2UY4DN.mjs +0 -17
  23. package/dist/Channel-IKL3SJXN.mjs +0 -17
  24. package/dist/Channel-KILNV5V3.mjs +0 -17
  25. package/dist/Channel-TOAQGSRX.mjs +0 -17
  26. package/dist/Channel-VENHOL7S.mjs +0 -17
  27. package/dist/ClientUser-RNDKHQ3Z.mjs +0 -9
  28. package/dist/Guild-36EGAAEW.mjs +0 -8
  29. package/dist/Guild-CA3W6DOD.mjs +0 -8
  30. package/dist/Guild-NHNQ5TIA.mjs +0 -8
  31. package/dist/Guild-ZOFF5LFR.mjs +0 -8
  32. package/dist/GuildMember-RGVPVUAG.mjs +0 -9
  33. package/dist/GuildMember-XF7K2R45.mjs +0 -9
  34. package/dist/Message-23Z3RPCZ.mjs +0 -9
  35. package/dist/Message-33APPS76.mjs +0 -9
  36. package/dist/Message-PZUU7ZFR.mjs +0 -9
  37. package/dist/Message-XB5WNMHL.mjs +0 -9
  38. package/dist/chunk-3CNUPFDI.mjs +0 -59
  39. package/dist/chunk-4DBGMFOQ.mjs +0 -14
  40. package/dist/chunk-6CEMF2LO.mjs +0 -14
  41. package/dist/chunk-6EBNOON4.mjs +0 -86
  42. package/dist/chunk-72OY7B3D.mjs +0 -72
  43. package/dist/chunk-7FYM4D2E.mjs +0 -50
  44. package/dist/chunk-7GZN6JXT.mjs +0 -50
  45. package/dist/chunk-7H3TKJUT.mjs +0 -53
  46. package/dist/chunk-EF32ILJL.mjs +0 -102
  47. package/dist/chunk-F2EEQP5O.mjs +0 -86
  48. package/dist/chunk-GUNWHOQO.mjs +0 -42
  49. package/dist/chunk-L25ON7WB.mjs +0 -52
  50. package/dist/chunk-LBBIQOSH.mjs +0 -53
  51. package/dist/chunk-OHIHIQAS.mjs +0 -102
  52. package/dist/chunk-P4IRDGB4.mjs +0 -43
  53. package/dist/chunk-QDCFQF6J.mjs +0 -36
  54. package/dist/chunk-QDNFJVVE.mjs +0 -70
  55. package/dist/chunk-SW6KNICI.mjs +0 -52
  56. package/dist/chunk-TE5IC7IP.mjs +0 -36
  57. package/dist/chunk-WFONGZGK.mjs +0 -42
  58. package/dist/chunk-XXCBJJZE.mjs +0 -88
  59. package/dist/chunk-ZHRQQZ4X.mjs +0 -102
package/dist/index.mjs CHANGED
@@ -1,30 +1,36 @@
1
1
  import {
2
- Message
3
- } from "./chunk-3CNUPFDI.mjs";
2
+ ClientUser,
3
+ User
4
+ } from "./chunk-4GCZFOS5.mjs";
4
5
  import {
5
6
  Webhook
6
- } from "./chunk-BUEXP5SZ.mjs";
7
+ } from "./chunk-ZGMM6IPQ.mjs";
7
8
  import {
8
- Guild
9
- } from "./chunk-7GZN6JXT.mjs";
9
+ Message
10
+ } from "./chunk-CO5EL5LH.mjs";
10
11
  import {
11
12
  CategoryChannel,
12
13
  Channel,
14
+ DMChannel,
13
15
  GuildChannel,
14
16
  LinkChannel,
17
+ MessageManager,
15
18
  TextChannel,
16
19
  VoiceChannel
17
- } from "./chunk-OHIHIQAS.mjs";
20
+ } from "./chunk-CZIO2D7F.mjs";
21
+ import {
22
+ Guild
23
+ } from "./chunk-TJVZEILY.mjs";
24
+ import "./chunk-HQMYRYMY.mjs";
18
25
  import {
19
26
  GuildMember
20
- } from "./chunk-TE5IC7IP.mjs";
27
+ } from "./chunk-JVEOQFUX.mjs";
21
28
  import {
22
- ClientUser
23
- } from "./chunk-6CEMF2LO.mjs";
29
+ Role
30
+ } from "./chunk-SQVCCSNN.mjs";
24
31
  import {
25
- User
26
- } from "./chunk-P4IRDGB4.mjs";
27
- import "./chunk-HQMYRYMY.mjs";
32
+ MessageReaction
33
+ } from "./chunk-HBF5QEDH.mjs";
28
34
  import {
29
35
  Base
30
36
  } from "./chunk-XNS4O6QJ.mjs";
@@ -33,8 +39,120 @@ import {
33
39
  import { EventEmitter } from "events";
34
40
  import { REST } from "@fluxerjs/rest";
35
41
  import { WebSocketManager } from "@fluxerjs/ws";
36
- import { Routes } from "@fluxerjs/types";
42
+ import { Routes as Routes3 } from "@fluxerjs/types";
43
+ import { Collection as Collection3 } from "@fluxerjs/collection";
44
+
45
+ // src/client/ChannelManager.ts
37
46
  import { Collection } from "@fluxerjs/collection";
47
+ import { Routes } from "@fluxerjs/types";
48
+ var ChannelManager = class extends Collection {
49
+ constructor(client) {
50
+ super();
51
+ this.client = client;
52
+ }
53
+ /**
54
+ * Fetch a channel by ID from the API (or return from cache if present).
55
+ * @param channelId - Snowflake of the channel
56
+ * @returns The channel, or null if not found
57
+ * @example
58
+ * const channel = await client.channels.fetch(channelId);
59
+ * if (channel?.isSendable()) await channel.send('Hello!');
60
+ */
61
+ async fetch(channelId) {
62
+ const cached = this.get(channelId);
63
+ if (cached) return cached;
64
+ try {
65
+ const { Channel: Channel2 } = await import("./Channel-TWPDKW2P.mjs");
66
+ const data = await this.client.rest.get(
67
+ Routes.channel(channelId)
68
+ );
69
+ const channel = Channel2.fromOrCreate(this.client, data);
70
+ if (channel) this.set(channel.id, channel);
71
+ return channel;
72
+ } catch {
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Fetch a message by ID from the API.
78
+ * @param channelId - Snowflake of the channel
79
+ * @param messageId - Snowflake of the message
80
+ * @returns The message, or null if not found
81
+ * @deprecated Use channel.messages.fetch(messageId). Prefer (await client.channels.fetch(channelId))?.messages?.fetch(messageId).
82
+ * @example
83
+ * const channel = await client.channels.fetch(channelId);
84
+ * const message = await channel?.messages?.fetch(messageId);
85
+ */
86
+ async fetchMessage(channelId, messageId) {
87
+ try {
88
+ const { Message: Message2 } = await import("./Message-G2QIKZQK.mjs");
89
+ const data = await this.client.rest.get(
90
+ Routes.channelMessage(channelId, messageId)
91
+ );
92
+ return new Message2(this.client, data);
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Send a message to a channel by ID. Works even when the channel is not cached.
99
+ * Skips the fetch when you only need to send.
100
+ * @param channelId - Snowflake of the channel (text channel or DM)
101
+ * @param payload - Text content or object with content and/or embeds
102
+ * @returns The created message
103
+ * @example
104
+ * await client.channels.send(logChannelId, 'User joined!');
105
+ * await client.channels.send(channelId, { embeds: [embed.toJSON()] });
106
+ */
107
+ async send(channelId, payload) {
108
+ const body = typeof payload === "string" ? { content: payload } : payload;
109
+ const { Message: Message2 } = await import("./Message-G2QIKZQK.mjs");
110
+ const data = await this.client.rest.post(Routes.channelMessages(channelId), { body });
111
+ return new Message2(this.client, data);
112
+ }
113
+ };
114
+
115
+ // src/client/GuildManager.ts
116
+ import { Collection as Collection2 } from "@fluxerjs/collection";
117
+ import { Routes as Routes2 } from "@fluxerjs/types";
118
+ var GuildManager = class extends Collection2 {
119
+ constructor(client) {
120
+ super();
121
+ this.client = client;
122
+ }
123
+ /**
124
+ * Fetch a guild by ID from the API (or return from cache if present).
125
+ * @param guildId - Snowflake of the guild
126
+ * @returns The guild, or null if not found
127
+ * @example
128
+ * const guild = await client.guilds.fetch(guildId);
129
+ * if (guild) console.log(guild.name);
130
+ */
131
+ async fetch(guildId) {
132
+ const cached = this.get(guildId);
133
+ if (cached) return cached;
134
+ try {
135
+ const { Guild: Guild2 } = await import("./Guild-CMZGA6DW.mjs");
136
+ const data = await this.client.rest.get(
137
+ Routes2.guild(guildId)
138
+ );
139
+ const guild = new Guild2(this.client, data);
140
+ this.set(guild.id, guild);
141
+ return guild;
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ };
147
+
148
+ // src/errors/FluxerError.ts
149
+ var FluxerError = class _FluxerError extends Error {
150
+ constructor(message) {
151
+ super(message);
152
+ this.name = "FluxerError";
153
+ Object.setPrototypeOf(this, _FluxerError.prototype);
154
+ }
155
+ };
38
156
 
39
157
  // src/util/Events.ts
40
158
  var Events = {
@@ -42,6 +160,7 @@ var Events = {
42
160
  MessageCreate: "messageCreate",
43
161
  MessageUpdate: "messageUpdate",
44
162
  MessageDelete: "messageDelete",
163
+ MessageDeleteBulk: "messageDeleteBulk",
45
164
  MessageReactionAdd: "messageReactionAdd",
46
165
  MessageReactionRemove: "messageReactionRemove",
47
166
  MessageReactionRemoveAll: "messageReactionRemoveAll",
@@ -50,24 +169,284 @@ var Events = {
50
169
  GuildCreate: "guildCreate",
51
170
  GuildUpdate: "guildUpdate",
52
171
  GuildDelete: "guildDelete",
53
- ChannelCreate: "channelCreate",
54
- ChannelUpdate: "channelUpdate",
55
- ChannelDelete: "channelDelete",
172
+ GuildBanAdd: "guildBanAdd",
173
+ GuildBanRemove: "guildBanRemove",
174
+ GuildEmojisUpdate: "guildEmojisUpdate",
175
+ GuildStickersUpdate: "guildStickersUpdate",
176
+ GuildIntegrationsUpdate: "guildIntegrationsUpdate",
56
177
  GuildMemberAdd: "guildMemberAdd",
57
178
  GuildMemberUpdate: "guildMemberUpdate",
58
179
  GuildMemberRemove: "guildMemberRemove",
180
+ GuildRoleCreate: "guildRoleCreate",
181
+ GuildRoleUpdate: "guildRoleUpdate",
182
+ GuildRoleDelete: "guildRoleDelete",
183
+ GuildScheduledEventCreate: "guildScheduledEventCreate",
184
+ GuildScheduledEventUpdate: "guildScheduledEventUpdate",
185
+ GuildScheduledEventDelete: "guildScheduledEventDelete",
186
+ ChannelCreate: "channelCreate",
187
+ ChannelUpdate: "channelUpdate",
188
+ ChannelDelete: "channelDelete",
189
+ ChannelPinsUpdate: "channelPinsUpdate",
190
+ InviteCreate: "inviteCreate",
191
+ InviteDelete: "inviteDelete",
192
+ TypingStart: "typingStart",
193
+ UserUpdate: "userUpdate",
194
+ PresenceUpdate: "presenceUpdate",
59
195
  VoiceStateUpdate: "voiceStateUpdate",
60
196
  VoiceServerUpdate: "voiceServerUpdate",
61
197
  VoiceStatesSync: "voiceStatesSync",
198
+ WebhooksUpdate: "webhooksUpdate",
199
+ Resumed: "resumed",
62
200
  Error: "error",
63
201
  Debug: "debug"
64
202
  };
65
203
 
204
+ // src/client/Client.ts
205
+ import { formatEmoji, parseEmoji } from "@fluxerjs/util";
206
+
207
+ // src/client/EventHandlerRegistry.ts
208
+ var handlers = /* @__PURE__ */ new Map();
209
+ handlers.set("MESSAGE_CREATE", async (client, d) => {
210
+ const { Message: Message2 } = await import("./Message-G2QIKZQK.mjs");
211
+ client.emit(Events.MessageCreate, new Message2(client, d));
212
+ });
213
+ handlers.set("MESSAGE_UPDATE", async (client, d) => {
214
+ const { Message: Message2 } = await import("./Message-G2QIKZQK.mjs");
215
+ client.emit(Events.MessageUpdate, null, new Message2(client, d));
216
+ });
217
+ handlers.set("MESSAGE_DELETE", async (client, d) => {
218
+ const data = d;
219
+ const channel = client.channels.get(data.channel_id) ?? null;
220
+ client.emit(Events.MessageDelete, {
221
+ id: data.id,
222
+ channelId: data.channel_id,
223
+ channel
224
+ });
225
+ });
226
+ handlers.set("MESSAGE_REACTION_ADD", async (client, d) => {
227
+ const data = d;
228
+ const { MessageReaction: MessageReaction2 } = await import("./MessageReaction-XRPYZDSC.mjs");
229
+ const reaction = new MessageReaction2(client, data);
230
+ const user = client.getOrCreateUser({
231
+ id: data.user_id,
232
+ username: "Unknown",
233
+ discriminator: "0"
234
+ });
235
+ client.emit(Events.MessageReactionAdd, reaction, user);
236
+ });
237
+ handlers.set("MESSAGE_REACTION_REMOVE", async (client, d) => {
238
+ const data = d;
239
+ const { MessageReaction: MessageReaction2 } = await import("./MessageReaction-XRPYZDSC.mjs");
240
+ const reaction = new MessageReaction2(client, data);
241
+ const user = client.getOrCreateUser({
242
+ id: data.user_id,
243
+ username: "Unknown",
244
+ discriminator: "0"
245
+ });
246
+ client.emit(Events.MessageReactionRemove, reaction, user);
247
+ });
248
+ handlers.set("MESSAGE_REACTION_REMOVE_ALL", async (client, d) => {
249
+ client.emit(Events.MessageReactionRemoveAll, d);
250
+ });
251
+ handlers.set("MESSAGE_REACTION_REMOVE_EMOJI", async (client, d) => {
252
+ client.emit(
253
+ Events.MessageReactionRemoveEmoji,
254
+ d
255
+ );
256
+ });
257
+ handlers.set("GUILD_CREATE", async (client, d) => {
258
+ const { Guild: Guild2 } = await import("./Guild-CMZGA6DW.mjs");
259
+ const { Channel: Channel2 } = await import("./Channel-TWPDKW2P.mjs");
260
+ const guild = new Guild2(client, d);
261
+ client.guilds.set(guild.id, guild);
262
+ const g = d;
263
+ for (const ch of g.channels ?? []) {
264
+ const channel = Channel2.from(client, ch);
265
+ if (channel) client.channels.set(channel.id, channel);
266
+ }
267
+ client.emit(Events.GuildCreate, guild);
268
+ if (g.voice_states?.length) {
269
+ client.emit(Events.VoiceStatesSync, { guildId: guild.id, voiceStates: g.voice_states });
270
+ }
271
+ });
272
+ handlers.set("GUILD_UPDATE", async (client, d) => {
273
+ const { Guild: Guild2 } = await import("./Guild-CMZGA6DW.mjs");
274
+ const g = d;
275
+ const old = client.guilds.get(g.id);
276
+ const updated = new Guild2(client, g);
277
+ client.guilds.set(updated.id, updated);
278
+ client.emit(Events.GuildUpdate, old ?? updated, updated);
279
+ });
280
+ handlers.set("GUILD_DELETE", async (client, d) => {
281
+ const g = d;
282
+ const guild = client.guilds.get(g.id);
283
+ if (guild) {
284
+ client.guilds.delete(g.id);
285
+ client.emit(Events.GuildDelete, guild);
286
+ }
287
+ });
288
+ handlers.set("CHANNEL_CREATE", async (client, d) => {
289
+ const { Channel: Channel2 } = await import("./Channel-TWPDKW2P.mjs");
290
+ const ch = Channel2.from(client, d);
291
+ if (ch) {
292
+ client.channels.set(ch.id, ch);
293
+ client.emit(Events.ChannelCreate, ch);
294
+ }
295
+ });
296
+ handlers.set("CHANNEL_UPDATE", async (client, d) => {
297
+ const { Channel: Channel2 } = await import("./Channel-TWPDKW2P.mjs");
298
+ const ch = d;
299
+ const oldCh = client.channels.get(ch.id);
300
+ const newCh = Channel2.from(client, ch);
301
+ if (newCh) {
302
+ client.channels.set(newCh.id, newCh);
303
+ client.emit(Events.ChannelUpdate, oldCh ?? newCh, newCh);
304
+ }
305
+ });
306
+ handlers.set("CHANNEL_DELETE", async (client, d) => {
307
+ const ch = d;
308
+ const channel = client.channels.get(ch.id);
309
+ if (channel) {
310
+ client.channels.delete(ch.id);
311
+ client.emit(Events.ChannelDelete, channel);
312
+ }
313
+ });
314
+ handlers.set("GUILD_MEMBER_ADD", async (client, d) => {
315
+ const { GuildMember: GuildMember2 } = await import("./GuildMember-DW2N6ITI.mjs");
316
+ const data = d;
317
+ const guild = client.guilds.get(data.guild_id);
318
+ if (guild) {
319
+ const member = new GuildMember2(client, data, guild);
320
+ guild.members.set(member.id, member);
321
+ client.emit(Events.GuildMemberAdd, member);
322
+ }
323
+ });
324
+ handlers.set("GUILD_MEMBER_UPDATE", async (client, d) => {
325
+ const { GuildMember: GuildMember2 } = await import("./GuildMember-DW2N6ITI.mjs");
326
+ const data = d;
327
+ const guild = client.guilds.get(data.guild_id);
328
+ if (guild) {
329
+ const oldM = guild.members.get(data.user.id);
330
+ const newM = new GuildMember2(client, data, guild);
331
+ guild.members.set(newM.id, newM);
332
+ client.emit(Events.GuildMemberUpdate, oldM ?? newM, newM);
333
+ }
334
+ });
335
+ handlers.set("GUILD_MEMBER_REMOVE", async (client, d) => {
336
+ const data = d;
337
+ const guild = client.guilds.get(data.guild_id);
338
+ if (guild) {
339
+ const member = guild.members.get(data.user.id);
340
+ if (member) {
341
+ guild.members.delete(data.user.id);
342
+ client.emit(Events.GuildMemberRemove, member);
343
+ }
344
+ }
345
+ });
346
+ handlers.set("INTERACTION_CREATE", async (client, d) => {
347
+ client.emit(Events.InteractionCreate, d);
348
+ });
349
+ handlers.set("VOICE_STATE_UPDATE", async (client, d) => {
350
+ client.emit(Events.VoiceStateUpdate, d);
351
+ });
352
+ handlers.set("VOICE_SERVER_UPDATE", async (client, d) => {
353
+ client.emit(Events.VoiceServerUpdate, d);
354
+ });
355
+ handlers.set("MESSAGE_DELETE_BULK", async (client, d) => {
356
+ client.emit(Events.MessageDeleteBulk, d);
357
+ });
358
+ handlers.set("GUILD_BAN_ADD", async (client, d) => {
359
+ client.emit(Events.GuildBanAdd, d);
360
+ });
361
+ handlers.set("GUILD_BAN_REMOVE", async (client, d) => {
362
+ client.emit(Events.GuildBanRemove, d);
363
+ });
364
+ handlers.set("GUILD_EMOJIS_UPDATE", async (client, d) => {
365
+ client.emit(Events.GuildEmojisUpdate, d);
366
+ });
367
+ handlers.set("GUILD_STICKERS_UPDATE", async (client, d) => {
368
+ client.emit(Events.GuildStickersUpdate, d);
369
+ });
370
+ handlers.set("GUILD_INTEGRATIONS_UPDATE", async (client, d) => {
371
+ client.emit(Events.GuildIntegrationsUpdate, d);
372
+ });
373
+ handlers.set("GUILD_ROLE_CREATE", async (client, d) => {
374
+ const data = d;
375
+ const guild = client.guilds.get(data.guild_id);
376
+ if (guild) {
377
+ const { Role: Role2 } = await import("./Role-SVLWIAMN.mjs");
378
+ guild.roles.set(data.role.id, new Role2(client, data.role, guild.id));
379
+ }
380
+ client.emit(Events.GuildRoleCreate, data);
381
+ });
382
+ handlers.set("GUILD_ROLE_UPDATE", async (client, d) => {
383
+ const data = d;
384
+ const guild = client.guilds.get(data.guild_id);
385
+ if (guild) {
386
+ const { Role: Role2 } = await import("./Role-SVLWIAMN.mjs");
387
+ guild.roles.set(data.role.id, new Role2(client, data.role, guild.id));
388
+ }
389
+ client.emit(Events.GuildRoleUpdate, data);
390
+ });
391
+ handlers.set("GUILD_ROLE_DELETE", async (client, d) => {
392
+ const data = d;
393
+ const guild = client.guilds.get(data.guild_id);
394
+ if (guild) guild.roles.delete(data.role_id);
395
+ client.emit(Events.GuildRoleDelete, data);
396
+ });
397
+ handlers.set("GUILD_SCHEDULED_EVENT_CREATE", async (client, d) => {
398
+ client.emit(Events.GuildScheduledEventCreate, d);
399
+ });
400
+ handlers.set("GUILD_SCHEDULED_EVENT_UPDATE", async (client, d) => {
401
+ client.emit(Events.GuildScheduledEventUpdate, d);
402
+ });
403
+ handlers.set("GUILD_SCHEDULED_EVENT_DELETE", async (client, d) => {
404
+ client.emit(Events.GuildScheduledEventDelete, d);
405
+ });
406
+ handlers.set("CHANNEL_PINS_UPDATE", async (client, d) => {
407
+ client.emit(Events.ChannelPinsUpdate, d);
408
+ });
409
+ handlers.set("INVITE_CREATE", async (client, d) => {
410
+ client.emit(Events.InviteCreate, d);
411
+ });
412
+ handlers.set("INVITE_DELETE", async (client, d) => {
413
+ client.emit(Events.InviteDelete, d);
414
+ });
415
+ handlers.set("TYPING_START", async (client, d) => {
416
+ client.emit(Events.TypingStart, d);
417
+ });
418
+ handlers.set("USER_UPDATE", async (client, d) => {
419
+ const data = d;
420
+ if (client.user?.id === data.id) {
421
+ client.user._patch(data);
422
+ }
423
+ client.emit(Events.UserUpdate, data);
424
+ });
425
+ handlers.set("PRESENCE_UPDATE", async (client, d) => {
426
+ client.emit(Events.PresenceUpdate, d);
427
+ });
428
+ handlers.set("WEBHOOKS_UPDATE", async (client, d) => {
429
+ client.emit(Events.WebhooksUpdate, d);
430
+ });
431
+ handlers.set("RESUMED", async (client) => {
432
+ client.emit(Events.Resumed);
433
+ });
434
+ var eventHandlers = handlers;
435
+
66
436
  // src/client/Client.ts
67
437
  var Client = class extends EventEmitter {
438
+ /** @param options - Token, REST config, WebSocket, presence, etc. */
68
439
  constructor(options = {}) {
69
440
  super();
70
441
  this.options = options;
442
+ Object.defineProperty(this.channels, "cache", {
443
+ get: () => this.channels,
444
+ configurable: true
445
+ });
446
+ Object.defineProperty(this.guilds, "cache", {
447
+ get: () => this.guilds,
448
+ configurable: true
449
+ });
71
450
  this.rest = new REST({
72
451
  api: options.rest?.api ?? "https://api.fluxer.app",
73
452
  version: options.rest?.version ?? "1",
@@ -75,17 +454,87 @@ var Client = class extends EventEmitter {
75
454
  });
76
455
  }
77
456
  rest;
78
- guilds = new Collection();
79
- channels = new Collection();
80
- users = new Collection();
457
+ guilds = new GuildManager(this);
458
+ channels = new ChannelManager(this);
459
+ users = new Collection3();
81
460
  user = null;
82
461
  readyAt = null;
83
462
  _ws = null;
463
+ /**
464
+ * Resolve an emoji argument to the API format (unicode or "name:id").
465
+ * Supports: <:name:id>, :name:, name:id, { name, id }, unicode.
466
+ * When id is missing (e.g. :name:), fetches guild emojis if guildId provided.
467
+ * @param emoji - Emoji string or object
468
+ * @param guildId - Guild ID for resolving custom emoji by name (required when id is missing)
469
+ * @returns API-formatted string for reactions
470
+ */
471
+ async resolveEmoji(emoji, guildId) {
472
+ if (typeof emoji === "object" && emoji.id) {
473
+ return formatEmoji({ name: emoji.name, id: emoji.id, animated: emoji.animated });
474
+ }
475
+ const parsed = parseEmoji(typeof emoji === "string" ? emoji : `:${emoji.name}:`);
476
+ if (!parsed) throw new Error("Invalid emoji");
477
+ if (parsed.id) return formatEmoji(parsed);
478
+ if (guildId) {
479
+ const emojis = await this.rest.get(Routes3.guildEmojis(guildId));
480
+ const list = Array.isArray(emojis) ? emojis : Object.values(emojis ?? {});
481
+ const found = list.find((e) => e.name && e.name.toLowerCase() === parsed.name.toLowerCase());
482
+ if (found) return formatEmoji({ ...parsed, id: found.id, animated: found.animated });
483
+ throw new Error(
484
+ `Custom emoji ":${parsed.name}:" not found in guild. Use name:id or <:name:id> format.`
485
+ );
486
+ }
487
+ if (/^\w+$/.test(parsed.name)) {
488
+ throw new Error(
489
+ `Custom emoji ":${parsed.name}:" requires guild context. Use message.react() in a guild channel, or pass guildId to client.resolveEmoji().`
490
+ );
491
+ }
492
+ return encodeURIComponent(parsed.name);
493
+ }
494
+ /**
495
+ * Fetch a message by channel and message ID. Use when you have IDs (e.g. from a DB).
496
+ * @param channelId - Snowflake of the channel
497
+ * @param messageId - Snowflake of the message
498
+ * @returns The message, or null if not found
499
+ * @deprecated Use channel.messages.fetch(messageId). For IDs-only: (await client.channels.fetch(channelId))?.messages?.fetch(messageId)
500
+ * @example
501
+ * const channel = await client.channels.fetch(channelId);
502
+ * const message = await channel?.messages?.fetch(messageId);
503
+ */
504
+ async fetchMessage(channelId, messageId) {
505
+ return this.channels.fetchMessage(channelId, messageId);
506
+ }
507
+ /**
508
+ * Send a message to any channel by ID. Shorthand for client.channels.send().
509
+ * Works even when the channel is not cached.
510
+ */
511
+ async sendToChannel(channelId, payload) {
512
+ return this.channels.send(channelId, payload);
513
+ }
514
+ /**
515
+ * Get or create a User from API data. Caches in client.users.
516
+ * Updates existing user's username, avatar, etc. when fresh data is provided.
517
+ */
518
+ getOrCreateUser(data) {
519
+ const existing = this.users.get(data.id);
520
+ if (existing) {
521
+ existing._patch(data);
522
+ return existing;
523
+ }
524
+ const user = new User(this, data);
525
+ this.users.set(user.id, user);
526
+ return user;
527
+ }
528
+ /** WebSocket manager. Throws if not logged in. */
84
529
  get ws() {
85
530
  if (!this._ws) throw new Error("Client is not logged in");
86
531
  return this._ws;
87
532
  }
88
- /** Send a payload to the gateway (e.g. Voice State Update). Uses shard 0 when single-shard. */
533
+ /**
534
+ * Send a payload to the gateway (e.g. Voice State Update).
535
+ * @param shardId - Shard ID (use 0 for single-shard)
536
+ * @param payload - Gateway payload to send
537
+ */
89
538
  sendToGateway(shardId, payload) {
90
539
  this.ws.send(shardId, payload);
91
540
  }
@@ -93,158 +542,27 @@ var Client = class extends EventEmitter {
93
542
  if (payload.op !== 0 || !payload.t) return;
94
543
  const { t: event, d } = payload;
95
544
  try {
96
- switch (event) {
97
- case "MESSAGE_CREATE": {
98
- const { Message: Message2 } = await import("./Message-33APPS76.mjs");
99
- this.emit(Events.MessageCreate, new Message2(this, d));
100
- break;
101
- }
102
- case "MESSAGE_UPDATE": {
103
- const { Message: Message2 } = await import("./Message-33APPS76.mjs");
104
- this.emit(Events.MessageUpdate, null, new Message2(this, d));
105
- break;
106
- }
107
- case "MESSAGE_DELETE":
108
- this.emit(Events.MessageDelete, { id: d.id, channelId: d.channel_id });
109
- break;
110
- case "MESSAGE_REACTION_ADD":
111
- this.emit(Events.MessageReactionAdd, d);
112
- break;
113
- case "MESSAGE_REACTION_REMOVE":
114
- this.emit(Events.MessageReactionRemove, d);
115
- break;
116
- case "MESSAGE_REACTION_REMOVE_ALL":
117
- this.emit(Events.MessageReactionRemoveAll, d);
118
- break;
119
- case "MESSAGE_REACTION_REMOVE_EMOJI":
120
- this.emit(Events.MessageReactionRemoveEmoji, d);
121
- break;
122
- case "GUILD_CREATE": {
123
- const { Guild: Guild2 } = await import("./Guild-NHNQ5TIA.mjs");
124
- const { Channel: Channel2 } = await import("./Channel-IKL3SJXN.mjs");
125
- const guild = new Guild2(this, d);
126
- this.guilds.set(guild.id, guild);
127
- const g = d;
128
- for (const ch of g.channels ?? []) {
129
- const channel = Channel2.from(this, ch);
130
- if (channel) this.channels.set(channel.id, channel);
131
- }
132
- this.emit(Events.GuildCreate, guild);
133
- if (g.voice_states?.length) {
134
- this.emit(Events.VoiceStatesSync, { guildId: guild.id, voiceStates: g.voice_states });
135
- }
136
- break;
137
- }
138
- case "GUILD_UPDATE": {
139
- const { Guild: Guild2 } = await import("./Guild-NHNQ5TIA.mjs");
140
- const g = d;
141
- const old = this.guilds.get(g.id);
142
- const updated = new Guild2(this, g);
143
- this.guilds.set(updated.id, updated);
144
- this.emit(Events.GuildUpdate, old ?? updated, updated);
145
- break;
146
- }
147
- case "GUILD_DELETE": {
148
- const g = d;
149
- const guild = this.guilds.get(g.id);
150
- if (guild) {
151
- this.guilds.delete(g.id);
152
- this.emit(Events.GuildDelete, guild);
153
- }
154
- break;
155
- }
156
- case "CHANNEL_CREATE": {
157
- const { Channel: Channel2 } = await import("./Channel-IKL3SJXN.mjs");
158
- const ch = Channel2.from(this, d);
159
- if (ch) {
160
- this.channels.set(ch.id, ch);
161
- this.emit(Events.ChannelCreate, ch);
162
- }
163
- break;
164
- }
165
- case "CHANNEL_UPDATE": {
166
- const { Channel: Channel2 } = await import("./Channel-IKL3SJXN.mjs");
167
- const ch = d;
168
- const oldCh = this.channels.get(ch.id);
169
- const newCh = Channel2.from(this, ch);
170
- if (newCh) {
171
- this.channels.set(newCh.id, newCh);
172
- this.emit(Events.ChannelUpdate, oldCh ?? newCh, newCh);
173
- }
174
- break;
175
- }
176
- case "CHANNEL_DELETE": {
177
- const ch = d;
178
- const channel = this.channels.get(ch.id);
179
- if (channel) {
180
- this.channels.delete(ch.id);
181
- this.emit(Events.ChannelDelete, channel);
182
- }
183
- break;
184
- }
185
- case "GUILD_MEMBER_ADD": {
186
- const { GuildMember: GuildMember2 } = await import("./GuildMember-RGVPVUAG.mjs");
187
- const data = d;
188
- const guild = this.guilds.get(data.guild_id);
189
- if (guild) {
190
- const member = new GuildMember2(this, data, guild);
191
- guild.members.set(member.id, member);
192
- this.emit(Events.GuildMemberAdd, member);
193
- }
194
- break;
195
- }
196
- case "GUILD_MEMBER_UPDATE": {
197
- const { GuildMember: GuildMember2 } = await import("./GuildMember-RGVPVUAG.mjs");
198
- const data = d;
199
- const guild = this.guilds.get(data.guild_id);
200
- if (guild) {
201
- const oldM = guild.members.get(data.user.id);
202
- const newM = new GuildMember2(this, data, guild);
203
- guild.members.set(newM.id, newM);
204
- this.emit(Events.GuildMemberUpdate, oldM ?? newM, newM);
205
- }
206
- break;
207
- }
208
- case "GUILD_MEMBER_REMOVE": {
209
- const data = d;
210
- const guild = this.guilds.get(data.guild_id);
211
- if (guild) {
212
- const member = guild.members.get(data.user.id);
213
- if (member) {
214
- guild.members.delete(data.user.id);
215
- this.emit(Events.GuildMemberRemove, member);
216
- }
217
- }
218
- break;
219
- }
220
- case "INTERACTION_CREATE": {
221
- this.emit(Events.InteractionCreate, d);
222
- break;
223
- }
224
- case "VOICE_STATE_UPDATE": {
225
- this.emit(Events.VoiceStateUpdate, d);
226
- break;
227
- }
228
- case "VOICE_SERVER_UPDATE": {
229
- this.emit(Events.VoiceServerUpdate, d);
230
- break;
231
- }
232
- default:
233
- break;
234
- }
545
+ const handler = eventHandlers.get(event);
546
+ if (handler) await handler(this, d);
235
547
  } catch (err) {
236
548
  this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)));
237
549
  }
238
550
  }
551
+ /**
552
+ * Connect to the Fluxer gateway and authenticate.
553
+ * @param token - Bot token (e.g. from FLUXER_BOT_TOKEN)
554
+ */
239
555
  async login(token) {
556
+ if (this._ws) {
557
+ throw new FluxerError("Client is already logged in. Call destroy() first.");
558
+ }
240
559
  this.rest.setToken(token);
241
560
  let intents = this.options.intents ?? 0;
242
561
  if (intents !== 0) {
243
562
  if (typeof process !== "undefined" && process.emitWarning) {
244
- process.emitWarning(
245
- "Fluxer does not support intents yet. Value has been set to 0.",
246
- { type: "FluxerIntents" }
247
- );
563
+ process.emitWarning("Fluxer does not support intents yet. Value has been set to 0.", {
564
+ type: "FluxerIntents"
565
+ });
248
566
  } else {
249
567
  console.warn("Fluxer does not support intents yet. Value has been set to 0.");
250
568
  }
@@ -259,33 +577,44 @@ var Client = class extends EventEmitter {
259
577
  WebSocket: this.options.WebSocket
260
578
  });
261
579
  this._ws.on("dispatch", ({ payload }) => {
262
- this.handleDispatch(payload);
580
+ this.handleDispatch(payload).catch(
581
+ (err) => this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)))
582
+ );
263
583
  });
264
- this._ws.on("ready", async ({ data }) => {
265
- const { ClientUser: ClientUser2 } = await import("./ClientUser-RNDKHQ3Z.mjs");
266
- const { Guild: Guild2 } = await import("./Guild-NHNQ5TIA.mjs");
267
- const { Channel: Channel2 } = await import("./Channel-IKL3SJXN.mjs");
268
- this.user = new ClientUser2(this, data.user);
269
- for (const g of data.guilds ?? []) {
270
- const guild = new Guild2(this, g);
271
- this.guilds.set(guild.id, guild);
272
- const withCh = g;
273
- for (const ch of withCh.channels ?? []) {
274
- const channel = Channel2.from(this, ch);
275
- if (channel) this.channels.set(channel.id, channel);
276
- }
277
- if (withCh.voice_states?.length) {
278
- this.emit(Events.VoiceStatesSync, { guildId: guild.id, voiceStates: withCh.voice_states });
584
+ this._ws.on(
585
+ "ready",
586
+ async ({
587
+ data
588
+ }) => {
589
+ const { ClientUser: ClientUser2 } = await import("./ClientUser-2K2BACK7.mjs");
590
+ const { Guild: Guild2 } = await import("./Guild-CMZGA6DW.mjs");
591
+ const { Channel: Channel2 } = await import("./Channel-TWPDKW2P.mjs");
592
+ this.user = new ClientUser2(this, data.user);
593
+ for (const g of data.guilds ?? []) {
594
+ const guild = new Guild2(this, g);
595
+ this.guilds.set(guild.id, guild);
596
+ const withCh = g;
597
+ for (const ch of withCh.channels ?? []) {
598
+ const channel = Channel2.from(this, ch);
599
+ if (channel) this.channels.set(channel.id, channel);
600
+ }
601
+ if (withCh.voice_states?.length) {
602
+ this.emit(Events.VoiceStatesSync, {
603
+ guildId: guild.id,
604
+ voiceStates: withCh.voice_states
605
+ });
606
+ }
279
607
  }
608
+ this.readyAt = /* @__PURE__ */ new Date();
609
+ this.emit(Events.Ready);
280
610
  }
281
- this.readyAt = /* @__PURE__ */ new Date();
282
- this.emit(Events.Ready);
283
- });
611
+ );
284
612
  this._ws.on("error", ({ error }) => this.emit(Events.Error, error));
285
613
  this._ws.on("debug", (msg) => this.emit(Events.Debug, msg));
286
614
  await this._ws.connect();
287
615
  return token;
288
616
  }
617
+ /** Disconnect from the gateway and clear cached data. */
289
618
  async destroy() {
290
619
  if (this._ws) {
291
620
  this._ws.destroy();
@@ -298,20 +627,12 @@ var Client = class extends EventEmitter {
298
627
  this.channels.clear();
299
628
  this.users.clear();
300
629
  }
630
+ /** Returns true if the client has received Ready and `user` is set. */
301
631
  isReady() {
302
632
  return this.readyAt !== null && this.user !== null;
303
633
  }
304
634
  static get Routes() {
305
- return Routes;
306
- }
307
- };
308
-
309
- // src/errors/FluxerError.ts
310
- var FluxerError = class _FluxerError extends Error {
311
- constructor(message) {
312
- super(message);
313
- this.name = "FluxerError";
314
- Object.setPrototypeOf(this, _FluxerError.prototype);
635
+ return Routes3;
315
636
  }
316
637
  };
317
638
 
@@ -323,14 +644,16 @@ var ErrorCodes = {
323
644
 
324
645
  // src/index.ts
325
646
  import { EmbedBuilder, MessagePayload, AttachmentBuilder } from "@fluxerjs/builders";
326
- import { Routes as Routes2, GatewayOpcodes } from "@fluxerjs/types";
647
+ import { Routes as Routes4, GatewayOpcodes } from "@fluxerjs/types";
327
648
  export {
328
649
  AttachmentBuilder,
329
650
  Base,
330
651
  CategoryChannel,
331
652
  Channel,
653
+ ChannelManager,
332
654
  Client,
333
655
  ClientUser,
656
+ DMChannel,
334
657
  EmbedBuilder,
335
658
  ErrorCodes,
336
659
  Events,
@@ -341,8 +664,11 @@ export {
341
664
  GuildMember,
342
665
  LinkChannel,
343
666
  Message,
667
+ MessageManager,
344
668
  MessagePayload,
345
- Routes2 as Routes,
669
+ MessageReaction,
670
+ Role,
671
+ Routes4 as Routes,
346
672
  TextChannel,
347
673
  User,
348
674
  VoiceChannel,