djs-builder 0.7.9 → 0.7.10
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/README.md +10 -6
- package/function/dash.js +290 -39
- package/function/function.js +50 -39
- package/function/level.js +337 -10
- package/handler/starter.js +34 -5
- package/package.json +2 -2
- package/views/dashboard.ejs +52 -18
- package/views/levels.ejs +671 -32
- package/views/logs.ejs +48 -13
package/README.md
CHANGED
|
@@ -481,9 +481,9 @@ const modal = CreateModal({
|
|
|
481
481
|
},
|
|
482
482
|
},
|
|
483
483
|
{
|
|
484
|
-
type: "
|
|
484
|
+
type: "text",
|
|
485
485
|
components: {
|
|
486
|
-
|
|
486
|
+
content: "Thank you for your input!",
|
|
487
487
|
},
|
|
488
488
|
},
|
|
489
489
|
],
|
|
@@ -526,6 +526,8 @@ await interaction.showModal(modal);
|
|
|
526
526
|
type: "string",
|
|
527
527
|
options: {
|
|
528
528
|
id: "country",
|
|
529
|
+
mine_label: "Choose Your Country", // Label displayed above the menu
|
|
530
|
+
mine_description: "Please select your country from the list below", // Optional description
|
|
529
531
|
placeholder: "Select your country",
|
|
530
532
|
min: 1,
|
|
531
533
|
max: 1,
|
|
@@ -571,9 +573,9 @@ await interaction.showModal(modal);
|
|
|
571
573
|
|
|
572
574
|
```js
|
|
573
575
|
{
|
|
574
|
-
type: "
|
|
576
|
+
type: "text",
|
|
575
577
|
components: {
|
|
576
|
-
|
|
578
|
+
content: "Please fill out the form above.",
|
|
577
579
|
},
|
|
578
580
|
},
|
|
579
581
|
```
|
|
@@ -598,6 +600,8 @@ Same as CreateRow select menus.
|
|
|
598
600
|
|
|
599
601
|
- `type` → `"string" | "user" | "role" | "channel"`
|
|
600
602
|
- `id` → customId for menu
|
|
603
|
+
- `mine_label` → Label displayed above the menu component (defaults to "Select an option")
|
|
604
|
+
- `mine_description` → Description text displayed below the menu label (optional)
|
|
601
605
|
- `placeholder` → Text shown before selection
|
|
602
606
|
- `min` / `max` → Min/Max selectable values
|
|
603
607
|
- `data` → Options array (for string select only)
|
|
@@ -622,9 +626,9 @@ Same as CreateRow select menus.
|
|
|
622
626
|
- `label` → Label
|
|
623
627
|
- `description` → Description
|
|
624
628
|
|
|
625
|
-
#### 🔹
|
|
629
|
+
#### 🔹 text
|
|
626
630
|
|
|
627
|
-
- `
|
|
631
|
+
- `content` → Text to display
|
|
628
632
|
|
|
629
633
|
---
|
|
630
634
|
|
package/function/dash.js
CHANGED
|
@@ -12,8 +12,20 @@ const DiscordStrategy = require("passport-discord").Strategy;
|
|
|
12
12
|
const path = require("path");
|
|
13
13
|
const Table = require("cli-table3");
|
|
14
14
|
const chalk = require("chalk");
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const mongoose = require("mongoose");
|
|
16
|
+
|
|
17
|
+
const {
|
|
18
|
+
Level,
|
|
19
|
+
levelGuild,
|
|
20
|
+
resetUser,
|
|
21
|
+
xpNeeded,
|
|
22
|
+
calculateLevel,
|
|
23
|
+
getUserRank,
|
|
24
|
+
getGuildConfig,
|
|
25
|
+
updateGuildConfig,
|
|
26
|
+
deleteGuildConfig,
|
|
27
|
+
clearConfigCache,
|
|
28
|
+
} = require("./level");
|
|
17
29
|
const {
|
|
18
30
|
Blacklist,
|
|
19
31
|
addToBlacklist,
|
|
@@ -94,6 +106,7 @@ function dashboard(client, options) {
|
|
|
94
106
|
res.locals.user = req.user || null;
|
|
95
107
|
res.locals.client = client;
|
|
96
108
|
res.locals.path = req.path;
|
|
109
|
+
res.locals.dashboardEnabled = options.Dashboard !== false; // الإعداد من الكود
|
|
97
110
|
next();
|
|
98
111
|
});
|
|
99
112
|
|
|
@@ -255,25 +268,91 @@ function dashboard(client, options) {
|
|
|
255
268
|
const guild = client.guilds.cache.get(req.params.guildId);
|
|
256
269
|
if (!guild) return res.redirect("/dashboard");
|
|
257
270
|
|
|
271
|
+
const mongoConnected = mongoose.connection.readyState === 1;
|
|
272
|
+
let levelConfigDb = null;
|
|
273
|
+
let configSource = null;
|
|
274
|
+
let databaseEnabled = false; // Only true if guild uses Dashboard mode in setLevel
|
|
275
|
+
|
|
276
|
+
// Check if modifying via dashboard is allowed
|
|
277
|
+
const canModify = options.Dashboard !== false;
|
|
278
|
+
|
|
279
|
+
// Check if guild uses Dashboard mode (Dashboard: true in setLevel)
|
|
280
|
+
const usesDashboardMode = client.levelDashboardGuilds && client.levelDashboardGuilds.has(guild.id);
|
|
281
|
+
|
|
282
|
+
// Get guild config from database
|
|
283
|
+
if (mongoConnected) {
|
|
284
|
+
try {
|
|
285
|
+
levelConfigDb = await getGuildConfig(guild.id);
|
|
286
|
+
if (levelConfigDb && usesDashboardMode) {
|
|
287
|
+
configSource = "database";
|
|
288
|
+
databaseEnabled = true; // Config exists AND guild uses Dashboard mode
|
|
289
|
+
}
|
|
290
|
+
} catch (e) {
|
|
291
|
+
console.error("Error fetching level config:", e);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
258
295
|
let leaderboardData = [];
|
|
259
296
|
if (Level) {
|
|
260
297
|
try {
|
|
261
|
-
|
|
298
|
+
const rawLeaderboard = await Level.find({ guildId: guild.id })
|
|
262
299
|
.sort({ totalXP: -1 })
|
|
263
300
|
.limit(100);
|
|
301
|
+
|
|
302
|
+
// Fetch members to ensure they are in cache/get real data
|
|
303
|
+
const memberIds = rawLeaderboard.map(u => u.userId);
|
|
304
|
+
const fetchedMembers = await guild.members.fetch({ user: memberIds }).catch(() => new Map());
|
|
305
|
+
|
|
306
|
+
leaderboardData = rawLeaderboard.map(u => {
|
|
307
|
+
const member = fetchedMembers.get(u.userId) || guild.members.cache.get(u.userId);
|
|
308
|
+
return {
|
|
309
|
+
userId: u.userId,
|
|
310
|
+
totalXP: u.totalXP,
|
|
311
|
+
level: u.level,
|
|
312
|
+
username: member ? member.user.username : `User ${u.userId.substring(0, 5)}`,
|
|
313
|
+
avatar: member ? member.user.displayAvatarURL({ size: 64, forceStatic: true }) : `https://cdn.discordapp.com/embed/avatars/${Math.floor(Math.random() * 6)}.png`,
|
|
314
|
+
};
|
|
315
|
+
});
|
|
264
316
|
} catch (e) {
|
|
265
317
|
console.error("Error fetching levels:", e);
|
|
266
318
|
}
|
|
267
319
|
}
|
|
268
320
|
|
|
321
|
+
// Get guild roles for role rewards
|
|
322
|
+
const roles = guild.roles.cache
|
|
323
|
+
.filter((r) => r.id !== guild.id && !r.managed)
|
|
324
|
+
.map((r) => ({ id: r.id, name: r.name, color: r.hexColor }))
|
|
325
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
326
|
+
|
|
327
|
+
// Get guild channels for level up messages
|
|
328
|
+
const channels = guild.channels.cache
|
|
329
|
+
.filter((c) => c.type === 0)
|
|
330
|
+
.map((c) => ({ id: c.id, name: c.name }))
|
|
331
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
332
|
+
|
|
269
333
|
res.render("levels", {
|
|
270
334
|
guild,
|
|
271
335
|
leaderboard: leaderboardData,
|
|
272
336
|
page: "levels",
|
|
273
337
|
botStats: getBotStats(),
|
|
338
|
+
databaseEnabled,
|
|
339
|
+
mongoConnected,
|
|
340
|
+
configSource,
|
|
341
|
+
levelConfigDb,
|
|
342
|
+
roles,
|
|
343
|
+
channels,
|
|
344
|
+
canModify,
|
|
274
345
|
});
|
|
275
346
|
});
|
|
276
347
|
|
|
348
|
+
// Middleware للتحقق من إمكانية التعديل عبر الداش بورد
|
|
349
|
+
function canModifySettings(req, res, next) {
|
|
350
|
+
if (options.Dashboard === false) {
|
|
351
|
+
return res.status(403).json({ success: false, error: "تم تعطيل التعديل من الداش بورد في ملف الإعدادات الرئيسي للبوت." });
|
|
352
|
+
}
|
|
353
|
+
next();
|
|
354
|
+
}
|
|
355
|
+
|
|
277
356
|
// API للحصول على بيانات مستخدم
|
|
278
357
|
app.get("/api/:guildId/user/:userId", isAuthenticated, async (req, res) => {
|
|
279
358
|
if (!Level) return res.json({ error: "Level system not available" });
|
|
@@ -487,7 +566,7 @@ function dashboard(client, options) {
|
|
|
487
566
|
});
|
|
488
567
|
|
|
489
568
|
// API - تحديث القناة الافتراضية
|
|
490
|
-
app.post("/api/:guildId/logs/channel", isAuthenticated, async (req, res) => {
|
|
569
|
+
app.post("/api/:guildId/logs/channel", isAuthenticated, canModifySettings, async (req, res) => {
|
|
491
570
|
const logData = getLogConfigData();
|
|
492
571
|
if (!logData.databaseEnabled)
|
|
493
572
|
return res.json({ error: "يجب تفعيل وضع Database لتعديل الإعدادات" });
|
|
@@ -510,7 +589,7 @@ function dashboard(client, options) {
|
|
|
510
589
|
});
|
|
511
590
|
|
|
512
591
|
// API - تفعيل/تعطيل حدث
|
|
513
|
-
app.post("/api/:guildId/logs/toggle", isAuthenticated, async (req, res) => {
|
|
592
|
+
app.post("/api/:guildId/logs/toggle", isAuthenticated, canModifySettings, async (req, res) => {
|
|
514
593
|
const logData = getLogConfigData();
|
|
515
594
|
if (!logData.databaseEnabled)
|
|
516
595
|
return res.json({ error: "يجب تفعيل وضع Database لتعديل الإعدادات" });
|
|
@@ -544,7 +623,7 @@ function dashboard(client, options) {
|
|
|
544
623
|
});
|
|
545
624
|
|
|
546
625
|
// API - تحديث إعدادات حدث معين
|
|
547
|
-
app.post("/api/:guildId/logs/event", isAuthenticated, async (req, res) => {
|
|
626
|
+
app.post("/api/:guildId/logs/event", isAuthenticated, canModifySettings, async (req, res) => {
|
|
548
627
|
const logData = getLogConfigData();
|
|
549
628
|
if (!logData.databaseEnabled)
|
|
550
629
|
return res.json({ error: "يجب تفعيل وضع Database لتعديل الإعدادات" });
|
|
@@ -593,7 +672,7 @@ function dashboard(client, options) {
|
|
|
593
672
|
});
|
|
594
673
|
|
|
595
674
|
// API - إعادة تعيين إعدادات السجلات
|
|
596
|
-
app.post("/api/:guildId/logs/reset", isAuthenticated, async (req, res) => {
|
|
675
|
+
app.post("/api/:guildId/logs/reset", isAuthenticated, canModifySettings, async (req, res) => {
|
|
597
676
|
const logData = getLogConfigData();
|
|
598
677
|
if (!logData.databaseEnabled)
|
|
599
678
|
return res.json({ error: "يجب تفعيل وضع Database لتعديل الإعدادات" });
|
|
@@ -787,66 +866,238 @@ function dashboard(client, options) {
|
|
|
787
866
|
|
|
788
867
|
// ==================== API للمستويات ====================
|
|
789
868
|
// تحديث مستوى مستخدم
|
|
790
|
-
app.post("/api/:guildId/level/update", isAuthenticated, async (req, res) => {
|
|
869
|
+
app.post("/api/:guildId/level/update", isAuthenticated, canModifySettings, async (req, res) => {
|
|
791
870
|
const { userId, xp, level } = req.body;
|
|
792
871
|
const guildId = req.params.guildId;
|
|
793
872
|
|
|
794
873
|
try {
|
|
795
|
-
if (Level) {
|
|
874
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
875
|
+
|
|
876
|
+
if (level !== undefined) {
|
|
877
|
+
// تعيين المستوى مباشرة
|
|
878
|
+
const config = await getGuildConfig(guildId);
|
|
879
|
+
const totalXP = xpNeeded(level - 1, config || {});
|
|
796
880
|
await Level.findOneAndUpdate(
|
|
797
|
-
{
|
|
798
|
-
{
|
|
881
|
+
{ userId, guildId },
|
|
882
|
+
{ userId, guildId, level, totalXP },
|
|
883
|
+
{ upsert: true, new: true }
|
|
884
|
+
);
|
|
885
|
+
} else if (xp !== undefined) {
|
|
886
|
+
// تعيين XP مباشرة
|
|
887
|
+
const config = await getGuildConfig(guildId);
|
|
888
|
+
const newLevel = calculateLevel(xp, config || {});
|
|
889
|
+
await Level.findOneAndUpdate(
|
|
890
|
+
{ userId, guildId },
|
|
891
|
+
{ userId, guildId, totalXP: xp, level: newLevel },
|
|
799
892
|
{ upsert: true, new: true }
|
|
800
893
|
);
|
|
801
|
-
return res.json({ success: true });
|
|
802
894
|
}
|
|
803
|
-
res.json({
|
|
895
|
+
return res.json({ success: true });
|
|
896
|
+
} catch (e) {
|
|
897
|
+
res.json({ success: false, error: e.message });
|
|
898
|
+
}
|
|
899
|
+
});
|
|
900
|
+
|
|
901
|
+
// تعيين مستوى مستخدم مباشرة
|
|
902
|
+
app.post("/api/:guildId/level/set", isAuthenticated, canModifySettings, async (req, res) => {
|
|
903
|
+
const { userId, level } = req.body;
|
|
904
|
+
const guildId = req.params.guildId;
|
|
905
|
+
|
|
906
|
+
try {
|
|
907
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
908
|
+
const config = await getGuildConfig(guildId);
|
|
909
|
+
const totalXP = xpNeeded(level - 1, config || {});
|
|
910
|
+
await Level.findOneAndUpdate(
|
|
911
|
+
{ userId, guildId },
|
|
912
|
+
{ userId, guildId, level, totalXP },
|
|
913
|
+
{ upsert: true, new: true }
|
|
914
|
+
);
|
|
915
|
+
return res.json({ success: true });
|
|
916
|
+
} catch (e) {
|
|
917
|
+
res.json({ success: false, error: e.message });
|
|
918
|
+
}
|
|
919
|
+
});
|
|
920
|
+
|
|
921
|
+
// تعيين XP مستخدم مباشرة
|
|
922
|
+
app.post("/api/:guildId/level/setxp", isAuthenticated, canModifySettings, async (req, res) => {
|
|
923
|
+
const { userId, xp } = req.body;
|
|
924
|
+
const guildId = req.params.guildId;
|
|
925
|
+
|
|
926
|
+
try {
|
|
927
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
928
|
+
const config = await getGuildConfig(guildId);
|
|
929
|
+
const level = calculateLevel(xp, config || {});
|
|
930
|
+
await Level.findOneAndUpdate(
|
|
931
|
+
{ userId, guildId },
|
|
932
|
+
{ userId, guildId, totalXP: xp, level },
|
|
933
|
+
{ upsert: true, new: true }
|
|
934
|
+
);
|
|
935
|
+
return res.json({ success: true });
|
|
804
936
|
} catch (e) {
|
|
805
937
|
res.json({ success: false, error: e.message });
|
|
806
938
|
}
|
|
807
939
|
});
|
|
808
940
|
|
|
809
941
|
// إضافة XP لمستخدم
|
|
810
|
-
app.post("/api/:guildId/level/add", isAuthenticated, async (req, res) => {
|
|
811
|
-
const { userId, xp
|
|
942
|
+
app.post("/api/:guildId/level/add", isAuthenticated, canModifySettings, async (req, res) => {
|
|
943
|
+
const { userId, xp } = req.body;
|
|
812
944
|
const guildId = req.params.guildId;
|
|
813
945
|
|
|
814
946
|
try {
|
|
815
|
-
if (Level) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
}
|
|
831
|
-
return res.json({ success: true });
|
|
947
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
948
|
+
|
|
949
|
+
const config = await getGuildConfig(guildId);
|
|
950
|
+
const existing = await Level.findOne({ guildId, userId });
|
|
951
|
+
if (existing) {
|
|
952
|
+
existing.totalXP += xp;
|
|
953
|
+
existing.level = calculateLevel(existing.totalXP, config || {});
|
|
954
|
+
await existing.save();
|
|
955
|
+
} else {
|
|
956
|
+
await Level.create({
|
|
957
|
+
guildId,
|
|
958
|
+
userId,
|
|
959
|
+
totalXP: xp,
|
|
960
|
+
level: calculateLevel(xp, config || {}),
|
|
961
|
+
text: xp,
|
|
962
|
+
});
|
|
832
963
|
}
|
|
833
|
-
res.json({
|
|
964
|
+
return res.json({ success: true });
|
|
834
965
|
} catch (e) {
|
|
835
966
|
res.json({ success: false, error: e.message });
|
|
836
967
|
}
|
|
837
968
|
});
|
|
838
969
|
|
|
839
|
-
// إعادة تعيين مستوى مستخدم
|
|
840
|
-
app.post("/api/:guildId/level/reset", isAuthenticated, async (req, res) => {
|
|
970
|
+
// إعادة تعيين مستوى مستخدم (استخدام resetUser)
|
|
971
|
+
app.post("/api/:guildId/level/reset", isAuthenticated, canModifySettings, async (req, res) => {
|
|
841
972
|
const { userId } = req.body;
|
|
842
973
|
const guildId = req.params.guildId;
|
|
843
974
|
|
|
844
975
|
try {
|
|
845
|
-
if (Level) {
|
|
846
|
-
|
|
847
|
-
|
|
976
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
977
|
+
await resetUser(userId, guildId);
|
|
978
|
+
return res.json({ success: true });
|
|
979
|
+
} catch (e) {
|
|
980
|
+
res.json({ success: false, error: e.message });
|
|
981
|
+
}
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
// الحصول على ترتيب مستخدم
|
|
985
|
+
app.get("/api/:guildId/level/rank/:userId", isAuthenticated, async (req, res) => {
|
|
986
|
+
const { guildId, userId } = req.params;
|
|
987
|
+
|
|
988
|
+
try {
|
|
989
|
+
if (!Level) return res.json({ error: "Level system not available" });
|
|
990
|
+
const rank = await getUserRank(userId, guildId);
|
|
991
|
+
const userData = await Level.findOne({ guildId, userId });
|
|
992
|
+
res.json({
|
|
993
|
+
rank,
|
|
994
|
+
level: userData?.level || 0,
|
|
995
|
+
totalXP: userData?.totalXP || 0,
|
|
996
|
+
xpForNext: xpNeeded((userData?.level || 0) + 1)
|
|
997
|
+
});
|
|
998
|
+
} catch (e) {
|
|
999
|
+
res.json({ error: e.message });
|
|
1000
|
+
}
|
|
1001
|
+
});
|
|
1002
|
+
|
|
1003
|
+
// ==================== API إعدادات Level System ====================
|
|
1004
|
+
|
|
1005
|
+
// الحصول على إعدادات السيرفر
|
|
1006
|
+
app.get("/api/:guildId/level/config", isAuthenticated, async (req, res) => {
|
|
1007
|
+
try {
|
|
1008
|
+
const config = await getGuildConfig(req.params.guildId);
|
|
1009
|
+
const usesDashboardMode = client.levelDashboardGuilds && client.levelDashboardGuilds.has(req.params.guildId);
|
|
1010
|
+
res.json({ databaseEnabled: usesDashboardMode, config: config || null });
|
|
1011
|
+
} catch (e) {
|
|
1012
|
+
res.json({ error: e.message });
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
1015
|
+
|
|
1016
|
+
// إضافة/تعديل Role Reward
|
|
1017
|
+
app.post("/api/:guildId/level/config/role", isAuthenticated, canModifySettings, async (req, res) => {
|
|
1018
|
+
const { level, roleId } = req.body;
|
|
1019
|
+
const guildId = req.params.guildId;
|
|
1020
|
+
|
|
1021
|
+
try {
|
|
1022
|
+
const config = await getGuildConfig(guildId) || {};
|
|
1023
|
+
const roleReward = config.roleReward || {};
|
|
1024
|
+
|
|
1025
|
+
if (roleId) {
|
|
1026
|
+
roleReward[level] = roleId;
|
|
1027
|
+
} else {
|
|
1028
|
+
delete roleReward[level];
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
await updateGuildConfig(guildId, { roleReward });
|
|
1032
|
+
res.json({ success: true, roleReward });
|
|
1033
|
+
} catch (e) {
|
|
1034
|
+
res.json({ success: false, error: e.message });
|
|
1035
|
+
}
|
|
1036
|
+
});
|
|
1037
|
+
|
|
1038
|
+
// تحديث إعدادات XP
|
|
1039
|
+
app.post("/api/:guildId/level/config/xp", isAuthenticated, canModifySettings, async (req, res) => {
|
|
1040
|
+
const { minXP, maxXP, xpMultiplier, maxLevel, cooldown, leveling } = req.body;
|
|
1041
|
+
const guildId = req.params.guildId;
|
|
1042
|
+
|
|
1043
|
+
try {
|
|
1044
|
+
const updates = {};
|
|
1045
|
+
if (minXP !== undefined) updates.minXP = minXP;
|
|
1046
|
+
if (maxXP !== undefined) updates.maxXP = maxXP;
|
|
1047
|
+
if (xpMultiplier !== undefined) updates.xpMultiplier = xpMultiplier;
|
|
1048
|
+
if (maxLevel !== undefined) updates.maxLevel = maxLevel;
|
|
1049
|
+
if (cooldown !== undefined) updates.cooldown = cooldown;
|
|
1050
|
+
if (leveling !== undefined) updates.leveling = leveling;
|
|
1051
|
+
|
|
1052
|
+
await updateGuildConfig(guildId, updates);
|
|
1053
|
+
res.json({ success: true });
|
|
1054
|
+
} catch (e) {
|
|
1055
|
+
res.json({ success: false, error: e.message });
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
|
|
1059
|
+
// إضافة/إزالة قناة من Blacklist
|
|
1060
|
+
app.post("/api/:guildId/level/config/blacklist", isAuthenticated, canModifySettings, async (req, res) => {
|
|
1061
|
+
const { channelId, action } = req.body; // action: "add" | "remove"
|
|
1062
|
+
const guildId = req.params.guildId;
|
|
1063
|
+
|
|
1064
|
+
try {
|
|
1065
|
+
const config = await getGuildConfig(guildId) || {};
|
|
1066
|
+
let blacklistedChannels = config.blacklistedChannels || [];
|
|
1067
|
+
|
|
1068
|
+
if (action === "add" && !blacklistedChannels.includes(channelId)) {
|
|
1069
|
+
blacklistedChannels.push(channelId);
|
|
1070
|
+
} else if (action === "remove") {
|
|
1071
|
+
blacklistedChannels = blacklistedChannels.filter(id => id !== channelId);
|
|
848
1072
|
}
|
|
849
|
-
|
|
1073
|
+
|
|
1074
|
+
await updateGuildConfig(guildId, { blacklistedChannels });
|
|
1075
|
+
res.json({ success: true, blacklistedChannels });
|
|
1076
|
+
} catch (e) {
|
|
1077
|
+
res.json({ success: false, error: e.message });
|
|
1078
|
+
}
|
|
1079
|
+
});
|
|
1080
|
+
|
|
1081
|
+
// تفعيل/تعطيل نظام Level للسيرفر
|
|
1082
|
+
app.post("/api/:guildId/level/config/toggle", isAuthenticated, canModifySettings, async (req, res) => {
|
|
1083
|
+
const { disabled } = req.body;
|
|
1084
|
+
const guildId = req.params.guildId;
|
|
1085
|
+
|
|
1086
|
+
try {
|
|
1087
|
+
await updateGuildConfig(guildId, { disabled: !!disabled });
|
|
1088
|
+
res.json({ success: true });
|
|
1089
|
+
} catch (e) {
|
|
1090
|
+
res.json({ success: false, error: e.message });
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
|
|
1094
|
+
// إعادة تعيين إعدادات السيرفر
|
|
1095
|
+
app.post("/api/:guildId/level/config/reset", isAuthenticated, canModifySettings, async (req, res) => {
|
|
1096
|
+
const guildId = req.params.guildId;
|
|
1097
|
+
|
|
1098
|
+
try {
|
|
1099
|
+
await deleteGuildConfig(guildId);
|
|
1100
|
+
res.json({ success: true });
|
|
850
1101
|
} catch (e) {
|
|
851
1102
|
res.json({ success: false, error: e.message });
|
|
852
1103
|
}
|
package/function/function.js
CHANGED
|
@@ -158,7 +158,7 @@ function CreateRow(components, rowOnly = false) {
|
|
|
158
158
|
throw new Error("Components should be an array.");
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
let actionRows = [];
|
|
162
162
|
|
|
163
163
|
components.forEach((component) => {
|
|
164
164
|
if (!component.type) {
|
|
@@ -225,7 +225,7 @@ function CreateRow(components, rowOnly = false) {
|
|
|
225
225
|
description: item[description]?.slice(0, 100) || undefined,
|
|
226
226
|
emoji: item[emoji] || undefined,
|
|
227
227
|
value: item[value] || `${index}`,
|
|
228
|
-
default: item.default || false,
|
|
228
|
+
default: item.default || false,
|
|
229
229
|
}));
|
|
230
230
|
selectMenu.addOptions(selectOptions);
|
|
231
231
|
}
|
|
@@ -235,10 +235,13 @@ function CreateRow(components, rowOnly = false) {
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
if (defaultValues && Array.isArray(defaultValues)) {
|
|
238
|
-
let ty
|
|
238
|
+
let ty,
|
|
239
|
+
all = [];
|
|
239
240
|
if (type === "user") ty = selectMenu.setDefaultUsers(...defaultValues);
|
|
240
|
-
else if (type === "role")
|
|
241
|
-
|
|
241
|
+
else if (type === "role")
|
|
242
|
+
ty = selectMenu.setDefaultRoles(...defaultValues);
|
|
243
|
+
else if (type === "channel")
|
|
244
|
+
ty = selectMenu.setDefaultChannels(...defaultValues);
|
|
242
245
|
for (const val of defaultValues) {
|
|
243
246
|
all.push({ type: ty, id: val });
|
|
244
247
|
}
|
|
@@ -248,11 +251,11 @@ function CreateRow(components, rowOnly = false) {
|
|
|
248
251
|
selectMenu.setDisabled(options.disabled);
|
|
249
252
|
}
|
|
250
253
|
|
|
251
|
-
|
|
252
254
|
if (rowOnly) {
|
|
253
|
-
|
|
255
|
+
actionRows = selectMenu;
|
|
256
|
+
} else {
|
|
257
|
+
actionRows.push(new ActionRowBuilder().addComponents(selectMenu));
|
|
254
258
|
}
|
|
255
|
-
actionRows.push(new ActionRowBuilder().addComponents(selectMenu));
|
|
256
259
|
} else {
|
|
257
260
|
throw new Error("Invalid component format");
|
|
258
261
|
}
|
|
@@ -281,10 +284,8 @@ async function CreateModal(options) {
|
|
|
281
284
|
required,
|
|
282
285
|
value,
|
|
283
286
|
} = component;
|
|
284
|
-
const input = new TextInputBuilder()
|
|
285
|
-
|
|
286
|
-
.setPlaceholder(placeholder)
|
|
287
|
-
.setStyle(style);
|
|
287
|
+
const input = new TextInputBuilder().setCustomId(id).setStyle(style);
|
|
288
|
+
if (placeholder) input.setPlaceholder(placeholder);
|
|
288
289
|
if (required !== undefined) input.setRequired(required);
|
|
289
290
|
if (minLength) input.setMinLength(minLength);
|
|
290
291
|
if (maxLength) input.setMaxLength(maxLength);
|
|
@@ -299,17 +300,30 @@ async function CreateModal(options) {
|
|
|
299
300
|
} else if (com.type === "menu") {
|
|
300
301
|
const { type, options } = com.components;
|
|
301
302
|
|
|
303
|
+
const selectMenu = await CreateRow(
|
|
304
|
+
[
|
|
305
|
+
{
|
|
306
|
+
type: type,
|
|
307
|
+
options: options,
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
true,
|
|
311
|
+
);
|
|
302
312
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
.
|
|
312
|
-
|
|
313
|
+
const menu = new LabelBuilder().setLabel(
|
|
314
|
+
options.mine_label || "Select an option",
|
|
315
|
+
);
|
|
316
|
+
if (type === "string") {
|
|
317
|
+
menu.setStringSelectMenuComponent(selectMenu);
|
|
318
|
+
} else if (type === "user") {
|
|
319
|
+
menu.setUserSelectMenuComponent(selectMenu);
|
|
320
|
+
} else if (type === "role") {
|
|
321
|
+
menu.setRoleSelectMenuComponent(selectMenu);
|
|
322
|
+
} else if (type === "channel") {
|
|
323
|
+
menu.setChannelSelectMenuComponent(selectMenu);
|
|
324
|
+
}
|
|
325
|
+
if (options.mine_description)
|
|
326
|
+
menu.setDescription(options.mine_description);
|
|
313
327
|
|
|
314
328
|
modal.addLabelComponents(menu);
|
|
315
329
|
} else if (com.type === "file") {
|
|
@@ -318,13 +332,13 @@ async function CreateModal(options) {
|
|
|
318
332
|
const fileUpload = new LabelBuilder().setLabel(label);
|
|
319
333
|
if (description) fileUpload.setDescription(description);
|
|
320
334
|
fileUpload.setFileUploadComponent(
|
|
321
|
-
new FileUploadBuilder().setCustomId(id)
|
|
335
|
+
new FileUploadBuilder().setCustomId(id),
|
|
322
336
|
);
|
|
323
337
|
|
|
324
338
|
modal.addLabelComponents(fileUpload);
|
|
325
|
-
} else if (com.type === "
|
|
326
|
-
const {
|
|
327
|
-
const text = new TextDisplayBuilder().setContent(
|
|
339
|
+
} else if (com.type === "text") {
|
|
340
|
+
const { content } = com.components;
|
|
341
|
+
const text = new TextDisplayBuilder().setContent(content);
|
|
328
342
|
|
|
329
343
|
modal.addTextDisplayComponents(text);
|
|
330
344
|
}
|
|
@@ -353,7 +367,7 @@ async function CreateComponents(type, components) {
|
|
|
353
367
|
}
|
|
354
368
|
} else if (item.type === "separator") {
|
|
355
369
|
const separator = new SeparatorBuilder().setDivider(
|
|
356
|
-
item.divider || false
|
|
370
|
+
item.divider || false,
|
|
357
371
|
);
|
|
358
372
|
if (item.spacing) separator.setSpacing(item.spacing);
|
|
359
373
|
|
|
@@ -389,10 +403,7 @@ async function CreateComponents(type, components) {
|
|
|
389
403
|
result.push(file);
|
|
390
404
|
}
|
|
391
405
|
} else if (item.type === "button") {
|
|
392
|
-
|
|
393
|
-
const but = await CreateRow([
|
|
394
|
-
item.components
|
|
395
|
-
])
|
|
406
|
+
const but = await CreateRow([item.components]);
|
|
396
407
|
if (type === "container") {
|
|
397
408
|
result.addActionRowComponents(but);
|
|
398
409
|
} else {
|
|
@@ -401,13 +412,13 @@ const but = await CreateRow([
|
|
|
401
412
|
} else if (item.type === "menu") {
|
|
402
413
|
const menu_type = item.components.type;
|
|
403
414
|
const options = item.components.options;
|
|
404
|
-
|
|
405
|
-
const menu = await CreateRow([
|
|
406
|
-
{
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
])
|
|
415
|
+
|
|
416
|
+
const menu = await CreateRow([
|
|
417
|
+
{
|
|
418
|
+
type: menu_type,
|
|
419
|
+
options: options,
|
|
420
|
+
},
|
|
421
|
+
]);
|
|
411
422
|
if (type === "container") {
|
|
412
423
|
result.addActionRowComponents(menu);
|
|
413
424
|
} else {
|
|
@@ -418,7 +429,7 @@ const menu = await CreateRow([
|
|
|
418
429
|
|
|
419
430
|
if (item.content) {
|
|
420
431
|
section.addTextDisplayComponents(
|
|
421
|
-
new TextDisplayBuilder().setContent(item.content)
|
|
432
|
+
new TextDisplayBuilder().setContent(item.content),
|
|
422
433
|
);
|
|
423
434
|
}
|
|
424
435
|
|