koishi-plugin-lolbaninfo 1.1.0 → 1.1.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 CHANGED
@@ -1,18 +1,26 @@
1
1
  import { Context, Schema } from 'koishi';
2
2
  export declare const name = "lolbaninfo";
3
- export declare const usage = "\n# \u26A0\uFE0F LOL\u5C01\u53F7\u67E5\u8BE2\u63D2\u4EF6 \u26A0\uFE0F\n- **\u6B64\u63D2\u4EF6\u4F5C\u8005\u53EA\u662F\u5236\u4F5C\u5DE5\u5177\uFF0C\u7F51\u7AD9API\u53CA\u5176\u5185\u5BB9\u5747\u4E0E\u4F5C\u8005\u65E0\u5173\uFF0C\u8BF7\u5408\u7406\u4F7F\u7528**\n- \u65E0\u9700\u5BC6\u7801\uFF0C\u76F4\u63A5\u6839\u636EQQ\u53F7\u67E5\u8BE2\u8D26\u53F7\u5C01\u7981\u72B6\u6001\u4E0E\u8BE6\u7EC6\u4FE1\u606F\n\n---\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCE2 \u529F\u80FD\u7279\u70B9</span></strong></summary>\n\n- \u652F\u6301\u901A\u8FC7QQ\u53F7\u5FEB\u901F\u67E5\u8BE2LOL\u8D26\u53F7\u5C01\u7981\u72B6\u6001\n- \u81EA\u52A8\u91CD\u8BD5\u673A\u5236\uFF0C\u63D0\u9AD8\u67E5\u8BE2\u6210\u529F\u7387\n- \u65E5\u5FD7\u81EA\u52A8\u6E05\u7406\uFF0C\u907F\u514D\u65E5\u5FD7\u8FC7\u591A\u5360\u7528\u5185\u5B58\n- \u7B80\u5355\u6613\u7528\u7684\u6307\u4EE4\u64CD\u4F5C\uFF0C\u9002\u5408\u5404\u7C7B\u7528\u6237\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDEE0\uFE0F \u914D\u7F6E\u8BF4\u660E</span></strong></summary>\n\n- apiUrl: \u76EE\u6807\u7F51\u7AD9\u7684API\u63A5\u53E3\u5730\u5740\uFF0C\u901A\u5E38\u65E0\u9700\u4FEE\u6539\n- apiToken: \u7F51\u7AD9API\u7684\u8BBF\u95EEToken\uFF08\u6CE8\u518C\u5373\u53EF\u83B7\u5F97\uFF09\uFF0C\u6CE8\u518C\u7F51\u7AD9\uFF1Ahttps://yun.4png.com/\n- retryTimes: \u8BF7\u6C42\u5931\u8D25\u65F6\u7684\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A2-3\u6B21\n- retryDelay: \u6BCF\u6B21\u91CD\u8BD5\u7684\u95F4\u9694\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A1000-2000ms\n- maxLogCount: \u65E5\u5FD7\u81EA\u52A8\u6E05\u7406\u9608\u503C\uFF08\u6700\u5927\u5B58\u50A8\u6761\u6570\uFF09\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A100-200\u6761\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCA1 \u4F7F\u7528\u6307\u4EE4</span></strong></summary>\n\n- \u67E5\u5C01\u53F7+\u7A7A\u683C+<qq\u53F7>\uFF1A\u67E5\u8BE2\u6307\u5B9AQQ\u53F7\u7684LOL\u5C01\u7981\u72B6\u6001\n- \u793A\u4F8B\uFF1A<pre><code>\u67E5\u5C01\u53F7 123456789</code></pre>\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCA1 \u4F7F\u7528\u6307\u4EE4</span></strong></summary>\n\n- \u67E5\u5C01\u53F7+\u7A7A\u683C+<qq\u53F7>\uFF1A\u67E5\u8BE2\u6307\u5B9AQQ\u53F7\u7684LOL\u5C01\u7981\u72B6\u6001\n- \u793A\u4F8B\uFF1A<pre><code>\u67E5\u5C01\u53F7 123456789</code></pre>\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCC4 \u6CE8\u610F\u4E8B\u9879</span></strong></summary>\n\n- \u8BF7\u786E\u4FDD\u63D0\u4F9B\u7684API Token\u6709\u6548\u4E14\u6709\u67E5\u8BE2\u6743\u9650\n- \u672C\u63D2\u4EF6\u4EC5\u4F9B\u67E5\u8BE2\u5C01\u7981\u72B6\u6001\uFF0C\u8BF7\u52FF\u7528\u4E8E\u5176\u4ED6\u7528\u9014\n\n</details>\n";
3
+ export declare const usage = "\n# \u26A0\uFE0F LOL\u5C01\u53F7\u67E5\u8BE2\u63D2\u4EF6 \u26A0\uFE0F\n- **\u6B64\u63D2\u4EF6\u4F5C\u8005\u53EA\u662F\u5236\u4F5C\u5DE5\u5177\uFF0C\u7F51\u7AD9API\u53CA\u5176\u5185\u5BB9\u5747\u4E0E\u4F5C\u8005\u65E0\u5173\uFF0C\u8BF7\u5408\u7406\u4F7F\u7528**\n- \u65E0\u9700\u5BC6\u7801\uFF0C\u76F4\u63A5\u6839\u636EQQ\u53F7\u67E5\u8BE2\u8D26\u53F7\u5C01\u7981\u72B6\u6001\u4E0E\u8BE6\u7EC6\u4FE1\u606F\n- \u6CE8\u518C\u7F51\u7AD9\uFF1Ahttps://yun.4png.com/\n---\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCE2 \u529F\u80FD\u7279\u70B9</span></strong></summary>\n\n- \u652F\u6301\u901A\u8FC7QQ\u53F7\u5FEB\u901F\u67E5\u8BE2LOL\u8D26\u53F7\u5C01\u7981\u72B6\u6001\n- \u81EA\u52A8\u91CD\u8BD5\u673A\u5236\uFF0C\u63D0\u9AD8\u67E5\u8BE2\u6210\u529F\u7387\n- \u65E5\u5FD7\u81EA\u52A8\u6E05\u7406\uFF0C\u907F\u514D\u65E5\u5FD7\u8FC7\u591A\u5360\u7528\u5185\u5B58\n- \u7B80\u5355\u6613\u7528\u7684\u6307\u4EE4\u64CD\u4F5C\uFF0C\u9002\u5408\u5404\u7C7B\u7528\u6237\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDEE0\uFE0F \u914D\u7F6E\u8BF4\u660E</span></strong></summary>\n\n- apiUrl: \u76EE\u6807\u7F51\u7AD9\u7684API\u63A5\u53E3\u5730\u5740\uFF0C\u901A\u5E38\u65E0\u9700\u4FEE\u6539\n- apiToken: \u7F51\u7AD9API\u7684\u8BBF\u95EEToken\uFF08\u6CE8\u518C\u5373\u53EF\u83B7\u5F97\uFF09\uFF0C\u6CE8\u518C\u7F51\u7AD9\uFF1Ahttps://yun.4png.com/\n- retryTimes: \u8BF7\u6C42\u5931\u8D25\u65F6\u7684\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A2-3\u6B21\n- retryDelay: \u6BCF\u6B21\u91CD\u8BD5\u7684\u95F4\u9694\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A1000-2000ms\n- maxLogCount: \u65E5\u5FD7\u81EA\u52A8\u6E05\u7406\u9608\u503C\uFF08\u6700\u5927\u5B58\u50A8\u6761\u6570\uFF09\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E\u4E3A100-200\u6761\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCA1 \u4F7F\u7528\u6307\u4EE4</span></strong></summary>\n\n- \u67E5\u5C01\u53F7+\u7A7A\u683C+<qq\u53F7>\uFF1A\u67E5\u8BE2\u6307\u5B9AQQ\u53F7\u7684LOL\u5C01\u7981\u72B6\u6001\n- \u793A\u4F8B\uFF1A<pre><code>\u67E5\u5C01\u53F7 123456789</code></pre>\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCA1 \u4F7F\u7528\u6307\u4EE4</span></strong></summary>\n\n- \u67E5\u5C01\u53F7+\u7A7A\u683C+<qq\u53F7>\uFF1A\u67E5\u8BE2\u6307\u5B9AQQ\u53F7\u7684LOL\u5C01\u7981\u72B6\u6001\n- \u793A\u4F8B\uFF1A<pre><code>\u67E5\u5C01\u53F7 123456789</code></pre>\n\n</details>\n\n<details>\n<summary><strong><span style=\"font-size: 1.3em; color: #2a2a2a;\">\uD83D\uDCC4 \u6CE8\u610F\u4E8B\u9879</span></strong></summary>\n\n- \u8BF7\u786E\u4FDD\u63D0\u4F9B\u7684API Token\u6709\u6548\u4E14\u6709\u67E5\u8BE2\u6743\u9650\n- \u672C\u63D2\u4EF6\u4EC5\u4F9B\u67E5\u8BE2\u5C01\u7981\u72B6\u6001\uFF0C\u8BF7\u52FF\u7528\u4E8E\u5176\u4ED6\u7528\u9014\n\n</details>\n";
4
4
  export declare enum ReplyMode {
5
5
  MENTION = "mention",// @用户
6
6
  QUOTE = "quote",// 引用回复
7
7
  NORMAL = "normal"
8
8
  }
9
9
  export interface Config {
10
- apiUrl: string;
11
- apiToken: string;
12
- retryTimes: number;
13
- retryDelay: number;
14
- maxLogCount: number;
15
- replyMode: ReplyMode;
10
+ api: {
11
+ apiUrl: string;
12
+ apiToken: string;
13
+ };
14
+ reply: {
15
+ replyMode: ReplyMode;
16
+ };
17
+ retry: {
18
+ retryTimes: number;
19
+ retryDelay: number;
20
+ };
21
+ log: {
22
+ maxLogCount: number;
23
+ };
16
24
  }
17
25
  export declare const Config: Schema<Config>;
18
26
  export declare function apply(ctx: Context, config: Config): void;
package/lib/index.js CHANGED
@@ -33,7 +33,7 @@ var usage = `
33
33
  # ⚠️ LOL封号查询插件 ⚠️
34
34
  - **此插件作者只是制作工具,网站API及其内容均与作者无关,请合理使用**
35
35
  - 无需密码,直接根据QQ号查询账号封禁状态与详细信息
36
-
36
+ - 注册网站:https://yun.4png.com/
37
37
  ---
38
38
 
39
39
  <details>
@@ -87,20 +87,37 @@ var ReplyMode = /* @__PURE__ */ ((ReplyMode2) => {
87
87
  ReplyMode2["NORMAL"] = "normal";
88
88
  return ReplyMode2;
89
89
  })(ReplyMode || {});
90
- var Config = import_koishi.Schema.object({
91
- apiUrl: import_koishi.Schema.string().description("目标网站的API接口地址").default("https://yun.4png.com/api/query.html "),
92
- apiToken: import_koishi.Schema.string().description("网站API的访问Token(注册即可获得)").required(),
93
- replyMode: import_koishi.Schema.union([
94
- // 新增配置项
95
- import_koishi.Schema.const("mention" /* MENTION */).description("使用 @ 用户进行回复"),
96
- import_koishi.Schema.const("quote" /* QUOTE */).description("使用引用进行回复"),
97
- import_koishi.Schema.const("normal" /* NORMAL */).description("保持普通回复")
98
- ]).description("机器人回复消息的方式").default("normal" /* NORMAL */),
99
- // 默认为普通模式
100
- retryTimes: import_koishi.Schema.number().description("请求失败时的最大重试次数").default(2).min(0).max(5),
101
- retryDelay: import_koishi.Schema.number().description("每次重试的间隔时间(毫秒)").default(1e3).min(500).max(5e3),
102
- maxLogCount: import_koishi.Schema.number().description("日志自动清理阈值(最大存储条数)").default(100).min(20).max(500)
103
- });
90
+ var Config = import_koishi.Schema.intersect([
91
+ // 使用 intersect 来组合多个对象
92
+ import_koishi.Schema.object({
93
+ api: import_koishi.Schema.object({
94
+ apiUrl: import_koishi.Schema.string().description("目标网站的API接口地址").default("https://yun.4png.com/api/query.html"),
95
+ // .required(), // 移除 .required(),因为有默认值
96
+ apiToken: import_koishi.Schema.string().description("网站API的访问Token(注册即可获得)").required()
97
+ // 这个是真正需要用户输入的
98
+ }).description("API 设置"),
99
+ // API 相关配置的分组描述
100
+ reply: import_koishi.Schema.object({
101
+ replyMode: import_koishi.Schema.union([
102
+ import_koishi.Schema.const("mention" /* MENTION */).description("使用 @ 用户进行回复"),
103
+ import_koishi.Schema.const("quote" /* QUOTE */).description("使用引用进行回复"),
104
+ import_koishi.Schema.const("normal" /* NORMAL */).description("保持普通回复")
105
+ ]).description("机器人回复消息的方式").default("normal" /* NORMAL */)
106
+ // 默认为普通模式
107
+ }).description("回复 设置"),
108
+ // 回复相关配置的分组描述
109
+ retry: import_koishi.Schema.object({
110
+ retryTimes: import_koishi.Schema.number().description("请求失败时的最大重试次数").default(2).min(0).max(5),
111
+ retryDelay: import_koishi.Schema.number().description("每次重试的间隔时间(毫秒)").default(1e3).min(500).max(5e3)
112
+ }).description("重试 设置"),
113
+ // 重试相关配置的分组描述
114
+ log: import_koishi.Schema.object({
115
+ // 新增日志配置分组
116
+ maxLogCount: import_koishi.Schema.number().description("日志自动清理阈值(最大存储条数)").default(100).min(20).max(500)
117
+ }).description("日志 设置")
118
+ // 日志相关配置的分组描述
119
+ })
120
+ ]);
104
121
  var logCache = [];
105
122
  function addLogAndClean(logger, content, maxCount) {
106
123
  const formattedLog = `[${(/* @__PURE__ */ new Date()).toLocaleString()}] ${content}`;
@@ -114,40 +131,45 @@ function addLogAndClean(logger, content, maxCount) {
114
131
  __name(addLogAndClean, "addLogAndClean");
115
132
  async function requestWithRetry(ctx, config, qq, logger) {
116
133
  let attempt = 0;
117
- while (attempt <= config.retryTimes) {
134
+ const { apiUrl, apiToken } = config.api;
135
+ const { retryTimes, retryDelay } = config.retry;
136
+ const { maxLogCount } = config.log;
137
+ while (attempt <= retryTimes) {
118
138
  try {
119
- const requestLog = `[第${attempt + 1}次请求] 开始查询QQ:${qq},目标API:${config.apiUrl}`;
120
- addLogAndClean(logger, requestLog, config.maxLogCount);
139
+ const requestLog = `[第${attempt + 1}次请求] 开始查询QQ:${qq},目标API:${apiUrl}`;
140
+ addLogAndClean(logger, requestLog, maxLogCount);
121
141
  logger.info(requestLog);
122
- const response = await ctx.http.get(config.apiUrl, {
142
+ const response = await ctx.http.get(apiUrl, {
143
+ // 使用解构后的值
123
144
  params: {
124
145
  qq,
125
- token: config.apiToken
146
+ token: apiToken
147
+ // 使用解构后的值
126
148
  },
127
149
  // 强制解析JSON,避免返回文本格式
128
150
  responseType: "json"
129
151
  });
130
152
  const successLog = `[第${attempt + 1}次请求] 查询成功,返回状态码:200`;
131
- addLogAndClean(logger, successLog, config.maxLogCount);
153
+ addLogAndClean(logger, successLog, maxLogCount);
132
154
  logger.success(successLog);
133
155
  return response;
134
156
  } catch (error) {
135
157
  attempt++;
136
158
  const status = error.response?.status || "未知状态";
137
159
  const failLog = `[第${attempt}次请求] 失败,状态码:${status},错误信息:${error.message}`;
138
- addLogAndClean(logger, failLog, config.maxLogCount);
160
+ addLogAndClean(logger, failLog, maxLogCount);
139
161
  logger.warn(failLog);
140
162
  const isRetryable = [400, 403].includes(status);
141
- if (!isRetryable || attempt > config.retryTimes) {
142
- const endLog = `[请求终止] 非重试错误或已达最大重试次数(${config.retryTimes}次)`;
143
- addLogAndClean(logger, endLog, config.maxLogCount);
163
+ if (!isRetryable || attempt > retryTimes) {
164
+ const endLog = `[请求终止] 非重试错误或已达最大重试次数(${retryTimes}次)`;
165
+ addLogAndClean(logger, endLog, maxLogCount);
144
166
  logger.error(endLog);
145
167
  throw error;
146
168
  }
147
- const retryLog = `[准备重试] 间隔${config.retryDelay}ms后进行第${attempt}次重试`;
148
- addLogAndClean(logger, retryLog, config.maxLogCount);
169
+ const retryLog = `[准备重试] 间隔${retryDelay}ms后进行第${attempt}次重试`;
170
+ addLogAndClean(logger, retryLog, maxLogCount);
149
171
  logger.info(retryLog);
150
- await (0, import_koishi.sleep)(config.retryDelay);
172
+ await (0, import_koishi.sleep)(retryDelay);
151
173
  }
152
174
  }
153
175
  throw new Error("达到最大重试次数,请求失败");
@@ -159,10 +181,10 @@ function isValidQQ(qq) {
159
181
  __name(isValidQQ, "isValidQQ");
160
182
  function formatReplyMessage(session, message, config) {
161
183
  let prefix = "";
162
- if (config.replyMode === "mention" /* MENTION */) {
163
- prefix = import_koishi.h.at(session.userId).toString();
184
+ if (config.reply.replyMode === "mention" /* MENTION */) {
185
+ prefix = import_koishi.h.at(session.userId).toString() + "\n";
164
186
  }
165
- if (config.replyMode === "quote" /* QUOTE */) {
187
+ if (config.reply.replyMode === "quote" /* QUOTE */) {
166
188
  prefix = import_koishi.h.quote(session.messageId).toString();
167
189
  }
168
190
  return prefix + message;
@@ -173,7 +195,7 @@ function apply(ctx, config) {
173
195
  ctx.command("查封号 <qq号>", "查询QQ号封号状态").action(async ({ session }, qq) => {
174
196
  if (!isValidQQ(qq)) {
175
197
  const errMsg = `QQ号格式错误:${qq}(需5-13位数字)`;
176
- addLogAndClean(logger, errMsg, config.maxLogCount);
198
+ addLogAndClean(logger, errMsg, config.log.maxLogCount);
177
199
  logger.warn(errMsg);
178
200
  return formatReplyMessage(session, `❌ ${errMsg}`, config);
179
201
  }
@@ -184,25 +206,25 @@ function apply(ctx, config) {
184
206
  case 200:
185
207
  const banInfo = result.data?.banmsg || "无详细封禁信息";
186
208
  const successResLog = `[查询结果] QQ${qq}:${msg} → ${banInfo}`;
187
- addLogAndClean(logger, successResLog, config.maxLogCount);
209
+ addLogAndClean(logger, successResLog, config.log.maxLogCount);
188
210
  logger.success(successResLog);
189
211
  return formatReplyMessage(session, `✅ 查询成功:${msg}
190
212
  📝 详细信息:${banInfo}`, config);
191
213
  case 400:
192
214
  const warnResLog = `[查询结果] QQ${qq} 400错误:${msg}`;
193
- addLogAndClean(logger, warnResLog, config.maxLogCount);
215
+ addLogAndClean(logger, warnResLog, config.log.maxLogCount);
194
216
  logger.warn(warnResLog);
195
217
  return formatReplyMessage(session, `❌ 查询失败 [错误码400]:${msg}(参数缺失,请检查配置)`, config);
196
218
  default:
197
219
  const infoResLog = `[查询结果] QQ${qq} 错误码${result.code}:${msg}`;
198
- addLogAndClean(logger, infoResLog, config.maxLogCount);
220
+ addLogAndClean(logger, infoResLog, config.log.maxLogCount);
199
221
  logger.info(infoResLog);
200
222
  return formatReplyMessage(session, `❌ 查询失败 [错误码${result.code}]:${msg}`, config);
201
223
  }
202
224
  } catch (error) {
203
225
  const errMsg = error.message || "未知错误";
204
226
  const errorLog = `[接口调用出错] QQ${qq}:${errMsg}`;
205
- addLogAndClean(logger, errorLog, config.maxLogCount);
227
+ addLogAndClean(logger, errorLog, config.log.maxLogCount);
206
228
  logger.error(errorLog);
207
229
  return formatReplyMessage(session, `⚠️ 接口调用出错:${errMsg}`, config);
208
230
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-lolbaninfo",
3
3
  "description": "LOL封号查询插件",
4
- "version": "1.1.0",
4
+ "version": "1.1.1",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/lenksen/lolbaninfo.git"