@dimzxzzx07/mc-headless 1.8.0 → 1.9.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.
- package/README.md +317 -703
- package/dist/core/JavaChecker.d.ts +16 -3
- package/dist/core/JavaChecker.d.ts.map +1 -1
- package/dist/core/JavaChecker.js +171 -65
- package/dist/core/JavaChecker.js.map +1 -1
- package/dist/core/MinecraftServer.d.ts +15 -0
- package/dist/core/MinecraftServer.d.ts.map +1 -1
- package/dist/core/MinecraftServer.js +200 -110
- package/dist/core/MinecraftServer.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -16
- package/dist/index.js.map +1 -1
- package/dist/platforms/BedrockServer.d.ts.map +1 -1
- package/dist/platforms/BedrockServer.js +2 -0
- package/dist/platforms/BedrockServer.js.map +1 -1
- package/dist/platforms/JavaServer.d.ts.map +1 -1
- package/dist/platforms/JavaServer.js +2 -0
- package/dist/platforms/JavaServer.js.map +1 -1
- package/dist/platforms/SkinRestorer.d.ts +14 -0
- package/dist/platforms/SkinRestorer.d.ts.map +1 -0
- package/dist/platforms/SkinRestorer.js +145 -0
- package/dist/platforms/SkinRestorer.js.map +1 -0
- package/dist/platforms/SkinsRestorer.d.ts +14 -0
- package/dist/platforms/SkinsRestorer.d.ts.map +1 -0
- package/dist/platforms/SkinsRestorer.js +145 -0
- package/dist/platforms/SkinsRestorer.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/JavaChecker.ts +162 -61
- package/src/core/MinecraftServer.ts +233 -120
- package/src/index.ts +33 -17
- package/src/platforms/BedrockServer.ts +2 -0
- package/src/platforms/JavaServer.ts +2 -0
- package/src/platforms/SkinRestorer.ts +127 -0
- package/src/types/index.ts +2 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { MinecraftConfig } from '../types';
|
|
2
|
+
import { FileUtils } from '../utils/FileUtils';
|
|
3
|
+
import { Logger } from '../utils/Logger';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import * as fs from 'fs-extra';
|
|
7
|
+
|
|
8
|
+
export interface SkinRestorerInfo {
|
|
9
|
+
version: string;
|
|
10
|
+
downloadUrl: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class SkinRestorerManager {
|
|
14
|
+
private logger = Logger.getInstance();
|
|
15
|
+
private readonly SKINRESTORER_URL = 'https://github.com/SkinsRestorer/SkinsRestorerX/releases/latest/download/SkinsRestorer.jar';
|
|
16
|
+
|
|
17
|
+
public async setup(config: MinecraftConfig): Promise<void> {
|
|
18
|
+
const pluginsDir = config.folders.plugins;
|
|
19
|
+
await FileUtils.ensureDir(pluginsDir);
|
|
20
|
+
|
|
21
|
+
this.logger.info('Setting up SkinRestorer...');
|
|
22
|
+
|
|
23
|
+
await this.cleanupCorruptFiles(pluginsDir);
|
|
24
|
+
await this.downloadSkinRestorer(pluginsDir);
|
|
25
|
+
await this.verifyPlugin(pluginsDir);
|
|
26
|
+
|
|
27
|
+
this.logger.success('SkinRestorer installed successfully');
|
|
28
|
+
this.logger.info('Player skins will now be restored automatically');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private async cleanupCorruptFiles(pluginsDir: string): Promise<void> {
|
|
32
|
+
const filePath = path.join(pluginsDir, 'SkinsRestorer.jar');
|
|
33
|
+
|
|
34
|
+
if (await FileUtils.fileExists(filePath)) {
|
|
35
|
+
try {
|
|
36
|
+
const stats = await fs.stat(filePath);
|
|
37
|
+
if (stats.size < 100000) {
|
|
38
|
+
this.logger.warning('Corrupt SkinRestorer detected, removing...');
|
|
39
|
+
await fs.remove(filePath);
|
|
40
|
+
} else {
|
|
41
|
+
const buffer = await fs.readFile(filePath);
|
|
42
|
+
if (buffer[0] !== 0x50 || buffer[1] !== 0x4B) {
|
|
43
|
+
this.logger.warning('Invalid ZIP header in SkinRestorer, removing...');
|
|
44
|
+
await fs.remove(filePath);
|
|
45
|
+
} else {
|
|
46
|
+
this.logger.info('SkinRestorer is valid, keeping it');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
this.logger.warning('Error checking SkinRestorer, removing...');
|
|
51
|
+
await fs.remove(filePath);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private async downloadSkinRestorer(pluginsDir: string): Promise<void> {
|
|
57
|
+
const destPath = path.join(pluginsDir, 'SkinsRestorer.jar');
|
|
58
|
+
|
|
59
|
+
if (await FileUtils.fileExists(destPath)) {
|
|
60
|
+
this.logger.info('SkinRestorer already exists, skipping download');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.logger.info('Downloading SkinRestorer...');
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
const response = await axios({
|
|
68
|
+
method: 'GET',
|
|
69
|
+
url: this.SKINRESTORER_URL,
|
|
70
|
+
responseType: 'stream',
|
|
71
|
+
timeout: 60000,
|
|
72
|
+
headers: {
|
|
73
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const writer = fs.createWriteStream(destPath);
|
|
78
|
+
response.data.pipe(writer);
|
|
79
|
+
|
|
80
|
+
await new Promise<void>((resolve, reject) => {
|
|
81
|
+
writer.on('finish', () => resolve());
|
|
82
|
+
writer.on('error', (err) => reject(err));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const stats = await fs.stat(destPath);
|
|
86
|
+
if (stats.size < 100000) {
|
|
87
|
+
throw new Error(`Downloaded file too small: ${stats.size} bytes`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const buffer = await fs.readFile(destPath);
|
|
91
|
+
if (buffer[0] !== 0x50 || buffer[1] !== 0x4B) {
|
|
92
|
+
throw new Error('Invalid ZIP header');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
this.logger.success(`Downloaded SkinRestorer (${(stats.size / 1024 / 1024).toFixed(2)} MB)`);
|
|
96
|
+
|
|
97
|
+
} catch (error) {
|
|
98
|
+
this.logger.error('Failed to download SkinRestorer:', error);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private async verifyPlugin(pluginsDir: string): Promise<void> {
|
|
104
|
+
const filePath = path.join(pluginsDir, 'SkinsRestorer.jar');
|
|
105
|
+
|
|
106
|
+
if (!await FileUtils.fileExists(filePath)) {
|
|
107
|
+
throw new Error('SkinRestorer plugin is missing');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const stats = await fs.stat(filePath);
|
|
112
|
+
if (stats.size < 100000) {
|
|
113
|
+
throw new Error('SkinRestorer plugin is too small');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const buffer = await fs.readFile(filePath);
|
|
117
|
+
if (buffer[0] !== 0x50 || buffer[1] !== 0x4B) {
|
|
118
|
+
throw new Error('SkinRestorer plugin has invalid ZIP header');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
this.logger.debug(`SkinRestorer verified OK (${(stats.size / 1024 / 1024).toFixed(2)} MB)`);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
this.logger.error('Failed to verify SkinRestorer:', error);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface MinecraftConfig {
|
|
|
30
30
|
seed?: string;
|
|
31
31
|
maxPlayers: number;
|
|
32
32
|
viewDistance: number;
|
|
33
|
+
simulationDistance?: number;
|
|
33
34
|
levelName: string;
|
|
34
35
|
};
|
|
35
36
|
|
|
@@ -63,6 +64,7 @@ export interface ServerInfo {
|
|
|
63
64
|
used: number;
|
|
64
65
|
max: number;
|
|
65
66
|
};
|
|
67
|
+
cpu: number;
|
|
66
68
|
status: 'starting' | 'running' | 'stopping' | 'stopped' | 'crashed';
|
|
67
69
|
}
|
|
68
70
|
|