@fluxerjs/core 1.0.7 → 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 (113) hide show
  1. package/dist/{Channel-OSOB6ELO.mjs → Channel-TWPDKW2P.mjs} +1 -1
  2. package/dist/{ClientUser-RNDKHQ3Z.mjs → ClientUser-2K2BACK7.mjs} +1 -2
  3. package/dist/{Guild-GOQZ7XP4.mjs → Guild-CMZGA6DW.mjs} +3 -1
  4. package/dist/{GuildMember-BJJNCL6W.mjs → GuildMember-DW2N6ITI.mjs} +1 -2
  5. package/dist/{Message-QXPHQOVC.mjs → Message-G2QIKZQK.mjs} +1 -2
  6. package/dist/MessageReaction-XRPYZDSC.mjs +7 -0
  7. package/dist/{Webhook-AG6QFM2I.mjs → Role-SVLWIAMN.mjs} +3 -3
  8. package/dist/{Webhook-2RHBXH7R.mjs → Webhook-2MQESB7Z.mjs} +1 -1
  9. package/dist/{chunk-J3EIGOXQ.mjs → chunk-4GCZFOS5.mjs} +20 -6
  10. package/dist/{chunk-PO5JZQVN.mjs → chunk-CO5EL5LH.mjs} +71 -14
  11. package/dist/{chunk-WYSHH4LR.mjs → chunk-CZIO2D7F.mjs} +72 -6
  12. package/dist/chunk-HBF5QEDH.mjs +42 -0
  13. package/dist/{chunk-NISGA2YZ.mjs → chunk-JVEOQFUX.mjs} +1 -4
  14. package/dist/chunk-SQVCCSNN.mjs +41 -0
  15. package/dist/chunk-TJVZEILY.mjs +120 -0
  16. package/dist/{chunk-T2NSVWBH.mjs → chunk-ZGMM6IPQ.mjs} +3 -1
  17. package/dist/index.d.mts +374 -61
  18. package/dist/index.d.ts +374 -61
  19. package/dist/index.js +1001 -409
  20. package/dist/index.mjs +505 -192
  21. package/package.json +27 -8
  22. package/dist/Channel-2WNJ445K.mjs +0 -17
  23. package/dist/Channel-BEZOW4VC.mjs +0 -17
  24. package/dist/Channel-DPLLHL7Y.mjs +0 -19
  25. package/dist/Channel-HM2UY4DN.mjs +0 -17
  26. package/dist/Channel-IKL3SJXN.mjs +0 -17
  27. package/dist/Channel-KILNV5V3.mjs +0 -17
  28. package/dist/Channel-KOTARBSF.mjs +0 -17
  29. package/dist/Channel-ON7O3D3M.mjs +0 -17
  30. package/dist/Channel-TOAQGSRX.mjs +0 -17
  31. package/dist/Channel-VENHOL7S.mjs +0 -17
  32. package/dist/Channel-YVGPVOVB.mjs +0 -17
  33. package/dist/ClientUser-6HBAPU6H.mjs +0 -8
  34. package/dist/ClientUser-ALGC4FNY.mjs +0 -8
  35. package/dist/ClientUser-J6HQVSDJ.mjs +0 -9
  36. package/dist/ClientUser-LLL6WX35.mjs +0 -8
  37. package/dist/ClientUser-N7ZXYAQ3.mjs +0 -8
  38. package/dist/Guild-36EGAAEW.mjs +0 -8
  39. package/dist/Guild-5UBZNIGD.mjs +0 -9
  40. package/dist/Guild-CA3W6DOD.mjs +0 -8
  41. package/dist/Guild-GIXJJBFM.mjs +0 -9
  42. package/dist/Guild-NHNQ5TIA.mjs +0 -8
  43. package/dist/Guild-S436SLOP.mjs +0 -9
  44. package/dist/Guild-WAFXK2EX.mjs +0 -9
  45. package/dist/Guild-XPOMHZZG.mjs +0 -9
  46. package/dist/Guild-ZOFF5LFR.mjs +0 -8
  47. package/dist/GuildMember-FX2JAWES.mjs +0 -8
  48. package/dist/GuildMember-K5FLBNHV.mjs +0 -8
  49. package/dist/GuildMember-RGVPVUAG.mjs +0 -9
  50. package/dist/GuildMember-UBNHZBCO.mjs +0 -8
  51. package/dist/GuildMember-UU26WJGN.mjs +0 -8
  52. package/dist/GuildMember-XF7K2R45.mjs +0 -9
  53. package/dist/Message-23Z3RPCZ.mjs +0 -9
  54. package/dist/Message-33APPS76.mjs +0 -9
  55. package/dist/Message-6RSAGIRP.mjs +0 -8
  56. package/dist/Message-OXTQHFCF.mjs +0 -8
  57. package/dist/Message-PZUU7ZFR.mjs +0 -9
  58. package/dist/Message-R7GZYIQQ.mjs +0 -8
  59. package/dist/Message-W624MHJF.mjs +0 -8
  60. package/dist/Message-XB5WNMHL.mjs +0 -9
  61. package/dist/Message-ZCS7IGJX.mjs +0 -8
  62. package/dist/Webhook-NUQCJAWZ.mjs +0 -7
  63. package/dist/Webhook-TGAZZRQQ.mjs +0 -7
  64. package/dist/chunk-2FIZRRSO.mjs +0 -88
  65. package/dist/chunk-3CNUPFDI.mjs +0 -59
  66. package/dist/chunk-4DBGMFOQ.mjs +0 -14
  67. package/dist/chunk-5HQRX3KJ.mjs +0 -70
  68. package/dist/chunk-62S4AB2S.mjs +0 -54
  69. package/dist/chunk-6CEMF2LO.mjs +0 -14
  70. package/dist/chunk-6EBNOON4.mjs +0 -86
  71. package/dist/chunk-72OY7B3D.mjs +0 -72
  72. package/dist/chunk-7FYM4D2E.mjs +0 -50
  73. package/dist/chunk-7GZN6JXT.mjs +0 -50
  74. package/dist/chunk-7H3TKJUT.mjs +0 -53
  75. package/dist/chunk-7SIS5CUA.mjs +0 -14
  76. package/dist/chunk-BGJSL6JI.mjs +0 -14
  77. package/dist/chunk-BUEXP5SZ.mjs +0 -70
  78. package/dist/chunk-BYTAODAO.mjs +0 -70
  79. package/dist/chunk-CQ5ZVTLX.mjs +0 -71
  80. package/dist/chunk-DJBCSVZX.mjs +0 -102
  81. package/dist/chunk-DLROMCIJ.mjs +0 -50
  82. package/dist/chunk-DPZHAYCK.mjs +0 -71
  83. package/dist/chunk-E75ZVY3I.mjs +0 -14
  84. package/dist/chunk-EF32ILJL.mjs +0 -102
  85. package/dist/chunk-F2EEQP5O.mjs +0 -86
  86. package/dist/chunk-FK5X6HFL.mjs +0 -111
  87. package/dist/chunk-FNFID6QB.mjs +0 -45
  88. package/dist/chunk-G4L7WAJS.mjs +0 -64
  89. package/dist/chunk-GUNWHOQO.mjs +0 -42
  90. package/dist/chunk-IPHFDI2L.mjs +0 -68
  91. package/dist/chunk-JJHZBWZM.mjs +0 -118
  92. package/dist/chunk-L25ON7WB.mjs +0 -52
  93. package/dist/chunk-LBBIQOSH.mjs +0 -53
  94. package/dist/chunk-LVMFPATK.mjs +0 -54
  95. package/dist/chunk-NOLYW3V4.mjs +0 -140
  96. package/dist/chunk-OHIHIQAS.mjs +0 -102
  97. package/dist/chunk-P4IRDGB4.mjs +0 -43
  98. package/dist/chunk-PYYXC7US.mjs +0 -76
  99. package/dist/chunk-QDCFQF6J.mjs +0 -36
  100. package/dist/chunk-QDNFJVVE.mjs +0 -70
  101. package/dist/chunk-QXJNV5EJ.mjs +0 -110
  102. package/dist/chunk-RXHJYGSJ.mjs +0 -53
  103. package/dist/chunk-SW6KNICI.mjs +0 -52
  104. package/dist/chunk-TE5IC7IP.mjs +0 -36
  105. package/dist/chunk-TMDZALIN.mjs +0 -110
  106. package/dist/chunk-WFONGZGK.mjs +0 -42
  107. package/dist/chunk-WZVY7DA6.mjs +0 -44
  108. package/dist/chunk-XTDZQD4A.mjs +0 -110
  109. package/dist/chunk-XXCBJJZE.mjs +0 -88
  110. package/dist/chunk-YKP7JHV2.mjs +0 -102
  111. package/dist/chunk-YSKZR66G.mjs +0 -102
  112. package/dist/chunk-ZHRQQZ4X.mjs +0 -102
  113. package/dist/chunk-ZMIMAMO2.mjs +0 -14
package/dist/index.mjs CHANGED
@@ -1,30 +1,36 @@
1
+ import {
2
+ ClientUser,
3
+ User
4
+ } from "./chunk-4GCZFOS5.mjs";
1
5
  import {
2
6
  Webhook
3
- } from "./chunk-T2NSVWBH.mjs";
7
+ } from "./chunk-ZGMM6IPQ.mjs";
8
+ import {
9
+ Message
10
+ } from "./chunk-CO5EL5LH.mjs";
4
11
  import {
5
12
  CategoryChannel,
6
13
  Channel,
7
14
  DMChannel,
8
15
  GuildChannel,
9
16
  LinkChannel,
17
+ MessageManager,
10
18
  TextChannel,
11
19
  VoiceChannel
12
- } from "./chunk-WYSHH4LR.mjs";
13
- import {
14
- Message
15
- } from "./chunk-PO5JZQVN.mjs";
20
+ } from "./chunk-CZIO2D7F.mjs";
16
21
  import {
17
22
  Guild
18
- } from "./chunk-DPZHAYCK.mjs";
23
+ } from "./chunk-TJVZEILY.mjs";
24
+ import "./chunk-HQMYRYMY.mjs";
19
25
  import {
20
26
  GuildMember
21
- } from "./chunk-NISGA2YZ.mjs";
27
+ } from "./chunk-JVEOQFUX.mjs";
22
28
  import {
23
- ClientUser
24
- } from "./chunk-BGJSL6JI.mjs";
29
+ Role
30
+ } from "./chunk-SQVCCSNN.mjs";
25
31
  import {
26
- User
27
- } from "./chunk-J3EIGOXQ.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,25 +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 {
68
438
  /** @param options - Token, REST config, WebSocket, presence, etc. */
69
439
  constructor(options = {}) {
70
440
  super();
71
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
+ });
72
450
  this.rest = new REST({
73
451
  api: options.rest?.api ?? "https://api.fluxer.app",
74
452
  version: options.rest?.version ?? "1",
@@ -76,12 +454,77 @@ var Client = class extends EventEmitter {
76
454
  });
77
455
  }
78
456
  rest;
79
- guilds = new Collection();
80
- channels = new Collection();
81
- users = new Collection();
457
+ guilds = new GuildManager(this);
458
+ channels = new ChannelManager(this);
459
+ users = new Collection3();
82
460
  user = null;
83
461
  readyAt = null;
84
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
+ }
85
528
  /** WebSocket manager. Throws if not logged in. */
86
529
  get ws() {
87
530
  if (!this._ws) throw new Error("Client is not logged in");
@@ -99,145 +542,8 @@ var Client = class extends EventEmitter {
99
542
  if (payload.op !== 0 || !payload.t) return;
100
543
  const { t: event, d } = payload;
101
544
  try {
102
- switch (event) {
103
- case "MESSAGE_CREATE": {
104
- const { Message: Message2 } = await import("./Message-W624MHJF.mjs");
105
- this.emit(Events.MessageCreate, new Message2(this, d));
106
- break;
107
- }
108
- case "MESSAGE_UPDATE": {
109
- const { Message: Message2 } = await import("./Message-W624MHJF.mjs");
110
- this.emit(Events.MessageUpdate, null, new Message2(this, d));
111
- break;
112
- }
113
- case "MESSAGE_DELETE":
114
- this.emit(Events.MessageDelete, { id: d.id, channelId: d.channel_id });
115
- break;
116
- case "MESSAGE_REACTION_ADD":
117
- this.emit(Events.MessageReactionAdd, d);
118
- break;
119
- case "MESSAGE_REACTION_REMOVE":
120
- this.emit(Events.MessageReactionRemove, d);
121
- break;
122
- case "MESSAGE_REACTION_REMOVE_ALL":
123
- this.emit(Events.MessageReactionRemoveAll, d);
124
- break;
125
- case "MESSAGE_REACTION_REMOVE_EMOJI":
126
- this.emit(Events.MessageReactionRemoveEmoji, d);
127
- break;
128
- case "GUILD_CREATE": {
129
- const { Guild: Guild2 } = await import("./Guild-GIXJJBFM.mjs");
130
- const { Channel: Channel2 } = await import("./Channel-OSOB6ELO.mjs");
131
- const guild = new Guild2(this, d);
132
- this.guilds.set(guild.id, guild);
133
- const g = d;
134
- for (const ch of g.channels ?? []) {
135
- const channel = Channel2.from(this, ch);
136
- if (channel) this.channels.set(channel.id, channel);
137
- }
138
- this.emit(Events.GuildCreate, guild);
139
- if (g.voice_states?.length) {
140
- this.emit(Events.VoiceStatesSync, { guildId: guild.id, voiceStates: g.voice_states });
141
- }
142
- break;
143
- }
144
- case "GUILD_UPDATE": {
145
- const { Guild: Guild2 } = await import("./Guild-GIXJJBFM.mjs");
146
- const g = d;
147
- const old = this.guilds.get(g.id);
148
- const updated = new Guild2(this, g);
149
- this.guilds.set(updated.id, updated);
150
- this.emit(Events.GuildUpdate, old ?? updated, updated);
151
- break;
152
- }
153
- case "GUILD_DELETE": {
154
- const g = d;
155
- const guild = this.guilds.get(g.id);
156
- if (guild) {
157
- this.guilds.delete(g.id);
158
- this.emit(Events.GuildDelete, guild);
159
- }
160
- break;
161
- }
162
- case "CHANNEL_CREATE": {
163
- const { Channel: Channel2 } = await import("./Channel-OSOB6ELO.mjs");
164
- const ch = Channel2.from(this, d);
165
- if (ch) {
166
- this.channels.set(ch.id, ch);
167
- this.emit(Events.ChannelCreate, ch);
168
- }
169
- break;
170
- }
171
- case "CHANNEL_UPDATE": {
172
- const { Channel: Channel2 } = await import("./Channel-OSOB6ELO.mjs");
173
- const ch = d;
174
- const oldCh = this.channels.get(ch.id);
175
- const newCh = Channel2.from(this, ch);
176
- if (newCh) {
177
- this.channels.set(newCh.id, newCh);
178
- this.emit(Events.ChannelUpdate, oldCh ?? newCh, newCh);
179
- }
180
- break;
181
- }
182
- case "CHANNEL_DELETE": {
183
- const ch = d;
184
- const channel = this.channels.get(ch.id);
185
- if (channel) {
186
- this.channels.delete(ch.id);
187
- this.emit(Events.ChannelDelete, channel);
188
- }
189
- break;
190
- }
191
- case "GUILD_MEMBER_ADD": {
192
- const { GuildMember: GuildMember2 } = await import("./GuildMember-UU26WJGN.mjs");
193
- const data = d;
194
- const guild = this.guilds.get(data.guild_id);
195
- if (guild) {
196
- const member = new GuildMember2(this, data, guild);
197
- guild.members.set(member.id, member);
198
- this.emit(Events.GuildMemberAdd, member);
199
- }
200
- break;
201
- }
202
- case "GUILD_MEMBER_UPDATE": {
203
- const { GuildMember: GuildMember2 } = await import("./GuildMember-UU26WJGN.mjs");
204
- const data = d;
205
- const guild = this.guilds.get(data.guild_id);
206
- if (guild) {
207
- const oldM = guild.members.get(data.user.id);
208
- const newM = new GuildMember2(this, data, guild);
209
- guild.members.set(newM.id, newM);
210
- this.emit(Events.GuildMemberUpdate, oldM ?? newM, newM);
211
- }
212
- break;
213
- }
214
- case "GUILD_MEMBER_REMOVE": {
215
- const data = d;
216
- const guild = this.guilds.get(data.guild_id);
217
- if (guild) {
218
- const member = guild.members.get(data.user.id);
219
- if (member) {
220
- guild.members.delete(data.user.id);
221
- this.emit(Events.GuildMemberRemove, member);
222
- }
223
- }
224
- break;
225
- }
226
- case "INTERACTION_CREATE": {
227
- this.emit(Events.InteractionCreate, d);
228
- break;
229
- }
230
- case "VOICE_STATE_UPDATE": {
231
- this.emit(Events.VoiceStateUpdate, d);
232
- break;
233
- }
234
- case "VOICE_SERVER_UPDATE": {
235
- this.emit(Events.VoiceServerUpdate, d);
236
- break;
237
- }
238
- default:
239
- break;
240
- }
545
+ const handler = eventHandlers.get(event);
546
+ if (handler) await handler(this, d);
241
547
  } catch (err) {
242
548
  this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)));
243
549
  }
@@ -247,14 +553,16 @@ var Client = class extends EventEmitter {
247
553
  * @param token - Bot token (e.g. from FLUXER_BOT_TOKEN)
248
554
  */
249
555
  async login(token) {
556
+ if (this._ws) {
557
+ throw new FluxerError("Client is already logged in. Call destroy() first.");
558
+ }
250
559
  this.rest.setToken(token);
251
560
  let intents = this.options.intents ?? 0;
252
561
  if (intents !== 0) {
253
562
  if (typeof process !== "undefined" && process.emitWarning) {
254
- process.emitWarning(
255
- "Fluxer does not support intents yet. Value has been set to 0.",
256
- { type: "FluxerIntents" }
257
- );
563
+ process.emitWarning("Fluxer does not support intents yet. Value has been set to 0.", {
564
+ type: "FluxerIntents"
565
+ });
258
566
  } else {
259
567
  console.warn("Fluxer does not support intents yet. Value has been set to 0.");
260
568
  }
@@ -269,28 +577,38 @@ var Client = class extends EventEmitter {
269
577
  WebSocket: this.options.WebSocket
270
578
  });
271
579
  this._ws.on("dispatch", ({ payload }) => {
272
- this.handleDispatch(payload);
580
+ this.handleDispatch(payload).catch(
581
+ (err) => this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)))
582
+ );
273
583
  });
274
- this._ws.on("ready", async ({ data }) => {
275
- const { ClientUser: ClientUser2 } = await import("./ClientUser-6HBAPU6H.mjs");
276
- const { Guild: Guild2 } = await import("./Guild-GIXJJBFM.mjs");
277
- const { Channel: Channel2 } = await import("./Channel-OSOB6ELO.mjs");
278
- this.user = new ClientUser2(this, data.user);
279
- for (const g of data.guilds ?? []) {
280
- const guild = new Guild2(this, g);
281
- this.guilds.set(guild.id, guild);
282
- const withCh = g;
283
- for (const ch of withCh.channels ?? []) {
284
- const channel = Channel2.from(this, ch);
285
- if (channel) this.channels.set(channel.id, channel);
286
- }
287
- if (withCh.voice_states?.length) {
288
- 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
+ }
289
607
  }
608
+ this.readyAt = /* @__PURE__ */ new Date();
609
+ this.emit(Events.Ready);
290
610
  }
291
- this.readyAt = /* @__PURE__ */ new Date();
292
- this.emit(Events.Ready);
293
- });
611
+ );
294
612
  this._ws.on("error", ({ error }) => this.emit(Events.Error, error));
295
613
  this._ws.on("debug", (msg) => this.emit(Events.Debug, msg));
296
614
  await this._ws.connect();
@@ -314,16 +632,7 @@ var Client = class extends EventEmitter {
314
632
  return this.readyAt !== null && this.user !== null;
315
633
  }
316
634
  static get Routes() {
317
- return Routes;
318
- }
319
- };
320
-
321
- // src/errors/FluxerError.ts
322
- var FluxerError = class _FluxerError extends Error {
323
- constructor(message) {
324
- super(message);
325
- this.name = "FluxerError";
326
- Object.setPrototypeOf(this, _FluxerError.prototype);
635
+ return Routes3;
327
636
  }
328
637
  };
329
638
 
@@ -335,12 +644,13 @@ var ErrorCodes = {
335
644
 
336
645
  // src/index.ts
337
646
  import { EmbedBuilder, MessagePayload, AttachmentBuilder } from "@fluxerjs/builders";
338
- import { Routes as Routes2, GatewayOpcodes } from "@fluxerjs/types";
647
+ import { Routes as Routes4, GatewayOpcodes } from "@fluxerjs/types";
339
648
  export {
340
649
  AttachmentBuilder,
341
650
  Base,
342
651
  CategoryChannel,
343
652
  Channel,
653
+ ChannelManager,
344
654
  Client,
345
655
  ClientUser,
346
656
  DMChannel,
@@ -354,8 +664,11 @@ export {
354
664
  GuildMember,
355
665
  LinkChannel,
356
666
  Message,
667
+ MessageManager,
357
668
  MessagePayload,
358
- Routes2 as Routes,
669
+ MessageReaction,
670
+ Role,
671
+ Routes4 as Routes,
359
672
  TextChannel,
360
673
  User,
361
674
  VoiceChannel,