djs-builder 0.7.3 → 0.7.4

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.
package/function/log.js CHANGED
@@ -4,66 +4,192 @@ const {
4
4
  AuditLogEvent,
5
5
  PermissionsBitField,
6
6
  } = require("discord.js");
7
+ const { Schema,model } = require("mongoose");
8
+
9
+ const logschema = new Schema({
10
+ guildId: { type: String, required: true },
11
+ channelId: String,
12
+ channels: Object,
13
+ colors: Object,
14
+ disable: Array,
15
+ });
16
+
17
+ const Log = model("Log", logschema);
18
+
19
+ // تخزين بيانات الـ log للداشبورد
20
+ let logConfigData = {
21
+ databaseEnabled: false,
22
+ configs: []
23
+ };
24
+
25
+ function getLogConfigData() {
26
+ return logConfigData;
27
+ }
28
+
29
+ async function log(client, mine_data) {
30
+ const { inviteTracker } = require("discord-inviter");
31
+ const tracker = new inviteTracker(client);
32
+
33
+ let Data;
34
+ let isDatabaseMode = false;
35
+
36
+ if (Array.isArray(mine_data)) {
37
+ Data = mine_data;
38
+ isDatabaseMode = false;
39
+ logConfigData.databaseEnabled = false;
40
+ logConfigData.configs = mine_data;
41
+ } else if (mine_data && mine_data.database) {
42
+ Data = Log;
43
+ isDatabaseMode = true;
44
+ logConfigData.databaseEnabled = true;
45
+ logConfigData.configs = [];
46
+ } else if (mine_data && mine_data.Data) {
47
+ Data = mine_data.Data || [];
48
+ isDatabaseMode = false;
49
+ logConfigData.databaseEnabled = false;
50
+ logConfigData.configs = mine_data.Data || [];
51
+ } else {
52
+ Data = [];
53
+ isDatabaseMode = false;
54
+ logConfigData.databaseEnabled = false;
55
+ logConfigData.configs = [];
56
+ }
57
+
58
+
59
+ ////////////////////! cache ////////////////////
60
+
61
+ const dataCache = new Map();
62
+
63
+ function clearCache(guildId) {
64
+ if (guildId) {
65
+ dataCache.delete(guildId);
66
+ } else {
67
+ dataCache.clear();
68
+ }
69
+ }
7
70
 
8
- async function check(guildId, channelId, key, fetched) {
71
+ logConfigData.clearCache = clearCache;
72
+
73
+ async function getCachedData(guildId) {
74
+ if (dataCache.has(guildId)) {
75
+ return dataCache.get(guildId);
76
+ }
77
+ let data;
78
+ if (isDatabaseMode) {
79
+ data = await Data.findOne({ guildId });
80
+ } else {
81
+ data = Data.find((c) => c.guildId === guildId);
82
+ }
83
+ if (data) dataCache.set(guildId, data);
84
+ return data;
85
+ }
86
+
87
+ ////////////////////? check ////////////////////
88
+
89
+
90
+ async function check(Data, type, key, fetched, auditType = null) {
9
91
  if (!key.guild) return;
10
- if (key.guild.id !== guildId) return;
92
+ const chack = await getCachedData(key.guild.id);
93
+ if (!chack) return;
94
+
95
+ const channelId = (chack.channels && chack.channels[type]) || chack.channelId;
96
+ if (!channelId) return console.log("No channel configured for", type, "in guild", key.guild.id);
97
+
11
98
  let channel = key.guild.channels.cache.get(channelId);
99
+ if (!channel) return console.log("Channel Log not found in", key.guild.id, "channel id:", channelId);
100
+
101
+ const isDisabled = chack.disable?.includes(type);
102
+ if (isDisabled) return;
103
+ const color = chack.colors?.[type] || false;
12
104
  if (!fetched) {
13
- return channel;
105
+ return {
106
+ channel: channel,
107
+ color: color,
108
+ data: chack
109
+ };
14
110
  }
15
111
 
16
- const fetchedLogs = await channel.guild.fetchAuditLogs({
17
- limit: 1,
18
- });
112
+ const auditOptions = auditType ? { limit: 1, type: auditType } : { limit: 1 };
113
+ const fetchedLogs = await channel.guild.fetchAuditLogs(auditOptions);
19
114
  const log = fetchedLogs.entries.first();
20
115
 
21
- return [channel, log];
116
+ return {
117
+ channel: channel,
118
+ color: color,
119
+ data: chack,
120
+ log: log,
121
+ };
22
122
  }
23
123
 
24
- async function log(client, guildId, channelId) {
25
- const { inviteTracker } = require("discord-inviter");
26
- const tracker = new inviteTracker(client);
124
+
125
+ ////////////////////* send ////////////////////
126
+
127
+
128
+
129
+ function createLogEmbed(title, description, color, fields = [], thumbnail = null, timestamp = true) {
130
+ const embed = new EmbedBuilder()
131
+ .setTitle(title)
132
+ .setColor(color)
133
+ .setDescription(description);
134
+
135
+ if (fields.length > 0) embed.addFields(fields);
136
+ if (thumbnail) embed.setThumbnail(thumbnail);
137
+ if (timestamp) embed.setTimestamp();
138
+
139
+ return embed;
140
+ }
141
+
142
+ async function sendLogEmbed(data, embed) {
143
+ try {
144
+ await data.channel.send({ embeds: [embed] });
145
+ } catch (error) {
146
+ console.error("Error sending log embed:", error);
147
+ }
148
+ }
149
+
150
+
27
151
 
28
152
  /////////////////messages ✉️
29
153
 
30
154
  client.on("messageDelete", async (message) => {
31
- const data = await check(guildId, channelId, message, true);
155
+ const data = await check(Data, "messageDelete", message, true);
32
156
  if (!data) return;
33
157
 
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- Message Channel:** ${message.channel}\n- Message Content :\n ${message.content}\n\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] });
158
+ const { executor } = data.log;
159
+ const embed = createLogEmbed(
160
+ "Message Deleted ! ❌",
161
+ `**- Message Author : ${message.author}\n\n- Deleted By : ${executor}\n- Message Channel:** ${message.channel}\n- Message Content :\n ${message.content}\n\n\n> Message Data : \n - Embeds : ${message.embeds.length}\n - Attachments : ${message.attachments.size}`,
162
+ data.color || "Red",
163
+ [],
164
+ message.author.displayAvatarURL({ dynamic: true })
165
+ );
166
+ await sendLogEmbed(data, embed);
43
167
  });
44
168
 
45
169
  ///
46
170
 
47
171
  client.on("messageUpdate", async (oldMessage, newMessage) => {
48
- const data = await check(guildId, channelId, oldMessage);
172
+ const data = await check(Data, "messageUpdate", oldMessage, false);
49
173
  if (!data) return;
174
+
175
+
50
176
  if (oldMessage.content === newMessage.content) return;
51
177
  if (!oldMessage.content || !newMessage.content) return;
52
178
 
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);
179
+ const embed = createLogEmbed(
180
+ "Message Edited! ⚠️",
181
+ `**> 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}**`,
182
+ data.color || "Yellow",
183
+ [],
184
+ newMessage.author.displayAvatarURL({ dynamic: true })
185
+ );
186
+ await sendLogEmbed(data, embed);
61
187
  });
62
188
 
63
189
  /////////////////channel 📁
64
190
 
65
191
  client.on("channelCreate", async (channel) => {
66
- const data = await check(guildId, channelId, channel);
192
+ const data = await check(Data, "channelCreate", channel, false);
67
193
  if (!data) return;
68
194
 
69
195
  const fetchedLogs = await channel.guild.fetchAuditLogs({
@@ -73,46 +199,42 @@ async function log(client, guildId, channelId) {
73
199
  const CreateLog = fetchedLogs.entries.first();
74
200
  const { executor } = CreateLog;
75
201
  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
202
 
91
- .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
203
+ const fields = [
204
+ { name: "Name", value: channel.name, inline: false },
205
+ { name: "Type", value: ChannelType[channel.type], inline: false },
206
+ { name: "Category", value: channel.parent ? channel.parent.name : "None", inline: false },
207
+ { name: "Created By", value: executor.toString(), inline: false },
208
+ { name: "Channel ID", value: channel.id, inline: false }
209
+ ];
92
210
 
93
- data.send({ embeds: [embed] });
211
+ const embed = createLogEmbed(
212
+ "📁 Channel Created ! ✅",
213
+ null,
214
+ data.color || "Green",
215
+ fields,
216
+ executor.displayAvatarURL({ dynamic: true })
217
+ );
218
+ await sendLogEmbed(data, embed);
94
219
  });
95
220
 
96
221
  ///
97
222
 
98
223
  client.on("channelDelete", async (channel) => {
99
- const data = await check(guildId, channelId, channel, true);
224
+ const data = await check(Data, "channelDelete", channel, true);
100
225
  if (!data) return;
101
226
 
102
227
  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);
228
+ const { executor } = data.log;
229
+
230
+ const embed = createLogEmbed(
231
+ "📁 Channel Deleted ! ❌",
232
+ `**Channel Name: ${channel.name}\n\nType: ${ChannelType[channel.type]}\n\nChannel ID: ${channel.id}\n\nDeleted By: ${executor}**`,
233
+ data.color || "Red",
234
+ [],
235
+ executor.displayAvatarURL({ dynamic: true })
236
+ );
237
+ await sendLogEmbed(data, embed);
116
238
  } catch (error) {
117
239
  console.error(error);
118
240
  }
@@ -121,11 +243,11 @@ async function log(client, guildId, channelId) {
121
243
  ///
122
244
 
123
245
  client.on("channelUpdate", async (oldChannel, newChannel) => {
124
- const data = await check(guildId, channelId, newChannel, true);
246
+ const data = await check(Data, "channelUpdate", newChannel, true);
125
247
  if (!data) return;
126
248
 
127
249
  try {
128
- const { executor } = data[1];
250
+ const { executor } = data.log;
129
251
 
130
252
  let descriptionText = "";
131
253
 
@@ -210,19 +332,20 @@ async function log(client, guildId, channelId) {
210
332
  }
211
333
 
212
334
  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);
335
+ const fields = [{
336
+ name: "Updated By :",
337
+ value: executor ? executor.toString() : "Unknown",
338
+ inline: false,
339
+ }];
340
+
341
+ const embed = createLogEmbed(
342
+ `📁 Channel Updated ! ⚠️: "${newChannel.name}"`,
343
+ descriptionText,
344
+ data.color || "Blue",
345
+ fields,
346
+ newChannel.guild.iconURL()
347
+ );
348
+ await sendLogEmbed(data, embed);
226
349
  }
227
350
  } catch (error) {
228
351
  console.error(error);
@@ -232,8 +355,8 @@ async function log(client, guildId, channelId) {
232
355
  /////////////////member 🧑
233
356
 
234
357
  client.on("guildMemberRemove", async (member) => {
235
- const logChannel = await check(guildId, channelId, member);
236
- if (!logChannel) return;
358
+ const data = await check(Data, "guildMemberRemove", member, false);
359
+ if (!data) return;
237
360
 
238
361
  try {
239
362
  const fetchedLogs = await member.guild.fetchAuditLogs({
@@ -248,13 +371,14 @@ async function log(client, guildId, channelId) {
248
371
 
249
372
  if (isKicked) {
250
373
  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] });
374
+ const embed = createLogEmbed(
375
+ "👟 Member Kicked",
376
+ `**<@${member.id}> was kicked by ${executor}**`,
377
+ "Red",
378
+ [],
379
+ member.user.displayAvatarURL({ dynamic: true })
380
+ );
381
+ await sendLogEmbed(data, embed);
258
382
  } else {
259
383
  const joinedAt = member.joinedAt;
260
384
  const duration = Date.now() - joinedAt.getTime();
@@ -265,15 +389,14 @@ async function log(client, guildId, channelId) {
265
389
  const minutes = Math.floor((duration % (1000 * 60 * 60)) / (1000 * 60));
266
390
  const seconds = Math.floor((duration % (1000 * 60)) / 1000);
267
391
 
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] });
392
+ const embed = createLogEmbed(
393
+ "🚪 Member Left",
394
+ `<@${member.id}> left the server.\n\nTime in server:\n**${days}d ${hours}h ${minutes}m ${seconds}s**`,
395
+ data.color || "DarkRed",
396
+ [],
397
+ member.user.displayAvatarURL({ dynamic: true })
398
+ );
399
+ await sendLogEmbed(data, embed);
277
400
  }
278
401
  } catch (err) {
279
402
  console.error("❌ Error in guildMemberRemove event:", err);
@@ -283,88 +406,90 @@ async function log(client, guildId, channelId) {
283
406
  ///
284
407
 
285
408
  tracker.on("guildMemberAdd", async (member, inviter, invite, error) => {
286
- const data = await check(guildId, channelId, member);
409
+ const data = await check(Data, "guildMemberAdd", member, false);
287
410
  if (!data) return;
288
411
 
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] });
412
+ const embed = createLogEmbed(
413
+ "🎉 Member Joined",
414
+ `**- ${member} joined the server\n\n- Invited invite by ${inviter} \n\n- Invite Link: ${invite}**`,
415
+ data.color || "Green",
416
+ [],
417
+ member.user.displayAvatarURL({ dynamic: true })
418
+ );
419
+ await sendLogEmbed(data, embed);
299
420
  });
300
421
 
301
422
  ///
302
423
 
303
424
  client.on("guildBanAdd", async (member) => {
304
- const data = await check(guildId, channelId, member, true);
425
+ const data = await check(Data, "guildBanAdd", member, true);
305
426
  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] });
427
+ const { executor } = data.log;
428
+
429
+ const embed = createLogEmbed(
430
+ "New Member Banned ! ✈",
431
+ `**<@${member.user.id}> Was Banned By ${executor}**`,
432
+ data.color || "Blue",
433
+ [],
434
+ member.user.displayAvatarURL({ dynamic: true })
435
+ );
436
+ await sendLogEmbed(data, embed);
314
437
  });
315
438
 
316
439
  client.on("guildBanRemove", async (member) => {
317
- const data = await check(guildId, channelId, member, true);
440
+ const data = await check(Data, "guildBanRemove", member, true);
318
441
  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] });
442
+ const { executor } = data.log;
443
+
444
+ const embed = createLogEmbed(
445
+ "New Member Unbanned ! 🤗",
446
+ `**<@${member.user.id}> Was Unbanned By ${executor}**`,
447
+ data.color || "Green",
448
+ [],
449
+ member.user.displayAvatarURL({ dynamic: true })
450
+ );
451
+ await sendLogEmbed(data, embed);
327
452
  });
328
453
 
329
454
  /////////////////role 🏅
330
455
 
331
456
  client.on("roleCreate", async (role) => {
332
- const data = await check(guildId, channelId, role, true);
457
+ const data = await check(Data, "roleCreate", role, true);
333
458
  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] });
459
+ const { executor } = data.log;
460
+ const embed = createLogEmbed(
461
+ "🛠️ 🏅 Role Created ! ✅",
462
+ `**Role Name : ${role}\n\nRole ID : ${role.id}\n\nCreated By : ${executor}**`,
463
+ role.hexColor || "Green",
464
+ [],
465
+ executor.displayAvatarURL({ dynamic: true })
466
+ );
467
+ await sendLogEmbed(data, embed);
343
468
  });
344
469
 
345
470
  ///
346
471
 
347
472
  client.on("roleDelete", async (role) => {
348
- const data = await check(guildId, channelId, role, true);
473
+ const data = await check(Data, "roleDelete", role, true);
349
474
  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] });
475
+ const { executor } = data.log;
476
+ const embed = createLogEmbed(
477
+ "🛠️ 🏅 Role Deleted ! ❌",
478
+ `**Role Name : ${role}\n\nRole ID : ${role.id}\n\nDeleted By : ${executor}**`,
479
+ data.color || "Red",
480
+ [],
481
+ executor.displayAvatarURL({ dynamic: true })
482
+ );
483
+ await sendLogEmbed(data, embed);
359
484
  });
360
485
 
361
486
  ///
362
487
 
363
488
  client.on("roleUpdate", async (oldRole, newRole) => {
364
- const data = await check(guildId, channelId, newRole, true);
489
+ const data = await check(Data, "roleUpdate", newRole, true);
365
490
  if (!data) return;
366
491
 
367
- const { executor } = data[1];
492
+ const { executor } = data.log;
368
493
 
369
494
  let descriptionText = "";
370
495
 
@@ -402,60 +527,55 @@ async function log(client, guildId, channelId) {
402
527
  let thumbnail = newRole.iconURL() || newRole.guild.iconURL();
403
528
 
404
529
  if (descriptionText !== "") {
405
- const embed = new EmbedBuilder()
406
- .setColor(newRole.hexColor || "Blue")
407
- .setTitle(`🏅 Role Updated: "${newRole.name}"`)
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);
530
+ const fields = [{
531
+ name: "Updated By:",
532
+ value: executor ? executor.toString() : "Unknown",
533
+ inline: false,
534
+ }];
535
+
536
+ const embed = createLogEmbed(
537
+ `🏅 Role Updated: "${newRole.name}"`,
538
+ descriptionText,
539
+ newRole.hexColor || "Blue",
540
+ fields,
541
+ thumbnail
542
+ );
543
+ await sendLogEmbed(data, embed);
418
544
  }
419
545
  });
420
546
 
421
547
  ///
422
548
 
423
549
  client.on("guildMemberUpdate", async (oldMember, newMember) => {
424
- const data = await check(guildId, channelId, newMember, true);
550
+ const data = await check(Data, "guildMemberUpdate", newMember, true);
425
551
  if (!data) return;
426
- const { executor } = data[1];
552
+ const { executor } = data.log;
427
553
 
428
554
  const removedRoles = oldMember.roles.cache.filter(
429
555
  (role) => !newMember.roles.cache.has(role.id)
430
556
  );
431
557
  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] });
558
+ const embed = createLogEmbed(
559
+ "🏅 Member Role Removed ! ❌",
560
+ `**Role : ${removedRoles.map((r) => r).join(", ")}\n\nRemoved From : ${newMember.user}\n\nRemoved By : ${executor}**`,
561
+ data.color || "Red",
562
+ [],
563
+ newMember.user.displayAvatarURL({ dynamic: true })
564
+ );
565
+ await sendLogEmbed(data, embed);
444
566
  }
445
567
  const addedRoles = newMember.roles.cache.filter(
446
568
  (role) => !oldMember.roles.cache.has(role.id)
447
569
  );
448
570
  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] });
571
+ const embed = createLogEmbed(
572
+ "🏅 Member Role Added ! ✅",
573
+ `**Role : ${addedRoles.map((r) => r).join(", ")}\n\nAdded To : <@${newMember.user.id}>\n\nAdded By : ${executor}**`,
574
+ data.color || "Gold",
575
+ [],
576
+ newMember.user.displayAvatarURL({ dynamic: true })
577
+ );
578
+ await sendLogEmbed(data, embed);
459
579
  }
460
580
  });
461
581
 
@@ -465,51 +585,44 @@ async function log(client, guildId, channelId) {
465
585
  if (oldState.member.bot) return;
466
586
  if (newState.member.bot) return;
467
587
 
468
- const data = await check(guildId, channelId, newState);
588
+ const data = await check(Data, "voiceStateUpdate", newState, false);
469
589
  if (!data) return;
470
590
 
471
591
  if (!oldState.channelId && newState.channelId) {
472
- let embed = new EmbedBuilder()
473
- .setTitle("🎤 Member Voice Connected ! ✅")
474
- .setColor("Green")
475
- .setDescription(
476
- `**${newState.member.user} has joined voice channel \n- Channel:" ${newState.channel} "**`
477
- )
478
- .setThumbnail(
479
- `${newState.member.user.displayAvatarURL({ dynamic: true })}`
480
- );
481
- return data.send({ embeds: [embed] });
592
+ const embed = createLogEmbed(
593
+ "🎤 Member Voice Connected ! ✅",
594
+ `**${newState.member.user} has joined voice channel \n- Channel:" ${newState.channel} "**`,
595
+ data.color || "Green",
596
+ [],
597
+ newState.member.user.displayAvatarURL({ dynamic: true })
598
+ );
599
+ return await sendLogEmbed(data, embed);
482
600
  }
483
601
 
484
602
  ///
485
603
 
486
604
  if (oldState.channelId && !newState.channelId) {
487
- let embed = new EmbedBuilder()
488
- .setTitle("🎤 Member Voice Disconnected ! ❌")
489
- .setColor("Red")
490
- .setDescription(
491
- `**- ${oldState.member.user} has disconnected\n- from voice channel " ${oldState.channel} "**`
492
- )
493
- .setThumbnail(
494
- `${oldState.member.user.displayAvatarURL({ dynamic: true })}`
495
- );
496
-
497
- return data.send({ embeds: [embed] });
605
+ const embed = createLogEmbed(
606
+ "🎤 Member Voice Disconnected ! ❌",
607
+ `**- ${oldState.member.user} has disconnected\n- from voice channel " ${oldState.channel} "**`,
608
+ data.color || "Red",
609
+ [],
610
+ oldState.member.user.displayAvatarURL({ dynamic: true })
611
+ );
612
+ return await sendLogEmbed(data, embed);
498
613
  }
499
614
 
500
615
  ///
501
616
 
502
617
  if (oldState.channelId !== newState.channelId) {
503
- let embed = new EmbedBuilder()
504
- .setTitle("🎤 Member Voice Moved ! 🔁")
505
- .setColor("Blue")
506
- .setDescription(
507
- `**${newState.member.user} has moved\n from ${oldState.channel} to ${newState.channel}**`
508
- )
509
- .setThumbnail(
510
- `${oldState.member.user.displayAvatarURL({ dynamic: true })}`
511
- );
512
- return data.send({ embeds: [embed] });
618
+ const embed = createLogEmbed(
619
+ "🎤 Member Voice Moved ! 🔁",
620
+ `**${newState.member.user} has moved\n from ${oldState.channel} to ${newState.channel}**`,
621
+ data.color || "Blue",
622
+ [],
623
+ oldState.member.user.displayAvatarURL({ dynamic: true })
624
+ );
625
+ return await sendLogEmbed(data, embed);
513
626
  }
514
627
  });
515
628
 
@@ -517,18 +630,17 @@ async function log(client, guildId, channelId) {
517
630
 
518
631
  client.on("inviteCreate", async (invite) => {
519
632
  try {
520
- const data = await check(guildId, channelId, invite, true);
633
+ const data = await check(Data, "inviteCreate", invite, true);
521
634
  if (!data) return;
522
- const { executor } = data[1];
523
- const embed = new EmbedBuilder()
524
- .setTitle("🔗 Invite Created ! ✅")
525
- .setColor("Gold")
526
- .setDescription(
527
- `**Invite Url : ${invite.url}\n\nCreated By : ${executor}**`
528
- )
529
- .setThumbnail(`${executor.displayAvatarURL({ dynamic: true })}`);
530
-
531
- data[0].send({ embeds: [embed] });
635
+ const { executor } = data.log;
636
+ const embed = createLogEmbed(
637
+ "🔗 Invite Created ! ✅",
638
+ `**Invite Url : ${invite.url}\n\nCreated By : ${executor}**`,
639
+ data.color || "Gold",
640
+ [],
641
+ executor.displayAvatarURL({ dynamic: true })
642
+ );
643
+ await sendLogEmbed(data, embed);
532
644
  } catch (error) {
533
645
  console.error("An error occurred:", error);
534
646
  }
@@ -537,153 +649,123 @@ async function log(client, guildId, channelId) {
537
649
  /////////////////emoji 😀
538
650
 
539
651
  client.on("emojiCreate", async (emoji) => {
540
- const data = await check(guildId, channelId, emoji, true);
652
+ const data = await check(Data, "emojiCreate", emoji, true);
541
653
  if (!data) return;
542
- const { executor } = data[1];
654
+ const { executor } = data.log;
543
655
 
544
656
  const fields = [
545
657
  { name: "Emoji", value: `${emoji}`, inline: false },
546
658
  { name: "Emoji Name", value: `\`${emoji.name}\``, inline: false },
547
659
  { name: "Emoji ID", value: `\`${emoji.id}\``, inline: false },
548
660
  { name: "Animated", value: emoji.animated ? "Yes" : "No", inline: false },
549
- {
550
- name: "Uploader",
551
- value: executor?.toString() || "Unknown",
552
- inline: false,
553
- },
661
+ { name: "Uploader", value: executor?.toString() || "Unknown", inline: false },
554
662
  ];
555
663
 
556
- const embed = new EmbedBuilder()
557
- .setColor("Green")
558
- .setTitle("😀 New Emoji Added")
559
- .setDescription(`A new emoji has been added to the server!`)
560
- .addFields(fields)
561
- .setThumbnail(emoji.imageURL())
562
- .setTimestamp();
563
-
564
- data[0].send({ embeds: [embed] }).catch(console.error);
664
+ const embed = createLogEmbed(
665
+ "😀 New Emoji Added",
666
+ "A new emoji has been added to the server!",
667
+ data.color || "Green",
668
+ fields,
669
+ emoji.imageURL()
670
+ );
671
+ await sendLogEmbed(data, embed);
565
672
  });
566
673
 
567
674
  client.on("emojiDelete", async (emoji) => {
568
- const data = await check(guildId, channelId, emoji, true);
675
+ const data = await check(Data, "emojiDelete", emoji, true);
569
676
  if (!data) return;
570
- const { executor } = data[1];
677
+ const { executor } = data.log;
571
678
 
572
679
  const fields = [
573
680
  { name: "Emoji Name", value: `\`${emoji.name}\``, inline: false },
574
681
  { name: "Emoji ID", value: `\`${emoji.id}\``, inline: false },
575
- {
576
- name: "Deleted by",
577
- value: executor?.toString() || "Unknown",
578
- inline: false,
579
- },
682
+ { name: "Deleted by", value: executor?.toString() || "Unknown", inline: false },
580
683
  ];
581
684
 
582
- const embed = new EmbedBuilder()
583
- .setColor("Red")
584
- .setTitle("🚫 Emoji Deleted")
585
- .setDescription(`An emoji was deleted from the server.`)
586
- .addFields(fields)
587
- .setThumbnail(emoji.imageURL())
588
- .setTimestamp();
589
-
590
- data[0].send({ embeds: [embed] }).catch(console.error);
685
+ const embed = createLogEmbed(
686
+ "🚫 Emoji Deleted",
687
+ "An emoji was deleted from the server.",
688
+ data.color || "Red",
689
+ fields,
690
+ emoji.imageURL()
691
+ );
692
+ await sendLogEmbed(data, embed);
591
693
  });
592
694
 
593
695
  client.on("emojiUpdate", async (oldEmoji, newEmoji) => {
594
- const data = await check(guildId, channelId, newEmoji, true);
696
+ const data = await check(Data, "emojiUpdate", newEmoji, true);
595
697
  if (!data) return;
596
- const { executor } = data[1];
698
+ const { executor } = data.log;
597
699
 
598
700
  const fields = [
599
701
  { name: "Old Emoji Name", value: `\`${oldEmoji.name}\``, inline: false },
600
702
  { name: "New Emoji Name", value: `\`${newEmoji.name}\``, inline: false },
601
703
  { name: "Emoji ID", value: `\`${newEmoji.id}\``, inline: false },
602
- {
603
- name: "Updated by",
604
- value: executor?.toString() || "Unknown",
605
- inline: false,
606
- },
704
+ { name: "Updated by", value: executor?.toString() || "Unknown", inline: false },
607
705
  ];
608
706
 
609
- const embed = new EmbedBuilder()
610
- .setColor("#FFA500")
611
- .setTitle("🔄 Emoji Updated")
612
- .setDescription(`An emoji has been updated in the server.`)
613
- .addFields(fields)
614
- .setThumbnail(newEmoji.imageURL())
615
- .setTimestamp();
616
-
617
- data[0].send({ embeds: [embed] }).catch(console.error);
707
+ const embed = createLogEmbed(
708
+ "🔄 Emoji Updated",
709
+ "An emoji has been updated in the server.",
710
+ data.color || "Yellow",
711
+ fields,
712
+ newEmoji.imageURL()
713
+ );
714
+ await sendLogEmbed(data, embed);
618
715
  });
619
716
 
620
717
  /////////////////Sticker 📜
621
-
622
- client.on("stickerCreate", async (sticker) => {
623
- const data = await check(guildId, channelId, sticker, true);
718
+ client.on("stickerCreate", async (sticker) => {
719
+ const data = await check(Data, "stickerCreate", sticker, true);
624
720
  if (!data) return;
625
- const { executor } = data[1];
721
+ const { executor } = data.log;
626
722
 
627
723
  const fields = [
628
724
  { name: "Sticker Name", value: `\`${sticker.name}\``, inline: false },
629
725
  { name: "Sticker ID", value: `\`${sticker.id}\``, inline: false },
630
726
  { name: "Format Type", value: `\`${sticker.format}\``, inline: false },
631
- {
632
- name: "Uploader",
633
- value: executor?.toString() || "Unknown",
634
- inline: false,
635
- },
727
+ { name: "Uploader", value: executor?.toString() || "Unknown", inline: false },
636
728
  ];
637
729
 
638
- const embed = new EmbedBuilder()
639
- .setColor("Green")
640
- .setTitle(" New Sticker Added")
641
- .setDescription("A new sticker has been added to the server!")
642
- .addFields(fields)
643
- .setThumbnail(sticker.url)
644
- .setTimestamp();
645
-
646
- data[0].send({ embeds: [embed] }).catch(console.error);
730
+ const embed = createLogEmbed(
731
+ "✨ New Sticker Added",
732
+ "A new sticker has been added to the server!",
733
+ data.color || "Green",
734
+ fields,
735
+ sticker.url
736
+ );
737
+ await sendLogEmbed(data, embed);
647
738
  });
648
739
 
649
740
  client.on("stickerDelete", async (sticker) => {
650
- const data = await check(guildId, channelId, sticker, true);
741
+ const data = await check(Data, "stickerDelete", sticker, true);
651
742
  if (!data) return;
652
- const { executor } = data[1];
743
+ const { executor } = data.log;
653
744
 
654
745
  const fields = [
655
746
  { name: "Sticker Name", value: `\`${sticker.name}\``, inline: false },
656
747
  { name: "Sticker ID", value: `\`${sticker.id}\``, inline: false },
657
- {
658
- name: "Deleted by",
659
- value: executor?.toString() || "Unknown",
660
- inline: false,
661
- },
748
+ { name: "Deleted by", value: executor?.toString() || "Unknown", inline: false },
662
749
  ];
663
750
 
664
- const embed = new EmbedBuilder()
665
- .setColor("Red")
666
- .setTitle("🚫 Sticker Deleted")
667
- .setDescription("A sticker was deleted from the server.")
668
- .addFields(fields)
669
- .setThumbnail(sticker.url)
670
- .setTimestamp();
671
-
672
- data[0].send({ embeds: [embed] }).catch(console.error);
751
+ const embed = createLogEmbed(
752
+ "🚫 Sticker Deleted",
753
+ "A sticker was deleted from the server.",
754
+ "Red",
755
+ fields,
756
+ sticker.url
757
+ );
758
+ await sendLogEmbed(data, embed);
673
759
  });
674
760
 
675
761
  client.on("stickerUpdate", async (oldSticker, newSticker) => {
676
- const data = await check(guildId, channelId, newSticker, true);
762
+ const data = await check(Data, "stickerUpdate", newSticker, true);
677
763
  if (!data) return;
678
- const { executor } = data[1];
764
+ const { executor } = data.log;
679
765
 
680
766
  const fields = [
681
767
  { name: "Sticker ID", value: `\`${newSticker.id}\``, inline: false },
682
- {
683
- name: "Updated by",
684
- value: executor?.toString() || "Unknown",
685
- inline: false,
686
- },
768
+ { name: "Updated by", value: executor?.toString() || "Unknown", inline: false },
687
769
  ];
688
770
 
689
771
  if (oldSticker.name !== newSticker.name) {
@@ -695,16 +777,8 @@ async function log(client, guildId, channelId) {
695
777
 
696
778
  if (oldSticker.description !== newSticker.description) {
697
779
  fields.push(
698
- {
699
- name: "Old Description 📜",
700
- value: `\`${oldSticker.description || "None"}\``,
701
- inline: true,
702
- },
703
- {
704
- name: "New Description 📜",
705
- value: `\`${newSticker.description || "None"}\``,
706
- inline: true,
707
- }
780
+ { name: "Old Description 📜", value: `\`${oldSticker.description || "None"}\``, inline: true },
781
+ { name: "New Description 📜", value: `\`${newSticker.description || "None"}\``, inline: true }
708
782
  );
709
783
  }
710
784
 
@@ -721,18 +795,19 @@ async function log(client, guildId, channelId) {
721
795
  );
722
796
  }
723
797
 
724
- const embed = new EmbedBuilder()
725
- .setColor("#FFA500")
726
- .setTitle("🌀 Sticker Updated")
727
- .setDescription("A sticker has been updated in the server.")
728
- .addFields(fields)
729
- .setThumbnail(newSticker.url)
730
- .setTimestamp();
731
-
732
- data[0].send({ embeds: [embed] }).catch(console.error);
798
+ const embed = createLogEmbed(
799
+ "🌀 Sticker Updated",
800
+ "A sticker has been updated in the server.",
801
+ data.color || "Yellow",
802
+ fields,
803
+ newSticker.url
804
+ );
805
+ await sendLogEmbed(data, embed);
733
806
  });
734
807
  }
735
808
 
736
809
  module.exports = {
737
810
  log,
811
+ Log,
812
+ getLogConfigData,
738
813
  };