@minecraft-docker/mcctl 1.6.0 → 1.6.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.
Files changed (193) hide show
  1. package/dist/application/index.d.ts +2 -0
  2. package/dist/application/index.d.ts.map +1 -0
  3. package/dist/application/index.js +5 -0
  4. package/dist/application/index.js.map +1 -0
  5. package/dist/commands/backup.d.ts +16 -0
  6. package/dist/commands/backup.d.ts.map +1 -0
  7. package/dist/commands/backup.js +182 -0
  8. package/dist/commands/backup.js.map +1 -0
  9. package/dist/commands/ban.d.ts +14 -0
  10. package/dist/commands/ban.d.ts.map +1 -0
  11. package/dist/commands/ban.js +418 -0
  12. package/dist/commands/ban.js.map +1 -0
  13. package/dist/commands/config.d.ts +18 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +106 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/console/api.d.ts +19 -0
  18. package/dist/commands/console/api.d.ts.map +1 -0
  19. package/dist/commands/console/api.js +399 -0
  20. package/dist/commands/console/api.js.map +1 -0
  21. package/dist/commands/console/index.d.ts +10 -0
  22. package/dist/commands/console/index.d.ts.map +1 -0
  23. package/dist/commands/console/index.js +12 -0
  24. package/dist/commands/console/index.js.map +1 -0
  25. package/dist/commands/console/init.d.ts +47 -0
  26. package/dist/commands/console/init.d.ts.map +1 -0
  27. package/dist/commands/console/init.js +491 -0
  28. package/dist/commands/console/init.js.map +1 -0
  29. package/dist/commands/console/remove.d.ts +25 -0
  30. package/dist/commands/console/remove.d.ts.map +1 -0
  31. package/dist/commands/console/remove.js +189 -0
  32. package/dist/commands/console/remove.js.map +1 -0
  33. package/dist/commands/console/service.d.ts +40 -0
  34. package/dist/commands/console/service.d.ts.map +1 -0
  35. package/dist/commands/console/service.js +321 -0
  36. package/dist/commands/console/service.js.map +1 -0
  37. package/dist/commands/console/user.d.ts +17 -0
  38. package/dist/commands/console/user.d.ts.map +1 -0
  39. package/dist/commands/console/user.js +431 -0
  40. package/dist/commands/console/user.js.map +1 -0
  41. package/dist/commands/create.d.ts +22 -0
  42. package/dist/commands/create.d.ts.map +1 -0
  43. package/dist/commands/create.js +86 -0
  44. package/dist/commands/create.js.map +1 -0
  45. package/dist/commands/delete.d.ts +17 -0
  46. package/dist/commands/delete.d.ts.map +1 -0
  47. package/dist/commands/delete.js +74 -0
  48. package/dist/commands/delete.js.map +1 -0
  49. package/dist/commands/exec.d.ts +10 -0
  50. package/dist/commands/exec.d.ts.map +1 -0
  51. package/dist/commands/exec.js +29 -0
  52. package/dist/commands/exec.js.map +1 -0
  53. package/dist/commands/index.d.ts +21 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +23 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/init.d.ts +9 -0
  58. package/dist/commands/init.d.ts.map +1 -0
  59. package/dist/commands/init.js +218 -0
  60. package/dist/commands/init.js.map +1 -0
  61. package/dist/commands/kick.d.ts +12 -0
  62. package/dist/commands/kick.d.ts.map +1 -0
  63. package/dist/commands/kick.js +71 -0
  64. package/dist/commands/kick.js.map +1 -0
  65. package/dist/commands/migrate.d.ts +18 -0
  66. package/dist/commands/migrate.d.ts.map +1 -0
  67. package/dist/commands/migrate.js +470 -0
  68. package/dist/commands/migrate.js.map +1 -0
  69. package/dist/commands/mod.d.ts +19 -0
  70. package/dist/commands/mod.d.ts.map +1 -0
  71. package/dist/commands/mod.js +441 -0
  72. package/dist/commands/mod.js.map +1 -0
  73. package/dist/commands/msg.d.ts +12 -0
  74. package/dist/commands/msg.d.ts.map +1 -0
  75. package/dist/commands/msg.js +273 -0
  76. package/dist/commands/msg.js.map +1 -0
  77. package/dist/commands/op.d.ts +12 -0
  78. package/dist/commands/op.d.ts.map +1 -0
  79. package/dist/commands/op.js +220 -0
  80. package/dist/commands/op.js.map +1 -0
  81. package/dist/commands/player-online.d.ts +11 -0
  82. package/dist/commands/player-online.d.ts.map +1 -0
  83. package/dist/commands/player-online.js +153 -0
  84. package/dist/commands/player-online.js.map +1 -0
  85. package/dist/commands/player.d.ts +18 -0
  86. package/dist/commands/player.d.ts.map +1 -0
  87. package/dist/commands/player.js +352 -0
  88. package/dist/commands/player.js.map +1 -0
  89. package/dist/commands/server-backup.d.ts +36 -0
  90. package/dist/commands/server-backup.d.ts.map +1 -0
  91. package/dist/commands/server-backup.js +320 -0
  92. package/dist/commands/server-backup.js.map +1 -0
  93. package/dist/commands/server-restore.d.ts +13 -0
  94. package/dist/commands/server-restore.d.ts.map +1 -0
  95. package/dist/commands/server-restore.js +294 -0
  96. package/dist/commands/server-restore.js.map +1 -0
  97. package/dist/commands/status.d.ts +13 -0
  98. package/dist/commands/status.d.ts.map +1 -0
  99. package/dist/commands/status.js +325 -0
  100. package/dist/commands/status.js.map +1 -0
  101. package/dist/commands/whitelist.d.ts +12 -0
  102. package/dist/commands/whitelist.d.ts.map +1 -0
  103. package/dist/commands/whitelist.js +316 -0
  104. package/dist/commands/whitelist.js.map +1 -0
  105. package/dist/commands/world.d.ts +18 -0
  106. package/dist/commands/world.d.ts.map +1 -0
  107. package/dist/commands/world.js +238 -0
  108. package/dist/commands/world.js.map +1 -0
  109. package/dist/domain/index.d.ts +2 -0
  110. package/dist/domain/index.d.ts.map +1 -0
  111. package/dist/domain/index.js +7 -0
  112. package/dist/domain/index.js.map +1 -0
  113. package/dist/index.d.ts +3 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +766 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
  118. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
  119. package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
  120. package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
  121. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
  122. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
  123. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
  124. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
  125. package/dist/infrastructure/adapters/index.d.ts +4 -0
  126. package/dist/infrastructure/adapters/index.d.ts.map +1 -0
  127. package/dist/infrastructure/adapters/index.js +6 -0
  128. package/dist/infrastructure/adapters/index.js.map +1 -0
  129. package/dist/infrastructure/di/container.d.ts +47 -0
  130. package/dist/infrastructure/di/container.d.ts.map +1 -0
  131. package/dist/infrastructure/di/container.js +140 -0
  132. package/dist/infrastructure/di/container.js.map +1 -0
  133. package/dist/infrastructure/di/index.d.ts +2 -0
  134. package/dist/infrastructure/di/index.d.ts.map +1 -0
  135. package/dist/infrastructure/di/index.js +2 -0
  136. package/dist/infrastructure/di/index.js.map +1 -0
  137. package/dist/infrastructure/index.d.ts +5 -0
  138. package/dist/infrastructure/index.d.ts.map +1 -0
  139. package/dist/infrastructure/index.js +8 -0
  140. package/dist/infrastructure/index.js.map +1 -0
  141. package/dist/lib/admin-config.d.ts +66 -0
  142. package/dist/lib/admin-config.d.ts.map +1 -0
  143. package/dist/lib/admin-config.js +130 -0
  144. package/dist/lib/admin-config.js.map +1 -0
  145. package/dist/lib/mojang-api.d.ts +51 -0
  146. package/dist/lib/mojang-api.d.ts.map +1 -0
  147. package/dist/lib/mojang-api.js +136 -0
  148. package/dist/lib/mojang-api.js.map +1 -0
  149. package/dist/lib/player-cache.d.ts +79 -0
  150. package/dist/lib/player-cache.d.ts.map +1 -0
  151. package/dist/lib/player-cache.js +302 -0
  152. package/dist/lib/player-cache.js.map +1 -0
  153. package/dist/lib/player-json.d.ts +69 -0
  154. package/dist/lib/player-json.d.ts.map +1 -0
  155. package/dist/lib/player-json.js +96 -0
  156. package/dist/lib/player-json.js.map +1 -0
  157. package/dist/lib/pm2-utils.d.ts +71 -0
  158. package/dist/lib/pm2-utils.d.ts.map +1 -0
  159. package/dist/lib/pm2-utils.js +155 -0
  160. package/dist/lib/pm2-utils.js.map +1 -0
  161. package/dist/lib/prompts/action-select.d.ts +23 -0
  162. package/dist/lib/prompts/action-select.d.ts.map +1 -0
  163. package/dist/lib/prompts/action-select.js +124 -0
  164. package/dist/lib/prompts/action-select.js.map +1 -0
  165. package/dist/lib/prompts/index.d.ts +7 -0
  166. package/dist/lib/prompts/index.d.ts.map +1 -0
  167. package/dist/lib/prompts/index.js +7 -0
  168. package/dist/lib/prompts/index.js.map +1 -0
  169. package/dist/lib/prompts/ip-select.d.ts +25 -0
  170. package/dist/lib/prompts/ip-select.d.ts.map +1 -0
  171. package/dist/lib/prompts/ip-select.js +255 -0
  172. package/dist/lib/prompts/ip-select.js.map +1 -0
  173. package/dist/lib/prompts/player-select.d.ts +25 -0
  174. package/dist/lib/prompts/player-select.d.ts.map +1 -0
  175. package/dist/lib/prompts/player-select.js +122 -0
  176. package/dist/lib/prompts/player-select.js.map +1 -0
  177. package/dist/lib/prompts/server-select.d.ts +26 -0
  178. package/dist/lib/prompts/server-select.d.ts.map +1 -0
  179. package/dist/lib/prompts/server-select.js +99 -0
  180. package/dist/lib/prompts/server-select.js.map +1 -0
  181. package/dist/lib/rcon.d.ts +53 -0
  182. package/dist/lib/rcon.d.ts.map +1 -0
  183. package/dist/lib/rcon.js +131 -0
  184. package/dist/lib/rcon.js.map +1 -0
  185. package/dist/lib/shell.d.ts +111 -0
  186. package/dist/lib/shell.d.ts.map +1 -0
  187. package/dist/lib/shell.js +321 -0
  188. package/dist/lib/shell.js.map +1 -0
  189. package/dist/lib/sudo-utils.d.ts +14 -0
  190. package/dist/lib/sudo-utils.d.ts.map +1 -0
  191. package/dist/lib/sudo-utils.js +53 -0
  192. package/dist/lib/sudo-utils.js.map +1 -0
  193. package/package.json +8 -2
@@ -0,0 +1,273 @@
1
+ import { Paths, log, colors, getRunningMcContainers } from '@minecraft-docker/shared';
2
+ import { ShellExecutor } from '../lib/shell.js';
3
+ import { execRconWithOutput, getContainerName } from '../lib/rcon.js';
4
+ import * as p from '@clack/prompts';
5
+ /**
6
+ * Send message to players
7
+ */
8
+ export async function msgCommand(options) {
9
+ const paths = new Paths(options.root);
10
+ if (!paths.isInitialized()) {
11
+ log.error('Platform not initialized. Run: mcctl init');
12
+ return 1;
13
+ }
14
+ // If --all flag with message, broadcast to all servers
15
+ if (options.all && options.message) {
16
+ if (options.player) {
17
+ // Find player across all servers and send private message
18
+ return await sendToPlayerAcrossServers(options.player, options.message);
19
+ }
20
+ else {
21
+ // Broadcast to all servers
22
+ return await broadcastToAllServers(options.message);
23
+ }
24
+ }
25
+ // If server specified with message
26
+ if (options.server && options.message) {
27
+ const shell = new ShellExecutor(paths);
28
+ const config = shell.readConfig(options.server);
29
+ if (config === null) {
30
+ log.error(`Server '${options.server}' not found`);
31
+ return 1;
32
+ }
33
+ const containerName = getContainerName(options.server);
34
+ if (options.player) {
35
+ // Send private message to specific player
36
+ return await sendPrivateMessage(containerName, options.player, options.message);
37
+ }
38
+ else {
39
+ // Broadcast to all players on server
40
+ return await broadcastToServer(containerName, options.server, options.message);
41
+ }
42
+ }
43
+ // Interactive mode
44
+ return await interactiveMode(paths);
45
+ }
46
+ /**
47
+ * Interactive mode for sending messages
48
+ */
49
+ async function interactiveMode(paths) {
50
+ const containers = getRunningMcContainers();
51
+ if (containers.length === 0) {
52
+ log.error('No running servers found');
53
+ return 1;
54
+ }
55
+ p.intro(colors.cyan('Send Message'));
56
+ // Select target scope
57
+ const scope = await p.select({
58
+ message: 'Select target scope',
59
+ options: [
60
+ { value: 'server', label: 'Specific server' },
61
+ { value: 'all', label: 'All servers' },
62
+ ],
63
+ });
64
+ if (p.isCancel(scope)) {
65
+ p.cancel('Cancelled');
66
+ return 0;
67
+ }
68
+ let targetServer;
69
+ let targetContainer;
70
+ if (scope === 'server') {
71
+ // Select server
72
+ const serverOptions = containers.map((c) => ({
73
+ value: c,
74
+ label: c.replace(/^mc-/, ''),
75
+ }));
76
+ const server = await p.select({
77
+ message: 'Select server',
78
+ options: serverOptions,
79
+ });
80
+ if (p.isCancel(server)) {
81
+ p.cancel('Cancelled');
82
+ return 0;
83
+ }
84
+ targetContainer = server;
85
+ targetServer = targetContainer.replace(/^mc-/, '');
86
+ }
87
+ // Select target type
88
+ const targetType = await p.select({
89
+ message: 'Send to',
90
+ options: [
91
+ { value: 'all', label: 'All players (broadcast)' },
92
+ { value: 'player', label: 'Specific player (private message)' },
93
+ ],
94
+ });
95
+ if (p.isCancel(targetType)) {
96
+ p.cancel('Cancelled');
97
+ return 0;
98
+ }
99
+ let targetPlayer;
100
+ if (targetType === 'player') {
101
+ // Get online players
102
+ const onlinePlayers = await getOnlinePlayersForSelection(scope === 'all' ? containers : [targetContainer]);
103
+ if (onlinePlayers.length === 0) {
104
+ log.warn('No players online');
105
+ p.outro('No players to message');
106
+ return 0;
107
+ }
108
+ const playerOptions = onlinePlayers.map((sp) => ({
109
+ value: sp,
110
+ label: scope === 'all' ? `${sp.player} (${sp.server})` : sp.player,
111
+ }));
112
+ const selectedPlayer = await p.select({
113
+ message: 'Select player',
114
+ options: playerOptions,
115
+ });
116
+ if (p.isCancel(selectedPlayer)) {
117
+ p.cancel('Cancelled');
118
+ return 0;
119
+ }
120
+ const selected = selectedPlayer;
121
+ targetPlayer = selected.player;
122
+ if (scope === 'all') {
123
+ targetContainer = selected.container;
124
+ targetServer = selected.server;
125
+ }
126
+ }
127
+ // Enter message
128
+ const message = await p.text({
129
+ message: 'Enter message',
130
+ placeholder: 'Hello!',
131
+ validate: (value) => {
132
+ if (!value || value.trim().length === 0) {
133
+ return 'Message cannot be empty';
134
+ }
135
+ return undefined;
136
+ },
137
+ });
138
+ if (p.isCancel(message)) {
139
+ p.cancel('Cancelled');
140
+ return 0;
141
+ }
142
+ const messageText = message;
143
+ // Send message
144
+ if (targetType === 'player' && targetPlayer && targetContainer) {
145
+ const result = await sendPrivateMessage(targetContainer, targetPlayer, messageText);
146
+ if (result === 0) {
147
+ p.outro(colors.green(`Message sent to ${targetPlayer}`));
148
+ }
149
+ return result;
150
+ }
151
+ else if (scope === 'all') {
152
+ const result = await broadcastToAllServers(messageText);
153
+ if (result === 0) {
154
+ p.outro(colors.green('Message broadcast to all servers'));
155
+ }
156
+ return result;
157
+ }
158
+ else if (targetContainer && targetServer) {
159
+ const result = await broadcastToServer(targetContainer, targetServer, messageText);
160
+ if (result === 0) {
161
+ p.outro(colors.green(`Message broadcast to ${targetServer}`));
162
+ }
163
+ return result;
164
+ }
165
+ return 1;
166
+ }
167
+ /**
168
+ * Get online players for selection
169
+ */
170
+ async function getOnlinePlayersForSelection(containers) {
171
+ const players = [];
172
+ for (const container of containers) {
173
+ const serverName = container.replace(/^mc-/, '');
174
+ const result = await execRconWithOutput(container, ['list']);
175
+ if (result.code === 0) {
176
+ const output = result.output.trim();
177
+ const playersMatch = output.match(/:\s*(.+)$/);
178
+ if (playersMatch && playersMatch[1]) {
179
+ const playerNames = playersMatch[1]
180
+ .split(',')
181
+ .map((s) => s.trim())
182
+ .filter(Boolean);
183
+ for (const playerName of playerNames) {
184
+ players.push({
185
+ server: serverName,
186
+ container,
187
+ player: playerName,
188
+ });
189
+ }
190
+ }
191
+ }
192
+ }
193
+ return players;
194
+ }
195
+ /**
196
+ * Send private message to a player
197
+ */
198
+ async function sendPrivateMessage(container, player, message) {
199
+ const result = await execRconWithOutput(container, ['tell', player, message]);
200
+ if (result.code !== 0) {
201
+ log.error(`Failed to send message: ${result.output}`);
202
+ return 1;
203
+ }
204
+ console.log(colors.green(`[${container.replace(/^mc-/, '')}] `) + `Whispered to ${player}: ${message}`);
205
+ return 0;
206
+ }
207
+ /**
208
+ * Broadcast message to all players on a server
209
+ */
210
+ async function broadcastToServer(container, serverName, message) {
211
+ const result = await execRconWithOutput(container, ['say', message]);
212
+ if (result.code !== 0) {
213
+ log.error(`Failed to broadcast: ${result.output}`);
214
+ return 1;
215
+ }
216
+ console.log(colors.green(`[${serverName}] `) + `Broadcast: ${message}`);
217
+ return 0;
218
+ }
219
+ /**
220
+ * Broadcast message to all running servers
221
+ */
222
+ async function broadcastToAllServers(message) {
223
+ const containers = getRunningMcContainers();
224
+ if (containers.length === 0) {
225
+ log.error('No running servers found');
226
+ return 1;
227
+ }
228
+ let successCount = 0;
229
+ let failCount = 0;
230
+ for (const container of containers) {
231
+ const serverName = container.replace(/^mc-/, '');
232
+ const result = await execRconWithOutput(container, ['say', message]);
233
+ if (result.code === 0) {
234
+ console.log(colors.green(`[${serverName}] `) + `Broadcast: ${message}`);
235
+ successCount++;
236
+ }
237
+ else {
238
+ log.error(`[${serverName}] Failed to broadcast`);
239
+ failCount++;
240
+ }
241
+ }
242
+ console.log('');
243
+ console.log(colors.bold(`Broadcast complete: `) +
244
+ colors.green(`${successCount} success`) +
245
+ (failCount > 0 ? `, ${colors.red(`${failCount} failed`)}` : ''));
246
+ return failCount > 0 ? 1 : 0;
247
+ }
248
+ /**
249
+ * Find player across all servers and send private message
250
+ */
251
+ async function sendToPlayerAcrossServers(player, message) {
252
+ const containers = getRunningMcContainers();
253
+ if (containers.length === 0) {
254
+ log.error('No running servers found');
255
+ return 1;
256
+ }
257
+ // Find player
258
+ for (const container of containers) {
259
+ const result = await execRconWithOutput(container, ['list']);
260
+ if (result.code === 0) {
261
+ const output = result.output.trim().toLowerCase();
262
+ if (output.includes(player.toLowerCase())) {
263
+ // Found player on this server
264
+ const serverName = container.replace(/^mc-/, '');
265
+ console.log(colors.dim(`Found ${player} on ${serverName}`));
266
+ return await sendPrivateMessage(container, player, message);
267
+ }
268
+ }
269
+ }
270
+ log.error(`Player '${player}' not found on any server`);
271
+ return 1;
272
+ }
273
+ //# sourceMappingURL=msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msg.js","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface OpCommandOptions {
2
+ root?: string;
3
+ serverName?: string;
4
+ subCommand?: 'add' | 'remove' | 'list';
5
+ playerName?: string;
6
+ json?: boolean;
7
+ }
8
+ /**
9
+ * Manage server operators
10
+ */
11
+ export declare function opCommand(options: OpCommandOptions): Promise<number>;
12
+ //# sourceMappingURL=op.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../../src/commands/op.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D1E"}
@@ -0,0 +1,220 @@
1
+ import { Paths, log, colors } from '@minecraft-docker/shared';
2
+ import { ShellExecutor } from '../lib/shell.js';
3
+ import { isContainerRunning, execRconWithOutput, getContainerName } from '../lib/rcon.js';
4
+ /**
5
+ * Manage server operators
6
+ */
7
+ export async function opCommand(options) {
8
+ const paths = new Paths(options.root);
9
+ if (!paths.isInitialized()) {
10
+ log.error('Platform not initialized. Run: mcctl init');
11
+ return 1;
12
+ }
13
+ if (!options.serverName) {
14
+ log.error('Server name is required');
15
+ log.info('Usage: mcctl op <server> <add|remove|list> [player]');
16
+ return 1;
17
+ }
18
+ if (!options.subCommand) {
19
+ log.error('Action is required: add, remove, or list');
20
+ log.info('Usage: mcctl op <server> <add|remove|list> [player]');
21
+ return 1;
22
+ }
23
+ const shell = new ShellExecutor(paths);
24
+ const config = shell.readConfig(options.serverName);
25
+ if (config === null) {
26
+ log.error(`Server '${options.serverName}' not found`);
27
+ return 1;
28
+ }
29
+ const containerName = getContainerName(options.serverName);
30
+ const isRunning = await isContainerRunning(containerName);
31
+ switch (options.subCommand) {
32
+ case 'list': {
33
+ return await listOps(shell, options, config, containerName, isRunning);
34
+ }
35
+ case 'add': {
36
+ if (!options.playerName) {
37
+ log.error('Player name is required for add');
38
+ log.info('Usage: mcctl op <server> add <player>');
39
+ return 1;
40
+ }
41
+ return await addOp(shell, options, config, containerName, isRunning);
42
+ }
43
+ case 'remove': {
44
+ if (!options.playerName) {
45
+ log.error('Player name is required for remove');
46
+ log.info('Usage: mcctl op <server> remove <player>');
47
+ return 1;
48
+ }
49
+ return await removeOp(shell, options, config, containerName, isRunning);
50
+ }
51
+ default:
52
+ log.error(`Unknown action: ${options.subCommand}`);
53
+ log.info('Valid actions: add, remove, list');
54
+ return 1;
55
+ }
56
+ }
57
+ /**
58
+ * List current operators
59
+ */
60
+ async function listOps(shell, options, config, containerName, isRunning) {
61
+ // Get OPs from config.env
62
+ const configOps = config['OPS'] ? config['OPS'].split(',').map((s) => s.trim()).filter(Boolean) : [];
63
+ if (options.json) {
64
+ console.log(JSON.stringify({
65
+ server: options.serverName,
66
+ running: isRunning,
67
+ operators: configOps,
68
+ source: 'config.env',
69
+ }));
70
+ }
71
+ else {
72
+ console.log(colors.bold(`\nOperators for ${options.serverName}:\n`));
73
+ if (configOps.length === 0) {
74
+ console.log(' (none)');
75
+ }
76
+ else {
77
+ for (const op of configOps) {
78
+ console.log(` ${colors.cyan(op)}`);
79
+ }
80
+ }
81
+ console.log('');
82
+ if (!isRunning) {
83
+ log.warn('Server is not running. Showing operators from config.env');
84
+ }
85
+ }
86
+ return 0;
87
+ }
88
+ /**
89
+ * Add an operator
90
+ */
91
+ async function addOp(shell, options, config, containerName, isRunning) {
92
+ const playerName = options.playerName;
93
+ // Get current OPs from config
94
+ const currentOps = config['OPS']
95
+ ? config['OPS'].split(',').map((s) => s.trim()).filter(Boolean)
96
+ : [];
97
+ // Check if already an OP
98
+ if (currentOps.some((op) => op.toLowerCase() === playerName.toLowerCase())) {
99
+ if (options.json) {
100
+ console.log(JSON.stringify({
101
+ success: false,
102
+ error: 'already_op',
103
+ player: playerName,
104
+ server: options.serverName,
105
+ }));
106
+ }
107
+ else {
108
+ log.warn(`${playerName} is already an operator`);
109
+ }
110
+ return 0;
111
+ }
112
+ let rconSuccess = false;
113
+ let rconMessage = '';
114
+ // Execute RCON if server is running
115
+ if (isRunning) {
116
+ const result = await execRconWithOutput(containerName, ['op', playerName]);
117
+ rconSuccess = result.code === 0;
118
+ rconMessage = result.output.trim();
119
+ }
120
+ // Update config.env
121
+ const newOps = [...currentOps, playerName].join(',');
122
+ const configSuccess = shell.writeConfigValue(options.serverName, 'OPS', newOps);
123
+ if (options.json) {
124
+ console.log(JSON.stringify({
125
+ success: true,
126
+ player: playerName,
127
+ server: options.serverName,
128
+ rcon: isRunning ? { success: rconSuccess, message: rconMessage } : null,
129
+ config: { success: configSuccess },
130
+ running: isRunning,
131
+ }));
132
+ }
133
+ else {
134
+ if (isRunning && rconSuccess) {
135
+ console.log(colors.green(`✓ ${playerName} is now an operator (applied immediately)`));
136
+ }
137
+ else if (isRunning && !rconSuccess) {
138
+ console.log(colors.yellow(`⚠ RCON failed: ${rconMessage}`));
139
+ if (configSuccess) {
140
+ console.log(colors.green(`✓ Config updated. Will apply on server restart.`));
141
+ }
142
+ }
143
+ else {
144
+ console.log(colors.yellow(`⚠ Server is not running.`));
145
+ if (configSuccess) {
146
+ console.log(colors.green(`✓ Config updated. Changes will apply on next start.`));
147
+ }
148
+ }
149
+ }
150
+ return 0;
151
+ }
152
+ /**
153
+ * Remove an operator
154
+ */
155
+ async function removeOp(shell, options, config, containerName, isRunning) {
156
+ const playerName = options.playerName;
157
+ // Get current OPs from config
158
+ const currentOps = config['OPS']
159
+ ? config['OPS'].split(',').map((s) => s.trim()).filter(Boolean)
160
+ : [];
161
+ // Check if is an OP
162
+ const opIndex = currentOps.findIndex((op) => op.toLowerCase() === playerName.toLowerCase());
163
+ if (opIndex === -1) {
164
+ if (options.json) {
165
+ console.log(JSON.stringify({
166
+ success: false,
167
+ error: 'not_an_op',
168
+ player: playerName,
169
+ server: options.serverName,
170
+ }));
171
+ }
172
+ else {
173
+ log.warn(`${playerName} is not an operator`);
174
+ }
175
+ return 0;
176
+ }
177
+ let rconSuccess = false;
178
+ let rconMessage = '';
179
+ // Execute RCON if server is running
180
+ if (isRunning) {
181
+ const result = await execRconWithOutput(containerName, ['deop', playerName]);
182
+ rconSuccess = result.code === 0;
183
+ rconMessage = result.output.trim();
184
+ }
185
+ // Update config.env
186
+ currentOps.splice(opIndex, 1);
187
+ const newOps = currentOps.join(',');
188
+ const configSuccess = newOps
189
+ ? shell.writeConfigValue(options.serverName, 'OPS', newOps)
190
+ : shell.writeConfigValue(options.serverName, 'OPS', '');
191
+ if (options.json) {
192
+ console.log(JSON.stringify({
193
+ success: true,
194
+ player: playerName,
195
+ server: options.serverName,
196
+ rcon: isRunning ? { success: rconSuccess, message: rconMessage } : null,
197
+ config: { success: configSuccess },
198
+ running: isRunning,
199
+ }));
200
+ }
201
+ else {
202
+ if (isRunning && rconSuccess) {
203
+ console.log(colors.green(`✓ ${playerName} is no longer an operator (applied immediately)`));
204
+ }
205
+ else if (isRunning && !rconSuccess) {
206
+ console.log(colors.yellow(`⚠ RCON failed: ${rconMessage}`));
207
+ if (configSuccess) {
208
+ console.log(colors.green(`✓ Config updated. Will apply on server restart.`));
209
+ }
210
+ }
211
+ else {
212
+ console.log(colors.yellow(`⚠ Server is not running.`));
213
+ if (configSuccess) {
214
+ console.log(colors.green(`✓ Config updated. Changes will apply on next start.`));
215
+ }
216
+ }
217
+ }
218
+ return 0;
219
+ }
220
+ //# sourceMappingURL=op.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"op.js","sourceRoot":"","sources":["../../src/commands/op.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface PlayerOnlineCommandOptions {
2
+ root?: string;
3
+ serverName?: string;
4
+ all?: boolean;
5
+ json?: boolean;
6
+ }
7
+ /**
8
+ * Show online players
9
+ */
10
+ export declare function playerOnlineCommand(options: PlayerOnlineCommandOptions): Promise<number>;
11
+ //# sourceMappingURL=player-online.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-online.d.ts","sourceRoot":"","sources":["../../src/commands/player-online.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAeD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAmE9F"}