openclaw-rocketchat 0.1.0

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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +694 -0
  3. package/README.md +730 -0
  4. package/dist/cli/add-bot.d.ts +2 -0
  5. package/dist/cli/add-bot.d.ts.map +1 -0
  6. package/dist/cli/add-bot.js +138 -0
  7. package/dist/cli/add-bot.js.map +1 -0
  8. package/dist/cli/add-group.d.ts +2 -0
  9. package/dist/cli/add-group.d.ts.map +1 -0
  10. package/dist/cli/add-group.js +145 -0
  11. package/dist/cli/add-group.js.map +1 -0
  12. package/dist/cli/add-user.d.ts +2 -0
  13. package/dist/cli/add-user.d.ts.map +1 -0
  14. package/dist/cli/add-user.js +186 -0
  15. package/dist/cli/add-user.js.map +1 -0
  16. package/dist/cli/invite.d.ts +2 -0
  17. package/dist/cli/invite.d.ts.map +1 -0
  18. package/dist/cli/invite.js +194 -0
  19. package/dist/cli/invite.js.map +1 -0
  20. package/dist/cli/prompts.d.ts +24 -0
  21. package/dist/cli/prompts.d.ts.map +1 -0
  22. package/dist/cli/prompts.js +134 -0
  23. package/dist/cli/prompts.js.map +1 -0
  24. package/dist/cli/remove-user.d.ts +2 -0
  25. package/dist/cli/remove-user.d.ts.map +1 -0
  26. package/dist/cli/remove-user.js +108 -0
  27. package/dist/cli/remove-user.js.map +1 -0
  28. package/dist/cli/setup.d.ts +2 -0
  29. package/dist/cli/setup.d.ts.map +1 -0
  30. package/dist/cli/setup.js +446 -0
  31. package/dist/cli/setup.js.map +1 -0
  32. package/dist/cli/status.d.ts +2 -0
  33. package/dist/cli/status.d.ts.map +1 -0
  34. package/dist/cli/status.js +161 -0
  35. package/dist/cli/status.js.map +1 -0
  36. package/dist/cli/uninstall.d.ts +2 -0
  37. package/dist/cli/uninstall.d.ts.map +1 -0
  38. package/dist/cli/uninstall.js +81 -0
  39. package/dist/cli/uninstall.js.map +1 -0
  40. package/dist/config/credentials.d.ts +26 -0
  41. package/dist/config/credentials.d.ts.map +1 -0
  42. package/dist/config/credentials.js +169 -0
  43. package/dist/config/credentials.js.map +1 -0
  44. package/dist/config/writer.d.ts +52 -0
  45. package/dist/config/writer.d.ts.map +1 -0
  46. package/dist/config/writer.js +170 -0
  47. package/dist/config/writer.js.map +1 -0
  48. package/dist/docker/compose.d.ts +10 -0
  49. package/dist/docker/compose.d.ts.map +1 -0
  50. package/dist/docker/compose.js +56 -0
  51. package/dist/docker/compose.js.map +1 -0
  52. package/dist/docker/manager.d.ts +38 -0
  53. package/dist/docker/manager.d.ts.map +1 -0
  54. package/dist/docker/manager.js +219 -0
  55. package/dist/docker/manager.js.map +1 -0
  56. package/dist/index.d.ts +5 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +203 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/rc-api/rest-client.d.ts +64 -0
  61. package/dist/rc-api/rest-client.d.ts.map +1 -0
  62. package/dist/rc-api/rest-client.js +268 -0
  63. package/dist/rc-api/rest-client.js.map +1 -0
  64. package/dist/rc-api/types.d.ts +158 -0
  65. package/dist/rc-api/types.d.ts.map +1 -0
  66. package/dist/rc-api/types.js +5 -0
  67. package/dist/rc-api/types.js.map +1 -0
  68. package/dist/rc-api/ws-client.d.ts +47 -0
  69. package/dist/rc-api/ws-client.d.ts.map +1 -0
  70. package/dist/rc-api/ws-client.js +308 -0
  71. package/dist/rc-api/ws-client.js.map +1 -0
  72. package/dist/service/bot-manager.d.ts +34 -0
  73. package/dist/service/bot-manager.d.ts.map +1 -0
  74. package/dist/service/bot-manager.js +156 -0
  75. package/dist/service/bot-manager.js.map +1 -0
  76. package/dist/service/channel.d.ts +35 -0
  77. package/dist/service/channel.d.ts.map +1 -0
  78. package/dist/service/channel.js +157 -0
  79. package/dist/service/channel.js.map +1 -0
  80. package/dist/service/message-handler.d.ts +45 -0
  81. package/dist/service/message-handler.d.ts.map +1 -0
  82. package/dist/service/message-handler.js +207 -0
  83. package/dist/service/message-handler.js.map +1 -0
  84. package/openclaw.plugin.json +45 -0
  85. package/package.json +61 -0
@@ -0,0 +1,194 @@
1
+ // ============================================================
2
+ // CLI: openclaw rocketchat invite
3
+ // 群组成员管理(邀请/移除/设管理员/设所有者)
4
+ // ============================================================
5
+ import { RocketChatRestClient } from "../rc-api/rest-client.js";
6
+ import { ConfigWriter } from "../config/writer.js";
7
+ import { loadAdminCredentials, loadUserRecords, } from "../config/credentials.js";
8
+ import { select, multiSelect, heading, step, success, error, info, } from "./prompts.js";
9
+ export async function inviteCommand(configPath) {
10
+ heading("群组成员管理");
11
+ // ----------------------------------------------------------
12
+ // 1. 加载凭据和配置
13
+ // ----------------------------------------------------------
14
+ const adminCreds = await loadAdminCredentials();
15
+ if (!adminCreds) {
16
+ error("未找到管理员凭据!请先运行: openclaw rocketchat setup");
17
+ return;
18
+ }
19
+ const configWriter = new ConfigWriter(configPath);
20
+ await configWriter.readConfig();
21
+ const rcConfig = configWriter.getRocketchatConfig();
22
+ if (!rcConfig?.serverUrl) {
23
+ error("未找到 Rocket.Chat 配置!请先运行: openclaw rocketchat setup");
24
+ return;
25
+ }
26
+ const groups = rcConfig.groups || {};
27
+ const groupNames = Object.keys(groups);
28
+ if (groupNames.length === 0) {
29
+ error("没有找到任何群组!");
30
+ info("请先创建群组: openclaw rocketchat add-group");
31
+ return;
32
+ }
33
+ const rc = new RocketChatRestClient(rcConfig.serverUrl);
34
+ rc.setAuth(adminCreds.userId, adminCreds.authToken);
35
+ // ----------------------------------------------------------
36
+ // 2. 选择群组
37
+ // ----------------------------------------------------------
38
+ const groupOptions = groupNames.map((name) => ({
39
+ label: name,
40
+ value: name,
41
+ }));
42
+ const selectedGroup = await select("选择群组", groupOptions);
43
+ // ----------------------------------------------------------
44
+ // 3. 显示当前成员
45
+ // ----------------------------------------------------------
46
+ const groupInfo = await rc.getGroupInfo(undefined, selectedGroup);
47
+ if (!groupInfo) {
48
+ error(`群组「${selectedGroup}」不存在!`);
49
+ return;
50
+ }
51
+ const members = await rc.getGroupMembers(groupInfo._id);
52
+ console.log(`\n${selectedGroup} 当前成员:`);
53
+ for (const member of members) {
54
+ const roles = member.roles?.length
55
+ ? ` (${member.roles.join(", ")})`
56
+ : "";
57
+ console.log(` ${member.username}${roles}`);
58
+ }
59
+ // ----------------------------------------------------------
60
+ // 4. 选择操作
61
+ // ----------------------------------------------------------
62
+ const action = await select("操作", [
63
+ { label: "邀请用户进群", value: "invite" },
64
+ { label: "移除用户", value: "kick" },
65
+ { label: "设为管理员 (Moderator)", value: "moderator" },
66
+ { label: "设为所有者 (Owner)", value: "owner" },
67
+ { label: "返回", value: "back" },
68
+ ]);
69
+ if (action === "back")
70
+ return;
71
+ const memberUsernames = members.map((m) => m.username);
72
+ if (action === "invite") {
73
+ // 邀请:显示不在群内的用户
74
+ const allUsers = await loadUserRecords();
75
+ const notInGroup = allUsers.filter((u) => !memberUsernames.includes(u.username));
76
+ if (notInGroup.length === 0) {
77
+ info("所有用户都已在群内!");
78
+ info("添加新用户: openclaw rocketchat add-user");
79
+ return;
80
+ }
81
+ const options = notInGroup.map((u) => ({
82
+ label: u.username,
83
+ value: u.username,
84
+ }));
85
+ const toInvite = await multiSelect("邀请谁?", options);
86
+ // 加载用户记录以检查权限
87
+ const userRecords = await loadUserRecords();
88
+ for (const username of toInvite) {
89
+ step(`邀请 ${username}...`);
90
+ try {
91
+ const userInfo = await rc.getUserInfo(username);
92
+ if (!userInfo) {
93
+ error(`用户 ${username} 在 Rocket.Chat 中不存在`);
94
+ continue;
95
+ }
96
+ await rc.groupInvite(groupInfo._id, userInfo._id);
97
+ success(`${username} 已加入「${selectedGroup}」`);
98
+ // 只读用户自动禁言
99
+ const record = userRecords.find((u) => u.username === username);
100
+ if (record?.permission === "readonly") {
101
+ try {
102
+ await rc.muteUserInRoom(groupInfo._id, userInfo._id);
103
+ info(` 已在「${selectedGroup}」中设为只读`);
104
+ }
105
+ catch {
106
+ // 禁言失败不影响主流程
107
+ }
108
+ }
109
+ }
110
+ catch (err) {
111
+ error(`邀请失败: ${err.message}`);
112
+ }
113
+ }
114
+ }
115
+ else if (action === "kick") {
116
+ const options = members
117
+ .filter((m) => !m.roles?.includes("owner"))
118
+ .map((m) => ({
119
+ label: `${m.username}${m.roles?.length ? ` (${m.roles.join(", ")})` : ""}`,
120
+ value: m.username,
121
+ }));
122
+ if (options.length === 0) {
123
+ info("没有可移除的成员(Owner 不能移除)!");
124
+ return;
125
+ }
126
+ const toKick = await multiSelect("移除谁?", options);
127
+ for (const username of toKick) {
128
+ step(`移除 ${username}...`);
129
+ try {
130
+ const member = members.find((m) => m.username === username);
131
+ if (member) {
132
+ await rc.groupKick(groupInfo._id, member._id);
133
+ success(`${username} 已从「${selectedGroup}」移除`);
134
+ }
135
+ }
136
+ catch (err) {
137
+ error(`移除失败: ${err.message}`);
138
+ }
139
+ }
140
+ }
141
+ else if (action === "moderator") {
142
+ const options = members
143
+ .filter((m) => !m.roles?.includes("moderator") && !m.roles?.includes("owner"))
144
+ .map((m) => ({
145
+ label: m.username,
146
+ value: m.username,
147
+ }));
148
+ if (options.length === 0) {
149
+ info("没有可设为管理员的成员!");
150
+ return;
151
+ }
152
+ const toMod = await multiSelect("设谁为管理员?", options);
153
+ for (const username of toMod) {
154
+ step(`设置 ${username} 为管理员...`);
155
+ try {
156
+ const member = members.find((m) => m.username === username);
157
+ if (member) {
158
+ await rc.groupAddModerator(groupInfo._id, member._id);
159
+ success(`${username} 已成为「${selectedGroup}」管理员`);
160
+ }
161
+ }
162
+ catch (err) {
163
+ error(`设置失败: ${err.message}`);
164
+ }
165
+ }
166
+ }
167
+ else if (action === "owner") {
168
+ const options = members
169
+ .filter((m) => !m.roles?.includes("owner"))
170
+ .map((m) => ({
171
+ label: m.username,
172
+ value: m.username,
173
+ }));
174
+ if (options.length === 0) {
175
+ info("没有可设为所有者的成员!");
176
+ return;
177
+ }
178
+ const toOwn = await multiSelect("设谁为所有者?", options);
179
+ for (const username of toOwn) {
180
+ step(`设置 ${username} 为所有者...`);
181
+ try {
182
+ const member = members.find((m) => m.username === username);
183
+ if (member) {
184
+ await rc.groupAddOwner(groupInfo._id, member._id);
185
+ success(`${username} 已成为「${selectedGroup}」所有者`);
186
+ }
187
+ }
188
+ catch (err) {
189
+ error(`设置失败: ${err.message}`);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ //# sourceMappingURL=invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite.js","sourceRoot":"","sources":["../../src/cli/invite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** 提示用户输入(带可选默认值) */
2
+ export declare function ask(question: string, defaultValue?: string): Promise<string>;
3
+ /** 提示用户输入密码(不显示输入内容) */
4
+ export declare function askPassword(question: string): Promise<string>;
5
+ /** 提示用户确认 [y/N] */
6
+ export declare function confirm(question: string, defaultYes?: boolean): Promise<boolean>;
7
+ /** 让用户从列表中选择(单选) */
8
+ export declare function select(question: string, options: {
9
+ label: string;
10
+ value: string;
11
+ }[]): Promise<string>;
12
+ /** 让用户从列表中选择(多选,逗号分隔) */
13
+ export declare function multiSelect(question: string, options: {
14
+ label: string;
15
+ value: string;
16
+ }[], allowEmpty?: boolean): Promise<string[]>;
17
+ /** 打印带颜色的状态消息 */
18
+ export declare function info(msg: string): void;
19
+ export declare function success(msg: string): void;
20
+ export declare function warn(msg: string): void;
21
+ export declare function error(msg: string): void;
22
+ export declare function step(msg: string): void;
23
+ export declare function heading(title: string): void;
24
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"AAaA,qBAAqB;AACrB,wBAAgB,GAAG,CACjB,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAwB;AACxB,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C7D;AAED,mBAAmB;AACnB,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,UAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,oBAAoB;AACpB,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1C,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,yBAAyB;AACzB,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC3C,UAAU,UAAQ,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAED,iBAAiB;AACjB,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3C"}
@@ -0,0 +1,134 @@
1
+ // ============================================================
2
+ // CLI 交互式输入工具
3
+ // 使用 Node.js 原生 readline,不依赖第三方库
4
+ // ============================================================
5
+ import { createInterface } from "node:readline";
6
+ const rl = () => createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ /** 提示用户输入(带可选默认值) */
11
+ export function ask(question, defaultValue) {
12
+ return new Promise((resolve) => {
13
+ const r = rl();
14
+ const prompt = defaultValue
15
+ ? `${question} [默认 ${defaultValue}]: `
16
+ : `${question}: `;
17
+ r.question(prompt, (answer) => {
18
+ r.close();
19
+ const value = answer.trim() || defaultValue || "";
20
+ resolve(value);
21
+ });
22
+ });
23
+ }
24
+ /** 提示用户输入密码(不显示输入内容) */
25
+ export function askPassword(question) {
26
+ return new Promise((resolve) => {
27
+ const r = rl();
28
+ // 隐藏输入
29
+ const stdin = process.stdin;
30
+ if (stdin.isTTY) {
31
+ stdin.setRawMode(true);
32
+ }
33
+ process.stdout.write(`${question}: `);
34
+ let password = "";
35
+ const onData = (buf) => {
36
+ const char = buf.toString();
37
+ if (char === "\n" || char === "\r" || char === "\r\n") {
38
+ if (stdin.isTTY) {
39
+ stdin.setRawMode(false);
40
+ }
41
+ stdin.removeListener("data", onData);
42
+ process.stdout.write("\n");
43
+ r.close();
44
+ resolve(password);
45
+ }
46
+ else if (char === "\u007F" || char === "\b") {
47
+ // Backspace
48
+ if (password.length > 0) {
49
+ password = password.slice(0, -1);
50
+ process.stdout.write("\b \b");
51
+ }
52
+ }
53
+ else if (char === "\u0003") {
54
+ // Ctrl+C
55
+ process.stdout.write("\n");
56
+ process.exit(0);
57
+ }
58
+ else {
59
+ password += char;
60
+ process.stdout.write("*");
61
+ }
62
+ };
63
+ stdin.on("data", onData);
64
+ stdin.resume();
65
+ });
66
+ }
67
+ /** 提示用户确认 [y/N] */
68
+ export async function confirm(question, defaultYes = false) {
69
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
70
+ const answer = await ask(`${question} ${hint}`);
71
+ if (!answer)
72
+ return defaultYes;
73
+ return answer.toLowerCase().startsWith("y");
74
+ }
75
+ /** 让用户从列表中选择(单选) */
76
+ export async function select(question, options) {
77
+ console.log(`\n${question}`);
78
+ for (let i = 0; i < options.length; i++) {
79
+ console.log(` ${i + 1}) ${options[i].label}`);
80
+ }
81
+ while (true) {
82
+ const answer = await ask("请选择");
83
+ const idx = parseInt(answer, 10) - 1;
84
+ if (idx >= 0 && idx < options.length) {
85
+ return options[idx].value;
86
+ }
87
+ console.log(" 无效选择,请重新输入");
88
+ }
89
+ }
90
+ /** 让用户从列表中选择(多选,逗号分隔) */
91
+ export async function multiSelect(question, options, allowEmpty = false) {
92
+ console.log(`\n${question}`);
93
+ for (let i = 0; i < options.length; i++) {
94
+ console.log(` ${i + 1}) ${options[i].label}`);
95
+ }
96
+ while (true) {
97
+ const hint = allowEmpty ? "(回车跳过)" : "(逗号分隔,如 1,2)";
98
+ const answer = await ask(`请选择${hint}`);
99
+ if (!answer && allowEmpty)
100
+ return [];
101
+ if (!answer)
102
+ continue;
103
+ const indices = answer
104
+ .split(",")
105
+ .map((s) => parseInt(s.trim(), 10) - 1)
106
+ .filter((i) => i >= 0 && i < options.length);
107
+ if (indices.length > 0) {
108
+ return indices.map((i) => options[i].value);
109
+ }
110
+ console.log(" 无效选择,请重新输入");
111
+ }
112
+ }
113
+ /** 打印带颜色的状态消息 */
114
+ export function info(msg) {
115
+ console.log(` ${msg}`);
116
+ }
117
+ export function success(msg) {
118
+ console.log(` ✅ ${msg}`);
119
+ }
120
+ export function warn(msg) {
121
+ console.log(` ⚠️ ${msg}`);
122
+ }
123
+ export function error(msg) {
124
+ console.log(` ❌ ${msg}`);
125
+ }
126
+ export function step(msg) {
127
+ console.log(` ⏳ ${msg}`);
128
+ }
129
+ export function heading(title) {
130
+ console.log("");
131
+ console.log(`=== ${title} ===`);
132
+ console.log("");
133
+ }
134
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function removeUserCommand(configPath: string): Promise<void>;
2
+ //# sourceMappingURL=remove-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-user.d.ts","sourceRoot":"","sources":["../../src/cli/remove-user.ts"],"names":[],"mappings":"AAuBA,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GzE"}
@@ -0,0 +1,108 @@
1
+ // ============================================================
2
+ // CLI: openclaw rocketchat remove-user
3
+ // 删除手机登录用户(从 RC 服务器移除 + 清理本地记录)
4
+ // ============================================================
5
+ import { RocketChatRestClient } from "../rc-api/rest-client.js";
6
+ import { ConfigWriter } from "../config/writer.js";
7
+ import { loadAdminCredentials, loadUserRecords, removeUserRecord, } from "../config/credentials.js";
8
+ import { select, confirm, heading, step, success, error, info, warn, } from "./prompts.js";
9
+ export async function removeUserCommand(configPath) {
10
+ heading("删除手机登录用户");
11
+ // ----------------------------------------------------------
12
+ // 1. 加载凭据和配置
13
+ // ----------------------------------------------------------
14
+ const adminCreds = await loadAdminCredentials();
15
+ if (!adminCreds) {
16
+ error("未找到管理员凭据!请先运行: openclaw rocketchat setup");
17
+ return;
18
+ }
19
+ const configWriter = new ConfigWriter(configPath);
20
+ await configWriter.readConfig();
21
+ const rcConfig = configWriter.getRocketchatConfig();
22
+ if (!rcConfig?.serverUrl) {
23
+ error("未找到 Rocket.Chat 配置!请先运行: openclaw rocketchat setup");
24
+ return;
25
+ }
26
+ const rc = new RocketChatRestClient(rcConfig.serverUrl);
27
+ rc.setAuth(adminCreds.userId, adminCreds.authToken);
28
+ // ----------------------------------------------------------
29
+ // 2. 列出可删除的用户
30
+ // ----------------------------------------------------------
31
+ const users = await loadUserRecords();
32
+ if (users.length === 0) {
33
+ info("当前没有已添加的用户。");
34
+ return;
35
+ }
36
+ const options = users.map((u) => ({
37
+ label: u.username,
38
+ value: u.username,
39
+ }));
40
+ const username = await select("选择要删除的用户", options);
41
+ // ----------------------------------------------------------
42
+ // 3. 确认操作
43
+ // ----------------------------------------------------------
44
+ warn(`⚠️ 即将删除用户 ${username},此操作不可恢复!`);
45
+ info(` 该用户将从 Rocket.Chat 服务器上永久删除,`);
46
+ info(` 同时从所有群组中移除,DM 记录也将丢失。`);
47
+ console.log("");
48
+ const confirmed = await confirm(`确认删除 ${username}?`);
49
+ if (!confirmed) {
50
+ info("已取消。");
51
+ return;
52
+ }
53
+ console.log("");
54
+ // ----------------------------------------------------------
55
+ // 4. 从 RC 群组中移除
56
+ // ----------------------------------------------------------
57
+ const groups = rcConfig.groups || {};
58
+ for (const groupName of Object.keys(groups)) {
59
+ try {
60
+ const groupInfo = await rc.getGroupInfo(undefined, groupName);
61
+ if (groupInfo) {
62
+ const members = await rc.getGroupMembers(groupInfo._id);
63
+ const member = members.find((m) => m.username === username);
64
+ if (member) {
65
+ step(`从「${groupName}」移除...`);
66
+ await rc.groupKick(groupInfo._id, member._id);
67
+ success(`已从「${groupName}」移除`);
68
+ }
69
+ }
70
+ }
71
+ catch (err) {
72
+ warn(`从群组 ${groupName} 移除失败: ${err.message}`);
73
+ }
74
+ }
75
+ // ----------------------------------------------------------
76
+ // 5. 从 RC 服务器删除用户
77
+ // ----------------------------------------------------------
78
+ step(`从 Rocket.Chat 删除用户 ${username}...`);
79
+ try {
80
+ const userInfo = await rc.getUserInfo(username);
81
+ if (userInfo) {
82
+ await rc.deleteUser(userInfo._id);
83
+ success(`用户 ${username} 已从 Rocket.Chat 删除`);
84
+ }
85
+ else {
86
+ warn(`用户 ${username} 在 Rocket.Chat 中不存在(可能已被手动删除)`);
87
+ }
88
+ }
89
+ catch (err) {
90
+ error(`删除失败: ${err.message}`);
91
+ info("你可以在 Rocket.Chat 管理后台手动删除该用户。");
92
+ // 即使 RC 删除失败,也继续清理本地记录
93
+ }
94
+ // ----------------------------------------------------------
95
+ // 6. 清理本地记录
96
+ // ----------------------------------------------------------
97
+ step("清理本地记录...");
98
+ await removeUserRecord(username);
99
+ success("本地记录已清理");
100
+ // ----------------------------------------------------------
101
+ // 7. 完成
102
+ // ----------------------------------------------------------
103
+ console.log("");
104
+ success(`用户 ${username} 已完全删除`);
105
+ info(" 该用户的 Rocket.Chat App 将无法再登录。");
106
+ console.log("");
107
+ }
108
+ //# sourceMappingURL=remove-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-user.js","sourceRoot":"","sources":["../../src/cli/remove-user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function setupCommand(configPath: string): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AA+BA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCpE"}