koishi-plugin-star-security
Version:
398 lines (392 loc) • 14 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name2 in all)
__defProp(target, name2, { get: all[name2], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
AntiConfig: () => AntiConfig,
BaseConfig: () => BaseConfig,
Config: () => Config,
apply: () => apply2,
inject: () => inject,
name: () => name,
reusable: () => reusable2
});
module.exports = __toCommonJS(src_exports);
// src/locales/zh-CN.yml
var zh_CN_default = { "star-security": { antirobot: { check: "为了确保您不是机器人\n请完成人机验证\n请在{limit}分钟内输入以下内容\n-- {code}", remind: "请输入以下内容进行人机验证\n-- {code}", success: "人机验证成功!", kick: "由于QQ({qq})\n长时间未通过人机验证\n已踢出交流群" } } };
// src/groupmanager.ts
var groupmanager_exports = {};
__export(groupmanager_exports, {
apply: () => apply,
reusable: () => reusable
});
var import_koishi = require("koishi");
var reusable = true;
async function getAvailableGroup(groupList, bot) {
for (const groupId of groupList) {
const groupInfo = await bot.internal.getGroupInfo(groupId);
if (groupInfo.member_count < groupInfo.max_member_count) {
return groupId;
}
}
return null;
}
__name(getAvailableGroup, "getAvailableGroup");
function debuglog(config, type, text) {
if (config.debug) {
console.log(`[${type}]: ${text}`);
}
}
__name(debuglog, "debuglog");
async function allowGroupRequest(session, config, data, approve, reason) {
if (!approve) {
if (!reason) {
const availableGroup = await getAvailableGroup(
config.groupList,
session.bot
);
if (availableGroup) {
debuglog(config, "进群审批处理", "拒绝 理由: 群已满,请加新群");
await session.bot.internal.setGroupAddRequest(
data.flag,
data.sub_type,
false,
`群已满,请加新群`
);
} else {
debuglog(config, "进群审批处理", "拒绝 理由: 群已满,当前无新群可用");
await session.bot.internal.setGroupAddRequest(
data.flag,
data.sub_type,
false,
`群已满,当前无新群可用`
);
}
} else {
debuglog(config, "进群审批处理", "拒绝 理由: " + reason);
await session.bot.internal.setGroupAddRequest(
data.flag,
data.sub_type,
approve,
reason
);
}
return;
}
const groupInfo = await session.bot.internal.getGroupInfo(
session.guildId,
true
);
if (config.fullblock) {
if (groupInfo.member_count >= groupInfo.max_member_count) {
const availableGroup = await getAvailableGroup(
config.groupList,
session.bot
);
if (availableGroup) {
debuglog(config, "进群审批处理", "拒绝 理由: 群已满,请加新群");
await session.bot.internal.setGroupAddRequest(
data.flag,
data.sub_type,
false,
`群已满,请加新群`
);
} else {
debuglog(config, "进群审批处理", "拒绝 理由: 群已满,当前无新群可用");
await session.bot.internal.setGroupAddRequest(
data.flag,
data.sub_type,
false,
`群已满,当前无新群可用`
);
}
return;
}
}
debuglog(config, "进群审批处理", "同意");
await session.bot.internal.setGroupAddRequest(data.flag, data.sub_type, true);
}
__name(allowGroupRequest, "allowGroupRequest");
function apply(ctx, config) {
ctx.on("guild-member-request", async (session) => {
if (!config.autoJoin) return;
const { _data: data } = session.event;
if (data.sub_type === "add") {
const qqinfo = await session.bot.internal.getStrangerInfo(
data.user_id,
true
);
const groupInfo = await session.bot.internal.getGroupInfo(
session.guildId,
true
);
let comment = data.comment;
const keyword = "答案:";
const commentIndex = data.comment.indexOf(keyword);
if (commentIndex !== -1) {
comment = data.comment.substring(commentIndex + keyword.length);
}
debuglog(
config,
"进群审批",
`正在处理进群审批 群号:${session.guildId} QQ:${data.user_id} 关键词:${comment} 人数:${groupInfo.member_count}/${groupInfo.max_member_count}`
);
if (await ctx.cache.get(`star_security_${config.name}`, data.user_id)) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请拒绝 原因: 退群后加群冷却"
);
await allowGroupRequest(session, config, data, false, "当前无法加群");
return;
}
if (config.fullblock) {
if (groupInfo.member_count >= groupInfo.max_member_count) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请拒绝 原因: 群已满"
);
await allowGroupRequest(session, config, data, false);
return;
}
}
if (qqinfo.level <= config.limitlevel && config.limitlevel != 0) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请不处理 原因: 等级低于 " + config.limitlevel + " 级"
);
return;
}
const block = config.blackWordList.some(
(item) => comment.toLowerCase().includes(item.toLowerCase())
);
if (block) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请拒绝 原因: 包含黑名单关键词"
);
allowGroupRequest(session, config, data, false, "拒绝入群");
return;
}
if (!config.wordList || config.wordList.length == 0) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请通过 原因: 未填写关键词名单"
);
allowGroupRequest(session, config, data, true);
return;
}
const allow = config.wordList.some(
(item) => comment.toLowerCase().includes(item.toLowerCase())
);
if (allow) {
debuglog(
config,
"进群审批",
"QQ:" + data.user_id + " 入群申请通过 原因: 包含关键词"
);
allowGroupRequest(session, config, data, true);
}
}
});
ctx.on("guild-member-added", async (session) => {
const { _data: data } = session.event;
debuglog(config, "进群欢迎", "获取到QQ:" + data.user_id + " 进群信息");
if (data.operator_id != session.selfId && !config.alwaysWelcome) {
return;
}
if (!config.autoJoin) return;
let welcome;
if (config.antiRobot) {
if (data.operator_id == session.selfId || data.operator_id != session.selfId && config.alwaysAnti) {
welcome = session.text("star-security.antirobot.success");
}
}
if (config.welcomeText) {
debuglog(
config,
"进群欢迎",
`正在准备欢迎文本 群号:${session.guildId} QQ:${data.user_id}`
);
if (welcome) {
welcome += "\r" + config.welcomeText;
} else {
welcome = config.welcomeText;
}
}
if (config.antiRobot) {
if (data.operator_id == session.selfId || data.operator_id != session.selfId && config.alwaysAnti) {
const code = Math.floor(1e5 + Math.random() * 9e5);
debuglog(
config,
"人机验证",
"QQ:" + session.userId + " 等待验证 验证码: " + code
);
await session.send(
import_koishi.h.at(session.userId) + "\r" + session.text("star-security.antirobot.check", {
limit: config.allowTime,
code
})
);
const check = await waitcheck(
ctx,
session,
code,
config.allowTime,
config.inkRemind
);
if (!check) {
await session.bot.internal.setGroupKick(session.guildId, session.userId).then(
// 正确踢出后发送
debuglog(
config,
"人机验证",
"QQ:" + session.userId + " 未及时验证,踢出群聊"
),
await session.send(
session.text("star-security.antirobot.kick", {
qq: session.userId
})
)
);
return;
} else {
debuglog(config, "人机验证", "QQ:" + session.userId + " 通过验证");
}
}
}
if (welcome) {
debuglog(config, "进群欢迎", `发送欢迎语`);
await session.send(import_koishi.h.at(session.userId) + "\r" + welcome);
}
});
ctx.on("guild-member-removed", async (session) => {
const { _data: data } = session.event;
if (config.limitleveljoin != 0 && config.limitleveljoin != null) {
debuglog(
config,
"退群处理",
"QQ:" + data.user_id + " 加入入群冷却 " + config.limitleveljoin + " 天"
);
await ctx.cache.set(
`star_security_${config.name}`,
data.user_id,
true,
config.limitleveljoin * import_koishi.Time.day
);
}
});
}
__name(apply, "apply");
async function waitcheck(ctx, session, code, allowTime, inkRemind) {
return new Promise((resolve) => {
let currentTime = Date.now();
const dispose = ctx.intersect((sess) => sess.userId === session.userId).middleware(async (sess, next) => {
if (sess.content.includes(code.toString())) {
clearTimeout(timeout);
resolve(true);
dispose();
return "";
}
if (Date.now() > currentTime + inkRemind * 60 * 1e3) {
await sess.send([
import_koishi.h.quote(sess.messageId),
import_koishi.h.text(
session.text("star-security.antirobot.remind", { code })
)
]);
currentTime = Date.now();
}
return "";
}, true);
const timeout = setTimeout(() => {
dispose();
resolve(false);
}, allowTime * 60 * 1e3);
});
}
__name(waitcheck, "waitcheck");
// src/config.ts
var import_koishi2 = require("koishi");
var BaseConfig = import_koishi2.Schema.intersect([
import_koishi2.Schema.object({
name: import_koishi2.Schema.string().default("name").description("名称(标记给自己看的)"),
debug: import_koishi2.Schema.boolean().description("调试模式").default(false),
autoJoin: import_koishi2.Schema.boolean().description("是否自动批准入群").default(false)
}).description("基础设置"),
import_koishi2.Schema.union([
import_koishi2.Schema.object({
autoJoin: import_koishi2.Schema.const(true).required(),
groupList: import_koishi2.Schema.array(String).role("table").description(
"启用的群组列表 > 就是QQ群号 | 如果需要不同群不同审批词,右上角管理多份配置->添加新配置"
),
fullblock: import_koishi2.Schema.boolean().description("群满禁止入群").default(false),
wordList: import_koishi2.Schema.array(String).role("table").description("自动审批的单词"),
blackWordList: import_koishi2.Schema.array(String).role("table").description("黑名单单词(遇到即拒绝)"),
limitlevel: import_koishi2.Schema.number().description("最低自动审批等级(QQ等级)").default(0),
limitleveljoin: import_koishi2.Schema.number().description("退群后N天内禁止入群").default(0),
alwaysWelcome: import_koishi2.Schema.boolean().description("无论谁批准都进行进群欢迎").default(false),
welcomeText: import_koishi2.Schema.string().role("textarea", { rows: [2, 8] }).description("进群欢迎文本").default("欢迎来到交流群\r玩得愉快")
}),
import_koishi2.Schema.object({})
])
]);
var AntiConfig = import_koishi2.Schema.intersect([
import_koishi2.Schema.object({
antiRobot: import_koishi2.Schema.boolean().description("是否开启人机验证").default(false)
}).description("反机器人设置"),
import_koishi2.Schema.union([
import_koishi2.Schema.object({
antiRobot: import_koishi2.Schema.const(true).required(),
alwaysAnti: import_koishi2.Schema.boolean().description("无论谁批准都进行人机验证").default(false),
allowTime: import_koishi2.Schema.number().description("人机验证允许时长(分钟)").default(30),
inkRemind: import_koishi2.Schema.number().description("人机验证提醒间隔(分钟)").default(5)
}),
import_koishi2.Schema.object({})
])
]);
var Config = import_koishi2.Schema.intersect([
BaseConfig,
AntiConfig
]);
// src/index.ts
var name = "star-security";
var inject = ["cache"];
var reusable2 = true;
function apply2(ctx, config) {
ctx.i18n.define("zh-CN", zh_CN_default);
ctx.intersect(
(session) => config.autoJoin && config.groupList.includes(session.guildId)
).platform("onebot").plugin(groupmanager_exports, config);
}
__name(apply2, "apply");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
AntiConfig,
BaseConfig,
Config,
apply,
inject,
name,
reusable
});