koishi-plugin-sky-blessing 0.2.2 → 0.2.3-rc.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/api.d.ts CHANGED
@@ -1,25 +1,41 @@
1
1
  import { Context } from 'koishi';
2
- import { BlessingResult, PluginConfig, ParamMapping } from './types';
2
+ import { BlessingResult, PluginConfig, ParamMapping, BlessingStats } from './types';
3
3
  import { SkyLogger } from './logger';
4
4
  export declare class BlessingAPI {
5
5
  private ctx;
6
6
  private config;
7
7
  private logger;
8
+ private stats;
8
9
  constructor(ctx: Context, // 📡 Koishi 上下文
9
10
  config: PluginConfig);
10
11
  /**
11
12
  * 设置日志器实例
12
13
  */
13
14
  setLogger(logger: SkyLogger): void;
15
+ /**
16
+ * ✅ 验证配置合法性
17
+ */
18
+ private validateConfig;
19
+ /**
20
+ * 📊 记录抽签统计数据
21
+ */
22
+ private recordStats;
23
+ /**
24
+ * 📈 获取统计摘要
25
+ */
26
+ getStatsSummary(): {
27
+ total: number;
28
+ recent: BlessingStats[];
29
+ };
14
30
  /**
15
31
  * 🔄 根据映射配置解析参数值
16
32
  * ⚠️ 重复的 key 只有第一个启用的生效
17
33
  */
18
34
  resolveParams(mappings: ParamMapping[], session: any): Record<string, string>;
19
35
  /**
20
- * 📡 调用 /blessing 端点
36
+ * 📡 调用 /blessing 端点(带计时和统计)
21
37
  */
22
- fetchBlessing(type: 'image' | 'json' | 'json_without_image', params?: Record<string, string>): Promise<BlessingResult | Buffer>;
38
+ fetchBlessing(type: 'image' | 'json' | 'json_without_image', params?: Record<string, string>, commandType?: 'image' | 'text' | 'qq-markdown'): Promise<BlessingResult | Buffer>;
23
39
  /**
24
40
  * 🔄 将 buffer 转为 base64 data URI 格式
25
41
  */
package/lib/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Context } from 'koishi';
2
2
  import { PluginConfig } from './types';
3
+ export { usage } from './usage';
3
4
  import { SkyLogger } from './logger';
4
5
  export declare const name = "sky-blessing";
5
- export declare const usage = "\n<h1>Koishi \u63D2\u4EF6\uFF1Asky-blessing \u5149\u9047\u7948\u798F\u7B7E</h1>\n<h2>\uD83C\uDFAF \u529F\u80FD\u7B80\u4ECB</h2>\n<p>\u968F\u673A\u751F\u6210\u5149\u9047\u7948\u798F\u7B7E\u56FE\u7247\u7684 Koishi \u63D2\u4EF6\uFF0C\u652F\u6301\u4E09\u79CD\u8F93\u51FA\u6A21\u5F0F\uFF1A</p>\n<ul>\n <li>\uD83D\uDDBC\uFE0F <b>\u5149\u9047\u62BD\u7B7E\u56FE</b> - \u4EC5\u53D1\u9001\u7948\u798F\u7B7E\u56FE\u7247</li>\n <li>\uD83D\uDCDC <b>\u5149\u9047\u62BD\u7B7E</b> - \u53D1\u9001\u56FE\u7247 + \u6587\u5B57\u5185\u5BB9\uFF08\u8FD0\u52BF\u7B49\u7EA7\u3001\u7ED3\u7F18\u7269\u3001\u7F18\u5F69\u3001\u795D\u798F\u8BED\u7B49\uFF09</li>\n <li>\uD83D\uDCDD <b>\u5149\u9047\u62BD\u7B7Emd</b> - \u53D1\u9001\u56FE\u7247 + Markdown\u683C\u5F0F\uFF08\uD83D\uDCA1 \u4EC5\u9650 QQ \u5E73\u53F0\u53EF\u7528\uFF09</li>\n</ul>\n\n<h2>\uD83D\uDCAC \u4EA4\u6D41\u7FA4\u7EC4</h2>\n<p><del>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165QQ\u7FA4\uFF1A<b>259248174</b> \uD83C\uDF89\uFF08\u8FD9\u4E2A\u7FA4G\u4E86\uFF09</del></p>\n<p>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D\uD83D\uDCBB \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165\u65B0QQ\u7FA4\uFF1A<b>1085190201</b> \uD83C\uDF89</p>\n<p>\uD83D\uDCA1 \u5728\u7FA4\u91CC\u76F4\u63A5\u827E\u7279\u6211\uFF0C\u56DE\u590D\u7684\u66F4\u5FEB\u54E6~ \u2728</p>\n\n<hr>\n\n<h3 style=\"color: #e74c3c;\">\u2699\uFE0F \u524D\u7F6E\u4F9D\u8D56</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u4EE5\u4E0B\u4F9D\u8D56\u624D\u80FD\u6B63\u5E38\u5DE5\u4F5C\uFF1A</p>\n<ul>\n <li><b style=\"color: #e74c3c;\">http</b> - Koishi \u5185\u7F6E\u670D\u52A1\uFF0C\u7528\u4E8EHTTP\u8BF7\u6C42\u540E\u7AEFAPI <span style=\"color: #e74c3c;\">\u3010\u5FC5\u987B\u3011</span></li>\n</ul>\n\n<h3 style=\"color: #3498db;\">\uD83D\uDD17 \u540E\u7AEF\u670D\u52A1</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u914D\u5408\u540E\u7AEF\u670D\u52A1\u4F7F\u7528\uFF0C\u8BF7\u5148\u90E8\u7F72\u540E\u7AEF\uFF1A</p>\n<ul>\n <li><a href=\"https://github.com/VincentZyuApps/skyblessings-fastapi-pillow\">GitHub \u540E\u7AEF\u4ED3\u5E93</a></li>\n <li><a href=\"https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow\">Gitee \u540E\u7AEF\u4ED3\u5E93</a></li>\n</ul>\n<p>\u90E8\u7F72\u5B8C\u6210\u540E\uFF0C\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u586B\u5199 <code>backendUrl</code> \u4E3A\u540E\u7AEF\u670D\u52A1\u5730\u5740\u3002</p>\n\n<h3 style=\"color: #2ecc71;\">\uD83C\uDFAE \u547D\u4EE4\u5217\u8868</h3>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n <tr>\n <th>\u547D\u4EE4</th>\n <th>\u63CF\u8FF0</th>\n <th>\u5E73\u53F0\u9650\u5236</th>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E\u56FE</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + \u6587\u5B57\u8BE6\u60C5</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7Emd</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + Markdown\u683C\u5F0F</td>\n <td>\u4EC5QQ\u5E73\u53F0</td>\n </tr>\n</table>\n\n<h3 style=\"color: #f39c12;\">\u2699\uFE0F \u53C2\u6570\u6620\u5C04\u8BF4\u660E</h3>\n<p>\u53EF\u901A\u8FC7\u914D\u7F6E\u5C06 a~e \u4E94\u4E2A\u53C2\u6570\u952E\u6620\u5C04\u5230\u4E0D\u540C\u7684\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u7528\u4E8E\u6784\u5EFA\u540E\u7AEF\u8BF7\u6C42\u7684\u79CD\u5B50\uFF1A</p>\n<ul>\n <li>\uD83C\uDF10 <b>platform</b> - \u5E73\u53F0\u540D\u79F0\uFF08\u5982 onebot\u3001discord\uFF09</li>\n <li>\uD83C\uDD94 <b>userid</b> - \u7528\u6237ID</li>\n <li>\uD83D\uDCC5 <b>date</b> - \u5F53\u524D\u65E5\u671F\uFF08YYYY-MM-DD\uFF09</li>\n <li>\uD83D\uDC64 <b>nickname</b> - \u7528\u6237\u6635\u79F0</li>\n <li>\uD83D\uDDBC\uFE0F <b>avatar_hash</b> - \u5934\u50CFMD5\u54C8\u5E0C\u503C</li>\n</ul>\n<p>\u9ED8\u8BA4\u914D\u7F6E\uFF1Aabc \u542F\u7528\uFF0Cde \u7981\u7528\u3002\u91CD\u590D\u7684 key \u53EA\u6709\u7B2C\u4E00\u4E2A\u542F\u7528\u7684\u4F1A\u751F\u6548\u3002</p>\n\n<h3 style=\"color: #9b59b6;\">\uD83D\uDCCA \u8FD4\u56DE\u5B57\u6BB5\u8BF4\u660E</h3>\n<ul>\n <li><b>fortune_level</b> - \u8FD0\u52BF\u7B49\u7EA7\uFF08\u5982\uFF1A\u5927\u5409\u3001\u4E2D\u5409\u3001\u5C0F\u5409\uFF09</li>\n <li><b>dordas</b> - \u7ED3\u7F18\u7269\uFF08\u5982\uFF1A\u7ED3\u7F18\u7269\uFF1A\u9065\u9CB2\uFF09</li>\n <li><b>dordas_color</b> - \u7F18\u5F69\uFF08\u5982\uFF1A\u7F18\u5F69\uFF1A\u68A7\u679D\u7EFF\uFF09</li>\n <li><b>color_hex</b> - \u989C\u8272\u5341\u516D\u8FDB\u5236\u503C\uFF08\u5982\uFF1A#4fd69e\uFF09</li>\n <li><b>blessing</b> - \u795D\u798F\u8BED</li>\n <li><b>entry</b> - \u5B9C\u5FCC\u63D0\u793A\uFF08\u5982\uFF1A\u5FCC\uFF1A\u4E00\u610F\u5B64\u884C\uFF09</li>\n</ul>\n";
6
6
  export declare const inject: {
7
7
  required: string[];
8
8
  };
package/lib/index.js CHANGED
@@ -70,9 +70,9 @@ var ConfigSchema = import_koishi.Schema.intersect([
70
70
  // 🌐 后端连接设置
71
71
  import_koishi.Schema.object({
72
72
  backendUrl: import_koishi.Schema.string().default("http://127.0.0.1:51205").description("🔗 后端服务地址\n\n💡 可以去这里部署后端: `https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow`"),
73
- sendBase64: import_koishi.Schema.boolean().default(false).description("🖼️ 是否将图片 Base64 编码后发送(关闭则发送 URL 链接)"),
74
73
  enableQuote: import_koishi.Schema.boolean().default(true).description("💬 开启后,本插件发送的所有消息都会引用(回复)触发指令的消息"),
75
- qqMarkdownSendImage: import_koishi.Schema.boolean().default(true).description("🖼️ 「光遇抽签md」命令是否同时发送图片(关闭则仅发送 Markdown 文本)")
74
+ qqMarkdownSendImage: import_koishi.Schema.boolean().default(true).description("🖼️ 「光遇抽签md」命令是否同时发送图片(关闭则仅发送 Markdown 文本)"),
75
+ alignWithTab: import_koishi.Schema.boolean().default(true).description("📏 文字对齐:在冒号前后添加制表符使文本对齐(⚠️ 仅对「光遇抽签」和「光遇抽签md」的文字部分生效,不影响图片)")
76
76
  }).description("🌐 后端设置"),
77
77
  // 📊 参数映射表设置
78
78
  import_koishi.Schema.object({
@@ -88,82 +88,108 @@ var ConfigSchema = import_koishi.Schema.intersect([
88
88
  }).description("🔧 调试设置")
89
89
  ]);
90
90
 
91
- // src/types.ts
92
- var USAGE = `
93
- <h1>Koishi 插件:sky-blessing 光遇祈福签</h1>
94
- <h2>🎯 功能简介</h2>
95
- <p>随机生成光遇祈福签图片的 Koishi 插件,支持三种输出模式:</p>
96
- <ul>
97
- <li>🖼️ <b>光遇抽签图</b> - 仅发送祈福签图片</li>
98
- <li>📜 <b>光遇抽签</b> - 发送图片 + 文字内容(运势等级、结缘物、缘彩、祝福语等)</li>
99
- <li>📝 <b>光遇抽签md</b> - 发送图片 + Markdown格式(💡 仅限 QQ 平台可用)</li>
100
- </ul>
91
+ // src/usage.ts
92
+ var import_fs = require("fs");
93
+ var import_path = require("path");
94
+ var pkg = JSON.parse((0, import_fs.readFileSync)((0, import_path.resolve)(__dirname, "../package.json"), "utf-8"));
95
+ var usage = `
96
+ <h1>🎋 Sky Blessing 光遇祈福签</h1>
97
+ <h2>📦版本号: v${pkg.version}</h2>
98
+
99
+ <hr>
100
+
101
+ <h2>📖 简介</h2>
102
+ <p>${pkg.description}</p>
103
+
104
+ <hr>
105
+
106
+ <h2>🔗 相关链接</h2>
107
+ <p>
108
+ <a href="https://www.npmjs.com/package/koishi-plugin-sky-blessing" target="_blank">
109
+ <img src="https://img.shields.io/npm/v/koishi-plugin-sky-blessing?style=flat-square" alt="npm version">
110
+ </a>
111
+ <a href="https://github.com/VincentZyuApps/skyblessings-fastapi-pillow" target="_blank">
112
+ <img src="https://img.shields.io/badge/Backend-GitHub-181717?style=for-the-badge&logo=github&logoColor=white" alt="GitHub Backend">
113
+ </a>
114
+ <a href="https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow" target="_blank">
115
+ <img src="https://img.shields.io/badge/Backend-Gitee-C71D23?style=for-the-badge&logo=gitee&logoColor=white" alt="Gitee Backend">
116
+ </a>
117
+ <a href="https://qm.qq.com/q/ZN7fxZ3qCq" target="_blank">
118
+ <img src="https://img.shields.io/badge/QQ群-1085190201-1AAD19?style=flat-square" alt="QQ群">
119
+ </a>
120
+ <a href="https://forum.koishi.xyz/t/topic/12467" target="_blank">
121
+ <img src="https://img.shields.io/badge/Koishi%20Forum-12558-5546A3?style=for-the-badge&logo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff3%2FKoishi.js_Logo.png&logoColor=white" alt="Forum">
122
+ </a>
123
+ </p>
101
124
 
102
- <h2>💬 交流群组</h2>
103
- <p><del>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍ 插件开发交流,欢迎加入QQ群:<b>259248174</b> 🎉(这个群G了)</del></p>
104
- <p>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍💻 插件开发交流,欢迎加入新QQ群:<b>1085190201</b> 🎉</p>
125
+ <hr>
126
+
127
+ <h2>💬 交流反馈</h2>
128
+ <p>🐛 Bug 反馈 / 💡 建议 / 👨‍💻 插件开发交流,欢迎加群:</p>
129
+ <p><del>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍💻 插件开发交流,欢迎加入QQ群:<b>259248174</b> 🎉(这个群G了</del></p>
130
+ <p>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍💻 插件开发交流,欢迎加入QQ群:<b>259248174🎉</p>
105
131
  <p>💡 在群里直接艾特我,回复的更快哦~ ✨</p>
106
132
 
107
133
  <hr>
108
134
 
109
- <h3 style="color: #e74c3c;">⚙️ 前置依赖</h3>
110
- <p>本插件需要以下依赖才能正常工作:</p>
135
+ <h2>⚠️ 前置条件</h2>
111
136
  <ul>
112
- <li><b style="color: #e74c3c;">http</b> - Koishi 内置服务,用于HTTP请求后端API <span style="color: #e74c3c;">【必须】</span></li>
137
+ <li>需要 Koishi 的 <code>http</code> 服务</li>
138
+ <li>需要先部署后端服务,并在配置中填写 <code>backendUrl</code></li>
139
+ <li><code>光遇抽签md</code> 仅支持 QQ 平台</li>
113
140
  </ul>
114
141
 
115
- <h3 style="color: #3498db;">🔗 后端服务</h3>
116
- <p>本插件需要配合后端服务使用,请先部署后端:</p>
117
- <ul>
118
- <li><a href="https://github.com/VincentZyuApps/skyblessings-fastapi-pillow">GitHub 后端仓库</a></li>
119
- <li><a href="https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow">Gitee 后端仓库</a></li>
120
- </ul>
121
- <p>部署完成后,在插件配置中填写 <code>backendUrl</code> 为后端服务地址。</p>
142
+ <hr>
143
+
144
+ <h2>⌨️ 指令说明</h2>
145
+
146
+ <h3>1️⃣ 光遇抽签图</h3>
147
+ <p>仅发送祈福签图片。</p>
148
+ <pre><code>光遇抽签图</code></pre>
149
+
150
+ <h3>2️⃣ 光遇抽签</h3>
151
+ <p>发送图片和文字详情,包括运势、结缘物、缘彩、祝福语、宜忌。</p>
152
+ <pre><code>光遇抽签</code></pre>
122
153
 
123
- <h3 style="color: #2ecc71;">🎮 命令列表</h3>
124
- <table border="1" cellpadding="5" cellspacing="0">
125
- <tr>
126
- <th>命令</th>
127
- <th>描述</th>
128
- <th>平台限制</th>
129
- </tr>
130
- <tr>
131
- <td><code>光遇抽签图</code></td>
132
- <td>获取祈福签图片</td>
133
- <td>无</td>
134
- </tr>
135
- <tr>
136
- <td><code>光遇抽签</code></td>
137
- <td>获取祈福签图片 + 文字详情</td>
138
- <td>无</td>
139
- </tr>
140
- <tr>
141
- <td><code>光遇抽签md</code></td>
142
- <td>获取祈福签图片 + Markdown格式</td>
143
- <td>仅QQ平台</td>
144
- </tr>
154
+ <h3>3️⃣ 光遇抽签md</h3>
155
+ <p>发送 QQ 原生 Markdown 版本,可选是否同时发送图片。</p>
156
+ <pre><code>光遇抽签md</code></pre>
157
+
158
+ <hr>
159
+
160
+ <h2>⚙️ 配置项</h2>
161
+ <table>
162
+ <tr><th>配置项</th><th>类型</th><th>默认值</th><th>说明</th></tr>
163
+ <tr><td><code>commandNames.image</code></td><td>string</td><td><code>光遇抽签图</code></td><td>仅图片命令名</td></tr>
164
+ <tr><td><code>commandNames.text</code></td><td>string</td><td><code>光遇抽签</code></td><td>图片 + 文字命令名</td></tr>
165
+ <tr><td><code>commandNames.qqMarkdown</code></td><td>string</td><td><code>光遇抽签md</code></td><td>QQ Markdown 命令名</td></tr>
166
+ <tr><td><code>backendUrl</code></td><td>string</td><td><code>http://127.0.0.1:51205</code></td><td>后端服务地址</td></tr>
167
+ <tr><td><code>enableQuote</code></td><td>boolean</td><td><code>true</code></td><td>发送时引用原消息</td></tr>
168
+ <tr><td><code>qqMarkdownSendImage</code></td><td>boolean</td><td><code>true</code></td><td>Markdown 命令是否额外发送图片</td></tr>
169
+ <tr><td><code>alignWithTab</code></td><td>boolean</td><td><code>true</code></td><td>文字模式中使用制表符对齐</td></tr>
170
+ <tr><td><code>logLevel</code></td><td>string</td><td><code>info</code></td><td>日志级别</td></tr>
171
+ <tr><td><code>paramMappings</code></td><td>table</td><td><code>abc 启用</code></td><td>请求参数 a~e 的映射表</td></tr>
145
172
  </table>
146
173
 
147
- <h3 style="color: #f39c12;">⚙️ 参数映射说明</h3>
148
- <p>可通过配置将 a~e 五个参数键映射到不同的会话信息,用于构建后端请求的种子:</p>
149
- <ul>
150
- <li>🌐 <b>platform</b> - 平台名称(如 onebot、discord)</li>
151
- <li>🆔 <b>userid</b> - 用户ID</li>
152
- <li>📅 <b>date</b> - 当前日期(YYYY-MM-DD)</li>
153
- <li>👤 <b>nickname</b> - 用户昵称</li>
154
- <li>🖼️ <b>avatar_hash</b> - 头像MD5哈希值</li>
155
- </ul>
156
- <p>默认配置:abc 启用,de 禁用。重复的 key 只有第一个启用的会生效。</p>
174
+ <hr>
157
175
 
158
- <h3 style="color: #9b59b6;">📊 返回字段说明</h3>
176
+ <h2>🧩 参数映射</h2>
177
+ <p>可将后端请求参数 <code>a ~ e</code> 映射到以下来源:</p>
159
178
  <ul>
160
- <li><b>fortune_level</b> - 运势等级(如:大吉、中吉、小吉)</li>
161
- <li><b>dordas</b> - 结缘物(如:结缘物:遥鲲)</li>
162
- <li><b>dordas_color</b> - 缘彩(如:缘彩:梧枝绿)</li>
163
- <li><b>color_hex</b> - 颜色十六进制值(如:#4fd69e)</li>
164
- <li><b>blessing</b> - 祝福语</li>
165
- <li><b>entry</b> - 宜忌提示(如:忌:一意孤行)</li>
179
+ <li><code>platform</code>:平台名</li>
180
+ <li><code>userid</code>:用户 ID</li>
181
+ <li><code>date</code>:当前日期</li>
182
+ <li><code>nickname</code>:昵称</li>
183
+ <li><code>avatar_hash</code>:头像哈希</li>
166
184
  </ul>
185
+ <p>默认启用 <code>a=platform</code>、<code>b=userid</code>、<code>c=date</code>。</p>
186
+
187
+ <hr>
188
+
189
+ <h2>🌐 后端项目</h2>
190
+ <p>后端参考:</p>
191
+ <p><a href="https://github.com/VincentZyuApps/skyblessings-fastapi-pillow" target="_blank">GitHub: skyblessings-fastapi-pillow</a></p>
192
+ <p><a href="https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow" target="_blank">Gitee: skyblessings-fastapi-pillow</a></p>
167
193
  `;
168
194
 
169
195
  // src/logger.ts
@@ -235,6 +261,7 @@ __name(createLogger, "createLogger");
235
261
  // src/api.ts
236
262
  var crypto = __toESM(require("crypto"));
237
263
  var BlessingAPI = class {
264
+ // 📊 统计数据存储
238
265
  constructor(ctx, config) {
239
266
  this.ctx = ctx;
240
267
  this.config = config;
@@ -244,11 +271,62 @@ var BlessingAPI = class {
244
271
  __name(this, "BlessingAPI");
245
272
  }
246
273
  logger;
274
+ stats = [];
247
275
  /**
248
276
  * 设置日志器实例
249
277
  */
250
278
  setLogger(logger) {
251
279
  this.logger = logger;
280
+ this.validateConfig();
281
+ }
282
+ /**
283
+ * ✅ 验证配置合法性
284
+ */
285
+ validateConfig() {
286
+ try {
287
+ const url = new URL(this.config.backendUrl);
288
+ if (!["http:", "https:"].includes(url.protocol)) {
289
+ this.logger.error(`❌ backendUrl 协议无效: ${this.config.backendUrl} (必须是 http:// 或 https://)`);
290
+ } else {
291
+ this.logger.info(`✅ backendUrl 格式验证通过: ${this.config.backendUrl}`);
292
+ }
293
+ } catch (error) {
294
+ this.logger.error(`❌ backendUrl 格式无效: ${this.config.backendUrl} (${error instanceof Error ? error.message : "未知错误"})`);
295
+ }
296
+ const enabledMappings = this.config.paramMappings.filter((m) => m.enabled);
297
+ const keyMap = /* @__PURE__ */ new Map();
298
+ for (let i = 0; i < enabledMappings.length; i++) {
299
+ const mapping = enabledMappings[i];
300
+ if (keyMap.has(mapping.key)) {
301
+ const firstIndex = keyMap.get(mapping.key);
302
+ this.logger.warn(
303
+ `⚠️ 参数映射存在重复的 key "${mapping.key}":第 ${firstIndex + 1} 行和第 ${i + 1} 行冲突,只有第 ${firstIndex + 1} 行会生效`
304
+ );
305
+ } else {
306
+ keyMap.set(mapping.key, i);
307
+ }
308
+ }
309
+ this.logger.info(`✅ 配置验证完成`);
310
+ }
311
+ /**
312
+ * 📊 记录抽签统计数据
313
+ */
314
+ recordStats(stats) {
315
+ this.stats.push(stats);
316
+ this.logger.debug(`📊 统计数据已记录 (总计: ${this.stats.length} 次抽签)`);
317
+ if (this.stats.length > 1e3) {
318
+ this.stats = this.stats.slice(-1e3);
319
+ }
320
+ }
321
+ /**
322
+ * 📈 获取统计摘要
323
+ */
324
+ getStatsSummary() {
325
+ return {
326
+ total: this.stats.length,
327
+ recent: this.stats.slice(-10)
328
+ // 返回最近10条
329
+ };
252
330
  }
253
331
  /**
254
332
  * 🔄 根据映射配置解析参数值
@@ -257,59 +335,87 @@ var BlessingAPI = class {
257
335
  resolveParams(mappings, session) {
258
336
  const params = {};
259
337
  const seenKeys = /* @__PURE__ */ new Set();
260
- this.logger.info(`[BlessingAPI] 🔍 resolveParams: ${mappings.length} 条映射, session.platform=${session.platform}, userId=${session.userId}`);
338
+ this.logger.debug(`[BlessingAPI] 🔍 resolveParams: ${mappings.length} 条映射, session.platform=${session.platform}, userId=${session.userId}`);
261
339
  for (const mapping of mappings) {
262
340
  if (!mapping.enabled || seenKeys.has(mapping.key)) {
263
- this.logger.info(`[BlessingAPI] ⏭️ 跳过 key=${mapping.key} (enabled=${mapping.enabled}, seen=${seenKeys.has(mapping.key)})`);
341
+ this.logger.debug(`[BlessingAPI] ⏭️ 跳过 key=${mapping.key} (enabled=${mapping.enabled}, seen=${seenKeys.has(mapping.key)})`);
264
342
  continue;
265
343
  }
266
344
  seenKeys.add(mapping.key);
267
345
  switch (mapping.value) {
268
346
  case "platform":
269
347
  params[mapping.key] = session.platform ?? "";
270
- this.logger.info(`[BlessingAPI] 🌐 ${mapping.key}=platform -> "${params[mapping.key]}"`);
348
+ this.logger.debug(`[BlessingAPI] 🌐 ${mapping.key}=platform -> "${params[mapping.key]}"`);
271
349
  break;
272
350
  case "userid":
273
351
  params[mapping.key] = String(session.userId ?? "");
274
- this.logger.info(`[BlessingAPI] 🆔 ${mapping.key}=userid -> "${params[mapping.key]}"`);
352
+ this.logger.debug(`[BlessingAPI] 🆔 ${mapping.key}=userid -> "${params[mapping.key]}"`);
275
353
  break;
276
354
  case "date":
277
355
  params[mapping.key] = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
278
- this.logger.info(`[BlessingAPI] 📅 ${mapping.key}=date -> "${params[mapping.key]}"`);
356
+ this.logger.debug(`[BlessingAPI] 📅 ${mapping.key}=date -> "${params[mapping.key]}"`);
279
357
  break;
280
358
  case "nickname":
281
359
  params[mapping.key] = session.username ?? "";
282
- this.logger.info(`[BlessingAPI] 👤 ${mapping.key}=nickname -> "${params[mapping.key]}"`);
360
+ this.logger.debug(`[BlessingAPI] 👤 ${mapping.key}=nickname -> "${params[mapping.key]}"`);
283
361
  break;
284
362
  case "avatar_hash":
285
363
  params[mapping.key] = session.avatar ? crypto.createHash("md5").update(session.avatar).digest("hex") : "";
286
- this.logger.info(`[BlessingAPI] 🖼️ ${mapping.key}=avatar_hash -> "${params[mapping.key].substring(0, 8)}..."`);
364
+ this.logger.debug(`[BlessingAPI] 🖼️ ${mapping.key}=avatar_hash -> "${params[mapping.key].substring(0, 8)}..."`);
287
365
  break;
288
366
  }
289
367
  }
290
- this.logger.info(`[BlessingAPI] ✅ 最终参数: ${JSON.stringify(params)}`);
368
+ this.logger.debug(`[BlessingAPI] ✅ 最终参数: ${JSON.stringify(params)}`);
291
369
  return params;
292
370
  }
293
371
  /**
294
- * 📡 调用 /blessing 端点
372
+ * 📡 调用 /blessing 端点(带计时和统计)
295
373
  */
296
- async fetchBlessing(type, params = {}) {
374
+ async fetchBlessing(type, params = {}, commandType = "image") {
297
375
  const url = `${this.config.backendUrl}/blessing`;
298
- this.logger.info(`[BlessingAPI] 🚀 fetchBlessing type=${type} url=${url}`);
299
- if (type === "image") {
300
- const response = await this.ctx.http.get(url, {
301
- responseType: "arraybuffer",
302
- params: { type, ...params }
303
- });
304
- const buf = Buffer.from(response);
305
- this.logger.info(`[BlessingAPI] 🖼️ 图片响应: ${buf.length} bytes`);
306
- return buf;
376
+ const startTime = Date.now();
377
+ this.logger.debug(`[BlessingAPI] 🚀 fetchBlessing type=${type} url=${url}`);
378
+ try {
379
+ let result;
380
+ if (type === "image") {
381
+ const response = await this.ctx.http.get(url, {
382
+ responseType: "arraybuffer",
383
+ params: { type, ...params }
384
+ });
385
+ result = Buffer.from(response);
386
+ this.logger.debug(`[BlessingAPI] 🖼️ 图片响应: ${result.length} bytes`);
387
+ } else {
388
+ const data = await this.ctx.http.get(url, {
389
+ params: { type, ...params }
390
+ });
391
+ result = data;
392
+ const responseTime = Date.now() - startTime;
393
+ if ("fortune_level" in data) {
394
+ const stats = {
395
+ timestamp: Date.now(),
396
+ userId: params.b || "",
397
+ platform: params.a || "",
398
+ username: params.d || void 0,
399
+ fortune_level: data.fortune_level,
400
+ dordas: data.dordas,
401
+ dordas_color: data.dordas_color,
402
+ entry: data.entry,
403
+ responseTime,
404
+ commandType
405
+ };
406
+ this.recordStats(stats);
407
+ this.logger.info(`✨ 抽签结果: ${data.fortune_level} | 结缘物: ${data.dordas} | 耗时: ${responseTime}ms`);
408
+ }
409
+ this.logger.debug(`[BlessingAPI] 📄 JSON响应: fortune_level=${data.fortune_level}`);
410
+ }
411
+ const totalTime = Date.now() - startTime;
412
+ this.logger.debug(`[BlessingAPI] ✅ API 请求成功,总耗时: ${totalTime}ms`);
413
+ return result;
414
+ } catch (error) {
415
+ const totalTime = Date.now() - startTime;
416
+ this.logger.error(`[BlessingAPI] ❌ API 请求失败 (耗时: ${totalTime}ms): ${error instanceof Error ? error.message : String(error)}`);
417
+ throw error;
307
418
  }
308
- const data = await this.ctx.http.get(url, {
309
- params: { type, ...params }
310
- });
311
- this.logger.info(`[BlessingAPI] 📄 JSON响应: fortune_level=${data.fortune_level}`);
312
- return data;
313
419
  }
314
420
  /**
315
421
  * 🔄 将 buffer 转为 base64 data URI 格式
@@ -324,21 +430,15 @@ var import_koishi2 = require("koishi");
324
430
  function registerImageCommand(ctx, config, api, logger) {
325
431
  ctx.command(config.commandNames.image).action(async ({ session }) => {
326
432
  logger.info(`[光遇抽签图] 🎯 命令触发, userId=${session.userId}, platform=${session.platform}`);
327
- logger.info(`[光遇抽签图] ⚙️ 配置: backendUrl=${config.backendUrl}, sendBase64=${config.sendBase64}`);
433
+ logger.info(`[光遇抽签图] ⚙️ 配置: backendUrl=${config.backendUrl}`);
328
434
  logger.info(`[光遇抽签图] 📋 paramMappings: ${JSON.stringify(config.paramMappings)}`);
329
435
  try {
330
436
  const params = api.resolveParams(config.paramMappings, session);
331
437
  logger.info(`[光遇抽签图] ✅ 解析参数: ${JSON.stringify(params)}`);
332
- const imageBuffer = await api.fetchBlessing("image", params);
438
+ const imageBuffer = await api.fetchBlessing("image", params, "image");
333
439
  logger.info(`[光遇抽签图] 🖼️ 图片接收成功, 大小=${imageBuffer.length} bytes`);
334
- let message;
335
- if (config.sendBase64) {
336
- message = (0, import_koishi2.h)("image", { url: api.toBase64Image(imageBuffer) });
337
- } else {
338
- const url = `${config.backendUrl}/blessing?type=image&${new URLSearchParams(params)}`;
339
- logger.info(`[光遇抽签图] 🔗 图片URL: ${url}`);
340
- message = import_koishi2.h.image(url);
341
- }
440
+ const message = (0, import_koishi2.h)("image", { url: api.toBase64Image(imageBuffer) });
441
+ logger.info(`[光遇抽签图] 🖼️ 图片已转换为Base64`);
342
442
  logger.info(`[光遇抽签图] 📤 发送消息中...`);
343
443
  const quotePart = config.enableQuote ? import_koishi2.h.quote(session.messageId) : "";
344
444
  await session.send(`${quotePart}${message}`);
@@ -358,30 +458,27 @@ var import_koishi3 = require("koishi");
358
458
  function registerTextCommand(ctx, config, api, logger) {
359
459
  ctx.command(config.commandNames.text).action(async ({ session }) => {
360
460
  logger.info(`[光遇抽签] 🎯 命令触发, userId=${session.userId}, platform=${session.platform}`);
361
- logger.info(`[光遇抽签] ⚙️ 配置: backendUrl=${config.backendUrl}, sendBase64=${config.sendBase64}`);
461
+ logger.info(`[光遇抽签] ⚙️ 配置: backendUrl=${config.backendUrl}`);
362
462
  try {
363
463
  const params = api.resolveParams(config.paramMappings, session);
364
464
  logger.info(`[光遇抽签] ✅ 解析参数: ${JSON.stringify(params)}`);
365
- const result = await api.fetchBlessing("json", params);
465
+ const result = await api.fetchBlessing("json", params, "text");
366
466
  logger.info(`[光遇抽签] 📄 JSON结果: fortune_level=${result.fortune_level}, dordas=${result.dordas}`);
467
+ const TAB = config.alignWithTab ? " " : "";
367
468
  const textParts = [
368
- `🎋 ${result.fortune_level}`,
369
- result.dordas,
370
- `${result.dordas_color}`,
371
- `「${result.blessing}」`,
372
- `${result.entry}`
469
+ `🎋 ${result.fortune_level} ✨`,
470
+ `${result.dordas.split(":")[0]}:${TAB}${result.dordas.split(":")[1] || ""}`,
471
+ `${result.dordas_color.split(":")[0]}:${TAB}${result.dordas_color.split(":")[1] || ""}`,
472
+ `背景色:${TAB}\`${result.color_hex}\``,
473
+ "",
474
+ `「${result.blessing}」
475
+ `,
476
+ `${result.entry.split(":")[0]}:${TAB}${result.entry.split(":")[1] || ""}`
373
477
  ];
374
- let imageSegment;
375
- if (config.sendBase64 && result.image_base64) {
376
- logger.info(`[光遇抽签] 🖼️ 使用 JSON 中的 base64 图片`);
377
- imageSegment = (0, import_koishi3.h)("image", {
378
- url: `data:image/png;base64,${result.image_base64}`
379
- });
380
- } else {
381
- logger.info(`[光遇抽签] 📡 单独请求图片`);
382
- const imageBuffer = await api.fetchBlessing("image", params);
383
- imageSegment = (0, import_koishi3.h)("image", { url: api.toBase64Image(imageBuffer) });
384
- }
478
+ logger.info(`[光遇抽签] 🖼️ 使用 JSON 中的 base64 图片`);
479
+ const imageSegment = (0, import_koishi3.h)("image", {
480
+ url: `data:image/png;base64,${result.image_base64}`
481
+ });
385
482
  logger.info(`[光遇抽签] 📤 发送消息中...`);
386
483
  const quotePart = config.enableQuote ? import_koishi3.h.quote(session.messageId) : "";
387
484
  await session.send(`${quotePart}${imageSegment}
@@ -411,7 +508,7 @@ function registerQQMarkdownCommand(ctx, config, api, logger) {
411
508
  try {
412
509
  const params = api.resolveParams(config.paramMappings, session);
413
510
  logger.info(`[光遇抽签md] ✅ 解析参数: ${JSON.stringify(params)}`);
414
- const result = await api.fetchBlessing("json", params);
511
+ const result = await api.fetchBlessing("json", params, "qq-markdown");
415
512
  logger.info(`[光遇抽签md] 📄 JSON结果: fortune_level=${result.fortune_level}`);
416
513
  const extractLabelAndValue = /* @__PURE__ */ __name((text) => {
417
514
  const idx = text.indexOf(":");
@@ -421,25 +518,21 @@ function registerQQMarkdownCommand(ctx, config, api, logger) {
421
518
  const [dordasLabel, dordasValue] = extractLabelAndValue(result.dordas);
422
519
  const [colorLabel, colorValue] = extractLabelAndValue(result.dordas_color);
423
520
  const [entryLabel, entryValue] = extractLabelAndValue(result.entry);
424
- const markdownContent = `# 🎋 ${result.fortune_level}
521
+ const TAB = config.alignWithTab ? " " : "";
522
+ const markdownContent = `# 🎋 ${result.fortune_level} ✨
425
523
 
426
- **${dordasLabel}**:${dordasValue}
427
- **${colorLabel}**:${colorValue}
428
- **🎨 色值**:\`${result.color_hex}\`
524
+ **${dordasLabel}**:${TAB}${dordasValue}
525
+ **${colorLabel}**:${TAB}${colorValue}
526
+ **背景色**:${TAB}\`${result.color_hex}\`
429
527
 
430
- > ${result.blessing}
528
+ > 「${result.blessing}
431
529
 
432
- **${entryLabel}**:${entryValue}`;
530
+ **${entryLabel}**:${TAB}${entryValue}`;
433
531
  logger.info(`[光遇抽签md] 📄 Markdown内容: ${markdownContent}`);
434
- let imageSegment;
435
- if (config.sendBase64 && result.image_base64) {
436
- imageSegment = (0, import_koishi4.h)("image", {
437
- url: `data:image/png;base64,${result.image_base64}`
438
- });
439
- } else {
440
- const imageBuffer = await api.fetchBlessing("image", params);
441
- imageSegment = (0, import_koishi4.h)("image", { url: api.toBase64Image(imageBuffer) });
442
- }
532
+ logger.info(`[光遇抽签md] 🖼️ 使用 JSON 中的 base64 图片`);
533
+ const imageSegment = (0, import_koishi4.h)("image", {
534
+ url: `data:image/png;base64,${result.image_base64}`
535
+ });
443
536
  logger.info(`[光遇抽签md] 📤 发送图片中...`);
444
537
  const quotePart = config.enableQuote ? import_koishi4.h.quote(session.messageId) : "";
445
538
  await session.send(`${quotePart}${imageSegment}`);
@@ -464,7 +557,6 @@ __name(registerQQMarkdownCommand, "registerQQMarkdownCommand");
464
557
 
465
558
  // src/index.ts
466
559
  var name = "sky-blessing";
467
- var usage = USAGE;
468
560
  var inject = {
469
561
  required: ["http"]
470
562
  };
package/lib/types.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export declare const USAGE = "\n<h1>Koishi \u63D2\u4EF6\uFF1Asky-blessing \u5149\u9047\u7948\u798F\u7B7E</h1>\n<h2>\uD83C\uDFAF \u529F\u80FD\u7B80\u4ECB</h2>\n<p>\u968F\u673A\u751F\u6210\u5149\u9047\u7948\u798F\u7B7E\u56FE\u7247\u7684 Koishi \u63D2\u4EF6\uFF0C\u652F\u6301\u4E09\u79CD\u8F93\u51FA\u6A21\u5F0F\uFF1A</p>\n<ul>\n <li>\uD83D\uDDBC\uFE0F <b>\u5149\u9047\u62BD\u7B7E\u56FE</b> - \u4EC5\u53D1\u9001\u7948\u798F\u7B7E\u56FE\u7247</li>\n <li>\uD83D\uDCDC <b>\u5149\u9047\u62BD\u7B7E</b> - \u53D1\u9001\u56FE\u7247 + \u6587\u5B57\u5185\u5BB9\uFF08\u8FD0\u52BF\u7B49\u7EA7\u3001\u7ED3\u7F18\u7269\u3001\u7F18\u5F69\u3001\u795D\u798F\u8BED\u7B49\uFF09</li>\n <li>\uD83D\uDCDD <b>\u5149\u9047\u62BD\u7B7Emd</b> - \u53D1\u9001\u56FE\u7247 + Markdown\u683C\u5F0F\uFF08\uD83D\uDCA1 \u4EC5\u9650 QQ \u5E73\u53F0\u53EF\u7528\uFF09</li>\n</ul>\n\n<h2>\uD83D\uDCAC \u4EA4\u6D41\u7FA4\u7EC4</h2>\n<p><del>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165QQ\u7FA4\uFF1A<b>259248174</b> \uD83C\uDF89\uFF08\u8FD9\u4E2A\u7FA4G\u4E86\uFF09</del></p>\n<p>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D\uD83D\uDCBB \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165\u65B0QQ\u7FA4\uFF1A<b>1085190201</b> \uD83C\uDF89</p>\n<p>\uD83D\uDCA1 \u5728\u7FA4\u91CC\u76F4\u63A5\u827E\u7279\u6211\uFF0C\u56DE\u590D\u7684\u66F4\u5FEB\u54E6~ \u2728</p>\n\n<hr>\n\n<h3 style=\"color: #e74c3c;\">\u2699\uFE0F \u524D\u7F6E\u4F9D\u8D56</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u4EE5\u4E0B\u4F9D\u8D56\u624D\u80FD\u6B63\u5E38\u5DE5\u4F5C\uFF1A</p>\n<ul>\n <li><b style=\"color: #e74c3c;\">http</b> - Koishi \u5185\u7F6E\u670D\u52A1\uFF0C\u7528\u4E8EHTTP\u8BF7\u6C42\u540E\u7AEFAPI <span style=\"color: #e74c3c;\">\u3010\u5FC5\u987B\u3011</span></li>\n</ul>\n\n<h3 style=\"color: #3498db;\">\uD83D\uDD17 \u540E\u7AEF\u670D\u52A1</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u914D\u5408\u540E\u7AEF\u670D\u52A1\u4F7F\u7528\uFF0C\u8BF7\u5148\u90E8\u7F72\u540E\u7AEF\uFF1A</p>\n<ul>\n <li><a href=\"https://github.com/VincentZyuApps/skyblessings-fastapi-pillow\">GitHub \u540E\u7AEF\u4ED3\u5E93</a></li>\n <li><a href=\"https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow\">Gitee \u540E\u7AEF\u4ED3\u5E93</a></li>\n</ul>\n<p>\u90E8\u7F72\u5B8C\u6210\u540E\uFF0C\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u586B\u5199 <code>backendUrl</code> \u4E3A\u540E\u7AEF\u670D\u52A1\u5730\u5740\u3002</p>\n\n<h3 style=\"color: #2ecc71;\">\uD83C\uDFAE \u547D\u4EE4\u5217\u8868</h3>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n <tr>\n <th>\u547D\u4EE4</th>\n <th>\u63CF\u8FF0</th>\n <th>\u5E73\u53F0\u9650\u5236</th>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E\u56FE</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + \u6587\u5B57\u8BE6\u60C5</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7Emd</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + Markdown\u683C\u5F0F</td>\n <td>\u4EC5QQ\u5E73\u53F0</td>\n </tr>\n</table>\n\n<h3 style=\"color: #f39c12;\">\u2699\uFE0F \u53C2\u6570\u6620\u5C04\u8BF4\u660E</h3>\n<p>\u53EF\u901A\u8FC7\u914D\u7F6E\u5C06 a~e \u4E94\u4E2A\u53C2\u6570\u952E\u6620\u5C04\u5230\u4E0D\u540C\u7684\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u7528\u4E8E\u6784\u5EFA\u540E\u7AEF\u8BF7\u6C42\u7684\u79CD\u5B50\uFF1A</p>\n<ul>\n <li>\uD83C\uDF10 <b>platform</b> - \u5E73\u53F0\u540D\u79F0\uFF08\u5982 onebot\u3001discord\uFF09</li>\n <li>\uD83C\uDD94 <b>userid</b> - \u7528\u6237ID</li>\n <li>\uD83D\uDCC5 <b>date</b> - \u5F53\u524D\u65E5\u671F\uFF08YYYY-MM-DD\uFF09</li>\n <li>\uD83D\uDC64 <b>nickname</b> - \u7528\u6237\u6635\u79F0</li>\n <li>\uD83D\uDDBC\uFE0F <b>avatar_hash</b> - \u5934\u50CFMD5\u54C8\u5E0C\u503C</li>\n</ul>\n<p>\u9ED8\u8BA4\u914D\u7F6E\uFF1Aabc \u542F\u7528\uFF0Cde \u7981\u7528\u3002\u91CD\u590D\u7684 key \u53EA\u6709\u7B2C\u4E00\u4E2A\u542F\u7528\u7684\u4F1A\u751F\u6548\u3002</p>\n\n<h3 style=\"color: #9b59b6;\">\uD83D\uDCCA \u8FD4\u56DE\u5B57\u6BB5\u8BF4\u660E</h3>\n<ul>\n <li><b>fortune_level</b> - \u8FD0\u52BF\u7B49\u7EA7\uFF08\u5982\uFF1A\u5927\u5409\u3001\u4E2D\u5409\u3001\u5C0F\u5409\uFF09</li>\n <li><b>dordas</b> - \u7ED3\u7F18\u7269\uFF08\u5982\uFF1A\u7ED3\u7F18\u7269\uFF1A\u9065\u9CB2\uFF09</li>\n <li><b>dordas_color</b> - \u7F18\u5F69\uFF08\u5982\uFF1A\u7F18\u5F69\uFF1A\u68A7\u679D\u7EFF\uFF09</li>\n <li><b>color_hex</b> - \u989C\u8272\u5341\u516D\u8FDB\u5236\u503C\uFF08\u5982\uFF1A#4fd69e\uFF09</li>\n <li><b>blessing</b> - \u795D\u798F\u8BED</li>\n <li><b>entry</b> - \u5B9C\u5FCC\u63D0\u793A\uFF08\u5982\uFF1A\u5FCC\uFF1A\u4E00\u610F\u5B64\u884C\uFF09</li>\n</ul>\n";
2
1
  export interface BlessingResult {
3
2
  fortune_level: string;
4
3
  background_id: string;
@@ -21,9 +20,21 @@ export interface PluginConfig {
21
20
  qqMarkdown: string;
22
21
  };
23
22
  backendUrl: string;
24
- sendBase64: boolean;
25
23
  enableQuote: boolean;
26
24
  qqMarkdownSendImage: boolean;
25
+ alignWithTab: boolean;
27
26
  logLevel: 'silent' | 'error' | 'warn' | 'info' | 'debug';
28
27
  paramMappings: ParamMapping[];
29
28
  }
29
+ export interface BlessingStats {
30
+ timestamp: number;
31
+ userId: string;
32
+ platform: string;
33
+ username?: string;
34
+ fortune_level: string;
35
+ dordas: string;
36
+ dordas_color: string;
37
+ entry: string;
38
+ responseTime: number;
39
+ commandType: 'image' | 'text' | 'qq-markdown';
40
+ }
package/lib/usage.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const usage: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-sky-blessing",
3
- "description": "光遇抽签,对接后端",
4
- "version": "0.2.2",
3
+ "description": "🎋 Koishi光遇祈福签插件 | 随机生成Sky: Children of the Light风格祈福签图片 🖼️ 支持三种输出模式:仅图片/图片+文字/QQ原生Markdown 📱 可配置参数映射构建个性化种子 🔧 内置日志级别控制",
4
+ "version": "0.2.3-rc.1+20260613",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
package/readme.md CHANGED
@@ -1,11 +1,15 @@
1
- ![sky-blessing](https://socialify.git.ci/VincentZyuApps/sky-blessing/image?description=1&font=Bitter&forks=1&issues=1&language=1&logo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff3%2FKoishi.js_Logo.png&name=1&owner=1&pattern=Plus&stargazers=1&theme=Auto)
1
+ ![koishi-plugin-sky-blessing](https://socialify.git.ci/VincentZyuApps/koishi-plugin-sky-blessing/image?description=1&font=KoHo&forks=1&issues=1&language=1&logo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff3%2FKoishi.js_Logo.png%3F_%3D20230331182243&name=1&owner=1&pulls=1&stargazers=1&theme=Auto)
2
2
 
3
3
  # koishi-plugin-sky-blessing
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/koishi-plugin-sky-blessing?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-sky-blessing)
6
6
  [![npm-download](https://img.shields.io/npm/dm/koishi-plugin-sky-blessing?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-sky-blessing)
7
- [![GitHub](https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/VincentZyuApps/sky-blessing)
8
- [![Gitee](https://img.shields.io/badge/Gitee-C71D23?style=for-the-badge&logo=gitee&logoColor=white)](https://gitee.com/vincent-zyu/sky-blessing)
7
+
8
+ [![GitHub](https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/VincentZyuApps/koishi-plugin-sky-blessing)
9
+ [![Gitee](https://img.shields.io/badge/Gitee-C71D23?style=for-the-badge&logo=gitee&logoColor=white)](gitee.com/vincent-zyu/koishi-plugin-sky-blessing)
10
+
11
+ [![Koishi Forum](https://img.shields.io/badge/forum.koishi.xyz_topic_12558-5546A3?style=for-the-badge&logo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff3%2FKoishi.js_Logo.png&logoColor=white)](https://forum.koishi.xyz/t/topic/12467)
12
+ [![QQ群](https://img.shields.io/badge/QQ群-1085190201-12B7F5?style=flat-square&logo=qq&logoColor=white)](https://qm.qq.com/q/4vjto4V7Di)
9
13
 
10
14
  <p><del>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍💻 插件开发交流,欢迎加入QQ群:<b>259248174</b> 🎉(这个群G了)</del></p>
11
15
  <p>💬 插件使用问题 / 🐛 Bug反馈 / 👨‍💻 插件开发交流,欢迎加入新QQ群:<b>1085190201</b> 🎉</p>