@jackle.dev/zalox 1.0.1
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 +185 -0
- package/dist/cli/commands/admin.d.ts +17 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +359 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +88 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/autoreply.d.ts +12 -0
- package/dist/cli/commands/autoreply.d.ts.map +1 -0
- package/dist/cli/commands/autoreply.js +162 -0
- package/dist/cli/commands/autoreply.js.map +1 -0
- package/dist/cli/commands/bulk.d.ts +9 -0
- package/dist/cli/commands/bulk.d.ts.map +1 -0
- package/dist/cli/commands/bulk.js +169 -0
- package/dist/cli/commands/bulk.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +122 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/conv.d.ts +3 -0
- package/dist/cli/commands/conv.d.ts.map +1 -0
- package/dist/cli/commands/conv.js +229 -0
- package/dist/cli/commands/conv.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +13 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +102 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/export.d.ts +10 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +98 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/friend.d.ts +13 -0
- package/dist/cli/commands/friend.d.ts.map +1 -0
- package/dist/cli/commands/friend.js +337 -0
- package/dist/cli/commands/friend.js.map +1 -0
- package/dist/cli/commands/group-settings.d.ts +11 -0
- package/dist/cli/commands/group-settings.d.ts.map +1 -0
- package/dist/cli/commands/group-settings.js +154 -0
- package/dist/cli/commands/group-settings.js.map +1 -0
- package/dist/cli/commands/group.d.ts +14 -0
- package/dist/cli/commands/group.d.ts.map +1 -0
- package/dist/cli/commands/group.js +365 -0
- package/dist/cli/commands/group.js.map +1 -0
- package/dist/cli/commands/license.d.ts +13 -0
- package/dist/cli/commands/license.d.ts.map +1 -0
- package/dist/cli/commands/license.js +218 -0
- package/dist/cli/commands/license.js.map +1 -0
- package/dist/cli/commands/listen.d.ts +3 -0
- package/dist/cli/commands/listen.d.ts.map +1 -0
- package/dist/cli/commands/listen.js +177 -0
- package/dist/cli/commands/listen.js.map +1 -0
- package/dist/cli/commands/me.d.ts +9 -0
- package/dist/cli/commands/me.d.ts.map +1 -0
- package/dist/cli/commands/me.js +135 -0
- package/dist/cli/commands/me.js.map +1 -0
- package/dist/cli/commands/msg.d.ts +11 -0
- package/dist/cli/commands/msg.d.ts.map +1 -0
- package/dist/cli/commands/msg.js +255 -0
- package/dist/cli/commands/msg.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +3 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +50 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +12 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +175 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +87 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/template.d.ts +12 -0
- package/dist/cli/commands/template.d.ts.map +1 -0
- package/dist/cli/commands/template.js +163 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +63 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +144 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/core/autoreply.d.ts +57 -0
- package/dist/core/autoreply.d.ts.map +1 -0
- package/dist/core/autoreply.js +159 -0
- package/dist/core/autoreply.js.map +1 -0
- package/dist/core/bulk.d.ts +36 -0
- package/dist/core/bulk.d.ts.map +1 -0
- package/dist/core/bulk.js +117 -0
- package/dist/core/bulk.js.map +1 -0
- package/dist/core/client.d.ts +8 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +91 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/daemon.d.ts +30 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +213 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/dm-commands.d.ts +41 -0
- package/dist/core/dm-commands.d.ts.map +1 -0
- package/dist/core/dm-commands.js +313 -0
- package/dist/core/dm-commands.js.map +1 -0
- package/dist/core/export.d.ts +20 -0
- package/dist/core/export.d.ts.map +1 -0
- package/dist/core/export.js +92 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/gate.d.ts +39 -0
- package/dist/core/gate.d.ts.map +1 -0
- package/dist/core/gate.js +75 -0
- package/dist/core/gate.js.map +1 -0
- package/dist/core/group-settings.d.ts +35 -0
- package/dist/core/group-settings.d.ts.map +1 -0
- package/dist/core/group-settings.js +70 -0
- package/dist/core/group-settings.js.map +1 -0
- package/dist/core/index.d.ts +22 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/license.d.ts +103 -0
- package/dist/core/license.d.ts.map +1 -0
- package/dist/core/license.js +444 -0
- package/dist/core/license.js.map +1 -0
- package/dist/core/scheduler.d.ts +45 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +203 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/templates.d.ts +35 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +107 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +79 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +48 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/license-api.d.ts +55 -0
- package/dist/server/license-api.d.ts.map +1 -0
- package/dist/server/license-api.js +496 -0
- package/dist/server/license-api.js.map +1 -0
- package/dist/server/middleware.d.ts +18 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/webhook.d.ts +10 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +53 -0
- package/dist/server/webhook.js.map +1 -0
- package/dist/server/ws.d.ts +66 -0
- package/dist/server/ws.d.ts.map +1 -0
- package/dist/server/ws.js +203 -0
- package/dist/server/ws.js.map +1 -0
- package/dist/utils/cache.d.ts +35 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +78 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +88 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — DM Command Handler
|
|
3
|
+
*
|
|
4
|
+
* When running in daemon mode (standalone, no AI agent),
|
|
5
|
+
* the bot can respond to DM commands from the owner.
|
|
6
|
+
*
|
|
7
|
+
* Commands via Zalo DM:
|
|
8
|
+
* /help — Show available commands
|
|
9
|
+
* /status — Show bot status
|
|
10
|
+
* /rules — List auto-reply rules
|
|
11
|
+
* /rules on|off <id> — Toggle a rule
|
|
12
|
+
* /jobs — List scheduled jobs
|
|
13
|
+
* /jobs on|off <id> — Toggle a job
|
|
14
|
+
* /gs — List group settings
|
|
15
|
+
* /gs <groupId> autoReply on|off — Toggle group auto-reply
|
|
16
|
+
* /gs <groupId> welcome <text> — Set welcome message
|
|
17
|
+
* /send <id> <message> — Send message to someone
|
|
18
|
+
* /send-group <id> <message> — Send to group
|
|
19
|
+
* /broadcast <message> — Send to all friends (bulk)
|
|
20
|
+
* /templates — List templates
|
|
21
|
+
* /template send <name> <id> — Send template
|
|
22
|
+
* /friends — Friend count & recent online
|
|
23
|
+
* /groups — Group list
|
|
24
|
+
*/
|
|
25
|
+
import { ThreadType } from 'zca-js';
|
|
26
|
+
import { listRules, toggleRule } from './autoreply.js';
|
|
27
|
+
import { listJobs, toggleJob } from './scheduler.js';
|
|
28
|
+
import { getAllGroupSettings, setGroupSettings, getGroupSettings } from './group-settings.js';
|
|
29
|
+
import { listTemplates, getTemplate, renderTemplate } from './templates.js';
|
|
30
|
+
import { validateLicense, generateDeviceCode } from './license.js';
|
|
31
|
+
import { getDaemonStats } from './daemon.js';
|
|
32
|
+
/**
|
|
33
|
+
* Process a DM message as a bot command.
|
|
34
|
+
* Returns { handled: true, response } if it was a command.
|
|
35
|
+
* Returns { handled: false } if it's not a command (pass to auto-reply or agent).
|
|
36
|
+
*/
|
|
37
|
+
export async function handleDmCommand(message, ctx) {
|
|
38
|
+
const text = message.trim();
|
|
39
|
+
// Only handle messages starting with /
|
|
40
|
+
if (!text.startsWith('/')) {
|
|
41
|
+
return { handled: false };
|
|
42
|
+
}
|
|
43
|
+
// Owner check
|
|
44
|
+
if (ctx.ownerId && ctx.senderId !== ctx.ownerId) {
|
|
45
|
+
return { handled: true, response: '🔒 Bạn không có quyền sử dụng lệnh bot.' };
|
|
46
|
+
}
|
|
47
|
+
const parts = text.slice(1).split(/\s+/);
|
|
48
|
+
const cmd = parts[0]?.toLowerCase();
|
|
49
|
+
const args = parts.slice(1);
|
|
50
|
+
switch (cmd) {
|
|
51
|
+
case 'help':
|
|
52
|
+
case 'h':
|
|
53
|
+
return { handled: true, response: helpText() };
|
|
54
|
+
case 'status':
|
|
55
|
+
case 'st':
|
|
56
|
+
return { handled: true, response: statusText() };
|
|
57
|
+
case 'rules':
|
|
58
|
+
case 'r':
|
|
59
|
+
return handleRulesCommand(args);
|
|
60
|
+
case 'jobs':
|
|
61
|
+
case 'j':
|
|
62
|
+
return handleJobsCommand(args);
|
|
63
|
+
case 'gs':
|
|
64
|
+
return handleGroupSettingsCommand(args);
|
|
65
|
+
case 'templates':
|
|
66
|
+
case 'tmpl':
|
|
67
|
+
return handleTemplatesCommand();
|
|
68
|
+
case 'template':
|
|
69
|
+
return await handleTemplateSendCommand(args, ctx);
|
|
70
|
+
case 'send':
|
|
71
|
+
return await handleSendCommand(args, ctx, false);
|
|
72
|
+
case 'send-group':
|
|
73
|
+
case 'sg':
|
|
74
|
+
return await handleSendCommand(args, ctx, true);
|
|
75
|
+
case 'friends':
|
|
76
|
+
return { handled: true, response: '👥 Dùng CLI: zalox friend list\n(Chức năng friend count qua DM sắp có)' };
|
|
77
|
+
case 'groups':
|
|
78
|
+
return { handled: true, response: '👥 Dùng CLI: zalox group list\n(Chức năng group list qua DM sắp có)' };
|
|
79
|
+
default:
|
|
80
|
+
return { handled: true, response: `❓ Lệnh không hợp lệ: /${cmd}\nGõ /help để xem danh sách lệnh.` };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ── /help ────────────────────────────────────────────
|
|
84
|
+
function helpText() {
|
|
85
|
+
return `🤖 ZaloX Bot Commands
|
|
86
|
+
|
|
87
|
+
📊 Thông tin:
|
|
88
|
+
/status — Trạng thái bot
|
|
89
|
+
/rules — Danh sách auto-reply
|
|
90
|
+
/jobs — Danh sách lịch gửi
|
|
91
|
+
/gs — Cài đặt nhóm
|
|
92
|
+
/templates — Danh sách template
|
|
93
|
+
|
|
94
|
+
⚙️ Quản lý:
|
|
95
|
+
/rules on|off <id> — Bật/tắt rule
|
|
96
|
+
/jobs on|off <id> — Bật/tắt job
|
|
97
|
+
/gs <groupId> autoReply on|off
|
|
98
|
+
/gs <groupId> welcome <text>
|
|
99
|
+
|
|
100
|
+
📤 Gửi tin:
|
|
101
|
+
/send <userId> <message>
|
|
102
|
+
/send-group <groupId> <message>
|
|
103
|
+
/template send <name> <userId>
|
|
104
|
+
|
|
105
|
+
💡 Gõ /help để xem lại.`;
|
|
106
|
+
}
|
|
107
|
+
// ── /status ──────────────────────────────────────────
|
|
108
|
+
function statusText() {
|
|
109
|
+
const license = validateLicense();
|
|
110
|
+
const stats = getDaemonStats();
|
|
111
|
+
const device = generateDeviceCode();
|
|
112
|
+
const uptime = formatUptime(stats.startedAt);
|
|
113
|
+
const rules = listRules();
|
|
114
|
+
const jobs = listJobs();
|
|
115
|
+
const activeRules = rules.filter(r => r.enabled).length;
|
|
116
|
+
const activeJobs = jobs.filter(j => j.enabled).length;
|
|
117
|
+
return `📊 ZaloX Status
|
|
118
|
+
|
|
119
|
+
🔑 License: ${license.tier.toUpperCase()} ${license.valid ? '✅' : '❌'}
|
|
120
|
+
📱 Device: ${device}
|
|
121
|
+
⏱️ Uptime: ${uptime}
|
|
122
|
+
|
|
123
|
+
📨 Tin nhắn nhận: ${stats.messagesReceived}
|
|
124
|
+
🤖 Auto-reply đã gửi: ${stats.autoRepliesSent}
|
|
125
|
+
📅 Scheduled đã gửi: ${stats.scheduledSent}
|
|
126
|
+
❌ Lỗi: ${stats.errors}
|
|
127
|
+
|
|
128
|
+
📋 Rules: ${activeRules}/${rules.length} active
|
|
129
|
+
📅 Jobs: ${activeJobs}/${jobs.length} active`;
|
|
130
|
+
}
|
|
131
|
+
// ── /rules ───────────────────────────────────────────
|
|
132
|
+
function handleRulesCommand(args) {
|
|
133
|
+
// /rules on|off <id>
|
|
134
|
+
if (args.length >= 2 && (args[0] === 'on' || args[0] === 'off')) {
|
|
135
|
+
const id = args[1];
|
|
136
|
+
const result = toggleRule(id);
|
|
137
|
+
if (!result) {
|
|
138
|
+
return { handled: true, response: `❌ Rule "${id}" không tồn tại.` };
|
|
139
|
+
}
|
|
140
|
+
return { handled: true, response: `${result.enabled ? '✅' : '⏸️'} Rule "${result.name}" đã ${result.enabled ? 'BẬT' : 'TẮT'}.` };
|
|
141
|
+
}
|
|
142
|
+
// /rules — list
|
|
143
|
+
const rules = listRules();
|
|
144
|
+
if (rules.length === 0) {
|
|
145
|
+
return { handled: true, response: '📋 Chưa có auto-reply rule nào.\nTạo qua CLI: zalox autoreply add ...' };
|
|
146
|
+
}
|
|
147
|
+
const lines = rules.map((r, i) => {
|
|
148
|
+
const status = r.enabled ? '🟢' : '🔴';
|
|
149
|
+
const scope = r.scope === 'all' ? '' : ` [${r.scope}]`;
|
|
150
|
+
return `${status} ${r.id} — "${r.name}" (${r.trigger.type}: "${r.trigger.pattern}")${scope}`;
|
|
151
|
+
});
|
|
152
|
+
return { handled: true, response: `📋 Auto-Reply Rules (${rules.length}):\n\n${lines.join('\n')}\n\nBật/tắt: /rules on|off <id>` };
|
|
153
|
+
}
|
|
154
|
+
// ── /jobs ────────────────────────────────────────────
|
|
155
|
+
function handleJobsCommand(args) {
|
|
156
|
+
// /jobs on|off <id>
|
|
157
|
+
if (args.length >= 2 && (args[0] === 'on' || args[0] === 'off')) {
|
|
158
|
+
const id = args[1];
|
|
159
|
+
const result = toggleJob(id);
|
|
160
|
+
if (!result) {
|
|
161
|
+
return { handled: true, response: `❌ Job "${id}" không tồn tại.` };
|
|
162
|
+
}
|
|
163
|
+
return { handled: true, response: `${result.enabled ? '✅' : '⏸️'} Job ${result.id} đã ${result.enabled ? 'BẬT' : 'TẮT'}.` };
|
|
164
|
+
}
|
|
165
|
+
// /jobs — list
|
|
166
|
+
const jobs = listJobs();
|
|
167
|
+
if (jobs.length === 0) {
|
|
168
|
+
return { handled: true, response: '📅 Chưa có scheduled job nào.\nTạo qua CLI: zalox schedule add ...' };
|
|
169
|
+
}
|
|
170
|
+
const lines = jobs.map(j => {
|
|
171
|
+
const status = j.enabled ? '🟢' : '🔴';
|
|
172
|
+
const type = j.repeat ? `cron: ${j.repeat}` : `at: ${j.scheduleAt}`;
|
|
173
|
+
const msg = j.message.length > 30 ? j.message.substring(0, 30) + '...' : j.message;
|
|
174
|
+
const next = j.nextRunAt ? `\n Next: ${j.nextRunAt}` : '';
|
|
175
|
+
return `${status} ${j.id} → ${j.threadId} (${type})\n "${msg}"${next}`;
|
|
176
|
+
});
|
|
177
|
+
return { handled: true, response: `📅 Scheduled Jobs (${jobs.length}):\n\n${lines.join('\n\n')}\n\nBật/tắt: /jobs on|off <id>` };
|
|
178
|
+
}
|
|
179
|
+
// ── /gs ──────────────────────────────────────────────
|
|
180
|
+
function handleGroupSettingsCommand(args) {
|
|
181
|
+
// /gs — list all
|
|
182
|
+
if (args.length === 0) {
|
|
183
|
+
const all = getAllGroupSettings();
|
|
184
|
+
const groupIds = Object.keys(all);
|
|
185
|
+
if (groupIds.length === 0) {
|
|
186
|
+
return { handled: true, response: '⚙️ Chưa có cài đặt nhóm nào.\nSet qua: /gs <groupId> autoReply on' };
|
|
187
|
+
}
|
|
188
|
+
const lines = groupIds.map(gid => {
|
|
189
|
+
const gs = all[gid];
|
|
190
|
+
const ar = gs.autoReplyEnabled ? '🟢 AR' : '🔴 AR';
|
|
191
|
+
const as = gs.antiSpamEnabled ? '🟢 AS' : '🔴 AS';
|
|
192
|
+
const wm = gs.welcomeMessage ? '✅ WM' : '—';
|
|
193
|
+
return `${gid}: ${ar} | ${as} | ${wm}${gs.notes ? ` | 📝 ${gs.notes}` : ''}`;
|
|
194
|
+
});
|
|
195
|
+
return { handled: true, response: `⚙️ Group Settings (${groupIds.length}):\n\n${lines.join('\n')}\n\nAR=AutoReply, AS=AntiSpam, WM=Welcome` };
|
|
196
|
+
}
|
|
197
|
+
// /gs <groupId> <key> <value>
|
|
198
|
+
if (args.length >= 3) {
|
|
199
|
+
const groupId = args[0];
|
|
200
|
+
const key = args[1].toLowerCase();
|
|
201
|
+
const value = args.slice(2).join(' ');
|
|
202
|
+
const current = getGroupSettings(groupId);
|
|
203
|
+
switch (key) {
|
|
204
|
+
case 'autoreply':
|
|
205
|
+
case 'ar':
|
|
206
|
+
setGroupSettings(groupId, { ...current, autoReplyEnabled: value === 'on' || value === 'true' });
|
|
207
|
+
return { handled: true, response: `✅ Group ${groupId}: auto-reply ${value === 'on' || value === 'true' ? 'BẬT' : 'TẮT'}` };
|
|
208
|
+
case 'welcome':
|
|
209
|
+
case 'wm':
|
|
210
|
+
setGroupSettings(groupId, { ...current, welcomeMessage: value });
|
|
211
|
+
return { handled: true, response: `✅ Group ${groupId}: welcome message set\n"${value}"` };
|
|
212
|
+
case 'antispam':
|
|
213
|
+
case 'as':
|
|
214
|
+
setGroupSettings(groupId, { ...current, antiSpamEnabled: value === 'on' || value === 'true' });
|
|
215
|
+
return { handled: true, response: `✅ Group ${groupId}: anti-spam ${value === 'on' || value === 'true' ? 'BẬT' : 'TẮT'}` };
|
|
216
|
+
case 'notes':
|
|
217
|
+
setGroupSettings(groupId, { ...current, notes: value });
|
|
218
|
+
return { handled: true, response: `✅ Group ${groupId}: notes updated` };
|
|
219
|
+
default:
|
|
220
|
+
return { handled: true, response: `❓ Key không hợp lệ: ${key}\nCó thể dùng: autoReply, welcome, antiSpam, notes` };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// /gs <groupId> — show one group
|
|
224
|
+
if (args.length === 1) {
|
|
225
|
+
const groupId = args[0];
|
|
226
|
+
const gs = getGroupSettings(groupId);
|
|
227
|
+
return {
|
|
228
|
+
handled: true,
|
|
229
|
+
response: `⚙️ Group ${groupId}:
|
|
230
|
+
Auto-reply: ${gs.autoReplyEnabled ? '🟢 ON' : '🔴 OFF'}
|
|
231
|
+
Anti-spam: ${gs.antiSpamEnabled ? '🟢 ON' : '🔴 OFF'}
|
|
232
|
+
Welcome: ${gs.welcomeMessage || '(không set)'}
|
|
233
|
+
Notes: ${gs.notes || '(không có)'}
|
|
234
|
+
|
|
235
|
+
Set: /gs ${groupId} autoReply on|off`,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return { handled: true, response: '⚙️ Usage: /gs [groupId] [key] [value]' };
|
|
239
|
+
}
|
|
240
|
+
// ── /templates ───────────────────────────────────────
|
|
241
|
+
function handleTemplatesCommand() {
|
|
242
|
+
const templates = listTemplates();
|
|
243
|
+
if (templates.length === 0) {
|
|
244
|
+
return { handled: true, response: '📄 Chưa có template nào.\nTạo qua CLI: zalox template create ...' };
|
|
245
|
+
}
|
|
246
|
+
const lines = templates.map(t => {
|
|
247
|
+
const vars = t.variables.length > 0 ? ` (vars: ${t.variables.join(', ')})` : '';
|
|
248
|
+
const preview = t.content.length > 40 ? t.content.substring(0, 40) + '...' : t.content;
|
|
249
|
+
return `📄 ${t.name}${vars}\n "${preview}"`;
|
|
250
|
+
});
|
|
251
|
+
return { handled: true, response: `📄 Templates (${templates.length}):\n\n${lines.join('\n\n')}\n\nGửi: /template send <name> <threadId>` };
|
|
252
|
+
}
|
|
253
|
+
// ── /template send ───────────────────────────────────
|
|
254
|
+
async function handleTemplateSendCommand(args, ctx) {
|
|
255
|
+
// /template send <name> <threadId> [--var key=val ...]
|
|
256
|
+
if (args.length < 3 || args[0] !== 'send') {
|
|
257
|
+
return { handled: true, response: '📄 Usage: /template send <name> <threadId> [key=val ...]' };
|
|
258
|
+
}
|
|
259
|
+
const name = args[1];
|
|
260
|
+
const threadId = args[2];
|
|
261
|
+
const template = getTemplate(name);
|
|
262
|
+
if (!template) {
|
|
263
|
+
return { handled: true, response: `❌ Template "${name}" không tồn tại.` };
|
|
264
|
+
}
|
|
265
|
+
// Parse vars from remaining args (key=val format)
|
|
266
|
+
const vars = {};
|
|
267
|
+
for (let i = 3; i < args.length; i++) {
|
|
268
|
+
const [k, ...v] = args[i].split('=');
|
|
269
|
+
if (k && v.length > 0) {
|
|
270
|
+
vars[k] = v.join('=');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const rendered = renderTemplate(template, vars);
|
|
274
|
+
try {
|
|
275
|
+
await ctx.api.sendMessage(rendered, threadId, ThreadType.User);
|
|
276
|
+
return { handled: true, response: `✅ Template "${name}" đã gửi tới ${threadId}` };
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
return { handled: true, response: `❌ Gửi thất bại: ${err.message}` };
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// ── /send ────────────────────────────────────────────
|
|
283
|
+
async function handleSendCommand(args, ctx, isGroup) {
|
|
284
|
+
if (args.length < 2) {
|
|
285
|
+
return { handled: true, response: `📤 Usage: /${isGroup ? 'send-group' : 'send'} <threadId> <message>` };
|
|
286
|
+
}
|
|
287
|
+
const threadId = args[0];
|
|
288
|
+
const message = args.slice(1).join(' ');
|
|
289
|
+
const type = isGroup ? ThreadType.Group : ThreadType.User;
|
|
290
|
+
try {
|
|
291
|
+
await ctx.api.sendMessage(message, threadId, type);
|
|
292
|
+
return { handled: true, response: `✅ Đã gửi tới ${threadId}: "${message.substring(0, 50)}${message.length > 50 ? '...' : ''}"` };
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
return { handled: true, response: `❌ Gửi thất bại: ${err.message}` };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// ── Helpers ──────────────────────────────────────────
|
|
299
|
+
function formatUptime(startedAt) {
|
|
300
|
+
const ms = Date.now() - new Date(startedAt).getTime();
|
|
301
|
+
const secs = Math.floor(ms / 1000);
|
|
302
|
+
const mins = Math.floor(secs / 60);
|
|
303
|
+
const hours = Math.floor(mins / 60);
|
|
304
|
+
const days = Math.floor(hours / 24);
|
|
305
|
+
if (days > 0)
|
|
306
|
+
return `${days}d ${hours % 24}h ${mins % 60}m`;
|
|
307
|
+
if (hours > 0)
|
|
308
|
+
return `${hours}h ${mins % 60}m`;
|
|
309
|
+
if (mins > 0)
|
|
310
|
+
return `${mins}m ${secs % 60}s`;
|
|
311
|
+
return `${secs}s`;
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=dm-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm-commands.js","sourceRoot":"","sources":["../../src/core/dm-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Export System
|
|
3
|
+
*
|
|
4
|
+
* Export friends, groups, and conversations to JSON or CSV.
|
|
5
|
+
*/
|
|
6
|
+
import type { API } from 'zca-js';
|
|
7
|
+
export type ExportFormat = 'json' | 'csv';
|
|
8
|
+
/**
|
|
9
|
+
* Export friends list.
|
|
10
|
+
*/
|
|
11
|
+
export declare function exportFriends(api: API, format: ExportFormat): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Export groups list.
|
|
14
|
+
*/
|
|
15
|
+
export declare function exportGroups(api: API, format: ExportFormat): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Export recent conversations.
|
|
18
|
+
*/
|
|
19
|
+
export declare function exportConversations(api: API, format: ExportFormat, limit?: number): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/core/export.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AA6B1C;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,EACpB,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Export System
|
|
3
|
+
*
|
|
4
|
+
* Export friends, groups, and conversations to JSON or CSV.
|
|
5
|
+
*/
|
|
6
|
+
// ── Helpers ──────────────────────────────────────────────
|
|
7
|
+
function escapeCsvField(value) {
|
|
8
|
+
if (value.includes(',') || value.includes('"') || value.includes('\n')) {
|
|
9
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function arrayToCsv(headers, rows) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
lines.push(headers.map(escapeCsvField).join(','));
|
|
16
|
+
for (const row of rows) {
|
|
17
|
+
const values = headers.map((h) => {
|
|
18
|
+
const val = row[h];
|
|
19
|
+
if (val === null || val === undefined)
|
|
20
|
+
return '';
|
|
21
|
+
return escapeCsvField(String(val));
|
|
22
|
+
});
|
|
23
|
+
lines.push(values.join(','));
|
|
24
|
+
}
|
|
25
|
+
return lines.join('\n');
|
|
26
|
+
}
|
|
27
|
+
// ── Core Functions ───────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Export friends list.
|
|
30
|
+
*/
|
|
31
|
+
export async function exportFriends(api, format) {
|
|
32
|
+
const friends = await api.getAllFriends();
|
|
33
|
+
const data = friends.map((f) => ({
|
|
34
|
+
userId: f.userId || '',
|
|
35
|
+
displayName: f.displayName || '',
|
|
36
|
+
zaloName: f.zaloName || '',
|
|
37
|
+
phoneNumber: f.phoneNumber || '',
|
|
38
|
+
gender: f.gender !== undefined ? (f.gender === 0 ? 'Male' : 'Female') : '',
|
|
39
|
+
isActive: f.isActive ? 'Yes' : 'No',
|
|
40
|
+
avatar: f.avatar || '',
|
|
41
|
+
}));
|
|
42
|
+
if (format === 'csv') {
|
|
43
|
+
return arrayToCsv(['userId', 'displayName', 'zaloName', 'phoneNumber', 'gender', 'isActive', 'avatar'], data);
|
|
44
|
+
}
|
|
45
|
+
return JSON.stringify(data, null, 2);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Export groups list.
|
|
49
|
+
*/
|
|
50
|
+
export async function exportGroups(api, format) {
|
|
51
|
+
const result = await api.getAllGroups();
|
|
52
|
+
const groupIds = Object.keys(result.gridVerMap || {});
|
|
53
|
+
if (groupIds.length === 0) {
|
|
54
|
+
return format === 'csv' ? 'groupId,name,totalMember,maxMember,creatorId' : '[]';
|
|
55
|
+
}
|
|
56
|
+
const groupInfo = await api.getGroupInfo(groupIds);
|
|
57
|
+
const groups = Object.values(groupInfo.gridInfoMap || {});
|
|
58
|
+
const data = groups.map((g) => ({
|
|
59
|
+
groupId: g.groupId || '',
|
|
60
|
+
name: g.name || '',
|
|
61
|
+
totalMember: g.totalMember ?? 0,
|
|
62
|
+
maxMember: g.maxMember ?? 0,
|
|
63
|
+
creatorId: g.creatorId || '',
|
|
64
|
+
desc: g.desc || '',
|
|
65
|
+
createdTime: g.createdTime ? new Date(g.createdTime).toISOString() : '',
|
|
66
|
+
}));
|
|
67
|
+
if (format === 'csv') {
|
|
68
|
+
return arrayToCsv(['groupId', 'name', 'totalMember', 'maxMember', 'creatorId', 'desc', 'createdTime'], data);
|
|
69
|
+
}
|
|
70
|
+
return JSON.stringify(data, null, 2);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Export recent conversations.
|
|
74
|
+
*/
|
|
75
|
+
export async function exportConversations(api, format, limit = 100) {
|
|
76
|
+
const result = await api.getRecentMessages?.(limit) ||
|
|
77
|
+
await api.getConversations?.(limit) || [];
|
|
78
|
+
const conversations = (Array.isArray(result) ? result : result?.data || []);
|
|
79
|
+
const data = conversations.map((c) => ({
|
|
80
|
+
threadId: c.threadId || c.idTo || '',
|
|
81
|
+
lastMessage: typeof c.content === 'string' ? c.content : JSON.stringify(c.content || ''),
|
|
82
|
+
timestamp: c.ts ? new Date(parseInt(c.ts)).toISOString() : '',
|
|
83
|
+
type: c.type === 1 ? 'group' : 'user',
|
|
84
|
+
senderId: c.uidFrom || '',
|
|
85
|
+
senderName: c.dName || '',
|
|
86
|
+
}));
|
|
87
|
+
if (format === 'csv') {
|
|
88
|
+
return arrayToCsv(['threadId', 'lastMessage', 'timestamp', 'type', 'senderId', 'senderName'], data);
|
|
89
|
+
}
|
|
90
|
+
return JSON.stringify(data, null, 2);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/core/export.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,4DAA4D;AAE5D,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,OAAiB,EAAE,IAA+B;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YACjD,OAAO,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4DAA4D;AAE5D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAQ,EACR,MAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;QACtB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;QAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1E,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACnC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;KACvB,CAAC,CAAC,CAAC;IAEJ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,UAAU,CACf,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,EACpF,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAQ,EACR,MAAoB;IAEpB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC;QAC/B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;QAC3B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;QAC5B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;KACxE,CAAC,CAAC,CAAC;IAEJ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,UAAU,CACf,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EACnF,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAQ,EACR,MAAoB,EACpB,QAAgB,GAAG;IAEnB,MAAM,MAAM,GAAG,MAAO,GAAW,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC;QAC1D,MAAO,GAAW,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,MAAc,EAAE,IAAI,IAAI,EAAE,CAAU,CAAC;IAE9F,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;QACpC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QACxF,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7D,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACrC,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACzB,UAAU,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;KAC1B,CAAC,CAAC,CAAC;IAEJ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,UAAU,CACf,CAAC,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAC1E,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Feature Gate Middleware
|
|
3
|
+
*
|
|
4
|
+
* Wrap CLI commands with license checks.
|
|
5
|
+
* Shows friendly upgrade message when feature is locked.
|
|
6
|
+
*/
|
|
7
|
+
import { type FeatureName, type GateResult } from '../core/license.js';
|
|
8
|
+
/**
|
|
9
|
+
* Gate a CLI action behind a feature flag.
|
|
10
|
+
* If feature is not allowed, prints error and exits.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* .action(gate('restApi', (opts) => { ... }))
|
|
14
|
+
*/
|
|
15
|
+
export declare function gate<T extends (...args: unknown[]) => unknown>(feature: FeatureName, action: T): T;
|
|
16
|
+
/**
|
|
17
|
+
* Gate with a numeric limit check.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* const gate = gateLimit('maxProfiles', currentProfileCount);
|
|
21
|
+
* if (!gate.allowed) { ... }
|
|
22
|
+
*/
|
|
23
|
+
export declare function gateLimit(feature: FeatureName, currentCount: number): GateResult;
|
|
24
|
+
/**
|
|
25
|
+
* Inline gate check — returns boolean, prints error if blocked.
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* if (!gateCheck('sendImages')) return;
|
|
29
|
+
*/
|
|
30
|
+
export declare function gateCheck(feature: FeatureName): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Silent gate check — returns boolean without printing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isFeatureEnabled(feature: FeatureName): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get current tier name.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCurrentTier(): string;
|
|
39
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/core/gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAC5D,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,CAAC,GACR,CAAC,CASH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAOvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Feature Gate Middleware
|
|
3
|
+
*
|
|
4
|
+
* Wrap CLI commands with license checks.
|
|
5
|
+
* Shows friendly upgrade message when feature is locked.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { checkFeature, checkLimit, validateLicense, } from '../core/license.js';
|
|
9
|
+
/**
|
|
10
|
+
* Gate a CLI action behind a feature flag.
|
|
11
|
+
* If feature is not allowed, prints error and exits.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* .action(gate('restApi', (opts) => { ... }))
|
|
15
|
+
*/
|
|
16
|
+
export function gate(feature, action) {
|
|
17
|
+
return ((...args) => {
|
|
18
|
+
const result = checkFeature(feature);
|
|
19
|
+
if (!result.allowed) {
|
|
20
|
+
printGateError(result);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
return action(...args);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gate with a numeric limit check.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* const gate = gateLimit('maxProfiles', currentProfileCount);
|
|
31
|
+
* if (!gate.allowed) { ... }
|
|
32
|
+
*/
|
|
33
|
+
export function gateLimit(feature, currentCount) {
|
|
34
|
+
return checkLimit(feature, currentCount);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Inline gate check — returns boolean, prints error if blocked.
|
|
38
|
+
*
|
|
39
|
+
* Usage:
|
|
40
|
+
* if (!gateCheck('sendImages')) return;
|
|
41
|
+
*/
|
|
42
|
+
export function gateCheck(feature) {
|
|
43
|
+
const result = checkFeature(feature);
|
|
44
|
+
if (!result.allowed) {
|
|
45
|
+
printGateError(result);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Silent gate check — returns boolean without printing.
|
|
52
|
+
*/
|
|
53
|
+
export function isFeatureEnabled(feature) {
|
|
54
|
+
return checkFeature(feature).allowed;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get current tier name.
|
|
58
|
+
*/
|
|
59
|
+
export function getCurrentTier() {
|
|
60
|
+
return validateLicense().tier;
|
|
61
|
+
}
|
|
62
|
+
// ── Error display ─────────────────────────────────────
|
|
63
|
+
function printGateError(result) {
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(chalk.red(` 🔒 Feature locked: ${result.feature}`));
|
|
66
|
+
console.log(chalk.gray(` ${result.reason}`));
|
|
67
|
+
console.log();
|
|
68
|
+
if (result.upgradeHint) {
|
|
69
|
+
console.log(chalk.yellow(` ⚡ ${result.upgradeHint}`));
|
|
70
|
+
}
|
|
71
|
+
console.log(chalk.gray(' See all features: zalox license features'));
|
|
72
|
+
console.log(chalk.gray(' Buy license: https://zalox.shrimpfarm.vn/pricing'));
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/core/gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAClB,OAAoB,EACpB,MAAS;IAET,OAAO,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAM,CAAC;AACV,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB,EAAE,YAAoB;IAClE,OAAO,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,eAAe,EAAE,CAAC,IAAI,CAAC;AAChC,CAAC;AAED,yDAAyD;AAEzD,SAAS,cAAc,CAAC,MAAkB;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZaloX — Group Settings
|
|
3
|
+
*
|
|
4
|
+
* Per-group configuration for auto-reply, welcome messages, anti-spam, etc.
|
|
5
|
+
* Settings stored in ~/.openclaw/zalox/group-settings.json
|
|
6
|
+
*/
|
|
7
|
+
export interface GroupSettingsEntry {
|
|
8
|
+
autoReplyEnabled: boolean;
|
|
9
|
+
welcomeMessage?: string;
|
|
10
|
+
antiSpamEnabled: boolean;
|
|
11
|
+
antiSpamKeywords?: string[];
|
|
12
|
+
scheduledMessages?: string[];
|
|
13
|
+
customRules?: string[];
|
|
14
|
+
notes?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GroupSettings {
|
|
17
|
+
[groupId: string]: GroupSettingsEntry;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get settings for a specific group.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getGroupSettings(groupId: string): GroupSettingsEntry;
|
|
23
|
+
/**
|
|
24
|
+
* Update settings for a specific group.
|
|
25
|
+
*/
|
|
26
|
+
export declare function setGroupSettings(groupId: string, update: Partial<GroupSettingsEntry>): GroupSettingsEntry;
|
|
27
|
+
/**
|
|
28
|
+
* Get all group settings.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getAllGroupSettings(): GroupSettings;
|
|
31
|
+
/**
|
|
32
|
+
* Delete settings for a specific group.
|
|
33
|
+
*/
|
|
34
|
+
export declare function deleteGroupSettings(groupId: string): boolean;
|
|
35
|
+
//# sourceMappingURL=group-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-settings.d.ts","sourceRoot":"","sources":["../../src/core/group-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAAC;CACvC;AAyBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAQpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,kBAAkB,CASpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM5D"}
|