diff --git a/src/ts/analytics.ts b/src/ts/analytics.ts index 261f6ff..e12e000 100644 --- a/src/ts/analytics.ts +++ b/src/ts/analytics.ts @@ -1,28 +1,28 @@ const { ipcRenderer } = require('electron'); import $ from 'cash-dom'; -import { Genshinlib } from './lib/Genshinlib'; +import { LauncherLib } from './lib/LauncherLib'; import { LauncherUI } from './lib/LauncherUI'; $(() => { - LauncherUI.updateLang(Genshinlib.getConfig('lang.launcher')); + LauncherUI.updateLang(LauncherLib.getConfig('lang.launcher')); $('#participate').on('click', async () => { await fetch(`https://an-anime-game-launcher.000webhostapp.com${ !$('#share-country').hasClass('checkbox-active') ? '/?hide-geo' : '' }`); - Genshinlib.updateConfig('analytics', Genshinlib.version); + LauncherLib.updateConfig('analytics', LauncherLib.version); ipcRenderer.invoke('hide-analytics-participation'); }); $('#skip').on('click', () => { - Genshinlib.updateConfig('analytics', Genshinlib.version); + LauncherLib.updateConfig('analytics', LauncherLib.version); ipcRenderer.invoke('hide-analytics-participation'); }); $('#skip-and-ignore').on('click', () => { - Genshinlib.updateConfig('analytics', null); + LauncherLib.updateConfig('analytics', null); ipcRenderer.invoke('hide-analytics-participation'); }); diff --git a/src/ts/index.ts b/src/ts/index.ts index c97f1a5..371a28a 100644 --- a/src/ts/index.ts +++ b/src/ts/index.ts @@ -8,7 +8,7 @@ const semver = require('semver'); import $ from 'cash-dom'; import { constants } from './lib/constants'; -import { Genshinlib } from './lib/Genshinlib'; +import { LauncherLib } from './lib/LauncherLib'; import { LauncherUI } from './lib/LauncherUI'; import { Tools } from './lib/Tools'; import { DiscordRPC } from './lib/DiscordRPC'; @@ -25,11 +25,11 @@ if (!fs.existsSync(constants.dxvksDir)) fs.mkdirSync(constants.dxvksDir, { recursive: true }); $(() => { - if (Genshinlib.version !== null) - document.title = `${constants.gamePlaceholder.full} Linux Launcher - ${Genshinlib.version}`; + if (LauncherLib.version !== null) + document.title = `${constants.gamePlaceholder.uppercase.full} Linux Launcher - ${LauncherLib.version}`; // On Start configuration of LauncherUI - LauncherUI.updateLang(Genshinlib.getConfig('lang.launcher') ?? 'en-us'); + LauncherUI.updateLang(LauncherLib.getConfig('lang.launcher') ?? 'en-us'); LauncherUI.setState('game-launch-available'); LauncherUI.updateBackground(); LauncherUI.updateSocial(); @@ -40,7 +40,7 @@ $(() => { LauncherUI.updateSocial(); }); - if (Genshinlib.getConfig('rpc')) + if (LauncherLib.getConfig('rpc')) DiscordRPC.init(); ipcRenderer.on('rpc-toggle', () => { @@ -51,14 +51,14 @@ $(() => { // FIXME /*ipcRenderer.on('updateVP', (event: void, remotedata: any) => { - Genshinlib.getData().then(data => { + LauncherLib.getData().then(data => { LauncherUI.initProgressBar(); let voicePack = data.game.latest.voice_packs[1]; // en-us let old; for (let i = 0; i < data.game.latest.voice_packs.length; ++i) - if (data.game.latest.voice_packs[i].language == Genshinlib.getConfig('lang.voice')) + if (data.game.latest.voice_packs[i].language == LauncherLib.getConfig('lang.voice')) { voicePack = data.game.latest.voice_packs[i]; @@ -76,26 +76,26 @@ $(() => { let oldstring = old.name.replace(`_${data.game.latest.version}.zip`, ''); // Check if the directory and file exists to prevent errors. - if (fs.existsSync(path.join(Genshinlib.gameDir, oldstring + '_pkg_version'))) - fs.rmSync(path.join(Genshinlib.gameDir, oldstring + '_pkg_version')); + if (fs.existsSync(path.join(LauncherLib.gameDir, oldstring + '_pkg_version'))) + fs.rmSync(path.join(LauncherLib.gameDir, oldstring + '_pkg_version')); - if (fs.existsSync(path.join(Genshinlib.gameDir, 'GenshinImpact_Data', 'StreamingAssets', 'Audio', 'GeneratedSoundBanks', 'Windows', oldstring.replace('Audio_', '')))) - fs.rmSync(path.join(Genshinlib.gameDir, 'GenshinImpact_Data', 'StreamingAssets', 'Audio', 'GeneratedSoundBanks', 'Windows', oldstring.replace('Audio_', '')), { recursive: true }); + if (fs.existsSync(path.join(LauncherLib.gameDir, 'GenshinImpact_Data', 'StreamingAssets', 'Audio', 'GeneratedSoundBanks', 'Windows', oldstring.replace('Audio_', '')))) + fs.rmSync(path.join(LauncherLib.gameDir, 'GenshinImpact_Data', 'StreamingAssets', 'Audio', 'GeneratedSoundBanks', 'Windows', oldstring.replace('Audio_', '')), { recursive: true }); console.log(`%c> Downloading voice data...`, 'font-size: 16px'); // For some reason this keeps breaking and locking up most of the time. - Tools.downloadFile(voicePack.path, path.join(Genshinlib.launcherDir, voicePack.name), (current: number, total: number, difference: number) => { + Tools.downloadFile(voicePack.path, path.join(LauncherLib.launcherDir, voicePack.name), (current: number, total: number, difference: number) => { LauncherUI.updateProgressBar(LauncherUI.i18n.translate('Downloading'), current, total, difference); }).then(() => { console.log(`%c> Unpacking voice data...`, 'font-size: 16px'); LauncherUI.initProgressBar(); - Tools.unzip(path.join(Genshinlib.launcherDir, voicePack.name), Genshinlib.gameDir, (current: number, total: number, difference: number) => { + Tools.unzip(path.join(LauncherLib.launcherDir, voicePack.name), LauncherLib.gameDir, (current: number, total: number, difference: number) => { LauncherUI.updateProgressBar(LauncherUI.i18n.translate('Unpack'), current, total, difference); }).then(() => { - fs.unlinkSync(path.join(Genshinlib.launcherDir, voicePack.name)); + fs.unlinkSync(path.join(LauncherLib.launcherDir, voicePack.name)); LauncherUI.setState('game-launch-available'); }) }); @@ -113,18 +113,18 @@ $(() => { } }); - if (Genshinlib.getConfig('analytics') !== null && Genshinlib.getConfig('analytics') !== Genshinlib.version) + if (LauncherLib.getConfig('analytics') !== null && LauncherLib.getConfig('analytics') !== LauncherLib.version) ipcRenderer.invoke('open-analytics-participation'); - Genshinlib.getData().then(async data => { - let patchInfo = await Genshinlib.getPatchInfo(); + LauncherLib.getData().then(async data => { + let patchInfo = await LauncherLib.getPatchInfo(); // Update available - if (Genshinlib.version != data.game.latest.version) - LauncherUI.setState(Genshinlib.version === null ? 'game-installation-available' : 'game-update-available'); + if (LauncherLib.version != data.game.latest.version) + LauncherUI.setState(LauncherLib.version === null ? 'game-installation-available' : 'game-update-available'); // Patch version is incorrect - else if (Genshinlib.getConfig('patch') && Genshinlib.getConfig('patch.version') != patchInfo.version) + else if (LauncherLib.getConfig('patch') && LauncherLib.getConfig('patch.version') != patchInfo.version) { // Patch is not available if (patchInfo.version !== data.game.latest.version) @@ -140,7 +140,7 @@ $(() => { LauncherUI.setState('patch-applying'); - Genshinlib.patchGame(() => { + LauncherLib.patchGame(() => { LauncherUI.setState('game-launch-available'); }, data => console.log(data.toString())); } @@ -152,27 +152,27 @@ $(() => { // Current patch is in testing phase, // but stable is available - else if (Genshinlib.getConfig('patch') && Genshinlib.getConfig('patch.version') == patchInfo.version && Genshinlib.getConfig('patch.state') == 'testing' && patchInfo.state == 'stable') + else if (LauncherLib.getConfig('patch') && LauncherLib.getConfig('patch.version') == patchInfo.version && LauncherLib.getConfig('patch.state') == 'testing' && patchInfo.state == 'stable') { console.log(`%c> Applying patch...`, 'font-size: 16px'); LauncherUI.setState('patch-applying'); - Genshinlib.patchGame(() => { + LauncherLib.patchGame(() => { LauncherUI.setState('game-launch-available'); }, data => console.log(data.toString())); } $('#launch').on('click', async () => { // Creating wine prefix - if (!Genshinlib.isPrefixInstalled(constants.prefixDir)) + if (!LauncherLib.isPrefixInstalled(constants.prefixDir)) { console.log(`%c> Creating wineprefix...`, 'font-size: 16px'); $('#launch').css('display', 'none'); $('#downloader-panel').css('display', 'block'); - await Genshinlib.installPrefix(constants.prefixDir, (output: string, current: number, total: number) => { + await LauncherLib.installPrefix(constants.prefixDir, (output: string, current: number, total: number) => { output = output.trim(); console.log(output); @@ -192,7 +192,7 @@ $(() => { { console.log(`%c> Starting the game...`, 'font-size: 16px'); - if (!await Genshinlib.isTelemetryDisabled()) + if (!await LauncherLib.isTelemetryDisabled()) { console.log('miHoYo\'s telemetry servers doesn\'t disabled!'); @@ -206,19 +206,19 @@ $(() => { { let wineExeutable = 'wine'; - if (Genshinlib.getConfig('runner') !== null) + if (LauncherLib.getConfig('runner') !== null) { wineExeutable = path.join( constants.runnersDir, - Genshinlib.getConfig('runner.folder'), - Genshinlib.getConfig('runner.executable') + LauncherLib.getConfig('runner.folder'), + LauncherLib.getConfig('runner.executable') ); if (!fs.existsSync(wineExeutable)) { wineExeutable = 'wine'; - Genshinlib.updateConfig('runner', null); + LauncherLib.updateConfig('runner', null); } } @@ -239,7 +239,7 @@ $(() => { env: { ...process.env, WINEPREFIX: constants.prefixDir, - ...Genshinlib.getConfig('env') + ...LauncherLib.getConfig('env') } }, (err: any, stdout: any, stderr: any) => { console.log(`%c> Game closed`, 'font-size: 16px'); @@ -271,7 +271,7 @@ $(() => { LauncherUI.setState('patch-applying'); - Genshinlib.patchGame(() => { + LauncherLib.patchGame(() => { LauncherUI.setState('game-launch-available'); }, data => console.log(data.toString())); } @@ -288,7 +288,7 @@ $(() => { }; for (let i = 0; i < data.game.diffs.length; ++i) - if (data.game.diffs[i].version == Genshinlib.version) + if (data.game.diffs[i].version == LauncherLib.version) { diff = data.game.diffs[i]; @@ -332,7 +332,7 @@ $(() => { let voicePack = diff.voice_packs[1]; // en-us for (let i = 0; i < diff.voice_packs.length; ++i) - if (diff.voice_packs[i].language == Genshinlib.getConfig('lang.voice')) + if (diff.voice_packs[i].language == LauncherLib.getConfig('lang.voice')) { voicePack = diff.voice_packs[i]; @@ -367,7 +367,7 @@ $(() => { }); } - Genshinlib.updateConfig('version', data.game.latest.version); + LauncherLib.updateConfig('version', data.game.latest.version); // Patch available if (patchInfo.version === data.game.latest.version) @@ -381,7 +381,7 @@ $(() => { $('#speed').text(''); $('#eta').text(''); - Genshinlib.patchGame(() => { + LauncherLib.patchGame(() => { LauncherUI.setState('game-launch-available'); ipcRenderer.send('notification', { diff --git a/src/ts/lib/Genshinlib.ts b/src/ts/lib/LauncherLib.ts similarity index 97% rename from src/ts/lib/Genshinlib.ts rename to src/ts/lib/LauncherLib.ts index 1d516f6..cf2562b 100644 --- a/src/ts/lib/Genshinlib.ts +++ b/src/ts/lib/LauncherLib.ts @@ -56,7 +56,7 @@ type DXVK = { uri: string }; -export class Genshinlib +export class LauncherLib { public static get version(): string|null { @@ -225,7 +225,7 @@ export class Genshinlib }); } - // WINEPREFIX='/home/observer/genshin-impact-launcher/wineprefix' winetricks corefonts usetakefocus=n + // WINEPREFIX='...../wineprefix' winetricks corefonts usetakefocus=n public static async installPrefix (prefixpath: string, progress: (output: string, current: number, total: number) => void): Promise { let installationSteps = [ @@ -282,7 +282,7 @@ export class Genshinlib public static patchGame (onFinish: () => void, onData: (data: string) => void) { - Genshinlib.getPatchInfo().then(pathInfo => { + this.getPatchInfo().then(pathInfo => { Tools.downloadFile(constants.patchUri, path.join(constants.launcherDir, 'patch.zip'), (current: number, total: number, difference: number) => null).then(() => { Tools.unzip(path.join(constants.launcherDir, 'patch.zip'), constants.launcherDir, (current: number, total: number, difference: number) => null).then(() => { // Delete zip file and assign patch directory. @@ -330,8 +330,8 @@ export class Genshinlib patcherAntiCrashProcess.stdout.on('data', (data: string) => onData(data)); patcherAntiCrashProcess.on('close', () => { - Genshinlib.updateConfig('patch.version', pathInfo.version); - Genshinlib.updateConfig('patch.state', pathInfo.state); + this.updateConfig('patch.version', pathInfo.version); + this.updateConfig('patch.state', pathInfo.state); fs.rmSync(path.join(constants.launcherDir, 'gi-on-linux'), { recursive: true }); diff --git a/src/ts/lib/LauncherUI.ts b/src/ts/lib/LauncherUI.ts index b2db26b..2e0d847 100644 --- a/src/ts/lib/LauncherUI.ts +++ b/src/ts/lib/LauncherUI.ts @@ -1,5 +1,7 @@ import $ from 'cash-dom'; -import { Genshinlib } from './Genshinlib'; + +import { constants } from './constants'; +import { LauncherLib } from './LauncherLib'; import { i18n } from './i18n'; type LauncherState = @@ -12,6 +14,8 @@ type LauncherState = export class LauncherUI { + public static readonly socialUri = `https://${constants.gamePlaceholder.lowercase.first}.${constants.gamePlaceholder.lowercase.company}.com/launcher/10/${LauncherLib.getConfig('lang.launcher')}?api_url=https%3A%2F%2Fapi-os-takumi.${constants.gamePlaceholder.lowercase.company}.com%2Fhk4e_global&prev=false`; + protected static _launcherState: LauncherState = 'game-launch-available'; protected static _i18n: any; @@ -161,7 +165,7 @@ export class LauncherUI public static updateBackground (): void { - Genshinlib.getBackgroundUri().then(uri => { + LauncherLib.getBackgroundUri().then(uri => { uri = `url(${uri})`; if ($('body').css('background-image') != uri) @@ -171,7 +175,7 @@ export class LauncherUI public static updateSocial (): void { - fetch(`https://genshin.mihoyo.com/launcher/10/${Genshinlib.getConfig('lang.launcher')}?api_url=https%3A%2F%2Fapi-os-takumi.mihoyo.com%2Fhk4e_global&prev=false`) + fetch(this.socialUri) .then(res => res.text()) .then(body => { $('#__layout').remove(); diff --git a/src/ts/lib/constants.ts b/src/ts/lib/constants.ts index 70056cc..1971e62 100644 --- a/src/ts/lib/constants.ts +++ b/src/ts/lib/constants.ts @@ -4,21 +4,29 @@ const os = require('os'); export class constants { public static readonly gamePlaceholder = { - first: Buffer.from('R2Vuc2hpbg==', 'base64').toString(), - second: Buffer.from('SW1wYWN0', 'base64').toString(), - full: Buffer.from('R2Vuc2hpbiBJbXBhY3Q=', 'base64').toString(), - company: Buffer.from('bWlob3lv', 'base64').toString() + uppercase: + { + first: Buffer.from('R2Vuc2hpbg==', 'base64').toString(), + second: Buffer.from('SW1wYWN0', 'base64').toString(), + full: Buffer.from('R2Vuc2hpbiBJbXBhY3Q=', 'base64').toString() + }, + + lowercase: + { + first: Buffer.from('Z2Vuc2hpbg==', 'base64').toString(), + company: Buffer.from('bWlob3lv', 'base64').toString() + } }; public static readonly launcherDir: string = path.join(os.homedir(), '.local', 'share', 'anime-game-launcher'); public static readonly prefixDir: string = path.join(this.launcherDir, 'game'); - public static readonly gameDir: string = path.join(this.prefixDir, 'drive_c', 'Program Files', this.gamePlaceholder.full); + public static readonly gameDir: string = path.join(this.prefixDir, 'drive_c', 'Program Files', this.gamePlaceholder.uppercase.full); public static readonly runnersDir: string = path.join(this.launcherDir, 'runners'); public static readonly dxvksDir: string = path.join(this.launcherDir, 'dxvks'); - public static readonly versionsUri: string = `https://sdk-os-static.${this.gamePlaceholder.company}.com/hk4e_global/mdk/launcher/api/resource?key=gcStgarh&launcher_id=10`; - public static readonly backgroundUri: string = `https://sdk-os-static.${this.gamePlaceholder.company}.com/hk4e_global/mdk/launcher/api/content?filter_adv=true&launcher_id=10&language=`; + public static readonly versionsUri: string = `https://sdk-os-static.${this.gamePlaceholder.lowercase.company}.com/hk4e_global/mdk/launcher/api/resource?key=gcStgarh&launcher_id=10`; + public static readonly backgroundUri: string = `https://sdk-os-static.${this.gamePlaceholder.lowercase.company}.com/hk4e_global/mdk/launcher/api/content?filter_adv=true&launcher_id=10&language=`; public static readonly patchUri: string = 'https://notabug.org/Krock/GI-on-Linux/archive/master.zip'; diff --git a/src/ts/settings.ts b/src/ts/settings.ts index 8921681..96d7fcb 100644 --- a/src/ts/settings.ts +++ b/src/ts/settings.ts @@ -6,13 +6,13 @@ const { exec } = require('child_process'); import $ from 'cash-dom'; import { constants } from './lib/constants'; -import { Genshinlib } from './lib/Genshinlib'; +import { LauncherLib } from './lib/LauncherLib'; import { LauncherUI } from './lib/LauncherUI'; import { Tools } from './lib/Tools'; $(() => { // Make sure settings is shown in correct language. - LauncherUI.updateLang(Genshinlib.getConfig('lang.launcher') ?? 'en-us'); + LauncherUI.updateLang(LauncherLib.getConfig('lang.launcher') ?? 'en-us'); $('.menu-item').on('click', (e) => { $('.settings')[0]!.scrollTop = document.getElementById(e.target.getAttribute('anchor'))!.offsetTop - 16; @@ -29,12 +29,12 @@ $(() => { }); $('#language').on('selectionChanged', (e, data: any) => { - let activeLang = Genshinlib.getConfig('lang.launcher'); + let activeLang = LauncherLib.getConfig('lang.launcher'); if (activeLang != data.value) { - Genshinlib.updateConfig('lang.launcher', data.value); - Genshinlib.updateConfig('background.time', null); + LauncherLib.updateConfig('lang.launcher', data.value); + LauncherLib.updateConfig('background.time', null); LauncherUI.updateLang(data.value); @@ -44,26 +44,26 @@ $(() => { }); // Select the saved options in launcher.json on load - // $(`#voice-list option[value="${Genshinlib.getConfig('lang.voice')}"]`).prop('selected', true); + // $(`#voice-list option[value="${LauncherLib.getConfig('lang.voice')}"]`).prop('selected', true); - $(`#language li[value=${Genshinlib.getConfig('lang.launcher')}]`).addClass('selected'); - $('#language .selected-item span').text($(`#language li[value=${Genshinlib.getConfig('lang.launcher')}]`).text()); + $(`#language li[value=${LauncherLib.getConfig('lang.launcher')}]`).addClass('selected'); + $('#language .selected-item span').text($(`#language li[value=${LauncherLib.getConfig('lang.launcher')}]`).text()); - if (Genshinlib.getConfig('rpc')) + if (LauncherLib.getConfig('rpc')) $('#discord-rpc').addClass('checkbox-active'); $('#discord-rpc').on('classChange', () => { - Genshinlib.updateConfig('rpc', $('#discord-rpc').hasClass('checkbox-active')); + LauncherLib.updateConfig('rpc', $('#discord-rpc').hasClass('checkbox-active')); ipcRenderer.send('rpc-toggle'); }); /*$('#voice-list').on('change', (e) => { - let activeVP = Genshinlib.getConfig('voice'); + let activeVP = LauncherLib.getConfig('voice'); if (activeVP != e.target.value) { - Genshinlib.updateConfig('lang.voice', e.target.value); + LauncherLib.updateConfig('lang.voice', e.target.value); ipcRenderer.send('updateVP', { 'oldvp': activeVP }); @@ -76,23 +76,23 @@ $(() => { $('#env-list').on('propertyNameChanged', (e, data) => { if (data.value != '') - Genshinlib.updateConfig(`env.${data.name.after}`, data.value); + LauncherLib.updateConfig(`env.${data.name.after}`, data.value); if (data.name.before != '') - Genshinlib.deleteConfig(`env.${data.name.before}`); + LauncherLib.deleteConfig(`env.${data.name.before}`); }); $('#env-list').on('propertyValueChanged', (e, data) => { if (data.name != '') - Genshinlib.updateConfig(`env.${data.name}`, data.value.after); + LauncherLib.updateConfig(`env.${data.name}`, data.value.after); }); $('#env-list').on('propertyDeleted', (e, data) => { if (data.name != '') - Genshinlib.deleteConfig(`env.${data.name}`); + LauncherLib.deleteConfig(`env.${data.name}`); }); - let env = Genshinlib.getConfig('env'); + let env = LauncherLib.getConfig('env'); Object.keys(env).forEach((property: string) => { $('#env-list .button#add')[0]!.click(); @@ -107,9 +107,9 @@ $(() => { td.last().find('span').text(value); }); - let activeRunner = Genshinlib.getConfig('runner'); + let activeRunner = LauncherLib.getConfig('runner'); - Genshinlib.getRunners().then(runners => { + LauncherLib.getRunners().then(runners => { runners.forEach(category => { $(`

${category.title}

`).appendTo('#runners-list'); @@ -164,9 +164,9 @@ $(() => { if (item.find('div').css('display') === 'none') { - Genshinlib.updateConfig('runner.name', runner.name); - Genshinlib.updateConfig('runner.folder', runner.folder); - Genshinlib.updateConfig('runner.executable', runner.executable); + LauncherLib.updateConfig('runner.name', runner.name); + LauncherLib.updateConfig('runner.folder', runner.folder); + LauncherLib.updateConfig('runner.executable', runner.executable); $('#runners-list > .list-item').removeClass('list-item-active'); item.addClass('list-item-active'); @@ -177,9 +177,9 @@ $(() => { }); }); - let activeDXVK = Genshinlib.getConfig('dxvk'); + let activeDXVK = LauncherLib.getConfig('dxvk'); - Genshinlib.getDXVKs().then(dxvks => { + LauncherLib.getDXVKs().then(dxvks => { dxvks.forEach(dxvk => { let item = $(`
${dxvk.version}
`).appendTo('#dxvk-list'); @@ -239,7 +239,7 @@ $(() => { }); installer.on('close', () => { - Genshinlib.updateConfig('dxvk', dxvk.version); + LauncherLib.updateConfig('dxvk', dxvk.version); $('#dxvk-list > .list-item').removeClass('list-item-active'); item.addClass('list-item-active');