mirror of
https://git.sanhost.net/sanasol/hytale-f2p.git
synced 2026-02-26 06:41:47 -03:00
refactor: split main file into smaller modules for better maintainability
This commit is contained in:
105
backend/services/firstLaunch.js
Normal file
105
backend/services/firstLaunch.js
Normal file
@@ -0,0 +1,105 @@
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { markAsLaunched, loadConfig } = require('../core/config');
|
||||
const { checkExistingGameInstallation, updateGameFiles } = require('../managers/gameManager');
|
||||
const { getInstalledClientVersion, getLatestClientVersion } = require('./versionManager');
|
||||
|
||||
async function proposeGameUpdate(existingGame, progressCallback) {
|
||||
try {
|
||||
console.log('Proposing game update for existing installation...');
|
||||
|
||||
if (progressCallback) {
|
||||
progressCallback('Checking for game updates...', 0, null, null, null);
|
||||
}
|
||||
|
||||
const [installedVersion, latestVersion] = await Promise.all([
|
||||
getInstalledClientVersion(),
|
||||
getLatestClientVersion()
|
||||
]);
|
||||
|
||||
console.log(`Existing installation - Installed: ${installedVersion}, Latest: ${latestVersion}`);
|
||||
|
||||
const customAppDir = path.join(existingGame.installPath, 'HytaleF2P');
|
||||
const customCacheDir = path.join(customAppDir, 'cache');
|
||||
const customToolsDir = path.join(customAppDir, 'butler');
|
||||
|
||||
[customCacheDir, customToolsDir].forEach(dir => {
|
||||
const fs = require('fs');
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
});
|
||||
|
||||
if (progressCallback) {
|
||||
progressCallback('Updating existing game installation...', 20, null, null, null);
|
||||
}
|
||||
|
||||
await updateGameFiles(latestVersion, progressCallback, existingGame.gameDir, customToolsDir, customCacheDir);
|
||||
|
||||
if (progressCallback) {
|
||||
progressCallback('Game update completed successfully', 100, null, null, null);
|
||||
}
|
||||
|
||||
console.log('Existing game installation updated successfully');
|
||||
return { success: true, updated: true };
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error updating existing game:', error);
|
||||
if (progressCallback) {
|
||||
progressCallback(`Update failed: ${error.message}`, -1, null, null, null);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function handleFirstLaunchCheck(progressCallback) {
|
||||
try {
|
||||
const config = loadConfig();
|
||||
|
||||
if (config.hasLaunchedBefore === true) {
|
||||
return { isFirstLaunch: false, needsUpdate: false };
|
||||
}
|
||||
|
||||
console.log('First launch detected, checking for existing game installation...');
|
||||
|
||||
const existingGame = checkExistingGameInstallation();
|
||||
|
||||
if (!existingGame) {
|
||||
console.log('No existing game installation found');
|
||||
|
||||
const hasUserData = config.installPath || config.username || config.javaPath ||
|
||||
config.chatUsername || config.userUuids ||
|
||||
Object.keys(config).length > 0;
|
||||
|
||||
if (hasUserData) {
|
||||
console.log('Detected existing user data but no game, marking as launched');
|
||||
markAsLaunched();
|
||||
return { isFirstLaunch: false, needsUpdate: false };
|
||||
} else {
|
||||
markAsLaunched();
|
||||
return { isFirstLaunch: true, needsUpdate: false, existingGame: null };
|
||||
}
|
||||
}
|
||||
|
||||
console.log('Existing game installation found:', {
|
||||
gameDir: existingGame.gameDir,
|
||||
hasUserData: existingGame.hasUserData
|
||||
});
|
||||
|
||||
return {
|
||||
isFirstLaunch: true,
|
||||
needsUpdate: true,
|
||||
existingGame: existingGame
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error in first launch check:', error);
|
||||
markAsLaunched();
|
||||
return { isFirstLaunch: true, needsUpdate: false, error: error.message };
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
proposeGameUpdate,
|
||||
handleFirstLaunchCheck
|
||||
};
|
||||
31
backend/services/newsManager.js
Normal file
31
backend/services/newsManager.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const axios = require('axios');
|
||||
|
||||
async function getHytaleNews() {
|
||||
try {
|
||||
const response = await axios.get('https://launcher.hytale.com/launcher-feed/release/feed.json', {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||||
},
|
||||
timeout: 10000
|
||||
});
|
||||
|
||||
const articles = response.data.articles || [];
|
||||
return articles.map(article => ({
|
||||
title: article.title || '',
|
||||
description: article.description || '',
|
||||
destUrl: article.dest_url || '',
|
||||
imageUrl: article.image_url ?
|
||||
(article.image_url.startsWith('http') ?
|
||||
article.image_url :
|
||||
`https://launcher.hytale.com/launcher-feed/release/${article.image_url}`
|
||||
) : ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch news:', error.message);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getHytaleNews
|
||||
};
|
||||
34
backend/services/playerManager.js
Normal file
34
backend/services/playerManager.js
Normal file
@@ -0,0 +1,34 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const { PLAYER_ID_FILE, APP_DIR } = require('../core/paths');
|
||||
|
||||
function getOrCreatePlayerId() {
|
||||
try {
|
||||
if (!fs.existsSync(APP_DIR)) {
|
||||
fs.mkdirSync(APP_DIR, { recursive: true });
|
||||
}
|
||||
|
||||
if (fs.existsSync(PLAYER_ID_FILE)) {
|
||||
const data = JSON.parse(fs.readFileSync(PLAYER_ID_FILE, 'utf8'));
|
||||
if (data.playerId) {
|
||||
return data.playerId;
|
||||
}
|
||||
}
|
||||
|
||||
const newPlayerId = uuidv4();
|
||||
fs.writeFileSync(PLAYER_ID_FILE, JSON.stringify({
|
||||
playerId: newPlayerId,
|
||||
createdAt: new Date().toISOString()
|
||||
}, null, 2));
|
||||
|
||||
return newPlayerId;
|
||||
} catch (error) {
|
||||
console.error('Error managing player ID:', error);
|
||||
return uuidv4();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getOrCreatePlayerId
|
||||
};
|
||||
82
backend/services/versionManager.js
Normal file
82
backend/services/versionManager.js
Normal file
@@ -0,0 +1,82 @@
|
||||
const axios = require('axios');
|
||||
|
||||
async function getLatestClientVersion() {
|
||||
try {
|
||||
console.log('Fetching latest client version from API...');
|
||||
const response = await axios.get('http://3.10.208.30:3002/api/version_client', {
|
||||
timeout: 5000,
|
||||
headers: {
|
||||
'User-Agent': 'Hytale-F2P-Launcher'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.data && response.data.client_version) {
|
||||
const version = response.data.client_version;
|
||||
console.log(`Latest client version: ${version}`);
|
||||
return version;
|
||||
} else {
|
||||
console.log('Warning: Invalid API response, falling back to default version');
|
||||
return '4.pwr';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching client version:', error.message);
|
||||
console.log('Warning: API unavailable, falling back to default version');
|
||||
return '4.pwr';
|
||||
}
|
||||
}
|
||||
|
||||
async function getInstalledClientVersion() {
|
||||
try {
|
||||
console.log('Fetching installed client version from API...');
|
||||
const response = await axios.get('http://3.10.208.30:3002/api/clientCheck', {
|
||||
timeout: 5000,
|
||||
headers: {
|
||||
'User-Agent': 'Hytale-F2P-Launcher'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.data && response.data.client_version) {
|
||||
const version = response.data.client_version;
|
||||
console.log(`Installed client version: ${version}`);
|
||||
return version;
|
||||
} else {
|
||||
console.log('Warning: Invalid clientCheck API response');
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching installed client version:', error.message);
|
||||
console.log('Warning: clientCheck API unavailable');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function getMultiClientVersion() {
|
||||
try {
|
||||
console.log('Fetching Multiplayer version from API...');
|
||||
const response = await axios.get('http://3.10.208.30:3002/api/multi', {
|
||||
timeout: 5000,
|
||||
headers: {
|
||||
'User-Agent': 'Hytale-F2P-Launcher'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.data && response.data.multi_version) {
|
||||
const version = response.data.multi_version;
|
||||
console.log(`Multiplayer version: ${version}`);
|
||||
return version;
|
||||
} else {
|
||||
console.log('Warning: Invalid multi API response');
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching Multiplayer version:', error.message);
|
||||
console.log('Multiplayer not available');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getLatestClientVersion,
|
||||
getInstalledClientVersion,
|
||||
getMultiClientVersion
|
||||
};
|
||||
Reference in New Issue
Block a user