@fluxerjs/core 1.0.7 → 1.0.9

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 (117) hide show
  1. package/dist/{Channel-OSOB6ELO.mjs → Channel-ICWNKXBR.mjs} +1 -1
  2. package/dist/{ClientUser-RNDKHQ3Z.mjs → ClientUser-WWXUMO5O.mjs} +1 -2
  3. package/dist/{Guild-GOQZ7XP4.mjs → Guild-TM6YGJWB.mjs} +3 -1
  4. package/dist/GuildBan-M4PA3HAA.mjs +7 -0
  5. package/dist/{GuildMember-BJJNCL6W.mjs → GuildMember-RZWZ3OCG.mjs} +1 -2
  6. package/dist/{Webhook-AG6QFM2I.mjs → Invite-UM5BU5A6.mjs} +3 -3
  7. package/dist/{Message-QXPHQOVC.mjs → Message-6IYEYSV6.mjs} +1 -2
  8. package/dist/MessageReaction-XRPYZDSC.mjs +7 -0
  9. package/dist/{Webhook-NUQCJAWZ.mjs → Role-SVLWIAMN.mjs} +3 -3
  10. package/dist/{Webhook-2RHBXH7R.mjs → Webhook-32VJD4AL.mjs} +1 -1
  11. package/dist/{chunk-T2NSVWBH.mjs → chunk-53Y37KRG.mjs} +35 -1
  12. package/dist/chunk-DSPSRPHF.mjs +200 -0
  13. package/dist/{chunk-WYSHH4LR.mjs → chunk-FJS5FBXO.mjs} +98 -6
  14. package/dist/{chunk-J3EIGOXQ.mjs → chunk-GCIJYVRC.mjs} +20 -6
  15. package/dist/{chunk-NISGA2YZ.mjs → chunk-GFUJVQ7L.mjs} +13 -4
  16. package/dist/chunk-HBF5QEDH.mjs +42 -0
  17. package/dist/chunk-QEXIYXXU.mjs +62 -0
  18. package/dist/chunk-RCP27MRC.mjs +33 -0
  19. package/dist/chunk-SQVCCSNN.mjs +41 -0
  20. package/dist/chunk-X77DFNE3.mjs +136 -0
  21. package/dist/index.d.mts +520 -55
  22. package/dist/index.d.ts +520 -55
  23. package/dist/index.js +1333 -404
  24. package/dist/index.mjs +616 -189
  25. package/package.json +27 -8
  26. package/dist/Channel-2WNJ445K.mjs +0 -17
  27. package/dist/Channel-BEZOW4VC.mjs +0 -17
  28. package/dist/Channel-DPLLHL7Y.mjs +0 -19
  29. package/dist/Channel-HM2UY4DN.mjs +0 -17
  30. package/dist/Channel-IKL3SJXN.mjs +0 -17
  31. package/dist/Channel-KILNV5V3.mjs +0 -17
  32. package/dist/Channel-KOTARBSF.mjs +0 -17
  33. package/dist/Channel-ON7O3D3M.mjs +0 -17
  34. package/dist/Channel-TOAQGSRX.mjs +0 -17
  35. package/dist/Channel-VENHOL7S.mjs +0 -17
  36. package/dist/Channel-YVGPVOVB.mjs +0 -17
  37. package/dist/ClientUser-6HBAPU6H.mjs +0 -8
  38. package/dist/ClientUser-ALGC4FNY.mjs +0 -8
  39. package/dist/ClientUser-J6HQVSDJ.mjs +0 -9
  40. package/dist/ClientUser-LLL6WX35.mjs +0 -8
  41. package/dist/ClientUser-N7ZXYAQ3.mjs +0 -8
  42. package/dist/Guild-36EGAAEW.mjs +0 -8
  43. package/dist/Guild-5UBZNIGD.mjs +0 -9
  44. package/dist/Guild-CA3W6DOD.mjs +0 -8
  45. package/dist/Guild-GIXJJBFM.mjs +0 -9
  46. package/dist/Guild-NHNQ5TIA.mjs +0 -8
  47. package/dist/Guild-S436SLOP.mjs +0 -9
  48. package/dist/Guild-WAFXK2EX.mjs +0 -9
  49. package/dist/Guild-XPOMHZZG.mjs +0 -9
  50. package/dist/Guild-ZOFF5LFR.mjs +0 -8
  51. package/dist/GuildMember-FX2JAWES.mjs +0 -8
  52. package/dist/GuildMember-K5FLBNHV.mjs +0 -8
  53. package/dist/GuildMember-RGVPVUAG.mjs +0 -9
  54. package/dist/GuildMember-UBNHZBCO.mjs +0 -8
  55. package/dist/GuildMember-UU26WJGN.mjs +0 -8
  56. package/dist/GuildMember-XF7K2R45.mjs +0 -9
  57. package/dist/Message-23Z3RPCZ.mjs +0 -9
  58. package/dist/Message-33APPS76.mjs +0 -9
  59. package/dist/Message-6RSAGIRP.mjs +0 -8
  60. package/dist/Message-OXTQHFCF.mjs +0 -8
  61. package/dist/Message-PZUU7ZFR.mjs +0 -9
  62. package/dist/Message-R7GZYIQQ.mjs +0 -8
  63. package/dist/Message-W624MHJF.mjs +0 -8
  64. package/dist/Message-XB5WNMHL.mjs +0 -9
  65. package/dist/Message-ZCS7IGJX.mjs +0 -8
  66. package/dist/Webhook-TGAZZRQQ.mjs +0 -7
  67. package/dist/chunk-2FIZRRSO.mjs +0 -88
  68. package/dist/chunk-3CNUPFDI.mjs +0 -59
  69. package/dist/chunk-4DBGMFOQ.mjs +0 -14
  70. package/dist/chunk-5HQRX3KJ.mjs +0 -70
  71. package/dist/chunk-62S4AB2S.mjs +0 -54
  72. package/dist/chunk-6CEMF2LO.mjs +0 -14
  73. package/dist/chunk-6EBNOON4.mjs +0 -86
  74. package/dist/chunk-72OY7B3D.mjs +0 -72
  75. package/dist/chunk-7FYM4D2E.mjs +0 -50
  76. package/dist/chunk-7GZN6JXT.mjs +0 -50
  77. package/dist/chunk-7H3TKJUT.mjs +0 -53
  78. package/dist/chunk-7SIS5CUA.mjs +0 -14
  79. package/dist/chunk-BGJSL6JI.mjs +0 -14
  80. package/dist/chunk-BUEXP5SZ.mjs +0 -70
  81. package/dist/chunk-BYTAODAO.mjs +0 -70
  82. package/dist/chunk-CQ5ZVTLX.mjs +0 -71
  83. package/dist/chunk-DJBCSVZX.mjs +0 -102
  84. package/dist/chunk-DLROMCIJ.mjs +0 -50
  85. package/dist/chunk-DPZHAYCK.mjs +0 -71
  86. package/dist/chunk-E75ZVY3I.mjs +0 -14
  87. package/dist/chunk-EF32ILJL.mjs +0 -102
  88. package/dist/chunk-F2EEQP5O.mjs +0 -86
  89. package/dist/chunk-FK5X6HFL.mjs +0 -111
  90. package/dist/chunk-FNFID6QB.mjs +0 -45
  91. package/dist/chunk-G4L7WAJS.mjs +0 -64
  92. package/dist/chunk-GUNWHOQO.mjs +0 -42
  93. package/dist/chunk-IPHFDI2L.mjs +0 -68
  94. package/dist/chunk-JJHZBWZM.mjs +0 -118
  95. package/dist/chunk-L25ON7WB.mjs +0 -52
  96. package/dist/chunk-LBBIQOSH.mjs +0 -53
  97. package/dist/chunk-LVMFPATK.mjs +0 -54
  98. package/dist/chunk-NOLYW3V4.mjs +0 -140
  99. package/dist/chunk-OHIHIQAS.mjs +0 -102
  100. package/dist/chunk-P4IRDGB4.mjs +0 -43
  101. package/dist/chunk-PO5JZQVN.mjs +0 -111
  102. package/dist/chunk-PYYXC7US.mjs +0 -76
  103. package/dist/chunk-QDCFQF6J.mjs +0 -36
  104. package/dist/chunk-QDNFJVVE.mjs +0 -70
  105. package/dist/chunk-QXJNV5EJ.mjs +0 -110
  106. package/dist/chunk-RXHJYGSJ.mjs +0 -53
  107. package/dist/chunk-SW6KNICI.mjs +0 -52
  108. package/dist/chunk-TE5IC7IP.mjs +0 -36
  109. package/dist/chunk-TMDZALIN.mjs +0 -110
  110. package/dist/chunk-WFONGZGK.mjs +0 -42
  111. package/dist/chunk-WZVY7DA6.mjs +0 -44
  112. package/dist/chunk-XTDZQD4A.mjs +0 -110
  113. package/dist/chunk-XXCBJJZE.mjs +0 -88
  114. package/dist/chunk-YKP7JHV2.mjs +0 -102
  115. package/dist/chunk-YSKZR66G.mjs +0 -102
  116. package/dist/chunk-ZHRQQZ4X.mjs +0 -102
  117. package/dist/chunk-ZMIMAMO2.mjs +0 -14
package/dist/index.mjs CHANGED
@@ -1,30 +1,44 @@
1
+ import {
2
+ GuildBan
3
+ } from "./chunk-RCP27MRC.mjs";
4
+ import {
5
+ Invite
6
+ } from "./chunk-QEXIYXXU.mjs";
7
+ import {
8
+ ClientUser,
9
+ User
10
+ } from "./chunk-GCIJYVRC.mjs";
1
11
  import {
2
12
  Webhook
3
- } from "./chunk-T2NSVWBH.mjs";
13
+ } from "./chunk-53Y37KRG.mjs";
14
+ import {
15
+ Message
16
+ } from "./chunk-DSPSRPHF.mjs";
4
17
  import {
5
18
  CategoryChannel,
6
19
  Channel,
7
20
  DMChannel,
8
21
  GuildChannel,
9
22
  LinkChannel,
23
+ MessageManager,
10
24
  TextChannel,
11
25
  VoiceChannel
12
- } from "./chunk-WYSHH4LR.mjs";
13
- import {
14
- Message
15
- } from "./chunk-PO5JZQVN.mjs";
26
+ } from "./chunk-FJS5FBXO.mjs";
16
27
  import {
17
28
  Guild
18
- } from "./chunk-DPZHAYCK.mjs";
29
+ } from "./chunk-X77DFNE3.mjs";
30
+ import {
31
+ CDN_URL
32
+ } from "./chunk-HQMYRYMY.mjs";
19
33
  import {
20
34
  GuildMember
21
- } from "./chunk-NISGA2YZ.mjs";
35
+ } from "./chunk-GFUJVQ7L.mjs";
22
36
  import {
23
- ClientUser
24
- } from "./chunk-BGJSL6JI.mjs";
37
+ Role
38
+ } from "./chunk-SQVCCSNN.mjs";
25
39
  import {
26
- User
27
- } from "./chunk-J3EIGOXQ.mjs";
40
+ MessageReaction
41
+ } from "./chunk-HBF5QEDH.mjs";
28
42
  import {
29
43
  Base
30
44
  } from "./chunk-XNS4O6QJ.mjs";
@@ -33,8 +47,120 @@ import {
33
47
  import { EventEmitter } from "events";
34
48
  import { REST } from "@fluxerjs/rest";
35
49
  import { WebSocketManager } from "@fluxerjs/ws";
36
- import { Routes } from "@fluxerjs/types";
50
+ import { Routes as Routes3 } from "@fluxerjs/types";
51
+ import { Collection as Collection3 } from "@fluxerjs/collection";
52
+
53
+ // src/client/ChannelManager.ts
37
54
  import { Collection } from "@fluxerjs/collection";
55
+ import { Routes } from "@fluxerjs/types";
56
+ var ChannelManager = class extends Collection {
57
+ constructor(client) {
58
+ super();
59
+ this.client = client;
60
+ }
61
+ /**
62
+ * Fetch a channel by ID from the API (or return from cache if present).
63
+ * @param channelId - Snowflake of the channel
64
+ * @returns The channel, or null if not found
65
+ * @example
66
+ * const channel = await client.channels.fetch(channelId);
67
+ * if (channel?.isSendable()) await channel.send('Hello!');
68
+ */
69
+ async fetch(channelId) {
70
+ const cached = this.get(channelId);
71
+ if (cached) return cached;
72
+ try {
73
+ const { Channel: Channel2 } = await import("./Channel-ICWNKXBR.mjs");
74
+ const data = await this.client.rest.get(
75
+ Routes.channel(channelId)
76
+ );
77
+ const channel = Channel2.fromOrCreate(this.client, data);
78
+ if (channel) this.set(channel.id, channel);
79
+ return channel;
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+ /**
85
+ * Fetch a message by ID from the API.
86
+ * @param channelId - Snowflake of the channel
87
+ * @param messageId - Snowflake of the message
88
+ * @returns The message, or null if not found
89
+ * @deprecated Use channel.messages.fetch(messageId). Prefer (await client.channels.fetch(channelId))?.messages?.fetch(messageId).
90
+ * @example
91
+ * const channel = await client.channels.fetch(channelId);
92
+ * const message = await channel?.messages?.fetch(messageId);
93
+ */
94
+ async fetchMessage(channelId, messageId) {
95
+ try {
96
+ const { Message: Message2 } = await import("./Message-6IYEYSV6.mjs");
97
+ const data = await this.client.rest.get(
98
+ Routes.channelMessage(channelId, messageId)
99
+ );
100
+ return new Message2(this.client, data);
101
+ } catch {
102
+ return null;
103
+ }
104
+ }
105
+ /**
106
+ * Send a message to a channel by ID. Works even when the channel is not cached.
107
+ * Skips the fetch when you only need to send.
108
+ * @param channelId - Snowflake of the channel (text channel or DM)
109
+ * @param payload - Text content or object with content and/or embeds
110
+ * @returns The created message
111
+ * @example
112
+ * await client.channels.send(logChannelId, 'User joined!');
113
+ * await client.channels.send(channelId, { embeds: [embed.toJSON()] });
114
+ */
115
+ async send(channelId, payload) {
116
+ const body = typeof payload === "string" ? { content: payload } : payload;
117
+ const { Message: Message2 } = await import("./Message-6IYEYSV6.mjs");
118
+ const data = await this.client.rest.post(Routes.channelMessages(channelId), { body });
119
+ return new Message2(this.client, data);
120
+ }
121
+ };
122
+
123
+ // src/client/GuildManager.ts
124
+ import { Collection as Collection2 } from "@fluxerjs/collection";
125
+ import { Routes as Routes2 } from "@fluxerjs/types";
126
+ var GuildManager = class extends Collection2 {
127
+ constructor(client) {
128
+ super();
129
+ this.client = client;
130
+ }
131
+ /**
132
+ * Fetch a guild by ID from the API (or return from cache if present).
133
+ * @param guildId - Snowflake of the guild
134
+ * @returns The guild, or null if not found
135
+ * @example
136
+ * const guild = await client.guilds.fetch(guildId);
137
+ * if (guild) console.log(guild.name);
138
+ */
139
+ async fetch(guildId) {
140
+ const cached = this.get(guildId);
141
+ if (cached) return cached;
142
+ try {
143
+ const { Guild: Guild2 } = await import("./Guild-TM6YGJWB.mjs");
144
+ const data = await this.client.rest.get(
145
+ Routes2.guild(guildId)
146
+ );
147
+ const guild = new Guild2(this.client, data);
148
+ this.set(guild.id, guild);
149
+ return guild;
150
+ } catch {
151
+ return null;
152
+ }
153
+ }
154
+ };
155
+
156
+ // src/errors/FluxerError.ts
157
+ var FluxerError = class _FluxerError extends Error {
158
+ constructor(message) {
159
+ super(message);
160
+ this.name = "FluxerError";
161
+ Object.setPrototypeOf(this, _FluxerError.prototype);
162
+ }
163
+ };
38
164
 
39
165
  // src/util/Events.ts
40
166
  var Events = {
@@ -42,6 +168,7 @@ var Events = {
42
168
  MessageCreate: "messageCreate",
43
169
  MessageUpdate: "messageUpdate",
44
170
  MessageDelete: "messageDelete",
171
+ MessageDeleteBulk: "messageDeleteBulk",
45
172
  MessageReactionAdd: "messageReactionAdd",
46
173
  MessageReactionRemove: "messageReactionRemove",
47
174
  MessageReactionRemoveAll: "messageReactionRemoveAll",
@@ -50,25 +177,292 @@ var Events = {
50
177
  GuildCreate: "guildCreate",
51
178
  GuildUpdate: "guildUpdate",
52
179
  GuildDelete: "guildDelete",
53
- ChannelCreate: "channelCreate",
54
- ChannelUpdate: "channelUpdate",
55
- ChannelDelete: "channelDelete",
180
+ GuildBanAdd: "guildBanAdd",
181
+ GuildBanRemove: "guildBanRemove",
182
+ GuildEmojisUpdate: "guildEmojisUpdate",
183
+ GuildStickersUpdate: "guildStickersUpdate",
184
+ GuildIntegrationsUpdate: "guildIntegrationsUpdate",
56
185
  GuildMemberAdd: "guildMemberAdd",
57
186
  GuildMemberUpdate: "guildMemberUpdate",
58
187
  GuildMemberRemove: "guildMemberRemove",
188
+ GuildRoleCreate: "guildRoleCreate",
189
+ GuildRoleUpdate: "guildRoleUpdate",
190
+ GuildRoleDelete: "guildRoleDelete",
191
+ GuildScheduledEventCreate: "guildScheduledEventCreate",
192
+ GuildScheduledEventUpdate: "guildScheduledEventUpdate",
193
+ GuildScheduledEventDelete: "guildScheduledEventDelete",
194
+ ChannelCreate: "channelCreate",
195
+ ChannelUpdate: "channelUpdate",
196
+ ChannelDelete: "channelDelete",
197
+ ChannelPinsUpdate: "channelPinsUpdate",
198
+ InviteCreate: "inviteCreate",
199
+ InviteDelete: "inviteDelete",
200
+ TypingStart: "typingStart",
201
+ UserUpdate: "userUpdate",
202
+ PresenceUpdate: "presenceUpdate",
59
203
  VoiceStateUpdate: "voiceStateUpdate",
60
204
  VoiceServerUpdate: "voiceServerUpdate",
61
205
  VoiceStatesSync: "voiceStatesSync",
206
+ WebhooksUpdate: "webhooksUpdate",
207
+ Resumed: "resumed",
62
208
  Error: "error",
63
209
  Debug: "debug"
64
210
  };
65
211
 
212
+ // src/client/Client.ts
213
+ import { formatEmoji, parseEmoji } from "@fluxerjs/util";
214
+
215
+ // src/client/EventHandlerRegistry.ts
216
+ var handlers = /* @__PURE__ */ new Map();
217
+ handlers.set("MESSAGE_CREATE", async (client, d) => {
218
+ const { Message: Message2 } = await import("./Message-6IYEYSV6.mjs");
219
+ client.emit(Events.MessageCreate, new Message2(client, d));
220
+ });
221
+ handlers.set("MESSAGE_UPDATE", async (client, d) => {
222
+ const { Message: Message2 } = await import("./Message-6IYEYSV6.mjs");
223
+ client.emit(Events.MessageUpdate, null, new Message2(client, d));
224
+ });
225
+ handlers.set("MESSAGE_DELETE", async (client, d) => {
226
+ const data = d;
227
+ const channel = client.channels.get(data.channel_id) ?? null;
228
+ client.emit(Events.MessageDelete, {
229
+ id: data.id,
230
+ channelId: data.channel_id,
231
+ channel
232
+ });
233
+ });
234
+ handlers.set("MESSAGE_REACTION_ADD", async (client, d) => {
235
+ const data = d;
236
+ const { MessageReaction: MessageReaction2 } = await import("./MessageReaction-XRPYZDSC.mjs");
237
+ const reaction = new MessageReaction2(client, data);
238
+ const user = client.getOrCreateUser({
239
+ id: data.user_id,
240
+ username: "Unknown",
241
+ discriminator: "0"
242
+ });
243
+ client.emit(Events.MessageReactionAdd, reaction, user);
244
+ });
245
+ handlers.set("MESSAGE_REACTION_REMOVE", async (client, d) => {
246
+ const data = d;
247
+ const { MessageReaction: MessageReaction2 } = await import("./MessageReaction-XRPYZDSC.mjs");
248
+ const reaction = new MessageReaction2(client, data);
249
+ const user = client.getOrCreateUser({
250
+ id: data.user_id,
251
+ username: "Unknown",
252
+ discriminator: "0"
253
+ });
254
+ client.emit(Events.MessageReactionRemove, reaction, user);
255
+ });
256
+ handlers.set("MESSAGE_REACTION_REMOVE_ALL", async (client, d) => {
257
+ client.emit(Events.MessageReactionRemoveAll, d);
258
+ });
259
+ handlers.set("MESSAGE_REACTION_REMOVE_EMOJI", async (client, d) => {
260
+ client.emit(
261
+ Events.MessageReactionRemoveEmoji,
262
+ d
263
+ );
264
+ });
265
+ handlers.set("GUILD_CREATE", async (client, d) => {
266
+ const { Guild: Guild2 } = await import("./Guild-TM6YGJWB.mjs");
267
+ const { Channel: Channel2 } = await import("./Channel-ICWNKXBR.mjs");
268
+ const guild = new Guild2(client, d);
269
+ client.guilds.set(guild.id, guild);
270
+ const g = d;
271
+ for (const ch of g.channels ?? []) {
272
+ const channel = Channel2.from(client, ch);
273
+ if (channel) client.channels.set(channel.id, channel);
274
+ }
275
+ client.emit(Events.GuildCreate, guild);
276
+ if (g.voice_states?.length) {
277
+ client.emit(Events.VoiceStatesSync, { guildId: guild.id, voiceStates: g.voice_states });
278
+ }
279
+ });
280
+ handlers.set("GUILD_UPDATE", async (client, d) => {
281
+ const { Guild: Guild2 } = await import("./Guild-TM6YGJWB.mjs");
282
+ const g = d;
283
+ const old = client.guilds.get(g.id);
284
+ const updated = new Guild2(client, g);
285
+ client.guilds.set(updated.id, updated);
286
+ client.emit(Events.GuildUpdate, old ?? updated, updated);
287
+ });
288
+ handlers.set("GUILD_DELETE", async (client, d) => {
289
+ const g = d;
290
+ const guild = client.guilds.get(g.id);
291
+ if (guild) {
292
+ client.guilds.delete(g.id);
293
+ client.emit(Events.GuildDelete, guild);
294
+ }
295
+ });
296
+ handlers.set("CHANNEL_CREATE", async (client, d) => {
297
+ const { Channel: Channel2 } = await import("./Channel-ICWNKXBR.mjs");
298
+ const ch = Channel2.from(client, d);
299
+ if (ch) {
300
+ client.channels.set(ch.id, ch);
301
+ client.emit(Events.ChannelCreate, ch);
302
+ }
303
+ });
304
+ handlers.set("CHANNEL_UPDATE", async (client, d) => {
305
+ const { Channel: Channel2 } = await import("./Channel-ICWNKXBR.mjs");
306
+ const ch = d;
307
+ const oldCh = client.channels.get(ch.id);
308
+ const newCh = Channel2.from(client, ch);
309
+ if (newCh) {
310
+ client.channels.set(newCh.id, newCh);
311
+ client.emit(Events.ChannelUpdate, oldCh ?? newCh, newCh);
312
+ }
313
+ });
314
+ handlers.set("CHANNEL_DELETE", async (client, d) => {
315
+ const ch = d;
316
+ const channel = client.channels.get(ch.id);
317
+ if (channel) {
318
+ client.channels.delete(ch.id);
319
+ client.emit(Events.ChannelDelete, channel);
320
+ }
321
+ });
322
+ handlers.set("GUILD_MEMBER_ADD", async (client, d) => {
323
+ const { GuildMember: GuildMember2 } = await import("./GuildMember-RZWZ3OCG.mjs");
324
+ const data = d;
325
+ const guild = client.guilds.get(data.guild_id);
326
+ if (guild) {
327
+ const member = new GuildMember2(client, data, guild);
328
+ guild.members.set(member.id, member);
329
+ client.emit(Events.GuildMemberAdd, member);
330
+ }
331
+ });
332
+ handlers.set("GUILD_MEMBER_UPDATE", async (client, d) => {
333
+ const { GuildMember: GuildMember2 } = await import("./GuildMember-RZWZ3OCG.mjs");
334
+ const data = d;
335
+ const guild = client.guilds.get(data.guild_id);
336
+ if (guild) {
337
+ const oldM = guild.members.get(data.user.id);
338
+ const newM = new GuildMember2(client, data, guild);
339
+ guild.members.set(newM.id, newM);
340
+ client.emit(Events.GuildMemberUpdate, oldM ?? newM, newM);
341
+ }
342
+ });
343
+ handlers.set("GUILD_MEMBER_REMOVE", async (client, d) => {
344
+ const data = d;
345
+ const guild = client.guilds.get(data.guild_id);
346
+ if (guild) {
347
+ const member = guild.members.get(data.user.id);
348
+ if (member) {
349
+ guild.members.delete(data.user.id);
350
+ client.emit(Events.GuildMemberRemove, member);
351
+ }
352
+ }
353
+ });
354
+ handlers.set("INTERACTION_CREATE", async (client, d) => {
355
+ client.emit(Events.InteractionCreate, d);
356
+ });
357
+ handlers.set("VOICE_STATE_UPDATE", async (client, d) => {
358
+ client.emit(Events.VoiceStateUpdate, d);
359
+ });
360
+ handlers.set("VOICE_SERVER_UPDATE", async (client, d) => {
361
+ client.emit(Events.VoiceServerUpdate, d);
362
+ });
363
+ handlers.set("MESSAGE_DELETE_BULK", async (client, d) => {
364
+ client.emit(Events.MessageDeleteBulk, d);
365
+ });
366
+ handlers.set("GUILD_BAN_ADD", async (client, d) => {
367
+ const data = d;
368
+ const { GuildBan: GuildBan2 } = await import("./GuildBan-M4PA3HAA.mjs");
369
+ const ban = new GuildBan2(client, data, data.guild_id);
370
+ client.emit(Events.GuildBanAdd, ban);
371
+ });
372
+ handlers.set("GUILD_BAN_REMOVE", async (client, d) => {
373
+ const data = d;
374
+ const { GuildBan: GuildBan2 } = await import("./GuildBan-M4PA3HAA.mjs");
375
+ const ban = new GuildBan2(client, { ...data, reason: null }, data.guild_id);
376
+ client.emit(Events.GuildBanRemove, ban);
377
+ });
378
+ handlers.set("GUILD_EMOJIS_UPDATE", async (client, d) => {
379
+ client.emit(Events.GuildEmojisUpdate, d);
380
+ });
381
+ handlers.set("GUILD_STICKERS_UPDATE", async (client, d) => {
382
+ client.emit(Events.GuildStickersUpdate, d);
383
+ });
384
+ handlers.set("GUILD_INTEGRATIONS_UPDATE", async (client, d) => {
385
+ client.emit(Events.GuildIntegrationsUpdate, d);
386
+ });
387
+ handlers.set("GUILD_ROLE_CREATE", async (client, d) => {
388
+ const data = d;
389
+ const guild = client.guilds.get(data.guild_id);
390
+ if (guild) {
391
+ const { Role: Role2 } = await import("./Role-SVLWIAMN.mjs");
392
+ guild.roles.set(data.role.id, new Role2(client, data.role, guild.id));
393
+ }
394
+ client.emit(Events.GuildRoleCreate, data);
395
+ });
396
+ handlers.set("GUILD_ROLE_UPDATE", async (client, d) => {
397
+ const data = d;
398
+ const guild = client.guilds.get(data.guild_id);
399
+ if (guild) {
400
+ const { Role: Role2 } = await import("./Role-SVLWIAMN.mjs");
401
+ guild.roles.set(data.role.id, new Role2(client, data.role, guild.id));
402
+ }
403
+ client.emit(Events.GuildRoleUpdate, data);
404
+ });
405
+ handlers.set("GUILD_ROLE_DELETE", async (client, d) => {
406
+ const data = d;
407
+ const guild = client.guilds.get(data.guild_id);
408
+ if (guild) guild.roles.delete(data.role_id);
409
+ client.emit(Events.GuildRoleDelete, data);
410
+ });
411
+ handlers.set("GUILD_SCHEDULED_EVENT_CREATE", async (client, d) => {
412
+ client.emit(Events.GuildScheduledEventCreate, d);
413
+ });
414
+ handlers.set("GUILD_SCHEDULED_EVENT_UPDATE", async (client, d) => {
415
+ client.emit(Events.GuildScheduledEventUpdate, d);
416
+ });
417
+ handlers.set("GUILD_SCHEDULED_EVENT_DELETE", async (client, d) => {
418
+ client.emit(Events.GuildScheduledEventDelete, d);
419
+ });
420
+ handlers.set("CHANNEL_PINS_UPDATE", async (client, d) => {
421
+ client.emit(Events.ChannelPinsUpdate, d);
422
+ });
423
+ handlers.set("INVITE_CREATE", async (client, d) => {
424
+ const data = d;
425
+ const { Invite: Invite2 } = await import("./Invite-UM5BU5A6.mjs");
426
+ client.emit(Events.InviteCreate, new Invite2(client, data));
427
+ });
428
+ handlers.set("INVITE_DELETE", async (client, d) => {
429
+ client.emit(Events.InviteDelete, d);
430
+ });
431
+ handlers.set("TYPING_START", async (client, d) => {
432
+ client.emit(Events.TypingStart, d);
433
+ });
434
+ handlers.set("USER_UPDATE", async (client, d) => {
435
+ const data = d;
436
+ if (client.user?.id === data.id) {
437
+ client.user._patch(data);
438
+ }
439
+ client.emit(Events.UserUpdate, data);
440
+ });
441
+ handlers.set("PRESENCE_UPDATE", async (client, d) => {
442
+ client.emit(Events.PresenceUpdate, d);
443
+ });
444
+ handlers.set("WEBHOOKS_UPDATE", async (client, d) => {
445
+ client.emit(Events.WebhooksUpdate, d);
446
+ });
447
+ handlers.set("RESUMED", async (client) => {
448
+ client.emit(Events.Resumed);
449
+ });
450
+ var eventHandlers = handlers;
451
+
66
452
  // src/client/Client.ts
67
453
  var Client = class extends EventEmitter {
68
454
  /** @param options - Token, REST config, WebSocket, presence, etc. */
69
455
  constructor(options = {}) {
70
456
  super();
71
457
  this.options = options;
458
+ Object.defineProperty(this.channels, "cache", {
459
+ get: () => this.channels,
460
+ configurable: true
461
+ });
462
+ Object.defineProperty(this.guilds, "cache", {
463
+ get: () => this.guilds,
464
+ configurable: true
465
+ });
72
466
  this.rest = new REST({
73
467
  api: options.rest?.api ?? "https://api.fluxer.app",
74
468
  version: options.rest?.version ?? "1",
@@ -76,12 +470,77 @@ var Client = class extends EventEmitter {
76
470
  });
77
471
  }
78
472
  rest;
79
- guilds = new Collection();
80
- channels = new Collection();
81
- users = new Collection();
473
+ guilds = new GuildManager(this);
474
+ channels = new ChannelManager(this);
475
+ users = new Collection3();
82
476
  user = null;
83
477
  readyAt = null;
84
478
  _ws = null;
479
+ /**
480
+ * Resolve an emoji argument to the API format (unicode or "name:id").
481
+ * Supports: <:name:id>, :name:, name:id, { name, id }, unicode.
482
+ * When id is missing (e.g. :name:), fetches guild emojis if guildId provided.
483
+ * @param emoji - Emoji string or object
484
+ * @param guildId - Guild ID for resolving custom emoji by name (required when id is missing)
485
+ * @returns API-formatted string for reactions
486
+ */
487
+ async resolveEmoji(emoji, guildId) {
488
+ if (typeof emoji === "object" && emoji.id) {
489
+ return formatEmoji({ name: emoji.name, id: emoji.id, animated: emoji.animated });
490
+ }
491
+ const parsed = parseEmoji(typeof emoji === "string" ? emoji : `:${emoji.name}:`);
492
+ if (!parsed) throw new Error("Invalid emoji");
493
+ if (parsed.id) return formatEmoji(parsed);
494
+ if (guildId) {
495
+ const emojis = await this.rest.get(Routes3.guildEmojis(guildId));
496
+ const list = Array.isArray(emojis) ? emojis : Object.values(emojis ?? {});
497
+ const found = list.find((e) => e.name && e.name.toLowerCase() === parsed.name.toLowerCase());
498
+ if (found) return formatEmoji({ ...parsed, id: found.id, animated: found.animated });
499
+ throw new Error(
500
+ `Custom emoji ":${parsed.name}:" not found in guild. Use name:id or <:name:id> format.`
501
+ );
502
+ }
503
+ if (/^\w+$/.test(parsed.name)) {
504
+ throw new Error(
505
+ `Custom emoji ":${parsed.name}:" requires guild context. Use message.react() in a guild channel, or pass guildId to client.resolveEmoji().`
506
+ );
507
+ }
508
+ return encodeURIComponent(parsed.name);
509
+ }
510
+ /**
511
+ * Fetch a message by channel and message ID. Use when you have IDs (e.g. from a DB).
512
+ * @param channelId - Snowflake of the channel
513
+ * @param messageId - Snowflake of the message
514
+ * @returns The message, or null if not found
515
+ * @deprecated Use channel.messages.fetch(messageId). For IDs-only: (await client.channels.fetch(channelId))?.messages?.fetch(messageId)
516
+ * @example
517
+ * const channel = await client.channels.fetch(channelId);
518
+ * const message = await channel?.messages?.fetch(messageId);
519
+ */
520
+ async fetchMessage(channelId, messageId) {
521
+ return this.channels.fetchMessage(channelId, messageId);
522
+ }
523
+ /**
524
+ * Send a message to any channel by ID. Shorthand for client.channels.send().
525
+ * Works even when the channel is not cached.
526
+ */
527
+ async sendToChannel(channelId, payload) {
528
+ return this.channels.send(channelId, payload);
529
+ }
530
+ /**
531
+ * Get or create a User from API data. Caches in client.users.
532
+ * Updates existing user's username, avatar, etc. when fresh data is provided.
533
+ */
534
+ getOrCreateUser(data) {
535
+ const existing = this.users.get(data.id);
536
+ if (existing) {
537
+ existing._patch(data);
538
+ return existing;
539
+ }
540
+ const user = new User(this, data);
541
+ this.users.set(user.id, user);
542
+ return user;
543
+ }
85
544
  /** WebSocket manager. Throws if not logged in. */
86
545
  get ws() {
87
546
  if (!this._ws) throw new Error("Client is not logged in");
@@ -99,145 +558,8 @@ var Client = class extends EventEmitter {
99
558
  if (payload.op !== 0 || !payload.t) return;
100
559
  const { t: event, d } = payload;
101
560
  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
- }
561
+ const handler = eventHandlers.get(event);
562
+ if (handler) await handler(this, d);
241
563
  } catch (err) {
242
564
  this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)));
243
565
  }
@@ -247,14 +569,16 @@ var Client = class extends EventEmitter {
247
569
  * @param token - Bot token (e.g. from FLUXER_BOT_TOKEN)
248
570
  */
249
571
  async login(token) {
572
+ if (this._ws) {
573
+ throw new FluxerError("Client is already logged in. Call destroy() first.");
574
+ }
250
575
  this.rest.setToken(token);
251
576
  let intents = this.options.intents ?? 0;
252
577
  if (intents !== 0) {
253
578
  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
- );
579
+ process.emitWarning("Fluxer does not support intents yet. Value has been set to 0.", {
580
+ type: "FluxerIntents"
581
+ });
258
582
  } else {
259
583
  console.warn("Fluxer does not support intents yet. Value has been set to 0.");
260
584
  }
@@ -269,28 +593,38 @@ var Client = class extends EventEmitter {
269
593
  WebSocket: this.options.WebSocket
270
594
  });
271
595
  this._ws.on("dispatch", ({ payload }) => {
272
- this.handleDispatch(payload);
596
+ this.handleDispatch(payload).catch(
597
+ (err) => this.emit(Events.Error, err instanceof Error ? err : new Error(String(err)))
598
+ );
273
599
  });
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 });
600
+ this._ws.on(
601
+ "ready",
602
+ async ({
603
+ data
604
+ }) => {
605
+ const { ClientUser: ClientUser2 } = await import("./ClientUser-WWXUMO5O.mjs");
606
+ const { Guild: Guild2 } = await import("./Guild-TM6YGJWB.mjs");
607
+ const { Channel: Channel2 } = await import("./Channel-ICWNKXBR.mjs");
608
+ this.user = new ClientUser2(this, data.user);
609
+ for (const g of data.guilds ?? []) {
610
+ const guild = new Guild2(this, g);
611
+ this.guilds.set(guild.id, guild);
612
+ const withCh = g;
613
+ for (const ch of withCh.channels ?? []) {
614
+ const channel = Channel2.from(this, ch);
615
+ if (channel) this.channels.set(channel.id, channel);
616
+ }
617
+ if (withCh.voice_states?.length) {
618
+ this.emit(Events.VoiceStatesSync, {
619
+ guildId: guild.id,
620
+ voiceStates: withCh.voice_states
621
+ });
622
+ }
289
623
  }
624
+ this.readyAt = /* @__PURE__ */ new Date();
625
+ this.emit(Events.Ready);
290
626
  }
291
- this.readyAt = /* @__PURE__ */ new Date();
292
- this.emit(Events.Ready);
293
- });
627
+ );
294
628
  this._ws.on("error", ({ error }) => this.emit(Events.Error, error));
295
629
  this._ws.on("debug", (msg) => this.emit(Events.Debug, msg));
296
630
  await this._ws.connect();
@@ -314,16 +648,101 @@ var Client = class extends EventEmitter {
314
648
  return this.readyAt !== null && this.user !== null;
315
649
  }
316
650
  static get Routes() {
317
- return Routes;
651
+ return Routes3;
318
652
  }
319
653
  };
320
654
 
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);
655
+ // src/structures/GuildEmoji.ts
656
+ import { Routes as Routes4 } from "@fluxerjs/types";
657
+ var GuildEmoji = class extends Base {
658
+ client;
659
+ id;
660
+ guildId;
661
+ name;
662
+ animated;
663
+ /** @param data - API emoji from GET /guilds/{id}/emojis or guild emoji events */
664
+ constructor(client, data, guildId) {
665
+ super();
666
+ this.client = client;
667
+ this.id = data.id;
668
+ this.guildId = data.guild_id ?? guildId;
669
+ this.name = data.name;
670
+ this.animated = data.animated ?? false;
671
+ }
672
+ /** CDN URL for this emoji image. */
673
+ get url() {
674
+ const ext = this.animated ? "gif" : "png";
675
+ return `${CDN_URL}/emojis/${this.id}.${ext}`;
676
+ }
677
+ /** Emoji identifier for use in reactions: `name:id` */
678
+ get identifier() {
679
+ return `${this.name}:${this.id}`;
680
+ }
681
+ /** Delete this emoji. Requires Manage Emojis and Stickers permission. */
682
+ async delete() {
683
+ await this.client.rest.delete(Routes4.guildEmoji(this.guildId, this.id), {
684
+ auth: true
685
+ });
686
+ }
687
+ /**
688
+ * Edit this emoji's name.
689
+ * Requires Manage Emojis and Stickers permission.
690
+ */
691
+ async edit(options) {
692
+ const data = await this.client.rest.patch(Routes4.guildEmoji(this.guildId, this.id), {
693
+ body: options,
694
+ auth: true
695
+ });
696
+ this.name = data.name;
697
+ return this;
698
+ }
699
+ };
700
+
701
+ // src/structures/GuildSticker.ts
702
+ import { Routes as Routes5 } from "@fluxerjs/types";
703
+ var GuildSticker = class extends Base {
704
+ client;
705
+ id;
706
+ guildId;
707
+ name;
708
+ description;
709
+ tags;
710
+ animated;
711
+ /** @param data - API sticker from GET /guilds/{id}/stickers or guild sticker events */
712
+ constructor(client, data, guildId) {
713
+ super();
714
+ this.client = client;
715
+ this.id = data.id;
716
+ this.guildId = data.guild_id ?? guildId;
717
+ this.name = data.name;
718
+ this.description = data.description ?? "";
719
+ this.tags = data.tags ?? [];
720
+ this.animated = data.animated ?? false;
721
+ }
722
+ /** CDN URL for this sticker image. */
723
+ get url() {
724
+ const ext = this.animated ? "gif" : "png";
725
+ return `${CDN_URL}/stickers/${this.id}.${ext}`;
726
+ }
727
+ /** Delete this sticker. Requires Manage Emojis and Stickers permission. */
728
+ async delete() {
729
+ await this.client.rest.delete(Routes5.guildSticker(this.guildId, this.id), {
730
+ auth: true
731
+ });
732
+ }
733
+ /**
734
+ * Edit this sticker's name and/or description.
735
+ * Requires Manage Emojis and Stickers permission.
736
+ */
737
+ async edit(options) {
738
+ const data = await this.client.rest.patch(Routes5.guildSticker(this.guildId, this.id), {
739
+ body: options,
740
+ auth: true
741
+ });
742
+ const s = data;
743
+ this.name = s.name;
744
+ this.description = s.description ?? "";
745
+ return this;
327
746
  }
328
747
  };
329
748
 
@@ -335,12 +754,13 @@ var ErrorCodes = {
335
754
 
336
755
  // src/index.ts
337
756
  import { EmbedBuilder, MessagePayload, AttachmentBuilder } from "@fluxerjs/builders";
338
- import { Routes as Routes2, GatewayOpcodes } from "@fluxerjs/types";
757
+ import { Routes as Routes6, GatewayOpcodes } from "@fluxerjs/types";
339
758
  export {
340
759
  AttachmentBuilder,
341
760
  Base,
342
761
  CategoryChannel,
343
762
  Channel,
763
+ ChannelManager,
344
764
  Client,
345
765
  ClientUser,
346
766
  DMChannel,
@@ -350,12 +770,19 @@ export {
350
770
  FluxerError,
351
771
  GatewayOpcodes,
352
772
  Guild,
773
+ GuildBan,
353
774
  GuildChannel,
775
+ GuildEmoji,
354
776
  GuildMember,
777
+ GuildSticker,
778
+ Invite,
355
779
  LinkChannel,
356
780
  Message,
781
+ MessageManager,
357
782
  MessagePayload,
358
- Routes2 as Routes,
783
+ MessageReaction,
784
+ Role,
785
+ Routes6 as Routes,
359
786
  TextChannel,
360
787
  User,
361
788
  VoiceChannel,