UNPKG

koishi-plugin-star-security

Version:
398 lines (392 loc) 14 kB
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 });