koishi-plugin-808ps-qunmax 0.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/lib/index.d.ts ADDED
@@ -0,0 +1,94 @@
1
+ import { Schema, Logger, Context } from 'koishi';
2
+ declare module 'koishi' {
3
+ interface Session {
4
+ 群ID?: string;
5
+ 频道ID?: string;
6
+ 用户QQ?: string;
7
+ 群ID兼容?: string;
8
+ 用户QQ兼容?: string;
9
+ 原始数据?: any;
10
+ 事件信息?: any;
11
+ }
12
+ }
13
+ interface 数据库基础配置 {
14
+ 数据库地址: string;
15
+ 数据库端口: number;
16
+ 数据库账号: string;
17
+ 数据库密码: string;
18
+ 机器人业务库名: string;
19
+ 游戏数据库存名: string;
20
+ }
21
+ interface 值班上岗配置 {
22
+ 上岗密码: string;
23
+ 上岗有效小时: number;
24
+ 每日领取上限: number;
25
+ }
26
+ interface 引流监控总开关 {
27
+ 主动进群监控: boolean;
28
+ 邀请进群监控: boolean;
29
+ 被踢群监控: boolean;
30
+ 主动退群监控: boolean;
31
+ }
32
+ interface 关键词配置条目 {
33
+ 触发关键词: string;
34
+ 自动回复内容: string;
35
+ 是否自动撤回: boolean;
36
+ 是否自动禁言: boolean;
37
+ 禁言秒数: number;
38
+ 是否通知管理: boolean;
39
+ }
40
+ interface 刷屏风控配置 {
41
+ 统计时间窗口秒数: number;
42
+ 最大允许消息条数: number;
43
+ 是否自动撤回刷屏消息: boolean;
44
+ 是否自动禁言刷屏用户: boolean;
45
+ 刷屏禁言秒数: number;
46
+ 是否通知管理员刷屏预警: boolean;
47
+ }
48
+ interface AI聊天智能配置 {
49
+ 接口密钥: string;
50
+ AI模型名称: string;
51
+ 最大生成Token数: number;
52
+ 对话温度随机值: number;
53
+ AI系统人设提示词: string;
54
+ }
55
+ interface 白名单独立群配置 {
56
+ 目标群号: number;
57
+ 新人进群欢迎语: string;
58
+ 关键词列表: 关键词配置条目[];
59
+ }
60
+ interface 插件全局功能总闸 {
61
+ 注册功能开关: boolean;
62
+ 引流监控功能开关: boolean;
63
+ 群管风控功能开关: boolean;
64
+ }
65
+ interface 插件总配置 {
66
+ 机器人QQ列表: number[];
67
+ 管理员QQ列表: number[];
68
+ 引流黑名单QQ列表: number[];
69
+ 数据库配置: 数据库基础配置;
70
+ 值班推广配置: 值班上岗配置;
71
+ 引流监控开关: 引流监控总开关;
72
+ 全局功能总开关: 插件全局功能总闸;
73
+ 引流重复推送冷却小时: number;
74
+ 白名单群设置: 白名单独立群配置[];
75
+ 刷屏风控设置: 刷屏风控配置;
76
+ AI智能聊天配置: AI聊天智能配置;
77
+ 进退群数据同步延迟秒: number;
78
+ 群成员定时同步间隔分钟: number;
79
+ 注册赠送初始点券: number;
80
+ 注册赠送初始代币: number;
81
+ }
82
+ export declare const 插件名称 = "808ps-clean-core";
83
+ export declare const 日志工具: Logger;
84
+ export declare const 依赖组件: string[];
85
+ export declare function apply(上下文: Context, 配置: 插件总配置): Promise<void>;
86
+ export declare const Config: Schema<插件总配置>;
87
+ declare const _default: {
88
+ 插件名称: string;
89
+ Config: Schema<插件总配置>;
90
+ apply: typeof apply;
91
+ 依赖组件: string[];
92
+ description: string;
93
+ };
94
+ export default _default;
package/lib/index.js ADDED
@@ -0,0 +1,398 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ Config: () => Config,
34
+ apply: () => apply,
35
+ default: () => src_default,
36
+ 依赖组件: () => 依赖组件,
37
+ 插件名称: () => 插件名称,
38
+ 日志工具: () => 日志工具
39
+ });
40
+ module.exports = __toCommonJS(src_exports);
41
+ var import_koishi = require("koishi");
42
+ var import_promise = require("mysql2/promise");
43
+ var crypto = __toESM(require("crypto"));
44
+ var fs = __toESM(require("fs"));
45
+ var path = __toESM(require("path"));
46
+ var 插件名称 = "808ps-clean-core";
47
+ var 日志工具 = new import_koishi.Logger(插件名称);
48
+ var 依赖组件 = ["http"];
49
+ var 事件数据提取工具 = class {
50
+ static {
51
+ __name(this, "事件数据提取工具");
52
+ }
53
+ 获取群聊ID(会话) {
54
+ const 群号 = 会话.群ID || 会话.群ID兼容 || 会话.原始数据?.group_id;
55
+ return 群号 ? String(群号).trim() : "";
56
+ }
57
+ 获取用户QQ(会话) {
58
+ const QQ号 = 会话.用户QQ || 会话.用户QQ兼容 || 会话.事件信息?.user?.id;
59
+ return QQ号 ? String(QQ号).trim() : "";
60
+ }
61
+ };
62
+ var 事件工具 = new 事件数据提取工具();
63
+ var 通用工具 = {
64
+ MD5加密: /* @__PURE__ */ __name((明文) => crypto.createHash("md5").update(明文).digest("hex"), "MD5加密"),
65
+ 校验是否合法QQ: /* @__PURE__ */ __name((QQ号) => /^\d{5,15}$/.test(QQ号), "校验是否合法QQ"),
66
+ 获取当前操作人QQ: /* @__PURE__ */ __name((会话) => 事件工具.获取用户QQ(会话), "获取当前操作人QQ"),
67
+ 插件日志写入: /* @__PURE__ */ __name((日志内容) => {
68
+ const 日志保存路径 = path.join(process.cwd(), "data", "808ps-core.log");
69
+ const 日志写入流 = fs.createWriteStream(日志保存路径, { flags: "a" });
70
+ const 当前时间 = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
71
+ 日志写入流.write(`[${当前时间}] ${日志内容}
72
+ `);
73
+ 日志写入流.end();
74
+ }, "插件日志写入"),
75
+ 校验数据库字段是否存在: /* @__PURE__ */ __name(async (数据库连接池, 数据库名, 数据表名, 字段名) => {
76
+ const 查询SQL = `SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND COLUMN_NAME=?`;
77
+ const [查询结果] = await 数据库连接池.execute(查询SQL, [数据库名, 数据表名, 字段名]);
78
+ return 查询结果.length > 0;
79
+ }, "校验数据库字段是否存在"),
80
+ 生成随机注册密码: /* @__PURE__ */ __name(() => {
81
+ return Math.random().toString().slice(2, 8);
82
+ }, "生成随机注册密码")
83
+ };
84
+ async function 数据库事务执行(数据库连接Pool, 回调方法) {
85
+ const 数据库连接 = await 数据库连接Pool.getConnection();
86
+ try {
87
+ await 数据库连接.beginTransaction();
88
+ const 执行结果 = await 回调方法(数据库连接);
89
+ await 数据库连接.commit();
90
+ return 执行结果;
91
+ } catch (错误信息) {
92
+ await 数据库连接.rollback();
93
+ 日志工具.error("数据库事务执行失败", 错误信息);
94
+ 通用工具.插件日志写入(`事务运行报错: ${错误信息.message}`);
95
+ throw 错误信息;
96
+ } finally {
97
+ 数据库连接.release();
98
+ }
99
+ }
100
+ __name(数据库事务执行, "数据库事务执行");
101
+ async function 初始化数据库(配置) {
102
+ const 根数据库连接Pool = (0, import_promise.createPool)({
103
+ host: 配置.数据库配置.数据库地址,
104
+ port: 配置.数据库配置.数据库端口,
105
+ user: 配置.数据库配置.数据库账号,
106
+ password: 配置.数据库配置.数据库密码,
107
+ connectionLimit: 1
108
+ });
109
+ await 根数据库连接Pool.execute(`CREATE DATABASE IF NOT EXISTS ${配置.数据库配置.机器人业务库名} DEFAULT CHARSET utf8mb4`);
110
+ const 机器人数据库池 = (0, import_promise.createPool)({
111
+ host: 配置.数据库配置.数据库地址,
112
+ port: 配置.数据库配置.数据库端口,
113
+ user: 配置.数据库配置.数据库账号,
114
+ password: 配置.数据库配置.数据库密码,
115
+ database: 配置.数据库配置.机器人业务库名,
116
+ connectionLimit: 30
117
+ });
118
+ const 游戏数据库池 = (0, import_promise.createPool)({
119
+ host: 配置.数据库配置.数据库地址,
120
+ port: 配置.数据库配置.数据库端口,
121
+ user: 配置.数据库配置.数据库账号,
122
+ password: 配置.数据库配置.数据库密码,
123
+ database: 配置.数据库配置.游戏数据库存名,
124
+ connectionLimit: 10
125
+ });
126
+ await 机器人数据库池.execute(`
127
+ CREATE TABLE IF NOT EXISTS our_group_members (
128
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
129
+ group_id VARCHAR(20) NOT NULL,
130
+ qq VARCHAR(20) NOT NULL,
131
+ nickname VARCHAR(100) NOT NULL,
132
+ card VARCHAR(100) DEFAULT '',
133
+ level INT DEFAULT 0,
134
+ join_time DATETIME NULL,
135
+ last_sent_time DATETIME NULL,
136
+ role VARCHAR(20) DEFAULT 'member',
137
+ title VARCHAR(100) DEFAULT '',
138
+ sync_time DATETIME NOT NULL,
139
+ register_group VARCHAR(20) DEFAULT '',
140
+ UNIQUE KEY idx_group_qq (group_id,qq),
141
+ INDEX idx_qq_reg (qq,register_group)
142
+ ) CHARSET=utf8mb4;
143
+ `);
144
+ if (!await 通用工具.校验数据库字段是否存在(机器人数据库池, 配置.数据库配置.机器人业务库名, "our_group_members", "register_group")) {
145
+ await 机器人数据库池.execute(`ALTER TABLE our_group_members ADD COLUMN register_group VARCHAR(20) DEFAULT '' COMMENT '用户注册绑定专属群号'`);
146
+ 日志工具.info("✅ 自动新增注册群兼容字段完成,老数据已兼容");
147
+ }
148
+ await 机器人数据库池.execute(`
149
+ CREATE TABLE IF NOT EXISTS duty_user (
150
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
151
+ qq VARCHAR(20) NOT NULL UNIQUE,
152
+ login_time DATETIME NOT NULL,
153
+ expire_time DATETIME NOT NULL,
154
+ today_get_count INT NOT NULL DEFAULT 0,
155
+ INDEX idx_expire (expire_time)
156
+ ) CHARSET=utf8mb4;
157
+ `);
158
+ await 机器人数据库池.execute(`
159
+ CREATE TABLE IF NOT EXISTS drain_log (
160
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
161
+ monitor_qq VARCHAR(20) NOT NULL,
162
+ source_group VARCHAR(20) NOT NULL,
163
+ event_type VARCHAR(20) NOT NULL,
164
+ capture_time DATETIME NOT NULL,
165
+ duty_qq VARCHAR(20) NOT NULL,
166
+ UNIQUE KEY idx_monitor_source (monitor_qq,source_group)
167
+ ) CHARSET=utf8mb4;
168
+ `);
169
+ await 根数据库连接Pool.end();
170
+ return { 机器人数据库池, 游戏数据库池 };
171
+ }
172
+ __name(初始化数据库, "初始化数据库");
173
+ async function apply(上下文, 配置) {
174
+ const { 机器人数据库池, 游戏数据库池 } = await 初始化数据库(配置);
175
+ const 机器人QQ集合 = new Set(配置.机器人QQ列表.map(String));
176
+ const 管理员QQ集合 = new Set(配置.管理员QQ列表.map(String));
177
+ const 白名单群集合 = new Set(配置.白名单群设置.map((群) => String(群.目标群号)));
178
+ const 黑名单QQ集合 = new Set(配置.引流黑名单QQ列表.map(String));
179
+ const 注册防并发锁定 = /* @__PURE__ */ new Set();
180
+ 日志工具.info("✅ 808ps中文纯净重构插件初始化完成,后台表格布局就绪");
181
+ 上下文.on("friend-request", async (会话) => {
182
+ try {
183
+ await 会话.bot.handleFriendRequest(会话.messageId, true);
184
+ await 会话.bot.sendPrivateMessage(会话.用户QQ, "✅ 好友已通过,发送【注册】即可注册游戏账号");
185
+ } catch (错误信息) {
186
+ 日志工具.error("自动通过好友请求失败", 错误信息);
187
+ }
188
+ });
189
+ const 同步群成员数据 = /* @__PURE__ */ __name(async (群号) => {
190
+ if (!白名单群集合.has(群号)) return;
191
+ const 目标机器人 = 上下文.bots.find((机器人) => 机器人QQ集合.has(机器人.selfId) && 机器人.platform === "onebot");
192
+ if (!目标机器人) return;
193
+ try {
194
+ const 群成员列表 = await 目标机器人.internal.getGroupMemberList(群号);
195
+ const 插入参数 = 群成员列表.flatMap((成员) => [
196
+ 群号,
197
+ 成员.user_id,
198
+ 成员.nickname || "",
199
+ 成员.card || "",
200
+ 成员.level || 0,
201
+ 成员.join_time ? new Date(成员.join_time * 1e3) : null,
202
+ 成员.last_sent_time ? new Date(成员.last_sent_time * 1e3) : null,
203
+ 成员.role || "member",
204
+ 成员.title || "",
205
+ /* @__PURE__ */ new Date()
206
+ ]);
207
+ const 同步SQL = `INSERT INTO our_group_members(group_id,qq,nickname,card,level,join_time,last_sent_time,role,title,sync_time)
208
+ VALUES ${群成员列表.map(() => "(?,?,?,?,?,?,?,?,?,?)").join(",")}
209
+ ON DUPLICATE KEY UPDATE nickname=VALUES(nickname),card=VALUES(card),level=VALUES(level),join_time=VALUES(join_time),last_sent_time=VALUES(last_sent_time),role=VALUES(role),title=VALUES(title),sync_time=VALUES(sync_time)`;
210
+ await 机器人数据库池.execute(同步SQL, 插入参数);
211
+ 日志工具.info(`群${群号}成员数据同步成功`);
212
+ } catch (错误信息) {
213
+ 日志工具.error(`群${群号}成员数据同步失败`, 错误信息);
214
+ }
215
+ }, "同步群成员数据");
216
+ 上下文.on("guild-member-added", (会话) => setTimeout(() => 同步群成员数据(事件工具.获取群聊ID(会话)), 配置.进退群数据同步延迟秒 * 1e3));
217
+ 上下文.on("guild-member-removed", (会话) => setTimeout(() => 同步群成员数据(事件工具.获取群聊ID(会话)), 配置.进退群数据同步延迟秒 * 1e3));
218
+ 上下文.setInterval(() => 配置.白名单群设置.forEach((群) => 同步群成员数据(String(群.目标群号))), 配置.群成员定时同步间隔分钟 * 60 * 1e3);
219
+ 上下文.on("guild-member-added", async (会话) => {
220
+ if (!配置.全局功能总开关.群管风控功能开关) return;
221
+ const 当前群号 = 事件工具.获取群聊ID(会话);
222
+ const 当前用户QQ = 事件工具.获取用户QQ(会话);
223
+ if (!白名单群集合.has(当前群号) || !通用工具.校验是否合法QQ(当前用户QQ)) return;
224
+ const 群专属配置 = 配置.白名单群设置.find((配置2) => String(配置2.目标群号) === 当前群号);
225
+ if (!群专属配置 || !群专属配置.新人进群欢迎语) return;
226
+ await 会话.bot.sendMessage(会话.频道ID, import_koishi.segment.at(当前用户QQ) + 群专属配置.新人进群欢迎语);
227
+ });
228
+ 上下文.on("message", async (会话) => {
229
+ if (!配置.全局功能总开关.群管风控功能开关) return;
230
+ const 当前群号 = 事件工具.获取群聊ID(会话);
231
+ const 当前用户QQ = 事件工具.获取用户QQ(会话);
232
+ const 消息内容 = (会话.content || "").trim();
233
+ if (!白名单群集合.has(当前群号) || !通用工具.校验是否合法QQ(当前用户QQ)) return;
234
+ const 群专属配置 = 配置.白名单群设置.find((配置2) => String(配置2.目标群号) === 当前群号);
235
+ if (!群专属配置 || !群专属配置.关键词列表.length) return;
236
+ for (const 规则 of 群专属配置.关键词列表) {
237
+ if (!消息内容.includes(规则.触发关键词)) continue;
238
+ if (规则.自动回复内容) await 会话.send(规则.自动回复内容);
239
+ if (规则.是否自动撤回) await 会话.bot.deleteMessage(会话.channelId, 会话.messageId);
240
+ if (规则.是否自动禁言 && 规则.禁言秒数 > 0) {
241
+ await 会话.bot.internal.setGroupBan(当前群号, 当前用户QQ, 规则.禁言秒数);
242
+ }
243
+ if (规则.是否通知管理) {
244
+ 管理员QQ集合.forEach(async (管理QQ) => {
245
+ await 会话.bot.sendPrivateMessage(管理QQ, `⚠️关键词风控触发:群${当前群号},用户${当前用户QQ},触发词【${规则.触发关键词}】`);
246
+ });
247
+ }
248
+ }
249
+ });
250
+ 上下文.middleware(async (会话, 下一步) => {
251
+ if (会话.type !== "message-created" || 会话.subtype !== "private") return 下一步();
252
+ if (!机器人QQ集合.has(会话.bot.selfId)) return 下一步();
253
+ const 操作人QQ = 通用工具.获取当前操作人QQ(会话);
254
+ const 消息内容 = (会话.content || "").trim();
255
+ if (!通用工具.校验是否合法QQ(操作人QQ)) return 下一步();
256
+ if (!配置.全局功能总开关.注册功能开关 && 消息内容.includes("注册")) {
257
+ await 会话.send("⚠️ 当前注册功能已关闭,暂无法注册");
258
+ return;
259
+ }
260
+ if (消息内容 === "注册") {
261
+ if (注册防并发锁定.has(操作人QQ)) {
262
+ await 会话.send("⚠️ 注册正在处理中,请稍后再试");
263
+ return;
264
+ }
265
+ 注册防并发锁定.add(操作人QQ);
266
+ try {
267
+ const [用户所在群数据] = await 机器人数据库池.execute(`SELECT group_id FROM our_group_members WHERE qq=? AND group_id IN (${配置.白名单群设置.map(() => "?").join(",")}) LIMIT 1`, [操作人QQ, ...配置.白名单群设置.map((群) => String(群.目标群号))]);
268
+ if (用户所在群数据.length <= 0) {
269
+ await 会话.send("❌ 你不在注册白名单群,无法注册账号");
270
+ return;
271
+ }
272
+ const 绑定注册群号 = 用户所在群数据[0].group_id;
273
+ const [已注册群信息] = await 机器人数据库池.execute(`SELECT register_group FROM our_group_members WHERE qq=? AND register_group!='' LIMIT 1`, [操作人QQ]);
274
+ const 注册数据 = 已注册群信息[0];
275
+ if (注册数据?.register_group) {
276
+ 管理员QQ集合.forEach(async (管理QQ) => {
277
+ await 会话.bot.sendPrivateMessage(管理QQ, `⚠️串群注册拦截:用户${操作人QQ},原注册群${注册数据.register_group},禁止重复注册已拦截`);
278
+ });
279
+ await 会话.send("❌ 已在其他群注册,禁止串群重复注册");
280
+ return;
281
+ }
282
+ const [游戏账号校验] = await 游戏数据库池.execute(`SELECT UID FROM accounts WHERE accountname=?`, [操作人QQ]);
283
+ if (游戏账号校验.length > 0) {
284
+ 管理员QQ集合.forEach(async (管理QQ) => {
285
+ await 会话.bot.sendPrivateMessage(管理QQ, `⚠️老账号拦截:用户${操作人QQ}游戏已注册,禁止重复新建账号`);
286
+ });
287
+ await 会话.send("❌ 你的账号已注册过,请勿重复操作");
288
+ return;
289
+ }
290
+ const 随机密码 = 通用工具.生成随机注册密码();
291
+ const MD5密码 = 通用工具.MD5加密(随机密码);
292
+ const 初始点券数量 = 配置.注册赠送初始点券;
293
+ const 初始代币数量 = 配置.注册赠送初始代币;
294
+ await 数据库事务执行(机器人数据库池, async () => {
295
+ await 机器人数据库池.execute(`UPDATE our_group_members SET register_group=? WHERE qq=?`, [绑定注册群号, 操作人QQ]);
296
+ await 游戏数据库池.execute(
297
+ `INSERT INTO accounts (accountname,password,reg_time,point,coins) VALUES (?,?,NOW(),?,?)`,
298
+ [操作人QQ, MD5密码, 初始点券数量, 初始代币数量]
299
+ );
300
+ });
301
+ await 会话.send(`✅ 注册成功!已绑定当前群防串群锁死
302
+ 👤游戏账号:${操作人QQ}
303
+ 🔒登录密码:${随机密码}
304
+ 💰注册赠送初始点券:${初始点券数量}
305
+ 🪙注册赠送初始代币:${初始代币数量}`);
306
+ 日志工具.info(`✅ 用户${操作人QQ}在群${绑定注册群号}注册成功,已赠送点券+代币`);
307
+ } catch (注册报错) {
308
+ 日志工具.error(`用户${操作人QQ}注册失败`, 注册报错);
309
+ 通用工具.插件日志写入(`注册失败:用户${操作人QQ},报错${注册报错.message}`);
310
+ await 会话.send("❌ 注册失败,请稍后重试或联系管理员");
311
+ } finally {
312
+ 注册防并发锁定.delete(操作人QQ);
313
+ }
314
+ return;
315
+ }
316
+ return 下一步();
317
+ });
318
+ 上下文.on("dispose", async () => {
319
+ await 机器人数据库池.end().catch(() => {
320
+ });
321
+ await 游戏数据库池.end().catch(() => {
322
+ });
323
+ 日志工具.info("✅ 插件已卸载,所有数据库资源已释放");
324
+ });
325
+ }
326
+ __name(apply, "apply");
327
+ var Config = import_koishi.Schema.object({
328
+ 机器人QQ列表: import_koishi.Schema.array(Number).description("填写所有需要启用的机器人QQ号"),
329
+ 管理员QQ列表: import_koishi.Schema.array(Number).description("接收串群、拦截报错通知的管理员QQ"),
330
+ 引流黑名单QQ列表: import_koishi.Schema.array(Number).default([]).description("黑名单用户不进行任何引流推送"),
331
+ 数据库配置: import_koishi.Schema.object({
332
+ 数据库地址: import_koishi.Schema.string().default("localhost").description("数据库IP地址"),
333
+ 数据库端口: import_koishi.Schema.number().default(3306).description("数据库端口默认3306"),
334
+ 数据库账号: import_koishi.Schema.string().default("root").description("数据库登录账号"),
335
+ 数据库密码: import_koishi.Schema.string().role("secret").default("").description("数据库登录密码"),
336
+ 机器人业务库名: import_koishi.Schema.string().default("808ps_bot").description("机器人配置数据库存名"),
337
+ 游戏数据库存名: import_koishi.Schema.string().default("d_taiwan").description("游戏账号数据库存名")
338
+ }).description("🔧 数据库核心连接配置"),
339
+ 值班推广配置: import_koishi.Schema.object({
340
+ 上岗密码: import_koishi.Schema.string().default("808ps123").description("用户值班上岗输入的密码"),
341
+ 上岗有效小时: import_koishi.Schema.number().default(2).description("值班上岗有效期时长"),
342
+ 每日领取上限: import_koishi.Schema.number().default(50).description("每日值班领取次数上限")
343
+ }).description("👷 值班上岗推广相关设置"),
344
+ 引流监控开关: import_koishi.Schema.object({
345
+ 主动进群监控: import_koishi.Schema.boolean().default(true).description("用户主动加群是否开启监控"),
346
+ 邀请进群监控: import_koishi.Schema.boolean().default(true).description("被好友邀请进群是否开启监控"),
347
+ 被踢群监控: import_koishi.Schema.boolean().default(false).description("用户被踢群是否开启监控"),
348
+ 主动退群监控: import_koishi.Schema.boolean().default(false).description("用户主动退群是否开启监控")
349
+ }).description("📹 引流监控事件启停开关"),
350
+ 全局功能总开关: import_koishi.Schema.object({
351
+ 注册功能开关: import_koishi.Schema.boolean().default(true).description("总开关:一键开启/关闭所有注册功能"),
352
+ 引流监控功能开关: import_koishi.Schema.boolean().default(true).description("总开关:一键开启/关闭引流监控"),
353
+ 群管风控功能开关: import_koishi.Schema.boolean().default(true).description("总开关:一键开启/关闭群管欢迎、风控")
354
+ }).description("🔘 插件所有功能一键总启停"),
355
+ 引流重复推送冷却小时: import_koishi.Schema.number().default(24).description("同一用户短时间内不重复推送引流冷却时间"),
356
+ 注册赠送初始点券: import_koishi.Schema.number().default(1e4).description("新用户注册自动赠送的初始游戏点券数量"),
357
+ 注册赠送初始代币: import_koishi.Schema.number().default(5e3).description("新用户注册自动赠送的初始游戏代币数量"),
358
+ // 核心:白名单群 强制表格横向布局
359
+ 白名单群设置: import_koishi.Schema.array(import_koishi.Schema.object({
360
+ 目标群号: import_koishi.Schema.number().required().description("托管管控群QQ"),
361
+ 新人进群欢迎语: import_koishi.Schema.string().default("欢迎新大佬进群!").description("新人进群欢迎文案"),
362
+ // 核心:关键词规则 强制原版表格平铺布局!!加了.role('table')
363
+ 关键词列表: import_koishi.Schema.array(import_koishi.Schema.object({
364
+ 触发关键词: import_koishi.Schema.string().description("触发词"),
365
+ 自动回复内容: import_koishi.Schema.string().description("回复内容"),
366
+ 是否自动撤回: import_koishi.Schema.boolean().default(false).description("自动撤回"),
367
+ 是否自动禁言: import_koishi.Schema.boolean().default(false).description("自动禁言"),
368
+ 禁言秒数: import_koishi.Schema.number().default(600).description("禁言秒数"),
369
+ 是否通知管理: import_koishi.Schema.boolean().default(true).description("通知管理")
370
+ })).role("table").description("关键词风控表格【横向平铺】")
371
+ })).role("table").description("👥 白名单群列表【原版表格横向平铺】"),
372
+ 刷屏风控设置: import_koishi.Schema.object({
373
+ 统计时间窗口秒数: import_koishi.Schema.number().default(5).description("几秒内统计刷屏消息"),
374
+ 最大允许消息条数: import_koishi.Schema.number().default(5).description("规定时间内最多发几条消息"),
375
+ 是否自动撤回刷屏消息: import_koishi.Schema.boolean().default(true).description("检测刷屏是否自动撤回消息"),
376
+ 是否自动禁言刷屏用户: import_koishi.Schema.boolean().default(false).description("检测刷屏是否自动禁言"),
377
+ 刷屏禁言秒数: import_koishi.Schema.number().default(600).description("刷屏违规禁言时长"),
378
+ 是否通知管理员刷屏预警: import_koishi.Schema.boolean().default(true).description("刷屏风控是否通知管理员")
379
+ }).description("🛡️ 群内刷屏防骚扰风控设置"),
380
+ AI智能聊天配置: import_koishi.Schema.object({
381
+ 接口密钥: import_koishi.Schema.string().role("secret").default("").description("AI大模型接口密钥"),
382
+ AI模型名称: import_koishi.Schema.string().default("glm-4-flash").description("使用的AI模型名字"),
383
+ 最大生成Token数: import_koishi.Schema.number().default(1024).description("AI回复最大文字长度"),
384
+ 对话温度随机值: import_koishi.Schema.number().default(0.7).description("AI回复随机创意度"),
385
+ AI系统人设提示词: import_koishi.Schema.string().default("你是QQ机器人,正常聊天回复").description("给AI设定的人设和回复规则")
386
+ }).description("🤖 AI智能聊天对话配置"),
387
+ 进退群数据同步延迟秒: import_koishi.Schema.number().default(3).description("进退群后延迟几秒再同步数据"),
388
+ 群成员定时同步间隔分钟: import_koishi.Schema.number().default(60).description("每隔多少分钟全量同步一次群成员")
389
+ });
390
+ var src_default = { 插件名称, Config, apply, 依赖组件, description: "808ps表格布局版-带完整注册+自动点券+代币赠送+防串群全套插件" };
391
+ // Annotate the CommonJS export names for ESM import in node:
392
+ 0 && (module.exports = {
393
+ Config,
394
+ apply,
395
+ 依赖组件,
396
+ 插件名称,
397
+ 日志工具
398
+ });
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "koishi-plugin-808ps-qunmax",
3
+ "description": "",
4
+ "version": "0.0.1",
5
+ "main": "lib/index.js",
6
+ "typings": "lib/index.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "dist"
10
+ ],
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "chatbot",
14
+ "koishi",
15
+ "plugin"
16
+ ],
17
+ "peerDependencies": {
18
+ "koishi": "^4.18.7"
19
+ },
20
+ "dependencies": {
21
+ "mysql2": "^3.22.3"
22
+ }
23
+ }
package/readme.md ADDED
@@ -0,0 +1,5 @@
1
+ # koishi-plugin-808ps-qunmax
2
+
3
+ [![npm](https://img.shields.io/npm/v/koishi-plugin-808ps-qunmax?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-808ps-qunmax)
4
+
5
+