@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,66 @@
1
+ /**
2
+ * API Access Mode
3
+ * Determines how the Admin API can be accessed
4
+ */
5
+ export type ApiAccessMode = 'internal' | 'api-key' | 'ip-whitelist' | 'api-key-ip' | 'open';
6
+ /**
7
+ * Admin Configuration structure stored in YAML
8
+ */
9
+ export interface AdminConfig {
10
+ version: string;
11
+ api: {
12
+ access_mode: ApiAccessMode;
13
+ port: number;
14
+ api_key: string | null;
15
+ allowed_ips: string[];
16
+ };
17
+ console: {
18
+ enabled: boolean;
19
+ port: number;
20
+ };
21
+ initialized_at: string;
22
+ }
23
+ /**
24
+ * AdminConfigManager
25
+ * Manages .mcctl-admin.yml configuration file
26
+ */
27
+ export declare class AdminConfigManager {
28
+ private readonly configPath;
29
+ constructor(rootDir?: string);
30
+ /**
31
+ * Get the configuration file path
32
+ */
33
+ get path(): string;
34
+ /**
35
+ * Check if admin service is already initialized
36
+ */
37
+ isInitialized(): boolean;
38
+ /**
39
+ * Load existing configuration
40
+ */
41
+ load(): Promise<AdminConfig | null>;
42
+ /**
43
+ * Save configuration to file
44
+ */
45
+ save(config: AdminConfig): Promise<void>;
46
+ /**
47
+ * Create a new configuration with specified options
48
+ */
49
+ create(options: {
50
+ accessMode: ApiAccessMode;
51
+ apiKey?: string | null;
52
+ allowedIps?: string[];
53
+ apiPort?: number;
54
+ consolePort?: number;
55
+ consoleEnabled?: boolean;
56
+ }): Promise<AdminConfig>;
57
+ /**
58
+ * Generate a new API key with mctk_ prefix
59
+ */
60
+ static generateApiKey(): string;
61
+ /**
62
+ * Validate an API key format
63
+ */
64
+ static isValidApiKey(key: string): boolean;
65
+ }
66
+ //# sourceMappingURL=admin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.d.ts","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,cAAc,GACd,YAAY,GACZ,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE;QACH,WAAW,EAAE,aAAa,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAoBD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,CAAC,EAAE,MAAM;IAK5B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAazC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9C;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE;QACpB,UAAU,EAAE,aAAa,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM;IAS/B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG3C"}
@@ -0,0 +1,130 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import * as yaml from 'js-yaml';
5
+ import { randomBytes } from 'node:crypto';
6
+ import { Paths } from '@minecraft-docker/shared';
7
+ /**
8
+ * Default configuration values
9
+ */
10
+ const DEFAULT_CONFIG = {
11
+ version: '1.0',
12
+ api: {
13
+ access_mode: 'internal',
14
+ port: 3001,
15
+ api_key: null,
16
+ allowed_ips: [],
17
+ },
18
+ console: {
19
+ enabled: true,
20
+ port: 3000,
21
+ },
22
+ initialized_at: new Date().toISOString(),
23
+ };
24
+ /**
25
+ * AdminConfigManager
26
+ * Manages .mcctl-admin.yml configuration file
27
+ */
28
+ export class AdminConfigManager {
29
+ configPath;
30
+ constructor(rootDir) {
31
+ const paths = new Paths(rootDir);
32
+ this.configPath = join(paths.root, '.mcctl-admin.yml');
33
+ }
34
+ /**
35
+ * Get the configuration file path
36
+ */
37
+ get path() {
38
+ return this.configPath;
39
+ }
40
+ /**
41
+ * Check if admin service is already initialized
42
+ */
43
+ isInitialized() {
44
+ return existsSync(this.configPath);
45
+ }
46
+ /**
47
+ * Load existing configuration
48
+ */
49
+ async load() {
50
+ if (!this.isInitialized()) {
51
+ return null;
52
+ }
53
+ try {
54
+ const content = await readFile(this.configPath, 'utf-8');
55
+ return yaml.load(content);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Save configuration to file
63
+ */
64
+ async save(config) {
65
+ // Ensure directory exists
66
+ const dir = dirname(this.configPath);
67
+ if (!existsSync(dir)) {
68
+ await mkdir(dir, { recursive: true });
69
+ }
70
+ const yamlContent = yaml.dump(config, {
71
+ indent: 2,
72
+ lineWidth: -1,
73
+ quotingType: '"',
74
+ forceQuotes: false,
75
+ });
76
+ // Add header comment
77
+ const header = `# mcctl Admin Service Configuration
78
+ # Generated by: mcctl admin init
79
+ # Do not edit this file manually unless you know what you are doing.
80
+ #
81
+ # API Access Modes:
82
+ # internal - Docker network only (default, most secure)
83
+ # api-key - External access with API key
84
+ # ip-whitelist - IP-based access control
85
+ # api-key-ip - Requires both API key and IP match
86
+ # open - No authentication (development only, NOT for production)
87
+ #
88
+ `;
89
+ await writeFile(this.configPath, header + yamlContent, 'utf-8');
90
+ }
91
+ /**
92
+ * Create a new configuration with specified options
93
+ */
94
+ async create(options) {
95
+ const config = {
96
+ ...DEFAULT_CONFIG,
97
+ api: {
98
+ access_mode: options.accessMode,
99
+ port: options.apiPort ?? DEFAULT_CONFIG.api.port,
100
+ api_key: options.apiKey ?? null,
101
+ allowed_ips: options.allowedIps ?? [],
102
+ },
103
+ console: {
104
+ enabled: options.consoleEnabled ?? DEFAULT_CONFIG.console.enabled,
105
+ port: options.consolePort ?? DEFAULT_CONFIG.console.port,
106
+ },
107
+ initialized_at: new Date().toISOString(),
108
+ };
109
+ await this.save(config);
110
+ return config;
111
+ }
112
+ /**
113
+ * Generate a new API key with mctk_ prefix
114
+ */
115
+ static generateApiKey() {
116
+ // Generate 32 bytes of random data and encode as base64url
117
+ const randomPart = randomBytes(32)
118
+ .toString('base64url')
119
+ .replace(/[^a-zA-Z0-9]/g, '')
120
+ .substring(0, 40);
121
+ return `mctk_${randomPart}`;
122
+ }
123
+ /**
124
+ * Validate an API key format
125
+ */
126
+ static isValidApiKey(key) {
127
+ return /^mctk_[a-zA-Z0-9]{20,}$/.test(key);
128
+ }
129
+ }
130
+ //# sourceMappingURL=admin-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Mojang API Client
3
+ * Provides player lookup functionality via Mojang API
4
+ */
5
+ export interface MojangProfile {
6
+ id: string;
7
+ name: string;
8
+ }
9
+ export interface PlayerInfo {
10
+ name: string;
11
+ uuid: string;
12
+ uuidNoDashes: string;
13
+ skinUrl?: string;
14
+ isOnline?: boolean;
15
+ server?: string;
16
+ source: 'mojang' | 'offline' | 'cache';
17
+ }
18
+ /**
19
+ * Mojang API client for player lookup
20
+ */
21
+ export declare class MojangApiClient {
22
+ private static readonly API_BASE;
23
+ private static readonly SESSION_BASE;
24
+ /**
25
+ * Look up a player by username via Mojang API
26
+ * Returns null if player not found
27
+ */
28
+ lookupByUsername(username: string): Promise<PlayerInfo | null>;
29
+ /**
30
+ * Get detailed profile including skin URL
31
+ * Requires UUID (with or without dashes)
32
+ */
33
+ getProfile(uuid: string): Promise<PlayerInfo | null>;
34
+ }
35
+ /**
36
+ * Format UUID with dashes
37
+ * Input: 8667ba71b85a4004af54457a9734eed7
38
+ * Output: 8667ba71-b85a-4004-af54-457a9734eed7
39
+ */
40
+ export declare function formatUuid(uuid: string): string;
41
+ /**
42
+ * Calculate offline UUID from username
43
+ * Offline servers use a different UUID format based on "OfflinePlayer:" + username
44
+ */
45
+ export declare function calculateOfflineUuid(username: string): string;
46
+ /**
47
+ * Get player info for offline mode
48
+ */
49
+ export declare function getOfflinePlayerInfo(username: string): PlayerInfo;
50
+ export declare function getMojangApiClient(): MojangApiClient;
51
+ //# sourceMappingURL=mojang-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mojang-api.d.ts","sourceRoot":"","sources":["../../src/lib/mojang-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CACxC;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAE1E;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA+BpE;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAkD3D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQjE;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Mojang API Client
3
+ * Provides player lookup functionality via Mojang API
4
+ */
5
+ import { createHash } from 'node:crypto';
6
+ /**
7
+ * Mojang API client for player lookup
8
+ */
9
+ export class MojangApiClient {
10
+ static API_BASE = 'https://api.mojang.com';
11
+ static SESSION_BASE = 'https://sessionserver.mojang.com';
12
+ /**
13
+ * Look up a player by username via Mojang API
14
+ * Returns null if player not found
15
+ */
16
+ async lookupByUsername(username) {
17
+ try {
18
+ const response = await fetch(`${MojangApiClient.API_BASE}/users/profiles/minecraft/${encodeURIComponent(username)}`);
19
+ if (response.status === 404) {
20
+ return null;
21
+ }
22
+ if (!response.ok) {
23
+ throw new Error(`Mojang API error: ${response.status} ${response.statusText}`);
24
+ }
25
+ const profile = await response.json();
26
+ const uuid = formatUuid(profile.id);
27
+ return {
28
+ name: profile.name,
29
+ uuid,
30
+ uuidNoDashes: profile.id,
31
+ source: 'mojang',
32
+ };
33
+ }
34
+ catch (error) {
35
+ if (error instanceof Error && error.message.includes('fetch')) {
36
+ throw new Error(`Failed to connect to Mojang API: ${error.message}`);
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ /**
42
+ * Get detailed profile including skin URL
43
+ * Requires UUID (with or without dashes)
44
+ */
45
+ async getProfile(uuid) {
46
+ try {
47
+ const uuidNoDashes = uuid.replace(/-/g, '');
48
+ const response = await fetch(`${MojangApiClient.SESSION_BASE}/session/minecraft/profile/${uuidNoDashes}`);
49
+ if (response.status === 404) {
50
+ return null;
51
+ }
52
+ if (!response.ok) {
53
+ throw new Error(`Mojang Session API error: ${response.status} ${response.statusText}`);
54
+ }
55
+ const data = await response.json();
56
+ const formattedUuid = formatUuid(data.id);
57
+ // Extract skin URL from properties
58
+ let skinUrl;
59
+ if (data.properties) {
60
+ const texturesProp = data.properties.find((p) => p.name === 'textures');
61
+ if (texturesProp) {
62
+ try {
63
+ const textures = JSON.parse(Buffer.from(texturesProp.value, 'base64').toString('utf-8'));
64
+ skinUrl = textures.textures?.SKIN?.url;
65
+ }
66
+ catch {
67
+ // Ignore texture parsing errors
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ name: data.name,
73
+ uuid: formattedUuid,
74
+ uuidNoDashes: data.id,
75
+ skinUrl,
76
+ source: 'mojang',
77
+ };
78
+ }
79
+ catch (error) {
80
+ if (error instanceof Error && error.message.includes('fetch')) {
81
+ throw new Error(`Failed to connect to Mojang Session API: ${error.message}`);
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Format UUID with dashes
89
+ * Input: 8667ba71b85a4004af54457a9734eed7
90
+ * Output: 8667ba71-b85a-4004-af54-457a9734eed7
91
+ */
92
+ export function formatUuid(uuid) {
93
+ const clean = uuid.replace(/-/g, '');
94
+ if (clean.length !== 32) {
95
+ return uuid; // Return as-is if not a valid UUID
96
+ }
97
+ return `${clean.slice(0, 8)}-${clean.slice(8, 12)}-${clean.slice(12, 16)}-${clean.slice(16, 20)}-${clean.slice(20)}`;
98
+ }
99
+ /**
100
+ * Calculate offline UUID from username
101
+ * Offline servers use a different UUID format based on "OfflinePlayer:" + username
102
+ */
103
+ export function calculateOfflineUuid(username) {
104
+ const hash = createHash('md5').update(`OfflinePlayer:${username}`).digest();
105
+ // Set version to 3 (name-based MD5)
106
+ const byte6 = hash[6];
107
+ const byte8 = hash[8];
108
+ if (byte6 !== undefined && byte8 !== undefined) {
109
+ hash[6] = (byte6 & 0x0f) | 0x30;
110
+ // Set variant to RFC 4122
111
+ hash[8] = (byte8 & 0x3f) | 0x80;
112
+ }
113
+ const hex = hash.toString('hex');
114
+ return formatUuid(hex);
115
+ }
116
+ /**
117
+ * Get player info for offline mode
118
+ */
119
+ export function getOfflinePlayerInfo(username) {
120
+ const uuid = calculateOfflineUuid(username);
121
+ return {
122
+ name: username,
123
+ uuid,
124
+ uuidNoDashes: uuid.replace(/-/g, ''),
125
+ source: 'offline',
126
+ };
127
+ }
128
+ // Singleton instance
129
+ let mojangApiClient = null;
130
+ export function getMojangApiClient() {
131
+ if (!mojangApiClient) {
132
+ mojangApiClient = new MojangApiClient();
133
+ }
134
+ return mojangApiClient;
135
+ }
136
+ //# sourceMappingURL=mojang-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mojang-api.js","sourceRoot":"","sources":["../../src/lib/mojang-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Player Cache System
3
+ * Encrypted local cache for Mojang API responses to minimize rate limiting
4
+ */
5
+ import { type PlayerInfo } from './mojang-api.js';
6
+ /**
7
+ * Player cache with AES-256-GCM encryption
8
+ */
9
+ export declare class PlayerCache {
10
+ private readonly cachePath;
11
+ private cache;
12
+ private encryptionKey;
13
+ constructor(cacheDir?: string);
14
+ /**
15
+ * Look up a player by username
16
+ * First checks cache, then Mojang API
17
+ */
18
+ lookup(username: string, options?: {
19
+ forceRefresh?: boolean;
20
+ offline?: boolean;
21
+ }): Promise<PlayerInfo | null>;
22
+ /**
23
+ * Look up a player with full profile (including skin URL)
24
+ */
25
+ lookupWithProfile(username: string, options?: {
26
+ forceRefresh?: boolean;
27
+ }): Promise<PlayerInfo | null>;
28
+ /**
29
+ * Get player from cache if valid
30
+ */
31
+ private getFromCache;
32
+ /**
33
+ * Save player info to cache
34
+ */
35
+ private saveToCache;
36
+ /**
37
+ * Update skin URL in cache
38
+ */
39
+ private updateSkinInCache;
40
+ /**
41
+ * Load cache from encrypted file
42
+ */
43
+ private loadCache;
44
+ /**
45
+ * Persist cache to encrypted file
46
+ */
47
+ private persistCache;
48
+ /**
49
+ * Get or derive encryption key
50
+ */
51
+ private getEncryptionKey;
52
+ /**
53
+ * Get machine-specific identifier for key derivation
54
+ */
55
+ private getMachineIdentifier;
56
+ /**
57
+ * Encrypt data using AES-256-GCM
58
+ */
59
+ private encrypt;
60
+ /**
61
+ * Decrypt data using AES-256-GCM
62
+ */
63
+ private decrypt;
64
+ /**
65
+ * Clear all cached data
66
+ */
67
+ clear(): Promise<void>;
68
+ /**
69
+ * Get cache statistics
70
+ */
71
+ getStats(): Promise<{
72
+ playerCount: number;
73
+ oldestEntry: number | null;
74
+ newestEntry: number | null;
75
+ cacheSize: number;
76
+ }>;
77
+ }
78
+ export declare function getPlayerCache(cacheDir?: string): PlayerCache;
79
+ //# sourceMappingURL=player-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-cache.d.ts","sourceRoot":"","sources":["../../src/lib/player-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAoCzB;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,QAAQ,CAAC,EAAE,MAAM;IAK7B;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkCvH;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqC/G;;OAEG;YACW,YAAY;IAsB1B;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,iBAAiB;IAY/B;;OAEG;YACW,SAAS;IAyBvB;;OAEG;YACW,YAAY;IAwB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;YACW,OAAO;IAoBrB;;OAEG;YACW,OAAO;IAkBrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CAsBH;AAKD,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAK7D"}