djs-builder 0.5.41 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +140 -303
  2. package/function/function.js +236 -0
  3. package/function/log.js +736 -0
  4. package/handler/helper.js +277 -0
  5. package/handler/starter.js +335 -0
  6. package/package.json +10 -42
  7. package/.tsbuildinfo +0 -1
  8. package/dist/discord/builder/components/Buttons.d.ts +0 -22
  9. package/dist/discord/builder/components/Buttons.d.ts.map +0 -1
  10. package/dist/discord/builder/components/Buttons.js +0 -91
  11. package/dist/discord/builder/components/Buttons.js.map +0 -1
  12. package/dist/discord/builder/components/Menus.d.ts +0 -31
  13. package/dist/discord/builder/components/Menus.d.ts.map +0 -1
  14. package/dist/discord/builder/components/Menus.js +0 -82
  15. package/dist/discord/builder/components/Menus.js.map +0 -1
  16. package/dist/discord/builder/permissions/perms.d.ts +0 -6
  17. package/dist/discord/builder/permissions/perms.d.ts.map +0 -1
  18. package/dist/discord/builder/permissions/perms.js +0 -66
  19. package/dist/discord/builder/permissions/perms.js.map +0 -1
  20. package/dist/discord/builder/system/Pagination.d.ts +0 -70
  21. package/dist/discord/builder/system/Pagination.d.ts.map +0 -1
  22. package/dist/discord/builder/system/Pagination.js +0 -227
  23. package/dist/discord/builder/system/Pagination.js.map +0 -1
  24. package/dist/discord/builder/system/collectors.d.ts +0 -27
  25. package/dist/discord/builder/system/collectors.d.ts.map +0 -1
  26. package/dist/discord/builder/system/collectors.js +0 -137
  27. package/dist/discord/builder/system/collectors.js.map +0 -1
  28. package/dist/discord/builder/utils.d.ts +0 -5
  29. package/dist/discord/builder/utils.d.ts.map +0 -1
  30. package/dist/discord/builder/utils.js +0 -10
  31. package/dist/discord/builder/utils.js.map +0 -1
  32. package/dist/discord/events-handler/eventLoader.d.ts +0 -13
  33. package/dist/discord/events-handler/eventLoader.d.ts.map +0 -1
  34. package/dist/discord/events-handler/eventLoader.js +0 -169
  35. package/dist/discord/events-handler/eventLoader.js.map +0 -1
  36. package/dist/discord/events-handler/events.d.ts +0 -8
  37. package/dist/discord/events-handler/events.d.ts.map +0 -1
  38. package/dist/discord/events-handler/events.js +0 -186
  39. package/dist/discord/events-handler/events.js.map +0 -1
  40. package/dist/discord/events-handler/login.d.ts +0 -9
  41. package/dist/discord/events-handler/login.d.ts.map +0 -1
  42. package/dist/discord/events-handler/login.js +0 -273
  43. package/dist/discord/events-handler/login.js.map +0 -1
  44. package/dist/discord/events-handler/prefix-register.d.ts +0 -23
  45. package/dist/discord/events-handler/prefix-register.d.ts.map +0 -1
  46. package/dist/discord/events-handler/prefix-register.js +0 -109
  47. package/dist/discord/events-handler/prefix-register.js.map +0 -1
  48. package/dist/discord/events-handler/prefix-responder.d.ts +0 -5
  49. package/dist/discord/events-handler/prefix-responder.d.ts.map +0 -1
  50. package/dist/discord/events-handler/prefix-responder.js +0 -155
  51. package/dist/discord/events-handler/prefix-responder.js.map +0 -1
  52. package/dist/discord/events-handler/prefixLoader.d.ts +0 -7
  53. package/dist/discord/events-handler/prefixLoader.d.ts.map +0 -1
  54. package/dist/discord/events-handler/prefixLoader.js +0 -74
  55. package/dist/discord/events-handler/prefixLoader.js.map +0 -1
  56. package/dist/discord/events-handler/slash-register.d.ts +0 -4
  57. package/dist/discord/events-handler/slash-register.d.ts.map +0 -1
  58. package/dist/discord/events-handler/slash-register.js +0 -85
  59. package/dist/discord/events-handler/slash-register.js.map +0 -1
  60. package/dist/discord/events-handler/slash-responder.d.ts +0 -3
  61. package/dist/discord/events-handler/slash-responder.d.ts.map +0 -1
  62. package/dist/discord/events-handler/slash-responder.js +0 -112
  63. package/dist/discord/events-handler/slash-responder.js.map +0 -1
  64. package/dist/discord/events-handler/slashLoader.d.ts +0 -7
  65. package/dist/discord/events-handler/slashLoader.d.ts.map +0 -1
  66. package/dist/discord/events-handler/slashLoader.js +0 -94
  67. package/dist/discord/events-handler/slashLoader.js.map +0 -1
  68. package/dist/discord/events-handler/starter.d.ts +0 -6
  69. package/dist/discord/events-handler/starter.d.ts.map +0 -1
  70. package/dist/discord/events-handler/starter.js +0 -85
  71. package/dist/discord/events-handler/starter.js.map +0 -1
  72. package/dist/discord/functions/anticrash.d.ts +0 -3
  73. package/dist/discord/functions/anticrash.d.ts.map +0 -1
  74. package/dist/discord/functions/anticrash.js +0 -55
  75. package/dist/discord/functions/anticrash.js.map +0 -1
  76. package/dist/discord/functions/devLogs.d.ts +0 -2
  77. package/dist/discord/functions/devLogs.d.ts.map +0 -1
  78. package/dist/discord/functions/devLogs.js +0 -137
  79. package/dist/discord/functions/devLogs.js.map +0 -1
  80. package/dist/discord/functions/logger.d.ts +0 -5
  81. package/dist/discord/functions/logger.d.ts.map +0 -1
  82. package/dist/discord/functions/logger.js +0 -57
  83. package/dist/discord/functions/logger.js.map +0 -1
  84. package/dist/discord/functions/mongoDb.d.ts +0 -4
  85. package/dist/discord/functions/mongoDb.d.ts.map +0 -1
  86. package/dist/discord/functions/mongoDb.js +0 -39
  87. package/dist/discord/functions/mongoDb.js.map +0 -1
  88. package/dist/discord/functions/similarity.d.ts +0 -3
  89. package/dist/discord/functions/similarity.d.ts.map +0 -1
  90. package/dist/discord/functions/similarity.js +0 -56
  91. package/dist/discord/functions/similarity.js.map +0 -1
  92. package/dist/discord/functions/terminal.d.ts +0 -2
  93. package/dist/discord/functions/terminal.d.ts.map +0 -1
  94. package/dist/discord/functions/terminal.js +0 -127
  95. package/dist/discord/functions/terminal.js.map +0 -1
  96. package/dist/discord/functions/utils.d.ts +0 -5
  97. package/dist/discord/functions/utils.d.ts.map +0 -1
  98. package/dist/discord/functions/utils.js +0 -11
  99. package/dist/discord/functions/utils.js.map +0 -1
  100. package/dist/discord/functions/versedb.d.ts +0 -3
  101. package/dist/discord/functions/versedb.d.ts.map +0 -1
  102. package/dist/discord/functions/versedb.js +0 -21
  103. package/dist/discord/functions/versedb.js.map +0 -1
  104. package/dist/discord/games/X-O.d.ts +0 -20
  105. package/dist/discord/games/X-O.d.ts.map +0 -1
  106. package/dist/discord/games/X-O.js +0 -166
  107. package/dist/discord/games/X-O.js.map +0 -1
  108. package/dist/discord/games/rps.d.ts +0 -21
  109. package/dist/discord/games/rps.d.ts.map +0 -1
  110. package/dist/discord/games/rps.js +0 -99
  111. package/dist/discord/games/rps.js.map +0 -1
  112. package/dist/discord/types/starter.d.ts +0 -144
  113. package/dist/discord/types/starter.d.ts.map +0 -1
  114. package/dist/discord/types/starter.js +0 -3
  115. package/dist/discord/types/starter.js.map +0 -1
  116. package/dist/discord/types/utils.d.ts +0 -3
  117. package/dist/discord/types/utils.d.ts.map +0 -1
  118. package/dist/discord/types/utils.js +0 -3
  119. package/dist/discord/types/utils.js.map +0 -1
  120. package/dist/discord/utils.d.ts +0 -15
  121. package/dist/discord/utils.d.ts.map +0 -1
  122. package/dist/discord/utils.js +0 -41
  123. package/dist/discord/utils.js.map +0 -1
  124. package/dist/index.d.ts +0 -4
  125. package/dist/index.d.ts.map +0 -1
  126. package/dist/index.js +0 -71
  127. package/dist/index.js.map +0 -1
  128. package/lib/discord/builder/components/Buttons.ts +0 -123
  129. package/lib/discord/builder/components/Menus.ts +0 -106
  130. package/lib/discord/builder/permissions/perms.ts +0 -66
  131. package/lib/discord/builder/system/Pagination.ts +0 -323
  132. package/lib/discord/builder/system/collectors.ts +0 -197
  133. package/lib/discord/builder/utils.ts +0 -9
  134. package/lib/discord/events-handler/eventLoader.ts +0 -166
  135. package/lib/discord/events-handler/events.ts +0 -160
  136. package/lib/discord/events-handler/login.ts +0 -265
  137. package/lib/discord/events-handler/prefix-register.ts +0 -117
  138. package/lib/discord/events-handler/prefix-responder.ts +0 -176
  139. package/lib/discord/events-handler/prefixLoader.ts +0 -83
  140. package/lib/discord/events-handler/slash-register.ts +0 -81
  141. package/lib/discord/events-handler/slash-responder.ts +0 -136
  142. package/lib/discord/events-handler/slashLoader.ts +0 -104
  143. package/lib/discord/events-handler/starter.ts +0 -85
  144. package/lib/discord/functions/anticrash.ts +0 -60
  145. package/lib/discord/functions/devLogs.ts +0 -128
  146. package/lib/discord/functions/logger.ts +0 -58
  147. package/lib/discord/functions/mongoDb.ts +0 -38
  148. package/lib/discord/functions/similarity.ts +0 -70
  149. package/lib/discord/functions/terminal.ts +0 -162
  150. package/lib/discord/functions/utils.ts +0 -4
  151. package/lib/discord/functions/versedb.ts +0 -17
  152. package/lib/discord/types/starter.ts +0 -158
  153. package/lib/discord/types/utils.ts +0 -2
  154. package/lib/discord/utils.ts +0 -17
  155. package/lib/index.ts +0 -37
  156. package/tsconfig.json +0 -21
@@ -0,0 +1,736 @@
1
+ const {
2
+ EmbedBuilder,
3
+ ChannelType,
4
+ AuditLogEvent,
5
+ PermissionsBitField,
6
+ } = require("discord.js");
7
+
8
+ async function check(guildId, channelId, key, fetched) {
9
+ if (!key.guild) return;
10
+ if (key.guild.id !== guildId) return;
11
+ let channel = key.guild.channels.cache.get(channelId);
12
+ if (!fetched) {
13
+ return channel;
14
+ }
15
+
16
+ const fetchedLogs = await channel.guild.fetchAuditLogs({
17
+ limit: 1,
18
+ });
19
+ const log = fetchedLogs.entries.first();
20
+
21
+ return [channel, log];
22
+ }
23
+
24
+ async function log(client, guildId, channelId) {
25
+ const { inviteTracker } = require("discord-inviter");
26
+ const tracker = new inviteTracker(client);
27
+
28
+ /////////////////messages ✉️
29
+
30
+ client.on("messageDelete", async (message) => {
31
+ const data = await check(guildId,channelId,message, true);
32
+ if (!data) return;
33
+
34
+ const { executor } = data[1];
35
+ let embed = new EmbedBuilder()
36
+ .setTitle("Message Deleted ! ❌")
37
+ .setColor("Red")
38
+ .setDescription(
39
+ `**- Message Author : ${message.author}\n\n- Deleted By : ${executor}\n\n- Message Content :\n ${message.content}\n- Message Channel:** ${message.channel}\n\n> Message Data : \n - Embeds : ${message.embeds.length}\n - Attachments : ${message.attachments.size}`
40
+ )
41
+ .setThumbnail(`${message.author.displayAvatarURL({ dynamic: true })}`);
42
+ data[0].send({ embeds: [embed] });
43
+ });
44
+
45
+ ///
46
+
47
+ client.on("messageUpdate", async (oldMessage, newMessage) => {
48
+ const data = await check(guildId,channelId,oldMessage);
49
+ if (!data) return;
50
+ if (oldMessage.content === newMessage.content) return;
51
+ if (!oldMessage.content || !newMessage.content) return;
52
+
53
+ let embed = new EmbedBuilder()
54
+ .setTitle("Message Edited! ⚠️")
55
+ .setColor("Yellow")
56
+ .setDescription(
57
+ `**> Old Message:\n${oldMessage.content}\n\n> New Message:\n${newMessage.content}\n\n> Message Channel: <#${newMessage.channel.id}>\n\nMessage Link: [here](${newMessage.url})\n\nSent By: ${newMessage.author}**`
58
+ )
59
+ .setThumbnail(newMessage.author.displayAvatarURL({ dynamic: true }));
60
+ data.send({ embeds: [embed] }).catch(console.error);
61
+ });
62
+
63
+ /////////////////channel 📁
64
+
65
+ client.on("channelCreate", async (channel) => {
66
+ const data = await check(guildId,channelId,channel);
67
+ if (!data) return;
68
+
69
+ const fetchedLogs = await channel.guild.fetchAuditLogs({
70
+ limit: 1,
71
+ type: AuditLogEvent.ChannelCreate,
72
+ });
73
+ const CreateLog = fetchedLogs.entries.first();
74
+ const { executor } = CreateLog;
75
+ if (executor.bot) return;
76
+ let embed = new EmbedBuilder()
77
+ .setTitle("📁 Channel Created ! ✅")
78
+ .setColor("Green")
79
+ .addFields(
80
+ { name: "Name", value: channel.name, inline: false },
81
+ { name: "Type", value: ChannelType[channel.type], inline: false },
82
+ {
83
+ name: "Category",
84
+ value: channel.parent ? channel.parent.name : "None",
85
+ inline: false,
86
+ },
87
+ { name: "Created By", value: executor.toString(), inline: false },
88
+ { name: "Channel ID", value: channel.id, inline: false }
89
+ )
90
+
91
+ .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
92
+
93
+ data.send({ embeds: [embed] });
94
+ });
95
+
96
+ ///
97
+
98
+ client.on("channelDelete", async (channel) => {
99
+ const data = await check(guildId,channelId,channel, true);
100
+ if (!data) return;
101
+
102
+ try {
103
+ const { executor } = data[1];
104
+
105
+ let embed = new EmbedBuilder()
106
+ .setTitle("📁 Channel Deleted ! ❌")
107
+ .setColor("Red")
108
+ .setDescription(
109
+ `**Channel Name: ${channel.name}\n\nType: ${
110
+ ChannelType[channel.type]
111
+ }\n\nChannel ID: ${channel.id}\n\nDeleted By: ${executor}**`
112
+ )
113
+ .setThumbnail(executor.displayAvatarURL({ dynamic: true }));
114
+
115
+ data[0].send({ embeds: [embed] }).catch(console.error);
116
+ } catch (error) {
117
+ console.error(error);
118
+ }
119
+ });
120
+
121
+ ///
122
+
123
+ client.on("channelUpdate", async (oldChannel, newChannel) => {
124
+ const data = await check(guildId,channelId,newChannel, true);
125
+ if (!data) return;
126
+
127
+ try {
128
+ const { executor } = data[1];
129
+
130
+ let descriptionText = "";
131
+
132
+ if (oldChannel.name !== newChannel.name) {
133
+ descriptionText += `**Name:** Changed from \`${oldChannel.name}\` to \`${newChannel.name}\`\n`;
134
+ }
135
+
136
+ const oldOverwrites = oldChannel.permissionOverwrites.cache;
137
+ const newOverwrites = newChannel.permissionOverwrites.cache;
138
+
139
+ const changes = [];
140
+
141
+ newOverwrites.forEach((newOverwrite, id) => {
142
+ const oldOverwrite = oldOverwrites.get(id);
143
+
144
+ if (!oldOverwrite) {
145
+ if (newOverwrite.allow.bitfield !== 0n) {
146
+ changes.push(
147
+ `✅ Allowed to <@&${id}>: \`${newOverwrite.allow
148
+ .toArray()
149
+ .join("`, `")}\``
150
+ );
151
+ }
152
+ if (newOverwrite.deny.bitfield !== 0n) {
153
+ changes.push(
154
+ `⛔ Denied to <@&${id}>: \`${newOverwrite.deny
155
+ .toArray()
156
+ .join("`, `")}\``
157
+ );
158
+ }
159
+ return;
160
+ }
161
+
162
+ const addedAllow =
163
+ newOverwrite.allow.bitfield & ~oldOverwrite.allow.bitfield;
164
+ const removedAllow =
165
+ oldOverwrite.allow.bitfield & ~newOverwrite.allow.bitfield;
166
+
167
+ const addedDeny =
168
+ newOverwrite.deny.bitfield & ~oldOverwrite.deny.bitfield;
169
+ const removedDeny =
170
+ oldOverwrite.deny.bitfield & ~newOverwrite.deny.bitfield;
171
+
172
+ if (addedAllow) {
173
+ changes.push(
174
+ `✅ Added allow for <@&${id}>: \`${new PermissionsBitField(
175
+ addedAllow
176
+ )
177
+ .toArray()
178
+ .join("`, `")}\``
179
+ );
180
+ }
181
+ if (removedAllow) {
182
+ changes.push(
183
+ `❌ Removed allow for <@&${id}>: \`${new PermissionsBitField(
184
+ removedAllow
185
+ )
186
+ .toArray()
187
+ .join("`, `")}\``
188
+ );
189
+ }
190
+ if (addedDeny) {
191
+ changes.push(
192
+ `⛔ Added deny for <@&${id}>: \`${new PermissionsBitField(addedDeny)
193
+ .toArray()
194
+ .join("`, `")}\``
195
+ );
196
+ }
197
+ if (removedDeny) {
198
+ changes.push(
199
+ `❗ Removed deny for <@&${id}>: \`${new PermissionsBitField(
200
+ removedDeny
201
+ )
202
+ .toArray()
203
+ .join("`, `")}\``
204
+ );
205
+ }
206
+ });
207
+
208
+ if (changes.length > 0) {
209
+ descriptionText += `**Permission Changes:**\n${changes.join("\n")}\n`;
210
+ }
211
+
212
+ if (descriptionText !== "") {
213
+ const embed = new EmbedBuilder()
214
+ .setColor("Blue")
215
+ .setTitle(`📁 Channel Updated ! ⚠️: "${newChannel.name}"`)
216
+ .setDescription(descriptionText)
217
+ .addFields({
218
+ name: "Updated By :",
219
+ value: executor ? executor.toString() : "Unknown",
220
+ inline: false,
221
+ })
222
+ .setThumbnail(newChannel.guild.iconURL())
223
+ .setTimestamp();
224
+
225
+ data[0].send({ embeds: [embed] }).catch(console.error);
226
+ }
227
+ } catch (error) {
228
+ console.error(error);
229
+ }
230
+ });
231
+
232
+ /////////////////member 🧑
233
+
234
+ client.on("guildMemberRemove", async (member) => {
235
+ const logChannel = await check(guildId,channelId,member);
236
+ if (!logChannel) return;
237
+
238
+ try {
239
+ const fetchedLogs = await member.guild.fetchAuditLogs({
240
+ limit: 1,
241
+ type: AuditLogEvent.MemberKick,
242
+ });
243
+
244
+ const kickLog = fetchedLogs.entries.first();
245
+ const isKicked =
246
+ kickLog?.target?.id === member.id &&
247
+ Date.now() - kickLog.createdTimestamp < 5000;
248
+
249
+ if (isKicked) {
250
+ const { executor } = kickLog;
251
+ const embed = new EmbedBuilder()
252
+ .setColor("Red")
253
+ .setTitle("👟 Member Kicked")
254
+ .setDescription(`**<@${member.id}> was kicked by ${executor}**`)
255
+ .setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
256
+ .setTimestamp();
257
+ logChannel.send({ embeds: [embed] });
258
+ } else {
259
+ const joinedAt = member.joinedAt;
260
+ const duration = Date.now() - joinedAt.getTime();
261
+ const days = Math.floor(duration / (1000 * 60 * 60 * 24));
262
+ const hours = Math.floor(
263
+ (duration % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
264
+ );
265
+ const minutes = Math.floor((duration % (1000 * 60 * 60)) / (1000 * 60));
266
+ const seconds = Math.floor((duration % (1000 * 60)) / 1000);
267
+
268
+ const embed = new EmbedBuilder()
269
+ .setColor("DarkRed")
270
+ .setTitle("🚪 Member Left")
271
+ .setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
272
+ .setDescription(
273
+ `<@${member.id}> left the server.\n\nTime in server:\n**${days}d ${hours}h ${minutes}m ${seconds}s**`
274
+ )
275
+ .setTimestamp();
276
+ logChannel.send({ embeds: [embed] });
277
+ }
278
+ } catch (err) {
279
+ console.error("❌ Error in guildMemberRemove event:", err);
280
+ }
281
+ });
282
+
283
+ ///
284
+
285
+ tracker.on("guildMemberAdd", async (member, inviter, invite, error) => {
286
+ const data = await check(guildId,channelId,member);
287
+ if (!data) return;
288
+
289
+ const embed = new EmbedBuilder()
290
+ .setColor("Green")
291
+ .setTitle("🎉 Member Joined")
292
+ .setDescription(
293
+ `**- ${member} joined the server\n\n- Invited invite by ${inviter} \n\n- Invite Link: ${invite}**`
294
+ )
295
+ .setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
296
+ .setTimestamp();
297
+
298
+ data.send({ embeds: [embed] });
299
+ });
300
+
301
+ ///
302
+
303
+ client.on("guildBanAdd", async (member) => {
304
+ const data = await check(guildId,channelId,member, true);
305
+ if (!data) return;
306
+ const { executor } = data[1];
307
+
308
+ let Embed = new EmbedBuilder()
309
+ .setTitle("New Member Banned ! ✈")
310
+ .setColor("Blue")
311
+ .setDescription(`**<@${member.user.id}> Was Banned By ${executor}**`)
312
+ .setThumbnail(`${member.user.displayAvatarURL({ dynamic: true })}`);
313
+ data[0].send({ embeds: [Embed] });
314
+ });
315
+
316
+ client.on("guildBanRemove", async (member) => {
317
+ const data = await check(guildId,channelId,member, true);
318
+ if (!data) return;
319
+ const { executor } = data[1];
320
+
321
+ let Embed = new EmbedBuilder()
322
+ .setTitle("New Member Unbanned ! 🤗")
323
+ .setColor("Green")
324
+ .setDescription(`**<@${member.user.id}> Was Unbanned By ${executor}**`)
325
+ .setThumbnail(`${member.user.displayAvatarURL({ dynamic: true })}`);
326
+ data[0].send({ embeds: [Embed] });
327
+ });
328
+
329
+ /////////////////role 🏅
330
+
331
+ client.on("roleCreate", async (role) => {
332
+ const data = await check(guildId,channelId,role, true);
333
+ if (!data) return;
334
+ const { executor } = data[1];
335
+ let embed = new EmbedBuilder()
336
+ .setTitle("🛠️ 🏅 Role Created ! ✅")
337
+ .setColor(role.hexColor || "Green")
338
+ .setDescription(
339
+ `**Role Name : ${role}\n\nRole ID : ${role.id}\n\nCreated By : ${executor}**`
340
+ )
341
+ .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
342
+ data[0].send({ embeds: [embed] });
343
+ });
344
+
345
+ ///
346
+
347
+ client.on("roleDelete", async (role) => {
348
+ const data = await check(guildId,channelId,role, true);
349
+ if (!data) return;
350
+ const { executor } = data[1];
351
+ let embed = new EmbedBuilder()
352
+ .setTitle("🛠️ 🏅 Role Deleted ! ❌")
353
+ .setColor("Red")
354
+ .setDescription(
355
+ `**Role Name : ${role}\n\nRole ID : ${role.id}\n\nDeleted By : ${executor}**`
356
+ )
357
+ .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
358
+ data[0].send({ embeds: [embed] });
359
+ });
360
+
361
+ ///
362
+
363
+ client.on("roleUpdate", async (oldRole, newRole) => {
364
+ const data = await check(guildId,channelId,newRole, true);
365
+ if (!data) return;
366
+
367
+ const { executor } = data[1];
368
+
369
+ let descriptionText = "";
370
+
371
+ if (oldRole.hexColor !== newRole.hexColor) {
372
+ descriptionText += `**Color:** Changed from \`${oldRole.hexColor.toUpperCase()}\` to \`${newRole.hexColor.toUpperCase()}\`\n`;
373
+ }
374
+
375
+ const oldPerms = new PermissionsBitField(oldRole.permissions);
376
+ const newPerms = new PermissionsBitField(newRole.permissions);
377
+ const addedPerms = newPerms.bitfield & ~oldPerms.bitfield;
378
+ const removedPerms = oldPerms.bitfield & ~newPerms.bitfield;
379
+
380
+ if (addedPerms || removedPerms) {
381
+ descriptionText += "**Permissions:**\n";
382
+ if (addedPerms) {
383
+ descriptionText += `\`Added ✅\`: \`${new PermissionsBitField(
384
+ addedPerms
385
+ )
386
+ .toArray()
387
+ .join("`, `")}\`\n`;
388
+ }
389
+ if (removedPerms) {
390
+ descriptionText += `\`Removed ⛔\`: \`${new PermissionsBitField(
391
+ removedPerms
392
+ )
393
+ .toArray()
394
+ .join("`, `")}\`\n`;
395
+ }
396
+ }
397
+
398
+ if (oldRole.name !== newRole.name) {
399
+ descriptionText += `**Name:**\nOld: \`${oldRole.name}\`\nNew: \`${newRole.name}\`\n`;
400
+ }
401
+
402
+ let thumbnail = newRole.iconURL() || newRole.guild.iconURL();
403
+
404
+ if (descriptionText !== "") {
405
+ const embed = new EmbedBuilder()
406
+ .setColor(newRole.hexColor || "Blue")
407
+ .setTitle(`🏅 Role Updated: "${newRole}"`)
408
+ .setDescription(descriptionText)
409
+ .addFields({
410
+ name: "Updated By:",
411
+ value: executor ? executor.toString() : "Unknown",
412
+ inline: false,
413
+ })
414
+ .setThumbnail(thumbnail)
415
+ .setTimestamp();
416
+
417
+ data[0].send({ embeds: [embed] }).catch(console.error);
418
+ }
419
+ });
420
+
421
+ ///
422
+
423
+ client.on("guildMemberUpdate", async (oldMember, newMember) => {
424
+ const data = await check(guildId,channelId,newMember, true);
425
+ if (!data) return;
426
+ const { executor } = data[1];
427
+
428
+ const removedRoles = oldMember.roles.cache.filter(
429
+ (role) => !newMember.roles.cache.has(role.id)
430
+ );
431
+ if (removedRoles.size > 0) {
432
+ let embed = new EmbedBuilder()
433
+ .setTitle("🏅 Member Role Removed ! ❌")
434
+ .setColor("Red")
435
+ .setDescription(
436
+ `**Role : ${removedRoles
437
+ .map((r) => r)
438
+ .join(", ")}\n\nRemoved From : ${
439
+ newMember.user
440
+ }\n\nRemoved By : ${executor}**`
441
+ )
442
+ .setThumbnail(`${newMember.user.displayAvatarURL({ dynamic: true })}`);
443
+ data[0].send({ embeds: [embed] });
444
+ }
445
+ const addedRoles = newMember.roles.cache.filter(
446
+ (role) => !oldMember.roles.cache.has(role.id)
447
+ );
448
+ if (addedRoles.size > 0) {
449
+ let embed = new EmbedBuilder()
450
+ .setTitle("🏅 Member Role Added ! ✅")
451
+ .setColor("Gold")
452
+ .setDescription(
453
+ `**Role : ${addedRoles.map((r) => r).join(", ")}\n\nAdded To : <@${
454
+ newMember.user.id
455
+ }>\n\nAdded By : ${executor}**`
456
+ )
457
+ .setThumbnail(`${newMember.user.displayAvatarURL({ dynamic: true })}`);
458
+ data[0].send({ embeds: [embed] });
459
+ }
460
+ });
461
+
462
+ /////////////////voice 🎤
463
+
464
+ client.on("voiceStateUpdate", async (oldState, newState) => {
465
+ if (oldState.member.bot) return;
466
+ if (newState.member.bot) return;
467
+ const data = await check(guildId,channelId,newState);
468
+
469
+ if (!oldState.channelId && newState.channelId) {
470
+ let embed = new EmbedBuilder()
471
+ .setTitle("🎤 Member Voice Connected ! ✅")
472
+ .setColor("Green")
473
+ .setDescription(
474
+ `**${newState.member.user} has joined voice channel \n- Channel:" ${newState.channel} "**`
475
+ )
476
+ .setThumbnail(
477
+ `${newState.member.user.displayAvatarURL({ dynamic: true })}`
478
+ );
479
+ return data.send({ embeds: [embed] });
480
+ }
481
+
482
+ ///
483
+
484
+ if (oldState.channelId && !newState.channelId) {
485
+ let embed = new EmbedBuilder()
486
+ .setTitle("🎤 Member Voice Disconnected ! ❌")
487
+ .setColor("Red")
488
+ .setDescription(
489
+ `**- ${oldState.member.user} has disconnected\n- from voice channel " ${oldState.channel} "**`
490
+ )
491
+ .setThumbnail(
492
+ `${oldState.member.user.displayAvatarURL({ dynamic: true })}`
493
+ );
494
+
495
+ return data.send({ embeds: [embed] });
496
+ }
497
+
498
+ ///
499
+
500
+ if (oldState.channelId !== newState.channelId) {
501
+ let embed = new EmbedBuilder()
502
+ .setTitle("🎤 Member Voice Moved ! 🔁")
503
+ .setColor("Blue")
504
+ .setDescription(
505
+ `**${newState.member.user} has moved\n from ${oldState.channel} to ${newState.channel}**`
506
+ )
507
+ .setThumbnail(
508
+ `${oldState.member.user.displayAvatarURL({ dynamic: true })}`
509
+ );
510
+ return data.send({ embeds: [embed] });
511
+ }
512
+ });
513
+
514
+ /////////////////invite 👥
515
+
516
+ client.on("inviteCreate", async (invite) => {
517
+ try {
518
+ const data = await check(guildId,channelId,invite, true);
519
+ if (!data) return;
520
+ const { executor } = data[1];
521
+ const embed = new EmbedBuilder()
522
+ .setTitle("🔗 Invite Created ! ✅")
523
+ .setColor("Gold")
524
+ .setDescription(
525
+ `**Invite Url : ${invite.url}\n\nCreated By : ${executor}**`
526
+ )
527
+ .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
528
+
529
+ data[0].send({ embeds: [embed] });
530
+ } catch (error) {
531
+ console.error("An error occurred:", error);
532
+ }
533
+ });
534
+
535
+ /////////////////emoji 😀
536
+
537
+ client.on("emojiCreate", async (emoji) => {
538
+ const data = await check(guildId,channelId,emoji, true);
539
+ if (!data) return;
540
+ const { executor } = data[1];
541
+
542
+ const fields = [
543
+ { name: "Emoji", value: `${emoji}`, inline: false },
544
+ { name: "Emoji Name", value: `\`${emoji.name}\``, inline: false },
545
+ { name: "Emoji ID", value: `\`${emoji.id}\``, inline: false },
546
+ { name: "Animated", value: emoji.animated ? "Yes" : "No", inline: false },
547
+ {
548
+ name: "Uploader",
549
+ value: executor?.toString() || "Unknown",
550
+ inline: false,
551
+ },
552
+ ];
553
+
554
+ const embed = new EmbedBuilder()
555
+ .setColor("Green")
556
+ .setTitle("😀 New Emoji Added")
557
+ .setDescription(`A new emoji has been added to the server!`)
558
+ .addFields(fields)
559
+ .setThumbnail(emoji.imageURL())
560
+ .setTimestamp();
561
+
562
+ data[0].send({ embeds: [embed] }).catch(console.error);
563
+ });
564
+
565
+ client.on("emojiDelete", async (emoji) => {
566
+ const data = await check(guildId,channelId,emoji, true);
567
+ if (!data) return;
568
+ const { executor } = data[1];
569
+
570
+ const fields = [
571
+ { name: "Emoji Name", value: `\`${emoji.name}\``, inline: false },
572
+ { name: "Emoji ID", value: `\`${emoji.id}\``, inline: false },
573
+ {
574
+ name: "Deleted by",
575
+ value: executor?.toString() || "Unknown",
576
+ inline: false,
577
+ },
578
+ ];
579
+
580
+ const embed = new EmbedBuilder()
581
+ .setColor("Red")
582
+ .setTitle("🚫 Emoji Deleted")
583
+ .setDescription(`An emoji was deleted from the server.`)
584
+ .addFields(fields)
585
+ .setThumbnail(emoji.imageURL())
586
+ .setTimestamp();
587
+
588
+ data[0].send({ embeds: [embed] }).catch(console.error);
589
+ });
590
+
591
+ client.on("emojiUpdate", async (oldEmoji, newEmoji) => {
592
+ const data = await check(guildId,channelId,newEmoji, true);
593
+ if (!data) return;
594
+ const { executor } = data[1];
595
+
596
+ const fields = [
597
+ { name: "Old Emoji Name", value: `\`${oldEmoji.name}\``, inline: false },
598
+ { name: "New Emoji Name", value: `\`${newEmoji.name}\``, inline: false },
599
+ { name: "Emoji ID", value: `\`${newEmoji.id}\``, inline: false },
600
+ {
601
+ name: "Updated by",
602
+ value: executor?.toString() || "Unknown",
603
+ inline: false,
604
+ },
605
+ ];
606
+
607
+ const embed = new EmbedBuilder()
608
+ .setColor("#FFA500")
609
+ .setTitle("🔄 Emoji Updated")
610
+ .setDescription(`An emoji has been updated in the server.`)
611
+ .addFields(fields)
612
+ .setThumbnail(newEmoji.imageURL())
613
+ .setTimestamp();
614
+
615
+ data[0].send({ embeds: [embed] }).catch(console.error);
616
+ });
617
+
618
+ /////////////////Sticker 📜
619
+
620
+ client.on("stickerCreate", async (sticker) => {
621
+ const data = await check(guildId,channelId,sticker, true);
622
+ if (!data) return;
623
+ const { executor } = data[1];
624
+
625
+ const fields = [
626
+ { name: "Sticker Name", value: `\`${sticker.name}\``, inline: false },
627
+ { name: "Sticker ID", value: `\`${sticker.id}\``, inline: false },
628
+ { name: "Format Type", value: `\`${sticker.format}\``, inline: false },
629
+ {
630
+ name: "Uploader",
631
+ value: executor?.toString() || "Unknown",
632
+ inline: false,
633
+ },
634
+ ];
635
+
636
+ const embed = new EmbedBuilder()
637
+ .setColor("Green")
638
+ .setTitle("✨ New Sticker Added")
639
+ .setDescription("A new sticker has been added to the server!")
640
+ .addFields(fields)
641
+ .setThumbnail(sticker.url)
642
+ .setTimestamp();
643
+
644
+ data[0].send({ embeds: [embed] }).catch(console.error);
645
+ });
646
+
647
+ client.on("stickerDelete", async (sticker) => {
648
+ const data = await check(guildId,channelId,sticker, true);
649
+ if (!data) return;
650
+ const { executor } = data[1];
651
+
652
+ const fields = [
653
+ { name: "Sticker Name", value: `\`${sticker.name}\``, inline: false },
654
+ { name: "Sticker ID", value: `\`${sticker.id}\``, inline: false },
655
+ {
656
+ name: "Deleted by",
657
+ value: executor?.toString() || "Unknown",
658
+ inline: false,
659
+ },
660
+ ];
661
+
662
+ const embed = new EmbedBuilder()
663
+ .setColor("Red")
664
+ .setTitle("🚫 Sticker Deleted")
665
+ .setDescription("A sticker was deleted from the server.")
666
+ .addFields(fields)
667
+ .setThumbnail(sticker.url)
668
+ .setTimestamp();
669
+
670
+ data[0].send({ embeds: [embed] }).catch(console.error);
671
+ });
672
+
673
+ client.on("stickerUpdate", async (oldSticker, newSticker) => {
674
+ const data = await check(guildId,channelId,newSticker, true);
675
+ if (!data) return;
676
+ const { executor } = data[1];
677
+
678
+ const fields = [
679
+ { name: "Sticker ID", value: `\`${newSticker.id}\``, inline: false },
680
+ {
681
+ name: "Updated by",
682
+ value: executor?.toString() || "Unknown",
683
+ inline: false,
684
+ },
685
+ ];
686
+
687
+ if (oldSticker.name !== newSticker.name) {
688
+ fields.push(
689
+ { name: "Old Name 🏷", value: `\`${oldSticker.name}\``, inline: true },
690
+ { name: "New Name 🏷", value: `\`${newSticker.name}\``, inline: true }
691
+ );
692
+ }
693
+
694
+ if (oldSticker.description !== newSticker.description) {
695
+ fields.push(
696
+ {
697
+ name: "Old Description 📜",
698
+ value: `\`${oldSticker.description || "None"}\``,
699
+ inline: true,
700
+ },
701
+ {
702
+ name: "New Description 📜",
703
+ value: `\`${newSticker.description || "None"}\``,
704
+ inline: true,
705
+ }
706
+ );
707
+ }
708
+
709
+ if (oldSticker.tags !== newSticker.tags) {
710
+ let os = oldSticker.tags;
711
+ if (os?.length > 3) os = oldSticker.guild.emojis.cache.get(os) || os;
712
+
713
+ let ns = newSticker.tags;
714
+ if (ns?.length > 3) ns = newSticker.guild.emojis.cache.get(ns) || ns;
715
+
716
+ fields.push(
717
+ { name: "Old Tags ⚓", value: `${os}`, inline: true },
718
+ { name: "New Tags ⚓", value: `${ns}`, inline: true }
719
+ );
720
+ }
721
+
722
+ const embed = new EmbedBuilder()
723
+ .setColor("#FFA500")
724
+ .setTitle("🌀 Sticker Updated")
725
+ .setDescription("A sticker has been updated in the server.")
726
+ .addFields(fields)
727
+ .setThumbnail(newSticker.url)
728
+ .setTimestamp();
729
+
730
+ data[0].send({ embeds: [embed] }).catch(console.error);
731
+ });
732
+ }
733
+
734
+ module.exports = {
735
+ log,
736
+ };