mioku-plugin-mc 4.0.0 → 4.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/index.ts CHANGED
@@ -6,7 +6,6 @@ import { createPlayManager } from "./play";
6
6
  import { createMcSkill } from "./skills/mc";
7
7
  import { handleDebugCommand } from "./play/debug/commands";
8
8
  import { createServerManager } from "./utils/server-manager";
9
- import { parseMcCommand } from "./utils/command-router";
10
9
  import { handleStatus } from "./handlers/status";
11
10
  import { handleSync } from "./handlers/sync";
12
11
  import { handleReconnect } from "./handlers/reconnect";
@@ -21,8 +20,6 @@ import type { McConfig } from "./types";
21
20
 
22
21
  export default definePlugin({
23
22
  name: "mc",
24
- version: "1.0.0",
25
- description: "Minecraft服务器与QQ群消息互通插件",
26
23
 
27
24
  async setup(ctx: MiokuContext) {
28
25
  const configService = getService(ctx, Services.Config);
@@ -74,7 +71,7 @@ export default definePlugin({
74
71
  if (groupId) {
75
72
  const reply = await handleDebugCommand({
76
73
  text,
77
- isOwner: ctx.isOwner?.(event) ?? false,
74
+ isMaster: ctx.isMaster?.(event) ?? false,
78
75
  debugEnabled: playConfigHandler.getConfig().debug.enabled,
79
76
  playManager,
80
77
  groupId: Number(groupId),
@@ -85,60 +82,64 @@ export default definePlugin({
85
82
  }
86
83
  }
87
84
 
88
- const parsed = parseMcCommand(text);
89
-
90
- if (!parsed || parsed.action === "") {
91
- if (groupId) {
92
- playManager.onQqMessage(event);
93
- await forwardToMc(ctx, event, config, configHandler, serverManager);
94
- }
95
- return;
85
+ if (groupId) {
86
+ await forwardToMc(ctx, event, config, configHandler, serverManager);
96
87
  }
88
+ });
97
89
 
98
- switch (parsed.action) {
99
- case "状态": {
100
- await handleStatus(serverManager, config, async (msg) => {
101
- await event.reply(msg);
102
- });
103
- break;
104
- }
105
- case "开启同步": {
106
- const serverName = parsed.args[0];
107
- await handleSync(
108
- serverName,
109
- true,
110
- serverManager,
111
- configHandler,
112
- config,
113
- async (msg) => {
114
- await event.reply(msg);
115
- },
116
- );
117
- break;
118
- }
119
- case "关闭同步": {
120
- const serverName = parsed.args[0];
121
- await handleSync(
122
- serverName,
123
- false,
124
- serverManager,
125
- configHandler,
126
- config,
127
- async (msg) => {
128
- await event.reply(msg);
129
- },
130
- );
131
- break;
132
- }
133
- case "重连": {
134
- if (ctx.isOwner?.(event)) {
135
- await handleReconnect(serverManager, async (msg) => {
136
- await event.reply(msg);
137
- });
138
- }
139
- break;
140
- }
141
- }
90
+ const replyWithEvent = (event: import("mioku").MessageEvent) =>
91
+ async (msg: string) => {
92
+ await event.reply(msg);
93
+ };
94
+
95
+ ctx.command({
96
+ id: "mc-status",
97
+ name: "mc-status",
98
+ match: /^\/mc\s+状态\s*$/,
99
+ prefixes: ["/"],
100
+ permission: "master",
101
+ description: "查看所有已配置服务器的WebSocket连接状态,包括连接中、已断开等",
102
+ async handler({ event }) {
103
+ await handleStatus(serverManager, config, replyWithEvent(event));
104
+ },
105
+ });
106
+
107
+ ctx.command({
108
+ id: "mc-sync-on",
109
+ name: "mc-sync-on",
110
+ match: /^\/mc\s+开启同步(?:\s+(.+))?$/,
111
+ prefixes: ["/"],
112
+ description: "开启指定服务器的群聊消息同步功能,开启后该服务器可接收和发送群聊消息",
113
+ usage: "/mc 开启同步 <服务器名称>",
114
+ permission: "master",
115
+ async handler({ event, args }) {
116
+ await handleSync(args[0], true, serverManager, configHandler, config, replyWithEvent(event));
117
+ },
118
+ });
119
+
120
+ ctx.command({
121
+ id: "mc-sync-off",
122
+ name: "mc-sync-off",
123
+ match: /^\/mc\s+关闭同步(?:\s+(.+))?$/,
124
+ prefixes: ["/"],
125
+ description: "关闭指定服务器的群聊消息同步功能,关闭后该服务器不再接收和发送群聊消息",
126
+ usage: "/mc 关闭同步 <服务器名称>",
127
+ permission: "master",
128
+ async handler({ event, args }) {
129
+ await handleSync(args[0], false, serverManager, configHandler, config, replyWithEvent(event));
130
+ },
131
+ });
132
+
133
+ ctx.command({
134
+ id: "mc-reconnect",
135
+ name: "mc-reconnect",
136
+ match: /^\/mc\s+重连\s*$/,
137
+ prefixes: ["/"],
138
+ permission: "master",
139
+ description: "断开并重新建立所有服务器的WebSocket连接,用于连接异常时手动恢复",
140
+ async handler({ event }) {
141
+ await handleReconnect(serverManager, replyWithEvent(event));
142
+ },
142
143
  });
143
144
 
144
145
  ctx.logger.info("Minecraft插件加载成功");
@@ -197,10 +198,7 @@ async function forwardToMc(
197
198
  const text = ctx.text(event);
198
199
  ctx.logger.debug(`[MC] 收到群消息 group=${event.group_id} text=${text}`);
199
200
 
200
- // 检查是否为群消息
201
- if (!event.group_id) {
202
- return;
203
- }
201
+ if (!event.group_id) return;
204
202
 
205
203
  const servers = configHandler.getServersForGroup(event.group_id);
206
204
  if (servers.length === 0) return;
@@ -219,7 +217,7 @@ async function forwardToMc(
219
217
  const isAllowed = isCommandAllowed(
220
218
  commandText,
221
219
  server,
222
- ctx.isOwner?.(event) ?? false,
220
+ ctx.isMaster?.(event) ?? false,
223
221
  event.user_id ?? "",
224
222
  );
225
223
 
@@ -252,4 +250,4 @@ async function forwardToMc(
252
250
  ctx.logger.error(`[MC] 发送到服务器 ${server.server_name} 失败: ${err}`);
253
251
  }
254
252
  }
255
- }
253
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mioku-plugin-mc",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Minecraft与QQ群消息互通插件,支持服务器状态监控与RCON命令",
5
5
  "main": "index.ts",
6
6
  "type": "module",
@@ -15,53 +15,7 @@
15
15
  "services": [
16
16
  "config",
17
17
  "ai"
18
- ],
19
- "accessHooks": [
20
- {
21
- "id": "/mc 状态",
22
- "match": "/^\\/mc\\s*状态/"
23
- },
24
- {
25
- "id": "/mc 开启同步",
26
- "match": "/^\\/mc\\s*开启同步/"
27
- },
28
- {
29
- "id": "/mc 关闭同步",
30
- "match": "/^\\/mc\\s*关闭同步/"
31
- },
32
- {
33
- "id": "/mc 重连",
34
- "match": "/^\\/mc\\s*重连/"
35
- }
36
- ],
37
- "help": {
38
- "title": "Minecraft",
39
- "description": "Minecraft服务器与QQ群消息互通插件,支持服务器状态监控与RCON命令",
40
- "commands": [
41
- {
42
- "cmd": "/mc 状态",
43
- "desc": "查看所有已配置服务器的WebSocket连接状态,包括连接中、已断开等",
44
- "role": "master"
45
- },
46
- {
47
- "cmd": "/mc 开启同步",
48
- "desc": "开启指定服务器的群聊消息同步功能,开启后该服务器可接收和发送群聊消息",
49
- "usage": "/mc 开启同步 <服务器名称>",
50
- "role": "master"
51
- },
52
- {
53
- "cmd": "/mc 关闭同步",
54
- "desc": "关闭指定服务器的群聊消息同步功能,关闭后该服务器不再接收和发送群聊消息",
55
- "usage": "/mc 关闭同步 <服务器名称>",
56
- "role": "master"
57
- },
58
- {
59
- "cmd": "/mc 重连",
60
- "desc": "断开并重新建立所有服务器的WebSocket连接,用于连接异常时手动恢复",
61
- "role": "master"
62
- }
63
- ]
64
- }
18
+ ]
65
19
  },
66
20
  "dependencies": {
67
21
  "@cikeyqi/queqiao-node-sdk": "^0.1.3",
@@ -2,7 +2,7 @@ import type { PlayManager } from "../index";
2
2
 
3
3
  export interface DebugCommandContext {
4
4
  text: string;
5
- isOwner: boolean;
5
+ isMaster: boolean;
6
6
  debugEnabled: boolean;
7
7
  playManager: PlayManager;
8
8
  groupId: number;
@@ -78,7 +78,7 @@ function parseBundleArgs(arg: string): ParsedBundleArgs | null {
78
78
  export async function handleDebugCommand(
79
79
  ctx: DebugCommandContext,
80
80
  ): Promise<string | null> {
81
- if (!ctx.debugEnabled || !ctx.isOwner) return null;
81
+ if (!ctx.debugEnabled || !ctx.isMaster) return null;
82
82
  const text = ctx.text.trim();
83
83
  if (!text.startsWith("/")) return null;
84
84
  const head = text.split(/\s+/)[0]?.toLowerCase();
@@ -1,51 +0,0 @@
1
- export interface ParsedCommand {
2
- action: string;
3
- args: string[];
4
- raw: string;
5
- }
6
-
7
- export function parseMcCommand(text: string): ParsedCommand | null {
8
- const trimmed = text.trim();
9
- if (!trimmed.startsWith("/mc")) return null;
10
-
11
- const remainder = trimmed.slice(3).trim();
12
- if (!remainder) {
13
- return { action: "", args: [], raw: "" };
14
- }
15
-
16
- // split into action and args
17
- const parts = remainder.split(/\s+/);
18
- const action = parts[0] || "";
19
- const args = parts.slice(1);
20
-
21
- return { action, args, raw: remainder };
22
- }
23
-
24
- export function matchMcCommand(
25
- text: string,
26
- pattern: RegExp
27
- ): RegExpMatchArray | null {
28
- const parsed = parseMcCommand(text);
29
- if (!parsed) return null;
30
- return parsed.raw.match(pattern);
31
- }
32
-
33
- export function buildStatusReply(
34
- serverName: string,
35
- status: string,
36
- displayName?: string
37
- ): string {
38
- const name = displayName || serverName;
39
- const icon = status === "connected" ? "在线" : status === "connecting" ? "连接中" : "离线";
40
- return `[${name}] ${icon}`;
41
- }
42
-
43
- export function buildSyncReply(
44
- serverName: string,
45
- enabled: boolean,
46
- displayName?: string
47
- ): string {
48
- const name = displayName || serverName;
49
- const action = enabled ? "开启" : "关闭";
50
- return `${action}了服务器 ${name} 的同步`;
51
- }