mioku-plugin-terraria 2.0.0 → 2.0.2
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/core/command.ts +1 -1
- package/index.ts +77 -63
- package/package.json +2 -48
- package/utils/command-router.ts +0 -21
package/core/command.ts
CHANGED
package/index.ts
CHANGED
|
@@ -2,7 +2,6 @@ import { definePlugin, getService, Services, type MiokuContext } from "mioku";
|
|
|
2
2
|
import { handleStatus } from "./handlers/status";
|
|
3
3
|
import { handleSync } from "./handlers/sync";
|
|
4
4
|
import { handleReconnect } from "./handlers/reconnect";
|
|
5
|
-
import { parseTsCommand } from "./utils/command-router";
|
|
6
5
|
import { createConfigHandler } from "./utils/config-handler";
|
|
7
6
|
import {
|
|
8
7
|
formatQqToTerraria,
|
|
@@ -19,8 +18,6 @@ import { PROTOCOL, type TerrariaConfig, type TerrariaEvent } from "./types";
|
|
|
19
18
|
|
|
20
19
|
export default definePlugin({
|
|
21
20
|
name: "terraria",
|
|
22
|
-
version: "1.0.0",
|
|
23
|
-
description: "Terraria 服务器与 QQ 群消息互通插件,基于 TianSuo 协议",
|
|
24
21
|
|
|
25
22
|
async setup(ctx: MiokuContext) {
|
|
26
23
|
const configService = getService(ctx, Services.Config);
|
|
@@ -42,65 +39,81 @@ export default definePlugin({
|
|
|
42
39
|
serverManager.startServers(config);
|
|
43
40
|
ctx.logger.info("Terraria 插件已就绪");
|
|
44
41
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
42
|
+
const requireGroup = (event: any): string | undefined =>
|
|
43
|
+
String(event?.group_id ?? "").trim() || undefined;
|
|
44
|
+
|
|
45
|
+
ctx.command({
|
|
46
|
+
name: "ts 状态",
|
|
47
|
+
prefixes: ["/", "."],
|
|
48
|
+
match: /^ts\s*状态(?:\s|$)/,
|
|
49
|
+
permission: "master",
|
|
50
|
+
description: "查看所有已配置服务器的 WebSocket 连接状态",
|
|
51
|
+
handler: async ({ event }) => {
|
|
52
|
+
if (!requireGroup(event)) return;
|
|
53
|
+
await handleStatus(serverManager, config, async (msg) => {
|
|
54
|
+
await event.reply(msg);
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
ctx.command({
|
|
59
|
+
name: "ts 开启同步",
|
|
60
|
+
prefixes: ["/", "."],
|
|
61
|
+
match: /^ts\s*开启同步(?:\s|$)/,
|
|
62
|
+
permission: "master",
|
|
63
|
+
description: "开启指定服务器的群聊消息同步功能",
|
|
64
|
+
usage: ".ts 开启同步 <服务器名称>",
|
|
65
|
+
handler: async ({ event, args }) => {
|
|
66
|
+
if (!requireGroup(event)) return;
|
|
67
|
+
await handleSync(
|
|
68
|
+
args[0],
|
|
69
|
+
true,
|
|
70
|
+
configHandler,
|
|
71
|
+
config,
|
|
72
|
+
async (msg) => {
|
|
73
|
+
await event.reply(msg);
|
|
74
|
+
},
|
|
75
|
+
);
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
ctx.command({
|
|
79
|
+
name: "ts 关闭同步",
|
|
80
|
+
prefixes: ["/", "."],
|
|
81
|
+
match: /^ts\s*关闭同步(?:\s|$)/,
|
|
82
|
+
permission: "master",
|
|
83
|
+
description: "关闭指定服务器的群聊消息同步功能",
|
|
84
|
+
usage: ".ts 关闭同步 <服务器名称>",
|
|
85
|
+
handler: async ({ event, args }) => {
|
|
86
|
+
if (!requireGroup(event)) return;
|
|
87
|
+
await handleSync(
|
|
88
|
+
args[0],
|
|
89
|
+
false,
|
|
90
|
+
configHandler,
|
|
91
|
+
config,
|
|
92
|
+
async (msg) => {
|
|
93
|
+
await event.reply(msg);
|
|
94
|
+
},
|
|
95
|
+
);
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
ctx.command({
|
|
99
|
+
name: "ts 重连",
|
|
100
|
+
prefixes: ["/", "."],
|
|
101
|
+
match: /^ts\s*重连(?:\s|$)/,
|
|
102
|
+
permission: "master",
|
|
103
|
+
description: "断开并重新建立所有服务器的 WebSocket 连接",
|
|
104
|
+
handler: async ({ event }) => {
|
|
105
|
+
if (!requireGroup(event)) return;
|
|
106
|
+
await handleReconnect(serverManager, async (msg) => {
|
|
107
|
+
await event.reply(msg);
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
});
|
|
102
111
|
|
|
112
|
+
ctx.handle("message", async (event) => {
|
|
113
|
+
const groupId = requireGroup(event);
|
|
103
114
|
if (!groupId) return;
|
|
115
|
+
const text = ctx.text(event)?.trim();
|
|
116
|
+
if (text && /^[./]ts\b/.test(text)) return;
|
|
104
117
|
await forwardToTerraria(ctx, event, config, configHandler, serverManager);
|
|
105
118
|
});
|
|
106
119
|
|
|
@@ -178,9 +191,10 @@ async function forwardToTerraria(
|
|
|
178
191
|
`[Terraria] 收到群消息 group=${event.group_id} text=${text}`,
|
|
179
192
|
);
|
|
180
193
|
|
|
181
|
-
|
|
194
|
+
const groupId = String(event.group_id ?? "").trim();
|
|
195
|
+
if (!groupId) return;
|
|
182
196
|
|
|
183
|
-
const servers = configHandler.getServersForGroup(
|
|
197
|
+
const servers = configHandler.getServersForGroup(groupId);
|
|
184
198
|
if (servers.length === 0) return;
|
|
185
199
|
|
|
186
200
|
const msgList: QqMessagePart[] = Array.isArray(event.message)
|
|
@@ -195,7 +209,7 @@ async function forwardToTerraria(
|
|
|
195
209
|
const isAllowed = isCommandAllowed(
|
|
196
210
|
commandText,
|
|
197
211
|
server,
|
|
198
|
-
ctx.
|
|
212
|
+
ctx.isMaster?.(event) ?? false,
|
|
199
213
|
event.user_id,
|
|
200
214
|
);
|
|
201
215
|
if (!isAllowed) continue;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mioku-plugin-terraria",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Terraria 服务器与 QQ 群消息互通插件,基于 TianSuo 协议",
|
|
5
5
|
"main": "index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -14,53 +14,7 @@
|
|
|
14
14
|
"mioku": {
|
|
15
15
|
"services": [
|
|
16
16
|
"config"
|
|
17
|
-
]
|
|
18
|
-
"accessHooks": [
|
|
19
|
-
{
|
|
20
|
-
"id": "/ts 状态",
|
|
21
|
-
"match": "/^\\/ts\\s*状态/"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"id": "/ts 开启同步",
|
|
25
|
-
"match": "/^\\/ts\\s*开启同步/"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"id": "/ts 关闭同步",
|
|
29
|
-
"match": "/^\\/ts\\s*关闭同步/"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"id": "/ts 重连",
|
|
33
|
-
"match": "/^\\/ts\\s*重连/"
|
|
34
|
-
}
|
|
35
|
-
],
|
|
36
|
-
"help": {
|
|
37
|
-
"title": "Terraria",
|
|
38
|
-
"description": "Terraria 服务器与 QQ 群消息互通插件,基于 TianSuo 协议",
|
|
39
|
-
"commands": [
|
|
40
|
-
{
|
|
41
|
-
"cmd": "/ts 状态",
|
|
42
|
-
"desc": "查看所有已配置服务器的 WebSocket 连接状态",
|
|
43
|
-
"role": "master"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"cmd": "/ts 开启同步 <服务器名称>",
|
|
47
|
-
"desc": "开启指定服务器的群聊消息同步功能",
|
|
48
|
-
"usage": "/ts 开启同步 <服务器名称>",
|
|
49
|
-
"role": "master"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"cmd": "/ts 关闭同步 <服务器名称>",
|
|
53
|
-
"desc": "关闭指定服务器的群聊消息同步功能",
|
|
54
|
-
"usage": "/ts 关闭同步 <服务器名称>",
|
|
55
|
-
"role": "master"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"cmd": "/ts 重连",
|
|
59
|
-
"desc": "断开并重新建立所有服务器的 WebSocket 连接",
|
|
60
|
-
"role": "master"
|
|
61
|
-
}
|
|
62
|
-
]
|
|
63
|
-
}
|
|
17
|
+
]
|
|
64
18
|
},
|
|
65
19
|
"dependencies": {
|
|
66
20
|
"ws": "^8.18.0"
|
package/utils/command-router.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export interface ParsedCommand {
|
|
2
|
-
action: string;
|
|
3
|
-
args: string[];
|
|
4
|
-
raw: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function parseTsCommand(text: string): ParsedCommand | null {
|
|
8
|
-
const trimmed = text.trim();
|
|
9
|
-
if (!trimmed.startsWith("/ts")) return null;
|
|
10
|
-
|
|
11
|
-
const remainder = trimmed.slice(3).trim();
|
|
12
|
-
if (!remainder) {
|
|
13
|
-
return { action: "", args: [], raw: "" };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const parts = remainder.split(/\s+/);
|
|
17
|
-
const action = parts[0] || "";
|
|
18
|
-
const args = parts.slice(1);
|
|
19
|
-
|
|
20
|
-
return { action, args, raw: remainder };
|
|
21
|
-
}
|