koishi-plugin-echo-cave 1.18.4 → 1.18.6
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/README.md +4 -28
- package/lib/adapters/onebot/user.d.ts +1 -1
- package/lib/index.cjs +28 -27
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,19 +11,13 @@
|
|
|
11
11
|
## ✨ 功能特性
|
|
12
12
|
|
|
13
13
|
- 📥 **消息存储**:支持存储普通消息和转发消息到数据库
|
|
14
|
-
- 🖼️ **图片保存**:自动保存消息中的图片资源到本地
|
|
15
14
|
- 🔍 **消息查询**:支持随机获取消息或通过 ID 精确查找
|
|
16
15
|
- 🗑️ **消息管理**:支持删除特定 ID 的消息(消息存储者、原始发送者或管理员)
|
|
17
|
-
- 📊 **数据持久化**:使用 Koishi 数据库系统,确保数据不会丢失
|
|
18
16
|
- 👤 **个人追踪**:支持查看自己投稿的消息列表
|
|
19
17
|
- 🔍 **发言回溯**:支持查看自己被他人投稿的消息列表
|
|
20
|
-
- 🎨
|
|
21
|
-
- 🔒
|
|
18
|
+
- 🎨 **模板化展示**:消息展示时自带多种风格的外部包裹信息
|
|
19
|
+
- 🔒 **管理员保护**:可配置管理员消息保护
|
|
22
20
|
- 📏 **媒体限制**:支持配置媒体文件大小限制
|
|
23
|
-
- 🌐 **多语言支持**:支持中文语言包
|
|
24
|
-
- 🔄 **嵌套转发**:支持嵌套转发消息的递归处理
|
|
25
|
-
- 📝 **模板化展示**:支持多种风格的消息展示模板
|
|
26
|
-
- 🔁 **重复检测**:自动检测重复消息,避免存储重复内容
|
|
27
21
|
|
|
28
22
|
## 📋 命令列表
|
|
29
23
|
|
|
@@ -32,13 +26,13 @@
|
|
|
32
26
|
| `cave` | 随机获取一条回声洞消息 | 所有人 |
|
|
33
27
|
| `cave <id>` | 获取特定 ID 的回声洞消息 | 所有人 |
|
|
34
28
|
| `cave.echo` | 将引用的消息存入回声洞 | 所有人 |
|
|
35
|
-
| `cave.
|
|
29
|
+
| `cave.drop <id>` | 删除特定 ID 的回声洞消息 | 消息存储者、原始发送者或管理员 |
|
|
36
30
|
| `cave.listen` | 获取自己投稿的回声洞列表 | 所有人 |
|
|
37
31
|
| `cave.trace` | 获取自己发言被投稿的回声洞列表 | 所有人 |
|
|
38
32
|
|
|
39
33
|
## 🚀 使用指南
|
|
40
34
|
|
|
41
|
-
###
|
|
35
|
+
### 安装插件
|
|
42
36
|
|
|
43
37
|
```bash
|
|
44
38
|
npm install koishi-plugin-echo-cave
|
|
@@ -46,24 +40,6 @@ npm install koishi-plugin-echo-cave
|
|
|
46
40
|
|
|
47
41
|
或在插件商城中搜索 `koishi-plugin-echo-cave` 进行安装。
|
|
48
42
|
|
|
49
|
-
### 2. 基本使用
|
|
50
|
-
|
|
51
|
-
1. **存储消息**:在群聊中引用一条消息,然后发送命令 `cave.echo`
|
|
52
|
-
2. **查看随机消息**:发送命令 `cave` 获取一条随机消息
|
|
53
|
-
3. **查看特定消息**:发送命令 `cave <id>` 查看指定 ID 的消息
|
|
54
|
-
4. **删除消息**:消息存储者、原始发送者或管理员发送命令 `cave.wipe <id>` 删除指定 ID 的消息
|
|
55
|
-
5. **查看自己的投稿**:发送命令 `cave.listen` 查看自己曾经存入的所有回声洞消息
|
|
56
|
-
6. **查看自己的发言**:发送命令 `cave.trace` 查看自己曾经被他人存入的回声洞消息
|
|
57
|
-
|
|
58
|
-
## 🔧 技术说明
|
|
59
|
-
|
|
60
|
-
- 插件使用 Koishi 数据库系统存储消息记录
|
|
61
|
-
- 支持嵌套转发消息的处理
|
|
62
|
-
- 自动检测重复消息,避免存储重复内容
|
|
63
|
-
- 支持媒体文件大小限制
|
|
64
|
-
- 支持多语言配置(中文)
|
|
65
|
-
- 支持嵌套转发消息的递归处理
|
|
66
|
-
|
|
67
43
|
## 🛠️ 配置选项
|
|
68
44
|
|
|
69
45
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
@@ -2,6 +2,6 @@ import { Context, Session } from 'koishi';
|
|
|
2
2
|
export declare function getUserIdFromNickname(session: Session, nickname: string, userId: number): Promise<number>;
|
|
3
3
|
export declare function getUserName(ctx: Context, session: Session, userId: string): Promise<string>;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Check if users belong to the specified group
|
|
6
6
|
*/
|
|
7
7
|
export declare function checkUsersInGroup(ctx: Context, session: Session, userIds: string[]): Promise<boolean>;
|
package/lib/index.cjs
CHANGED
|
@@ -155,16 +155,14 @@ var require_zh_CN2 = __commonJS({
|
|
|
155
155
|
description: "\u83B7\u5F97\u7531\u81EA\u5DF1\u6295\u7A3F\u7684\u56DE\u58F0\u6D1E\u5217\u8868",
|
|
156
156
|
messages: {
|
|
157
157
|
noMsgContributed: '\u{1F680} \u60A8\u5728\u56DE\u58F0\u6D1E\u4E2D\u6682\u65E0\u6295\u7A3F\uFF0C\u5FEB\u4F7F\u7528 "cave.echo" \u547D\u4EE4\u6DFB\u52A0\u7B2C\u4E00\u6761\u6D88\u606F\u5427\uFF01',
|
|
158
|
-
msgListHeader: "\u{1F4DC} \u60A8\u5728\u672C\u9891\u9053\u6295\u7A3F\u7684\u56DE\u58F0\u6D1E\u6D88\u606F\u5217\u8868\uFF1A"
|
|
159
|
-
msgListItem: "ID: {0} | \u521B\u5EFA\u65F6\u95F4: {1}"
|
|
158
|
+
msgListHeader: "\u{1F4DC} \u60A8\u5728\u672C\u9891\u9053\u6295\u7A3F\u7684\u56DE\u58F0\u6D1E\u6D88\u606F\u5217\u8868\uFF1A"
|
|
160
159
|
}
|
|
161
160
|
},
|
|
162
161
|
"cave.trace": {
|
|
163
162
|
description: "\u83B7\u5F97\u81EA\u5DF1\u53D1\u8A00\u7684\u56DE\u58F0\u6D1E\u5217\u8868",
|
|
164
163
|
messages: {
|
|
165
164
|
noMsgTraced: '\u{1F680} \u60A8\u5728\u56DE\u58F0\u6D1E\u4E2D\u6682\u65E0\u53D1\u8A00\u88AB\u6295\u7A3F\uFF0C\u5FEB\u4F7F\u7528 "cave.echo" \u547D\u4EE4\u6DFB\u52A0\u7B2C\u4E00\u6761\u6D88\u606F\u5427\uFF01',
|
|
166
|
-
msgListHeader: "\u{1F4DC} \u60A8\u5728\u672C\u9891\u9053\u53D1\u8A00\u7684\u56DE\u58F0\u6D1E\u6D88\u606F\u5217\u8868\uFF1A"
|
|
167
|
-
msgListItem: "ID: {0} | \u521B\u5EFA\u65F6\u95F4: {1}"
|
|
165
|
+
msgListHeader: "\u{1F4DC} \u60A8\u5728\u672C\u9891\u9053\u53D1\u8A00\u7684\u56DE\u58F0\u6D1E\u6D88\u606F\u5217\u8868\uFF1A"
|
|
168
166
|
}
|
|
169
167
|
},
|
|
170
168
|
"cave.bind": {
|
|
@@ -365,7 +363,7 @@ async function checkAndCleanMediaFiles(ctx, cfg, type) {
|
|
|
365
363
|
switch (type) {
|
|
366
364
|
case "image":
|
|
367
365
|
return (cfg.maxImageSize || 100) * 1024 * 1024;
|
|
368
|
-
//
|
|
366
|
+
// Convert to bytes
|
|
369
367
|
case "video":
|
|
370
368
|
return (cfg.maxVideoSize || 500) * 1024 * 1024;
|
|
371
369
|
case "file":
|
|
@@ -505,15 +503,16 @@ async function addCave(ctx, session, cfg, userIds) {
|
|
|
505
503
|
const messageId = quote.id;
|
|
506
504
|
let parsedUserIds = [];
|
|
507
505
|
if (userIds && userIds.length > 0) {
|
|
508
|
-
ctx.logger.info(`Original userIds in addCave: ${JSON.stringify(userIds)}`);
|
|
509
506
|
const result = parseUserIds(userIds);
|
|
510
507
|
if (result.error === "invalid_all_mention") {
|
|
511
508
|
return session.text("echo-cave.user.invalidAllMention");
|
|
512
509
|
}
|
|
513
510
|
parsedUserIds = result.parsedUserIds;
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
511
|
+
if (parsedUserIds.length > 0) {
|
|
512
|
+
const isAllUsersInGroup = await checkUsersInGroup(ctx, session, parsedUserIds);
|
|
513
|
+
if (!isAllUsersInGroup) {
|
|
514
|
+
return session.text("echo-cave.user.userNotInGroup");
|
|
515
|
+
}
|
|
517
516
|
}
|
|
518
517
|
}
|
|
519
518
|
let content;
|
|
@@ -745,36 +744,38 @@ async function getCaveListByUser(ctx, session) {
|
|
|
745
744
|
return session.text("echo-cave.general.privateChatReminder");
|
|
746
745
|
}
|
|
747
746
|
const { userId, channelId } = session;
|
|
748
|
-
const caves = await ctx.database.get(
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
747
|
+
const caves = await ctx.database.get(
|
|
748
|
+
"echo_cave",
|
|
749
|
+
{
|
|
750
|
+
userId,
|
|
751
|
+
channelId
|
|
752
|
+
},
|
|
753
|
+
["id"]
|
|
754
|
+
);
|
|
752
755
|
if (caves.length === 0) {
|
|
753
756
|
return session.text(".noMsgContributed");
|
|
754
757
|
}
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
response += session.text(".msgListItem", [cave.id, formatDate(cave.createTime)]) + "\n";
|
|
758
|
-
}
|
|
759
|
-
return response;
|
|
758
|
+
const ids = caves.map((cave) => cave.id).join(" | ");
|
|
759
|
+
return session.text(".msgListHeader") + "\n" + ids;
|
|
760
760
|
}
|
|
761
761
|
async function getCaveListByOriginUser(ctx, session) {
|
|
762
762
|
if (!session.guildId) {
|
|
763
763
|
return session.text("echo-cave.general.privateChatReminder");
|
|
764
764
|
}
|
|
765
765
|
const { userId, channelId } = session;
|
|
766
|
-
const caves = await ctx.database.get(
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
766
|
+
const caves = await ctx.database.get(
|
|
767
|
+
"echo_cave",
|
|
768
|
+
{
|
|
769
|
+
originUserId: userId,
|
|
770
|
+
channelId
|
|
771
|
+
},
|
|
772
|
+
["id"]
|
|
773
|
+
);
|
|
770
774
|
if (caves.length === 0) {
|
|
771
775
|
return session.text(".noMsgTraced");
|
|
772
776
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
response += session.text(".msgListItem", [cave.id, formatDate(cave.createTime)]) + "\n";
|
|
776
|
-
}
|
|
777
|
-
return response;
|
|
777
|
+
const ids = caves.map((cave) => cave.id).join(" | ");
|
|
778
|
+
return session.text(".msgListHeader") + "\n" + ids;
|
|
778
779
|
}
|
|
779
780
|
async function getCave(ctx, session, cfg, id) {
|
|
780
781
|
if (!session.guildId) {
|