levix-bot 2.0.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.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/SETUP.md +242 -0
- package/app.cjs +337 -0
- package/bin/levix.js +7 -0
- package/deploy/install.sh +182 -0
- package/deploy/levix.service +56 -0
- package/deploy/nginx/levix.leviro.net.conf +79 -0
- package/package.json +78 -0
- package/public/brand/apple-touch-icon.png +0 -0
- package/public/brand/banner.jpg +0 -0
- package/public/brand/banner.webp +0 -0
- package/public/brand/icon-16.png +0 -0
- package/public/brand/icon-192.png +0 -0
- package/public/brand/icon-32.png +0 -0
- package/public/brand/icon-512.png +0 -0
- package/public/brand/icon-512.webp +0 -0
- package/public/brand/mark.png +0 -0
- package/public/brand/mark.svg +16 -0
- package/public/brand/mark.webp +0 -0
- package/public/brand/wordmark.png +0 -0
- package/public/brand/wordmark.webp +0 -0
- package/public/dashboard.css +881 -0
- package/public/dashboard.js +1057 -0
- package/public/logo.svg +16 -0
- package/public/qrcode.min.js +1 -0
- package/public/socket.io.min.js +7 -0
- package/scheduler.cjs +197 -0
- package/src/auth/auth-storage.cjs +74 -0
- package/src/auth/use-database-auth-state.js +130 -0
- package/src/bootstrap/core.js +74 -0
- package/src/bootstrap/events.cjs +43 -0
- package/src/bootstrap/panel.js +97 -0
- package/src/cli.js +153 -0
- package/src/commands/autoschedule.cjs +84 -0
- package/src/commands/blacklist.cjs +116 -0
- package/src/commands/block.cjs +70 -0
- package/src/commands/calc.cjs +387 -0
- package/src/commands/debt.cjs +175 -0
- package/src/commands/deleteschedule.cjs +36 -0
- package/src/commands/gemini.cjs +727 -0
- package/src/commands/group/add.cjs +136 -0
- package/src/commands/group/all.cjs +43 -0
- package/src/commands/group/antiSpam.cjs +96 -0
- package/src/commands/group/antilink.cjs +167 -0
- package/src/commands/group/approveall.cjs +54 -0
- package/src/commands/group/clearwarns.cjs +41 -0
- package/src/commands/group/deletenote.cjs +33 -0
- package/src/commands/group/demote.cjs +62 -0
- package/src/commands/group/kick.cjs +85 -0
- package/src/commands/group/media.cjs +120 -0
- package/src/commands/group/members.cjs +59 -0
- package/src/commands/group/note.cjs +32 -0
- package/src/commands/group/promote.cjs +60 -0
- package/src/commands/group/removeall.cjs +42 -0
- package/src/commands/group/rules.cjs +31 -0
- package/src/commands/group/save.cjs +36 -0
- package/src/commands/group/setname.cjs +41 -0
- package/src/commands/group/setpp.cjs +51 -0
- package/src/commands/group/setrules.cjs +46 -0
- package/src/commands/group/setwarn.cjs +58 -0
- package/src/commands/group/tagadmins.cjs +50 -0
- package/src/commands/group/warn.cjs +105 -0
- package/src/commands/group/warns.cjs +66 -0
- package/src/commands/group/welcome.cjs +109 -0
- package/src/commands/group.cjs +160 -0
- package/src/commands/help.cjs +230 -0
- package/src/commands/listschedules.cjs +47 -0
- package/src/commands/loop.cjs +163 -0
- package/src/commands/memory.cjs +201 -0
- package/src/commands/mod.cjs +155 -0
- package/src/commands/notes.cjs +28 -0
- package/src/commands/perm.cjs +236 -0
- package/src/commands/ping.cjs +17 -0
- package/src/commands/poll.cjs +80 -0
- package/src/commands/prayer.cjs +64 -0
- package/src/commands/qr.cjs +39 -0
- package/src/commands/rand.cjs +130 -0
- package/src/commands/restart.cjs +25 -0
- package/src/commands/schedule.cjs +86 -0
- package/src/commands/score.cjs +130 -0
- package/src/commands/setprefix.cjs +40 -0
- package/src/commands/shortlink.cjs +74 -0
- package/src/commands/shutdown.cjs +45 -0
- package/src/commands/status.cjs +75 -0
- package/src/commands/stt.cjs +150 -0
- package/src/commands/todo.cjs +88 -0
- package/src/commands/tts.cjs +170 -0
- package/src/commands/unblock.cjs +57 -0
- package/src/commands/weather.cjs +79 -0
- package/src/config/ai-persona.md +17 -0
- package/src/config/baileys.config.js +51 -0
- package/src/config/brand.cjs +36 -0
- package/src/config/brand.esm.js +17 -0
- package/src/config/constants.js +16 -0
- package/src/config/defaults.cjs +91 -0
- package/src/config/lock.cjs +110 -0
- package/src/config/paths.cjs +90 -0
- package/src/config/runtime-config.cjs +219 -0
- package/src/config/secrets.cjs +130 -0
- package/src/config/settings.cjs +386 -0
- package/src/core/connection.js +199 -0
- package/src/core/events.js +61 -0
- package/src/core/socket.js +64 -0
- package/src/db/db.cjs +282 -0
- package/src/db/store.cjs +837 -0
- package/src/db/store.esm.js +17 -0
- package/src/domain/caddy.js +120 -0
- package/src/domain/command.js +380 -0
- package/src/domain/detect.js +173 -0
- package/src/domain/nginx.js +138 -0
- package/src/domain/system.js +148 -0
- package/src/handlers/command.handler.js +414 -0
- package/src/handlers/group.handler.js +73 -0
- package/src/handlers/message.handler.js +149 -0
- package/src/index.js +217 -0
- package/src/middleware/antispam.middleware.js +68 -0
- package/src/middleware/blacklist.middleware.js +29 -0
- package/src/middleware/forward-tracking.middleware.js +49 -0
- package/src/middleware/permissions.middleware.js +114 -0
- package/src/routes/dashboard.api.esm.js +779 -0
- package/src/services/aiAgent.cjs +317 -0
- package/src/services/aiTools.cjs +635 -0
- package/src/utils/datetime.cjs +61 -0
- package/src/utils/lid-helper.esm.js +143 -0
- package/src/utils/logger.cjs +72 -0
- package/src/utils/memory.cjs +385 -0
- package/src/utils/normalizeJid.cjs +65 -0
- package/src/utils/normalizeJid.esm.js +37 -0
- package/src/utils/openBrowser.cjs +129 -0
- package/src/utils/permissions.cjs +154 -0
- package/src/utils/permissions.esm.js +375 -0
- package/src/utils/recentMessageCache.esm.js +70 -0
- package/src/utils/requestOrigin.cjs +102 -0
- package/src/utils/sendBotMessage.cjs +43 -0
- package/src/utils/sendBotMessage.esm.js +139 -0
- package/src/utils/statusMessage.cjs +179 -0
- package/src/utils/storage-hub.cjs +49 -0
- package/src/utils/storage-hub.esm.js +24 -0
- package/src/utils/storage.cjs +80 -0
- package/src/utils/storage.esm.js +88 -0
- package/src/utils/textDecode.cjs +197 -0
- package/src/utils/thumbnail.cjs +591 -0
- package/src/utils/typing.esm.js +102 -0
- package/views/dashboard.ejs +329 -0
- package/views/login.ejs +105 -0
- package/views/qr.ejs +108 -0
- package/views/setup.ejs +122 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// file: /middleware/permissions.middleware.js
|
|
2
|
+
import { createRequire } from "module";
|
|
3
|
+
import {
|
|
4
|
+
isOwnerJid,
|
|
5
|
+
isBotAdminUser,
|
|
6
|
+
isAdminInGroup,
|
|
7
|
+
isBotAdminInGroup,
|
|
8
|
+
getSenderId,
|
|
9
|
+
getSenderCandidates,
|
|
10
|
+
} from "../utils/permissions.esm.js";
|
|
11
|
+
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const runtimeConfig = require("../config/runtime-config.cjs");
|
|
14
|
+
const logger = require("../utils/logger.cjs");
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the permission level in force for a command name — the dashboard
|
|
18
|
+
* override if the operator set one, otherwise the default from defaults.cjs
|
|
19
|
+
* (see src/config/runtime-config.cjs).
|
|
20
|
+
*
|
|
21
|
+
* The `group` command is special: its config entry is an object with
|
|
22
|
+
* sub_commands, and runtime-config folds that to its `default_permission`,
|
|
23
|
+
* which is the least-privileged level that lets group.cjs route to a
|
|
24
|
+
* sub-command. The sub-command itself then enforces the precise level.
|
|
25
|
+
*/
|
|
26
|
+
function resolvePermissionLevel(commandName) {
|
|
27
|
+
return runtimeConfig.getPermission(commandName);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Check if user has permission to execute a command.
|
|
32
|
+
*
|
|
33
|
+
* @param {string} commandName - Canonical command name
|
|
34
|
+
* @param {object} msg - Baileys message
|
|
35
|
+
* @param {object} groupMetadata - Group metadata (null for private chats)
|
|
36
|
+
* @param {object} sock - Baileys socket
|
|
37
|
+
* @returns {{hasPermission: boolean, reason: string, isOwner: boolean, isSenderAdmin: boolean}}
|
|
38
|
+
*/
|
|
39
|
+
export function checkCommandPermission(commandName, msg, groupMetadata, sock) {
|
|
40
|
+
const isGroup = msg.key.remoteJid?.endsWith("@g.us");
|
|
41
|
+
const senderId = getSenderId(msg, sock);
|
|
42
|
+
|
|
43
|
+
// v7/LID: check every identifier the sender could appear under (LID + PN
|
|
44
|
+
// alternates), so owner/admin detection isn't defeated by a LID<->PN mismatch.
|
|
45
|
+
const senderCandidates = getSenderCandidates(msg, sock);
|
|
46
|
+
const candidates = senderCandidates.length ? senderCandidates : [senderId];
|
|
47
|
+
|
|
48
|
+
// fromMe is an immediate owner indicator (the bot is always its own owner).
|
|
49
|
+
let isOwner = msg.key.fromMe || candidates.some((c) => isOwnerJid(c));
|
|
50
|
+
|
|
51
|
+
// Bot-level admins (granted with `!perm add admin`, from the dashboard, or by
|
|
52
|
+
// asking the AI) count as admins everywhere — including DMs, where there is
|
|
53
|
+
// no group roster to consult.
|
|
54
|
+
const isBotAdmin = !isOwner && candidates.some((c) => isBotAdminUser(c));
|
|
55
|
+
|
|
56
|
+
const isSenderAdmin =
|
|
57
|
+
isBotAdmin ||
|
|
58
|
+
(isGroup ? candidates.some((c) => isAdminInGroup(groupMetadata, c)) : false);
|
|
59
|
+
|
|
60
|
+
const permissionLevel = resolvePermissionLevel(commandName);
|
|
61
|
+
|
|
62
|
+
let hasPermission = false;
|
|
63
|
+
let reason = "";
|
|
64
|
+
|
|
65
|
+
switch (permissionLevel) {
|
|
66
|
+
case "MEMBERS":
|
|
67
|
+
case "ALL":
|
|
68
|
+
hasPermission = true;
|
|
69
|
+
break;
|
|
70
|
+
|
|
71
|
+
case "OWNER_ONLY":
|
|
72
|
+
hasPermission = isOwner;
|
|
73
|
+
reason = "🚫 هذا الأمر متاح للمالك فقط.";
|
|
74
|
+
break;
|
|
75
|
+
|
|
76
|
+
case "ADMINS_ONLY":
|
|
77
|
+
if (!isGroup) {
|
|
78
|
+
// Owners and bot-admins can run admin-only commands from anywhere —
|
|
79
|
+
// useful for the operator pinging the bot privately to manage a group.
|
|
80
|
+
hasPermission = isOwner || isBotAdmin;
|
|
81
|
+
reason = "⚠️ هذا الأمر يعمل في المجموعات فقط (أو للمالك في الخاص).";
|
|
82
|
+
} else {
|
|
83
|
+
hasPermission = isSenderAdmin || isOwner;
|
|
84
|
+
reason = "🚫 هذا الأمر متاح للمشرفين فقط.";
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case "ADMINS_OWNER":
|
|
89
|
+
if (!isGroup) {
|
|
90
|
+
hasPermission = isOwner || isBotAdmin;
|
|
91
|
+
reason = "⚠️ هذا الأمر يعمل في المجموعات أو للمالك فقط.";
|
|
92
|
+
} else {
|
|
93
|
+
hasPermission = isOwner || isSenderAdmin;
|
|
94
|
+
reason = "🚫 هذا الأمر متاح للمشرفين والمالك فقط.";
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
default:
|
|
99
|
+
logger.warn(
|
|
100
|
+
`Unknown permission level: ${permissionLevel} for command: ${commandName}`
|
|
101
|
+
);
|
|
102
|
+
hasPermission = false;
|
|
103
|
+
reason = "🚫 مستوى الصلاحية غير معروف.";
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return { hasPermission, reason, isOwner, isSenderAdmin, isBotAdmin };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Check if bot has admin role in the given group.
|
|
111
|
+
*/
|
|
112
|
+
export function checkBotAdmin(groupMetadata, sock) {
|
|
113
|
+
return isBotAdminInGroup(groupMetadata, sock);
|
|
114
|
+
}
|