koishi-plugin-onebot-verifier 1.0.4 → 1.0.6
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/lib/index.js +30 -8
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -81,6 +81,7 @@ function apply(ctx, config = {}) {
|
|
|
81
81
|
const executeAction = /* @__PURE__ */ __name(async (session, kind, pass, reason = "", remark = "") => {
|
|
82
82
|
try {
|
|
83
83
|
const eventData = session.event?._data || {};
|
|
84
|
+
if (config.debugMode) logger.info(`[执行操作] 类型:${kind} 结果:${pass ? "同意" : "拒绝"} 原因:${reason || "无"}`);
|
|
84
85
|
if (!pass && kind === "guild" && session.guildId && (session.event?.type === "guild-added" || eventData.notice_type === "group_increase")) {
|
|
85
86
|
if (reason) {
|
|
86
87
|
try {
|
|
@@ -129,15 +130,20 @@ function apply(ctx, config = {}) {
|
|
|
129
130
|
}, "sendNotice");
|
|
130
131
|
const checkCriteria = /* @__PURE__ */ __name(async (session, kind) => {
|
|
131
132
|
const rawText = session.event?._data?.comment || "";
|
|
132
|
-
const cleanLines = rawText.split(/[\r\n]+/).map((s) => s.trim()).filter((s) => /^(
|
|
133
|
+
const cleanLines = rawText.split(/[\r\n]+/).map((s) => s.trim()).filter((s) => /^(回答|答案)[::]/i.test(s)).map((s) => s.replace(/^(回答|答案)[::]\s*/i, ""));
|
|
133
134
|
const verifyText = cleanLines.length > 0 ? cleanLines.join("\n") : rawText;
|
|
134
135
|
if (kind === "friend") {
|
|
135
136
|
try {
|
|
136
|
-
if (config.friendRegex && new RegExp(config.friendRegex, "i").test(verifyText))
|
|
137
|
+
if (config.friendRegex && new RegExp(config.friendRegex, "i").test(verifyText)) {
|
|
138
|
+
if (config.debugMode) logger.info(`[规则匹配] 好友检查: ${config.friendRegex}`);
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
137
141
|
const limitLevel = config.friendLevel ?? -1;
|
|
138
142
|
if (limitLevel >= 0 && session.onebot && session.userId) {
|
|
139
143
|
const stats = await session.onebot.getStrangerInfo(session.userId, true);
|
|
140
|
-
|
|
144
|
+
const isPassed = (stats.qqLevel ?? 0) >= limitLevel;
|
|
145
|
+
if (config.debugMode) logger.info(`[规则判定] 等级检查: ${stats.qqLevel} > ${limitLevel} = ${isPassed}`);
|
|
146
|
+
if (!isPassed) return `QQ 等级低于 ${limitLevel} 级`;
|
|
141
147
|
return true;
|
|
142
148
|
}
|
|
143
149
|
} catch {
|
|
@@ -148,14 +154,23 @@ function apply(ctx, config = {}) {
|
|
|
148
154
|
if (kind === "guild") {
|
|
149
155
|
try {
|
|
150
156
|
const userData = session.userId ? await ctx.database.getUser(session.platform, session.userId) : null;
|
|
151
|
-
if (userData && userData.authority > 1)
|
|
157
|
+
if (userData && userData.authority > 1) {
|
|
158
|
+
if (config.debugMode) logger.info(`[规则匹配] 白名单: ${userData.authority}`);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
152
161
|
} catch {
|
|
153
162
|
}
|
|
154
163
|
if (session.onebot && session.guildId && ((config.minMembers ?? -1) >= 0 || (config.maxCapacity ?? -1) >= 0)) {
|
|
155
164
|
try {
|
|
156
165
|
const stats = await session.onebot.getGroupInfo(session.guildId, true);
|
|
157
|
-
if ((config.minMembers ?? -1) >= 0 && stats.member_count < (config.minMembers ?? 0))
|
|
158
|
-
|
|
166
|
+
if ((config.minMembers ?? -1) >= 0 && stats.member_count < (config.minMembers ?? 0)) {
|
|
167
|
+
if (config.debugMode) logger.info(`[规则判定] 成员检查: ${stats.member_count} < ${config.minMembers}`);
|
|
168
|
+
return `群成员不足 ${config.minMembers} 人`;
|
|
169
|
+
}
|
|
170
|
+
if ((config.maxCapacity ?? -1) >= 0 && stats.max_member_count < (config.maxCapacity ?? 0)) {
|
|
171
|
+
if (config.debugMode) logger.info(`[规则判定] 容量检查: ${stats.max_member_count} < ${config.maxCapacity}`);
|
|
172
|
+
return `群容量不足 ${config.maxCapacity} 人`;
|
|
173
|
+
}
|
|
159
174
|
return true;
|
|
160
175
|
} catch {
|
|
161
176
|
return false;
|
|
@@ -190,12 +205,18 @@ function apply(ctx, config = {}) {
|
|
|
190
205
|
}, "setupManual");
|
|
191
206
|
const handleEvent = /* @__PURE__ */ __name(async (session, kind) => {
|
|
192
207
|
try {
|
|
208
|
+
if (config.debugMode) logger.info(`[收到请求] 类型: ${kind} 数据:${JSON.stringify(session.event?._data || {})}`);
|
|
193
209
|
if (kind === "member") {
|
|
194
|
-
const rule = config.verifyRules?.find((r) => r.guildId === session.guildId);
|
|
210
|
+
const rule = config.verifyRules?.find((r) => String(r.guildId) === String(session.guildId));
|
|
195
211
|
if (rule) {
|
|
196
212
|
const rawText = session.event?._data?.comment || "";
|
|
213
|
+
const cleanLines = rawText.split(/[\r\n]+/).map((s) => s.trim()).filter((s) => /^(回答|答案)[::]/i.test(s)).map((s) => s.replace(/^(回答|答案)[::]\s*/i, ""));
|
|
214
|
+
const verifyText = cleanLines.length > 0 ? cleanLines.join("\n") : rawText;
|
|
197
215
|
const stats = (rule.minLevel ?? -1) >= 0 && session.onebot && session.userId ? await session.onebot.getStrangerInfo(session.userId, true).catch(() => ({})) : null;
|
|
198
|
-
const
|
|
216
|
+
const keywordMatch = !rule.keyword || new RegExp(rule.keyword, "i").test(verifyText);
|
|
217
|
+
const levelMatch = !stats || (stats.qqLevel ?? 0) >= rule.minLevel;
|
|
218
|
+
const isMatch = keywordMatch && levelMatch;
|
|
219
|
+
if (config.debugMode) logger.info(`[规则判定] ${rule.guildId}: 关键词=${keywordMatch}, 等级=${levelMatch}, 结果=${isMatch}`);
|
|
199
220
|
if (isMatch && rule.action) {
|
|
200
221
|
const isApprove = rule.action === "accept";
|
|
201
222
|
await executeAction(session, kind, isApprove, isApprove ? "" : "命中拒绝规则,自动拒绝");
|
|
@@ -243,6 +264,7 @@ function apply(ctx, config = {}) {
|
|
|
243
264
|
activeTask.messages.forEach((msg) => activeTasks.delete(msg));
|
|
244
265
|
const isApprove = cmdMatch[1] === "y" || cmdMatch[1] === "通过";
|
|
245
266
|
const extraInfo = cmdMatch[2]?.trim() || "";
|
|
267
|
+
if (config.debugMode) logger.info(`[人工回复] 用户 ${session.userId} 回复: ${cmdMatch[1]} 备注: ${extraInfo}`);
|
|
246
268
|
const isSuccess = await executeAction(activeTask.session, activeTask.kind, isApprove, isApprove ? "" : extraInfo, isApprove && activeTask.kind === "friend" ? extraInfo : "");
|
|
247
269
|
const replyText = isSuccess ? `已${isApprove ? "通过" : "拒绝"}该请求` : `处理请求失败`;
|
|
248
270
|
await (targetType === "private" ? session.bot.sendPrivateMessage(targetId, replyText) : session.bot.sendMessage(targetId, replyText));
|