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:
103
backend/utils/fileManager.js
Normal file
103
backend/utils/fileManager.js
Normal file
@@ -0,0 +1,103 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const axios = require('axios');
|
||||
|
||||
async function downloadFile(url, dest, progressCallback) {
|
||||
const response = await axios({
|
||||
method: 'GET',
|
||||
url: url,
|
||||
responseType: 'stream',
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'en-US,en;q=0.9',
|
||||
'Referer': 'https://launcher.hytale.com/'
|
||||
}
|
||||
});
|
||||
|
||||
const totalSize = parseInt(response.headers['content-length'], 10);
|
||||
let downloaded = 0;
|
||||
const startTime = Date.now();
|
||||
|
||||
const writer = fs.createWriteStream(dest);
|
||||
|
||||
response.data.on('data', (chunk) => {
|
||||
downloaded += chunk.length;
|
||||
if (progressCallback && totalSize > 0) {
|
||||
const percent = Math.min(100, Math.max(0, (downloaded / totalSize) * 100));
|
||||
const elapsed = (Date.now() - startTime) / 1000;
|
||||
const speed = elapsed > 0 ? downloaded / elapsed : 0;
|
||||
progressCallback(null, percent, speed, downloaded, totalSize);
|
||||
}
|
||||
});
|
||||
|
||||
response.data.pipe(writer);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
writer.on('finish', resolve);
|
||||
writer.on('error', reject);
|
||||
response.data.on('error', reject);
|
||||
});
|
||||
}
|
||||
|
||||
function findHomePageUIPath(gameLatest) {
|
||||
function searchDirectory(dir) {
|
||||
try {
|
||||
const items = fs.readdirSync(dir, { withFileTypes: true });
|
||||
|
||||
for (const item of items) {
|
||||
if (item.isFile() && item.name === 'HomePage.ui') {
|
||||
return path.join(dir, item.name);
|
||||
} else if (item.isDirectory()) {
|
||||
const found = searchDirectory(path.join(dir, item.name));
|
||||
if (found) {
|
||||
return found;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!fs.existsSync(gameLatest)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return searchDirectory(gameLatest);
|
||||
}
|
||||
|
||||
function findLogoPath(gameLatest) {
|
||||
function searchDirectory(dir) {
|
||||
try {
|
||||
const items = fs.readdirSync(dir, { withFileTypes: true });
|
||||
|
||||
for (const item of items) {
|
||||
if (item.isFile() && item.name === 'Logo@2x.png') {
|
||||
return path.join(dir, item.name);
|
||||
} else if (item.isDirectory()) {
|
||||
const found = searchDirectory(path.join(dir, item.name));
|
||||
if (found) {
|
||||
return found;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!fs.existsSync(gameLatest)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return searchDirectory(gameLatest);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
downloadFile,
|
||||
findHomePageUIPath,
|
||||
findLogoPath
|
||||
};
|
||||
73
backend/utils/platformUtils.js
Normal file
73
backend/utils/platformUtils.js
Normal file
@@ -0,0 +1,73 @@
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
function getOS() {
|
||||
if (process.platform === 'win32') return 'windows';
|
||||
if (process.platform === 'darwin') return 'darwin';
|
||||
if (process.platform === 'linux') return 'linux';
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
function getArch() {
|
||||
return process.arch === 'x64' ? 'amd64' : process.arch;
|
||||
}
|
||||
|
||||
function isWaylandSession() {
|
||||
if (process.platform !== 'linux') {
|
||||
return false;
|
||||
}
|
||||
|
||||
const sessionType = process.env.XDG_SESSION_TYPE;
|
||||
if (sessionType && sessionType.toLowerCase() === 'wayland') {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (process.env.WAYLAND_DISPLAY) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
const sessionId = process.env.XDG_SESSION_ID;
|
||||
if (sessionId) {
|
||||
const output = execSync(`loginctl show-session ${sessionId} -p Type`, { encoding: 'utf8' });
|
||||
if (output && output.toLowerCase().includes('wayland')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function setupWaylandEnvironment() {
|
||||
if (process.platform !== 'linux') {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!isWaylandSession()) {
|
||||
console.log('Detected X11 session, using default environment');
|
||||
return {};
|
||||
}
|
||||
|
||||
console.log('Detected Wayland session, configuring environment...');
|
||||
|
||||
const envVars = {
|
||||
SDL_VIDEODRIVER: 'wayland',
|
||||
GDK_BACKEND: 'wayland',
|
||||
QT_QPA_PLATFORM: 'wayland',
|
||||
MOZ_ENABLE_WAYLAND: '1',
|
||||
_JAVA_AWT_WM_NONREPARENTING: '1'
|
||||
};
|
||||
|
||||
envVars.ELECTRON_OZONE_PLATFORM_HINT = 'wayland';
|
||||
|
||||
console.log('Wayland environment variables:', envVars);
|
||||
return envVars;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getOS,
|
||||
getArch,
|
||||
isWaylandSession,
|
||||
setupWaylandEnvironment
|
||||
};
|
||||
Reference in New Issue
Block a user