From 1b9c2696e9ab65440d2e78c7b3d869d360e4f33e Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:10:30 +0300 Subject: [PATCH 01/33] fix: Remove unnecessary async --- packages/tosu/src/entities/AbstractEntity/index.ts | 2 +- packages/tosu/src/entities/AllTimesData/index.ts | 2 +- packages/tosu/src/entities/BassDensityData/index.ts | 2 +- packages/tosu/src/entities/GamePlayData/index.ts | 4 ++-- packages/tosu/src/entities/MenuData/index.ts | 2 +- packages/tosu/src/entities/ResultsScreenData/index.ts | 2 +- packages/tosu/src/entities/TourneyUserProfileData/index.ts | 2 +- packages/tosu/src/entities/UserProfile/index.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/tosu/src/entities/AbstractEntity/index.ts b/packages/tosu/src/entities/AbstractEntity/index.ts index 6cd1365f..3e308d62 100644 --- a/packages/tosu/src/entities/AbstractEntity/index.ts +++ b/packages/tosu/src/entities/AbstractEntity/index.ts @@ -7,7 +7,7 @@ export abstract class AbstractEntity { this.services = services; } - async updateState() { + updateState() { throw Error('Error: updateState not implemented'); } } diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index e4324b7c..e8b0957d 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -114,7 +114,7 @@ export class AllTimesData extends AbstractEntity { } } - async updateState() { + updateState() { const { process, patterns, settings } = this.services.getServices([ 'process', 'patterns', diff --git a/packages/tosu/src/entities/BassDensityData/index.ts b/packages/tosu/src/entities/BassDensityData/index.ts index e579e9e9..2d799eef 100644 --- a/packages/tosu/src/entities/BassDensityData/index.ts +++ b/packages/tosu/src/entities/BassDensityData/index.ts @@ -13,7 +13,7 @@ export class BassDensityData extends AbstractEntity { super(services); } - async updateState() { + updateState() { const { process: osuProcess, patterns } = this.services.getServices([ 'process', 'patterns' diff --git a/packages/tosu/src/entities/GamePlayData/index.ts b/packages/tosu/src/entities/GamePlayData/index.ts index bf3a499f..15022f8c 100644 --- a/packages/tosu/src/entities/GamePlayData/index.ts +++ b/packages/tosu/src/entities/GamePlayData/index.ts @@ -107,7 +107,7 @@ export class GamePlayData extends AbstractEntity { this.Leaderboard = undefined; } - async updateState() { + updateState() { const { process, patterns, allTimesData, menuData } = this.services.getServices([ 'process', @@ -232,7 +232,7 @@ export class GamePlayData extends AbstractEntity { this.updateStarsAndPerformance(); } - async updateKeyOverlay() { + updateKeyOverlay() { const { process, patterns } = this.services.getServices([ 'process', 'patterns' diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index 6c332b9c..f82f0256 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -36,7 +36,7 @@ export class MenuData extends AbstractEntity { super(services); } - async updateState() { + updateState() { const { process, patterns } = this.services.getServices([ 'process', 'patterns' diff --git a/packages/tosu/src/entities/ResultsScreenData/index.ts b/packages/tosu/src/entities/ResultsScreenData/index.ts index ce4a4742..3de647a7 100644 --- a/packages/tosu/src/entities/ResultsScreenData/index.ts +++ b/packages/tosu/src/entities/ResultsScreenData/index.ts @@ -45,7 +45,7 @@ export class ResultsScreenData extends AbstractEntity { this.Date = ''; } - async updateState() { + updateState() { const { process, patterns, allTimesData } = this.services.getServices([ 'process', 'patterns', diff --git a/packages/tosu/src/entities/TourneyUserProfileData/index.ts b/packages/tosu/src/entities/TourneyUserProfileData/index.ts index 5c7bd62d..31bab737 100644 --- a/packages/tosu/src/entities/TourneyUserProfileData/index.ts +++ b/packages/tosu/src/entities/TourneyUserProfileData/index.ts @@ -18,7 +18,7 @@ export class TourneyUserProfileData extends AbstractEntity { super(services); } - async updateState() { + updateState() { wLogger.debug(`TUPD(updateState) Starting`); const { process, patterns } = this.services.getServices([ diff --git a/packages/tosu/src/entities/UserProfile/index.ts b/packages/tosu/src/entities/UserProfile/index.ts index f4c4dad5..e25bc3e8 100644 --- a/packages/tosu/src/entities/UserProfile/index.ts +++ b/packages/tosu/src/entities/UserProfile/index.ts @@ -20,7 +20,7 @@ export class UserProfile extends AbstractEntity { super(services); } - async updateState() { + updateState() { const { patterns, process } = this.services.getServices([ 'patterns', 'process' From b46306d87621476d48064e31bea6e5c4dcecc861 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:11:09 +0300 Subject: [PATCH 02/33] fix: Open beatmap file only once --- .../tosu/src/entities/BeatmapPpData/index.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 8d7ecc5f..8fda0310 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -3,6 +3,7 @@ import { config, wLogger } from '@tosu/common'; import { Beatmap as ParsedBeatmap } from 'osu-classes'; import { BeatmapDecoder } from 'osu-parsers'; import path from 'path'; +import fs from 'fs'; import { BeatmapStrains } from '@/api/types/v1'; import { DataRepo } from '@/entities/DataRepoList'; @@ -186,7 +187,7 @@ export class BeatmapPPData extends AbstractEntity { return this.beatmap; } - async updateMapMetadata(currentMods: number) { + updateMapMetadata(currentMods: number) { const start_time = performance.now(); const { menuData, settings } = this.services.getServices([ @@ -200,19 +201,24 @@ export class BeatmapPPData extends AbstractEntity { menuData.Folder, menuData.Path ); + + let beatmapContent: string; + try { - this.beatmap = new Beatmap({ - path: mapPath, - ar: menuData.AR, - od: menuData.OD, - cs: menuData.CS, - hp: menuData.HP - }); - } catch (_) { + beatmapContent = fs.readFileSync(mapPath, 'utf8'); + } catch (error) { wLogger.debug(`BPPD(updateMapMetadata) Can't get map: ${mapPath}`); return; } + this.beatmap = new Beatmap({ + content: beatmapContent, + ar: menuData.AR, + od: menuData.OD, + cs: menuData.CS, + hp: menuData.HP + }); + const beatmap_check_time = performance.now(); wLogger.debug( `BPPD(updateMapMetadata) [${( @@ -252,13 +258,15 @@ export class BeatmapPPData extends AbstractEntity { try { const decoder = new BeatmapDecoder(); - lazerBeatmap = await decoder.decodeFromPath(mapPath, { + lazerBeatmap = decoder.decodeFromString(beatmapContent, { parseColours: false, parseDifficulty: false, parseEditor: false, parseEvents: true, parseGeneral: false, - parseMetadata: false + parseStoryboard: false, + parseMetadata: false, + parseTimingPoints: false }); const { bpm, bpmMin, bpmMax } = lazerBeatmap; From f090298761b83a7e3fa3fbe09a2ce540934eabc6 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:13:36 +0300 Subject: [PATCH 03/33] fix: Remove some while loops --- .../instanceManager/instanceManager.ts | 10 +- .../objects/instanceManager/osuInstance.ts | 190 ++++++++++-------- 2 files changed, 114 insertions(+), 86 deletions(-) diff --git a/packages/tosu/src/objects/instanceManager/instanceManager.ts b/packages/tosu/src/objects/instanceManager/instanceManager.ts index ccd2cbd9..09d12529 100644 --- a/packages/tosu/src/objects/instanceManager/instanceManager.ts +++ b/packages/tosu/src/objects/instanceManager/instanceManager.ts @@ -10,6 +10,8 @@ export class InstanceManager { constructor() { this.osuInstances = {}; + + this.runWatcher = this.runWatcher.bind(this); } private onProcessDestroy(pid: number) { @@ -56,11 +58,9 @@ export class InstanceManager { } } - async runWatcher() { - while (true) { - this.handleProcesses(); + runWatcher() { + this.handleProcesses(); - await sleep(5000); - } + setTimeout(this.runWatcher, 5000); } } diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 0b654fb6..60c74b52 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -105,6 +105,9 @@ export class OsuInstance { ipcId: number = 0; + previousState: string = ''; + previousTime: number = 0; + emitter: EventEmitter; constructor(pid: number) { @@ -140,6 +143,10 @@ export class OsuInstance { new TourneyManagerData(this.entities) ); this.entities.set('userProfile', new UserProfile(this.entities)); + + this.watchProcessHealth = this.watchProcessHealth.bind(this); + this.updateMapMetadata = this.updateMapMetadata.bind(this); + this.updateKeyOverlay = this.updateKeyOverlay.bind(this); } setTourneyIpcId(ipcId: number) { @@ -206,9 +213,9 @@ export class OsuInstance { this.update(); if (config.enableKeyOverlay) { - this.updateKeyOverlay(); + this.initKeyOverlay(); } - this.updateMapMetadata(); + this.initMapMetadata(); this.watchProcessHealth(); } @@ -239,13 +246,10 @@ export class OsuInstance { 'userProfile' ]); - let prevTime = 0; while (!this.isDestroyed) { try { - await Promise.all([ - allTimesData.updateState(), - menuData.updateState() - ]); + allTimesData.updateState(); + menuData.updateState(); // osu! calculates audioTrack length a little bit after updating menuData, sooo.. lets this thing run regardless of menuData updating if (menuData.Folder != '' && menuData.Folder != null) @@ -272,7 +276,7 @@ export class OsuInstance { switch (allTimesData.Status) { case 0: - await bassDensityData.updateState(); + bassDensityData.updateState(); break; case 5: // Reset Gameplay/ResultScreen data on joining to songSelect @@ -282,34 +286,38 @@ export class OsuInstance { beatmapPpData.resetCurrentAttributes(); } break; + case 2: // Reset gameplay data on retry - if (prevTime > allTimesData.PlayTime) { + if (this.previousTime > allTimesData.PlayTime) { gamePlayData.init(true); beatmapPpData.resetCurrentAttributes(); } - prevTime = allTimesData.PlayTime; + this.previousTime = allTimesData.PlayTime; if ( - allTimesData.PlayTime < 150 && + allTimesData.PlayTime < 0 && !gamePlayData.isDefaultState ) { gamePlayData.init(true); break; } - await gamePlayData.updateState(); + gamePlayData.updateState(); break; + case 7: - await resultsScreenData.updateState(); + resultsScreenData.updateState(); break; + case 22: if (!this.isTourneyManager) { this.isTourneyManager = true; } await tourneyManagerData.updateState(); break; + default: gamePlayData.init(); resultsScreenData.init(); @@ -317,10 +325,10 @@ export class OsuInstance { } if (this.isTourneySpectator) { - await tourneyUserProfileData.updateState(); + tourneyUserProfileData.updateState(); } - await userProfile.updateState(); + userProfile.updateState(); } catch (exc) { wLogger.error('error happend while another loop executed', exc); } @@ -329,7 +337,7 @@ export class OsuInstance { } } - async updateKeyOverlay() { + initKeyOverlay() { wLogger.debug(`OI(updateKeyOverlay) starting`); const { allTimesData, gamePlayData } = this.entities.getServices([ @@ -337,91 +345,111 @@ export class OsuInstance { 'gamePlayData' ]); - while (!this.isDestroyed) { - try { - switch (allTimesData.Status) { - case 2: - if (allTimesData.PlayTime < 150) { - break; - } + this.updateKeyOverlay(allTimesData, gamePlayData); + } + + updateKeyOverlay(allTimesData: AllTimesData, gamePlayData: GamePlayData) { + if (this.isDestroyed == true) return; - await gamePlayData.updateKeyOverlay(); - // await + try { + switch (allTimesData.Status) { + case 2: + if (allTimesData.PlayTime < 150) { break; - default: - // no-default - } + } - await sleep(config.keyOverlayPollRate); - } catch (exc) { - wLogger.error( - 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse', - exc - ); + gamePlayData.updateKeyOverlay(); + // await + break; + default: + // no-default } + + setTimeout(() => { + this.updateKeyOverlay(allTimesData, gamePlayData); + }, config.keyOverlayPollRate); + } catch (exc) { + wLogger.error( + 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse' + ); + console.error(exc); } } - async updateMapMetadata() { + initMapMetadata() { wLogger.debug(`OI(updateMapMetadata) Starting`); - let previousState = ''; + const entities = this.entities.getServices([ + 'menuData', + 'allTimesData', + 'settings', + 'gamePlayData', + 'beatmapPpData' + ]); - while (true) { - const { + this.updateMapMetadata(entities); + } + + updateMapMetadata({ + menuData, + allTimesData, + settings, + gamePlayData, + beatmapPpData + }: { + menuData: MenuData; + allTimesData: AllTimesData; + settings: Settings; + gamePlayData: GamePlayData; + beatmapPpData: BeatmapPPData; + }) { + const currentMods = + allTimesData.Status === 2 || allTimesData.Status === 7 + ? gamePlayData.Mods + : allTimesData.MenuMods; + + const currentState = `${menuData.MD5}:${menuData.MenuGameMode}:${currentMods}:${menuData.MP3Length}`; + + if ( + menuData.Path?.endsWith('.osu') && + settings.gameFolder && + this.previousState !== currentState + ) { + this.previousState = currentState; + + try { + beatmapPpData.updateMapMetadata(currentMods); + } catch (exc) { + wLogger.error( + "OI(updateMapMetadata) Can't update beatmap metadata", + exc + ); + } + } + + setTimeout(() => { + this.updateMapMetadata({ menuData, allTimesData, settings, gamePlayData, beatmapPpData - } = this.entities.getServices([ - 'menuData', - 'allTimesData', - 'settings', - 'gamePlayData', - 'beatmapPpData' - ]); - - const currentMods = - allTimesData.Status === 2 || allTimesData.Status === 7 - ? gamePlayData.Mods - : allTimesData.MenuMods; - - const currentTimeMD5 = `${menuData.MD5}:${menuData.MenuGameMode}:${currentMods}:${menuData.MP3Length}`; - - if ( - menuData.Path?.endsWith('.osu') && - settings.gameFolder && - previousState !== currentTimeMD5 - ) { - previousState = currentTimeMD5; - - try { - await beatmapPpData.updateMapMetadata(currentMods); - } catch (exc) { - wLogger.error( - "OI(updateMapMetadata) Can't update beatmap metadata", - exc - ); - } - } - - await sleep(config.pollRate); - } + }); + }, config.pollRate); } - async watchProcessHealth() { - while (!this.isDestroyed) { - if (!Process.isProcessExist(this.process.handle)) { - this.isDestroyed = true; - wLogger.info( + watchProcessHealth() { + if (this.isDestroyed == true) return; + + if (!Process.isProcessExist(this.process.handle)) { + this.isDestroyed = true; + wLogger.info( `OI(watchProcessHealth) osu!.exe at ${this.pid} got destroyed` ); - this.emitter.emit('onDestroy', this.pid); - } - - await sleep(config.pollRate); + this.emitter.emit('onDestroy', this.pid); } + + setTimeout(this.watchProcessHealth, config.pollRate); } getState(instanceManager: InstanceManager) { From 182bd8e8591b06a2ec16297d1acbb036bc3e8cca Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:14:01 +0300 Subject: [PATCH 04/33] feat: Add current pp for editor --- .../tosu/src/entities/BeatmapPpData/index.ts | 73 +++++++++++++++++++ .../objects/instanceManager/osuInstance.ts | 11 +++ 2 files changed, 84 insertions(+) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 8fda0310..445505a2 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -1,5 +1,6 @@ import { Beatmap, Calculator } from '@kotrikd/rosu-pp'; import { config, wLogger } from '@tosu/common'; +import fs from 'fs'; import { Beatmap as ParsedBeatmap } from 'osu-classes'; import { BeatmapDecoder } from 'osu-parsers'; import path from 'path'; @@ -429,4 +430,76 @@ export class BeatmapPPData extends AbstractEntity { hitWindow: (fcPerformance.difficulty as any).hitWindow }); } + + updateEditorPP() { + const start_time = performance.now(); + + const { allTimesData, menuData, settings } = this.services.getServices([ + 'allTimesData', + 'menuData', + 'settings', + 'beatmapPpData' + ]); + + const mapPath = path.join( + settings.songsFolder, + menuData.Folder, + menuData.Path + ); + + let beatmapContent: string; + + try { + beatmapContent = fs.readFileSync(mapPath, 'utf8'); + } catch (error) { + wLogger.debug(`can't get map: ${mapPath}`); + return; + } + + const beatmap = new Beatmap({ + content: beatmapContent, + ar: menuData.AR, + od: menuData.OD, + cs: menuData.CS, + hp: menuData.HP + }); + + const decoder = new BeatmapDecoder().decodeFromString(beatmapContent, { + parseHitObjects: true, + + parseColours: false, + parseDifficulty: false, + parseEditor: false, + parseEvents: true, + parseGeneral: false, + parseMetadata: false, + parseStoryboard: false, + parseTimingPoints: false + }); + + const beatmap_parse_time = performance.now(); + wLogger.debug( + `(updateEditorPP) Spend:${(beatmap_parse_time - start_time).toFixed( + 2 + )}ms on beatmap parsing` + ); + + const passedObjects = decoder.hitObjects.filter( + (r) => r.startTime <= allTimesData.PlayTime + ); + + const curPerformance = new Calculator({ + passedObjects: passedObjects.length + }).performance(beatmap); + + const calculate_time = performance.now(); + + this.currAttributes.pp = curPerformance.pp; + + wLogger.debug( + `(updateEditorPP) Spend:${( + calculate_time - beatmap_parse_time + ).toFixed(2)}ms on calculating performance` + ); + } } diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 60c74b52..39befbf2 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -278,6 +278,17 @@ export class OsuInstance { case 0: bassDensityData.updateState(); break; + + // skip editor, to prevent constant data reset + case 1: + if (this.previousTime == allTimesData.PlayTime) break; + + this.previousTime = allTimesData.PlayTime; + beatmapPpData.updateEditorPP(); + break; + + // EditorSongSElect and SongSelect + case 4: case 5: // Reset Gameplay/ResultScreen data on joining to songSelect if (!gamePlayData.isDefaultState) { From e9c8f97d80eb1f6cfaa2a32d3f6d40ce5ede6c41 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:42:57 +0300 Subject: [PATCH 05/33] fix: Remove errors spam, if they aren't constant --- .../tosu/src/entities/AllTimesData/index.ts | 314 +++++++++++++++++- packages/tosu/src/entities/MenuData/index.ts | 38 ++- 2 files changed, 339 insertions(+), 13 deletions(-) diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index e8b0957d..abe51e6e 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -26,6 +26,243 @@ export class AllTimesData extends AbstractEntity { ShowInterface: boolean = false; IsWatchingReplay: number = 0; + bindingNames = new Map(); + + configStateErrorAttempts: number = 0; + bindingStateErrorAttempts: number = 0; + + private configList: Record = { + VolumeUniversal: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.master = value; + } + }, + VolumeEffect: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.effect = value; + } + }, + VolumeMusic: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.music = value; + } + }, + _ReleaseStream: { + type: 'enum', + setValue: (settings, value) => { + settings.client.branch = value; + } + }, + DimLevel: { + type: 'int', + setValue: (settings, value) => { + settings.background.dim = value; + } + }, + ShowStoryboard: { + type: 'bool', + setValue: (settings, value) => { + settings.background.storyboard = value; + } + }, + ShowInterface: { + type: 'bool', + setValue: (settings, value) => { + settings.showInterface = value; + } + }, + BeatmapDirectory: { + type: 'bstring', + setValue: (settings, value) => { + settings.BeatmapDirectory = value; + } + }, + ScoreMeter: { + type: 'enum', + setValue: (settings, value) => { + settings.scoreMeter.type = value; + } + }, + ScoreMeterScale: { + type: 'double', + setValue: (settings, value) => { + settings.scoreMeter.size = value; + } + }, + Offset: { + type: 'int', + setValue: (settings, value) => { + settings.offset.universal = value; + } + }, + CursorSize: { + type: 'double', + setValue: (settings, value) => { + settings.cursor.size = value; + } + }, + MouseSpeed: { + type: 'double', + setValue: (settings, value) => { + settings.mouse.sensitivity = value; + } + }, + Fullscreen: { + type: 'bool', + setValue: (settings, value) => { + settings.resolution.fullscreen = value; + } + }, + Width: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.width = value; + } + }, + Height: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.height = value; + } + }, + WidthFullscreen: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.widthFullscreen = value; + } + }, + HeightFullscreen: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.heightFullscreen = value; + } + }, + AutomaticCursorSizing: { + type: 'bool', + setValue: (settings, value) => { + settings.cursor.autoSize = value; + } + }, + IgnoreBeatmapSamples: { + type: 'bool', + setValue: (settings, value) => { + settings.audio.ignoreBeatmapSounds = value; + } + }, + SkinSamples: { + type: 'bool', + setValue: (settings, value) => { + settings.audio.useSkinSamples = value; + } + }, + LastVersion: { + type: 'bstring', + setValue: (settings, value) => { + settings.client.version = value; + } + }, + ManiaSpeedBPMScale: { + type: 'bool', + setValue: (settings, value) => { + settings.mania.speedBPMScale = value; + } + }, + UsePerBeatmapManiaSpeed: { + type: 'bool', + setValue: (settings, value) => { + settings.mania.usePerBeatmapSpeedScale = value; + } + }, + MouseDisableButtons: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.disableButtons = value; + } + }, + MouseDisableWheel: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.disableWheel = value; + } + }, + ProgressBarType: { + type: 'enum', + setValue: (settings, value) => { + settings.progressBarType = value; + } + }, + RankType: { + type: 'enum', + setValue: (settings, value) => { + settings.leaderboardType = value; + } + }, + UpdatePending: { + type: 'bool', + setValue: (settings, value) => { + settings.client.updateAvailable = value; + } + }, + + UseSkinCursor: { + type: 'bool', + setValue: (settings, value) => { + settings.cursor.useSkinCursor = value; + } + }, + RawInput: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.rawInput = value; + } + }, + TreeSortMode: { + type: 'enum', + setValue: (settings, value) => { + settings.groupType = value; + } + }, + TreeSortMode2: { + type: 'enum', + setValue: (settings, value) => { + settings.sortType = value; + } + }, + EditorDefaultSkin: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.useDefaultSkinInEditor = value; + } + }, + ComboColourSliderBall: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.tintSliderBall = value; + } + }, + IgnoreBeatmapSkins: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.ignoreBeatmapSkins = value; + } + }, + Skin: { + type: 'bstring', + setValue: (settings, value) => { + settings.skin.name = value; + } + }, + UseTaikoSkin: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.useTaikoSkin = value; + } + } + }; + private bindingList: Record = { [Bindings.OsuLeft]: { setValue: (settings, value: number) => { @@ -88,6 +325,75 @@ export class AllTimesData extends AbstractEntity { super(services); } + updateConfigState( + process: Process, + settings: Settings, + configurationAddr: number + ) { + try { + const rawSharpDictionary = + process.readSharpDictionary(configurationAddr); + for (let i = 0; i < rawSharpDictionary.length; i++) { + const current = rawSharpDictionary[i]; + const keyAddress = process.readInt(current); + let key; + if (this.bindingNames.has(keyAddress)) { + key = this.bindingNames.get(keyAddress); + } else { + key = process.readSharpString(keyAddress); + this.bindingNames.set(keyAddress, key); + } + const bindable = process.readInt(current + 0x4); + + if (!(key in this.configList)) { + continue; + } + let value: any; + + switch (this.configList[key].type) { + case 'byte': + value = process.readByte(bindable + 0xc); + break; + case 'bool': + value = Boolean(process.readByte(bindable + 0xc)); + break; + case 'int': + case 'double': + value = process.readDouble(bindable + 0x4); + break; + case 'string': + value = process.readSharpString( + process.readInt(current + 0x4) + ); + break; + case 'bstring': + value = process.readSharpString( + process.readInt(bindable + 0x4) + ); + break; + case 'enum': + value = process.readInt(bindable + 0xc); + break; + default: + break; + } + + if (value) { + this.configList[key].setValue(settings, value); + } + } + } catch (exc) { + this.configStateErrorAttempts += 1; + + if (this.configStateErrorAttempts > 5) { + wLogger.error( + "ATD(updateConfigState) Can't update config state", + exc + ); + } + } + } + updateBindingState( process: Process, settings: Settings, @@ -107,10 +413,14 @@ export class AllTimesData extends AbstractEntity { } } } catch (exc) { - wLogger.error( + this.bindingStateErrorAttempts += 1; + + if (this.bindingStateErrorAttempts > 5) { + wLogger.error( "ATD(updateBindingState) Can't update binding state", - exc + exc ); + } } } diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index f82f0256..4b67f9a4 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -32,6 +32,8 @@ export class MenuData extends AbstractEntity { previousMD5: string = ''; + mp3ErrorAttempts: number = 0; + constructor(services: DataRepo) { super(services); } @@ -128,17 +130,31 @@ export class MenuData extends AbstractEntity { } updateMP3Length() { - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); + try { + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); - // [[GetAudioLength + 0x7] + 0x4] - this.MP3Length = Math.round( - process.readDouble( - process.readPointer(patterns.getPattern('getAudioLengthPtr')) + - 0x4 - ) - ); + // [[GetAudioLength + 0x7] + 0x4] + this.MP3Length = Math.round( + process.readDouble( + process.readPointer( + patterns.getPattern('getAudioLengthPtr') + ) + 0x4 + ) + ); + + this.mp3ErrorAttempts = 0; + } catch (exc) { + this.mp3ErrorAttempts += 1; + + if (this.mp3ErrorAttempts > 5) { + wLogger.error( + `Unable to parse beatmap mp3 length (you can ignore it)` + ); + console.error(exc); + } + } } } From 8ce3992f82f8c8d70533712e1b01c512b2ec36e3 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:43:55 +0300 Subject: [PATCH 06/33] fix: Move dependecies to dev --- package.json | 12 +- pnpm-lock.yaml | 315 ++++++++++++++++++++++++++----------------------- 2 files changed, 173 insertions(+), 154 deletions(-) diff --git a/package.json b/package.json index 28359cf6..91c6c2d6 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,15 @@ "prettier:fix": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"", "prettier:ci": "prettier --check \"**/*.{js,jsx,ts,tsx,css}\"" }, - "dependencies": { - "@types/node": "^18.14.6", - "standard-version": "^9.5.0", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.3" - }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@types/node": "^18.18.11", "husky": "^8.0.3", "lint-staged": "^13.2.0", - "prettier": "^2.8.5" + "prettier": "^2.8.5", + "standard-version": "^9.5.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.3.3" }, "lint-staged": { "**/*.{js,ts}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dda8d9c..b10756e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,23 +7,13 @@ settings: importers: .: - dependencies: - '@types/node': - specifier: ^18.14.6 - version: 18.18.11 - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^4.1.1 version: 4.3.0(prettier@2.8.8) + '@types/node': + specifier: ^18.18.11 + version: 18.18.11 husky: specifier: ^8.0.3 version: 8.0.3 @@ -33,6 +23,15 @@ importers: prettier: specifier: ^2.8.5 version: 2.8.8 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 packages/common: dependencies: @@ -155,6 +154,7 @@ packages: dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 + dev: true /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} @@ -219,6 +219,7 @@ packages: /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -227,6 +228,7 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + dev: true /@babel/parser@7.18.4: resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} @@ -307,7 +309,7 @@ packages: /@hutson/parse-repository-url@3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - dev: false + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -451,16 +453,17 @@ packages: /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: false + dev: true /@types/node@18.18.11: resolution: {integrity: sha512-c1vku6qnTeujJneYH94/4aq73XrVcsJe35UPyAsSok1ijiKrkRzK+AxQPSpNMUnC03roWBBwJx/9I8V7lQoxmA==} dependencies: undici-types: 5.26.5 + dev: true /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: false + dev: true /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} @@ -479,7 +482,7 @@ packages: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: false + dev: true /abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -499,7 +502,7 @@ packages: /add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: false + dev: true /adm-zip@0.5.10: resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} @@ -552,6 +555,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -569,7 +573,7 @@ packages: /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: false + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -579,7 +583,7 @@ packages: /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -588,7 +592,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -613,7 +616,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: false + dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -649,7 +652,7 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -682,12 +685,12 @@ packages: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: false + dev: true /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: false + dev: true /cargo-cp-artifact@0.1.8: resolution: {integrity: sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==} @@ -701,6 +704,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -750,6 +754,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -791,11 +796,11 @@ packages: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: false + dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false + dev: true /concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} @@ -805,7 +810,7 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: false + dev: true /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} @@ -813,25 +818,25 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: false + dev: true /conventional-changelog-atom@2.0.8: resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-codemirror@2.0.8: resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-config-spec@2.1.0: resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: false + dev: true /conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} @@ -840,7 +845,7 @@ packages: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: false + dev: true /conventional-changelog-core@4.2.4: resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} @@ -860,35 +865,35 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: false + dev: true /conventional-changelog-ember@2.0.9: resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-eslint@3.0.9: resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-express@2.0.6: resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-jquery@3.0.11: resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-jshint@2.0.9: resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} @@ -896,12 +901,12 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: false + dev: true /conventional-changelog-preset-loader@2.3.4: resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} engines: {node: '>=10'} - dev: false + dev: true /conventional-changelog-writer@5.0.1: resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} @@ -917,7 +922,7 @@ packages: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 - dev: false + dev: true /conventional-changelog@3.1.25: resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} @@ -934,7 +939,7 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: false + dev: true /conventional-commits-filter@2.0.7: resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} @@ -942,7 +947,7 @@ packages: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: false + dev: true /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} @@ -955,7 +960,7 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: false + dev: true /conventional-recommended-bump@6.1.0: resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} @@ -970,7 +975,7 @@ packages: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 - dev: false + dev: true /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -998,11 +1003,11 @@ packages: /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dev: false + dev: true /dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: false + dev: true /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1021,12 +1026,12 @@ packages: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: false + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1096,7 +1101,7 @@ packages: /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - dev: false + dev: true /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} @@ -1106,7 +1111,7 @@ packages: /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - dev: false + dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -1125,7 +1130,7 @@ packages: engines: {node: '>=8'} dependencies: is-obj: 2.0.0 - dev: false + dev: true /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} @@ -1138,7 +1143,7 @@ packages: dependencies: find-up: 3.0.0 minimatch: 3.1.2 - dev: false + dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1175,15 +1180,17 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: false + dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + dev: true /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -1241,7 +1248,7 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: false + dev: true /file-type@3.9.0: resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} @@ -1276,14 +1283,14 @@ packages: engines: {node: '>=4'} dependencies: locate-path: 2.0.0 - dev: false + dev: true /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - dev: false + dev: true /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -1291,7 +1298,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: false + dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -1299,7 +1306,7 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: false + dev: true /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} @@ -1345,6 +1352,7 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true /genversion@3.1.1: resolution: {integrity: sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==} @@ -1358,6 +1366,7 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + dev: true /get-pkg-repo@4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} @@ -1368,7 +1377,7 @@ packages: hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: false + dev: true /get-stream@2.3.1: resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} @@ -1393,7 +1402,7 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: false + dev: true /git-remote-origin-url@2.0.0: resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} @@ -1401,7 +1410,7 @@ packages: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: false + dev: true /git-semver-tags@4.1.1: resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} @@ -1410,13 +1419,13 @@ packages: dependencies: meow: 8.1.2 semver: 6.3.1 - dev: false + dev: true /gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} dependencies: ini: 1.3.8 - dev: false + dev: true /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -1472,16 +1481,17 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: false + dev: true /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - dev: false + dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1498,17 +1508,18 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + dev: true /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: false + dev: true /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 - dev: false + dev: true /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -1580,13 +1591,13 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: false /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true /into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} @@ -1602,12 +1613,13 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 + dev: true /is-core-module@2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} @@ -1652,12 +1664,12 @@ packages: /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - dev: false + dev: true /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - dev: false + dev: true /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -1674,7 +1686,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 - dev: false + dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -1702,6 +1714,7 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -1711,21 +1724,21 @@ packages: /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false + dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false + dev: true /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + dev: true /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: false + dev: true /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -1738,12 +1751,12 @@ packages: /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - dev: false + dev: true /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: false + dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -1752,7 +1765,7 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + dev: true /lint-staged@13.3.0: resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} @@ -1799,7 +1812,7 @@ packages: parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: false + dev: true /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -1807,7 +1820,7 @@ packages: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: false + dev: true /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} @@ -1815,28 +1828,29 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: false + dev: true /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: false + dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: false + dev: true /lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: false + dev: true /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} @@ -1897,12 +1911,12 @@ packages: /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} - dev: false + dev: true /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - dev: false + dev: true /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} @@ -1919,7 +1933,7 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: false + dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1956,13 +1970,13 @@ packages: /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - dev: false + dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: false + dev: true /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -1978,10 +1992,11 @@ packages: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: false + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true /minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} @@ -2060,7 +2075,7 @@ packages: /modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} - dev: false + dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2083,7 +2098,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false + dev: true /node-abi@3.51.0: resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} @@ -2142,7 +2157,7 @@ packages: resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: false + dev: true /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} @@ -2152,7 +2167,7 @@ packages: is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 - dev: false + dev: true /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} @@ -2240,49 +2255,49 @@ packages: engines: {node: '>=4'} dependencies: p-try: 1.0.0 - dev: false + dev: true /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 - dev: false + dev: true /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - dev: false + dev: true /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} dependencies: p-limit: 1.3.0 - dev: false + dev: true /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - dev: false + dev: true /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - dev: false + dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: false + dev: true /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -2294,12 +2309,12 @@ packages: /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} - dev: false + dev: true /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: false + dev: true /parents@1.0.1: resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==} @@ -2313,7 +2328,7 @@ packages: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: false + dev: true /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -2323,17 +2338,17 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false + dev: true /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: false + dev: true /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: false + dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -2346,6 +2361,7 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-platform@0.11.15: resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==} @@ -2365,7 +2381,7 @@ packages: engines: {node: '>=4'} dependencies: pify: 3.0.0 - dev: false + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2395,12 +2411,10 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: false /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - dev: false /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} @@ -2515,7 +2529,7 @@ packages: /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: false + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2524,7 +2538,7 @@ packages: /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - dev: false + dev: true /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -2542,7 +2556,7 @@ packages: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: false + dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -2551,7 +2565,7 @@ packages: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: false + dev: true /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} @@ -2560,7 +2574,7 @@ packages: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: false + dev: true /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} @@ -2570,7 +2584,7 @@ packages: normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: false + dev: true /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2597,11 +2611,12 @@ packages: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: false + dev: true /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + dev: true /resedit@2.0.0: resolution: {integrity: sha512-vrrJCabKxAW4MT1QivtAAb0poGp8KT2qhnSzfN9tFIxb2rQu1hRHNn1VgGSZR7nmxGaW5Yz0YeW1bjgvRfNoKA==} @@ -2617,6 +2632,7 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} @@ -2668,12 +2684,12 @@ packages: /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: false + dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: false + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -2758,41 +2774,41 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false + dev: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: false + dev: true /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: false + dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: false + dev: true /spdx-license-ids@3.0.16: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: false + dev: true /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 - dev: false + dev: true /split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 - dev: false + dev: true /ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} @@ -2820,7 +2836,7 @@ packages: semver: 7.5.4 stringify-package: 1.0.1 yargs: 16.2.0 - dev: false + dev: true /stream-meter@1.0.4: resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} @@ -2862,7 +2878,7 @@ packages: /stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: false + dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -2879,7 +2895,7 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: false + dev: true /strip-dirs@2.1.0: resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} @@ -2897,7 +2913,7 @@ packages: engines: {node: '>=8'} dependencies: min-indent: 1.0.1 - dev: false + dev: true /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -2909,6 +2925,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2920,6 +2937,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -2969,24 +2987,23 @@ packages: /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} - dev: false + dev: true /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false + dev: true /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 - dev: false + dev: true /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false /to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} @@ -3011,7 +3028,7 @@ packages: /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} - dev: false + dev: true /ts-node@10.9.1(@types/node@18.18.11)(typescript@5.3.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -3051,7 +3068,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false + dev: true /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3062,17 +3079,17 @@ packages: /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} - dev: false + dev: true /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} - dev: false + dev: true /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - dev: false + dev: true /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} @@ -3081,19 +3098,20 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false + dev: true /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + dev: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true - dev: false + dev: true optional: true /unbzip2-stream@1.4.3: @@ -3105,6 +3123,7 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} @@ -3137,7 +3156,7 @@ packages: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: false + dev: true /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3167,7 +3186,7 @@ packages: /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: false + dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -3204,11 +3223,11 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3221,6 +3240,7 @@ packages: /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: true /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -3233,6 +3253,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + dev: true /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -3249,4 +3270,4 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: false + dev: true From 971f77e5bd309ebc5278dc5dbdc63a75995ffbfd Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:51:23 +0300 Subject: [PATCH 07/33] oops )) --- packages/tosu/src/entities/AllTimesData/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index abe51e6e..603a8957 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -382,6 +382,8 @@ export class AllTimesData extends AbstractEntity { this.configList[key].setValue(settings, value); } } + + this.configStateErrorAttempts = 0; } catch (exc) { this.configStateErrorAttempts += 1; @@ -412,6 +414,8 @@ export class AllTimesData extends AbstractEntity { bindable.setValue(settings, value); } } + + this.bindingStateErrorAttempts = 0; } catch (exc) { this.bindingStateErrorAttempts += 1; From 74c44eedc7f9444c1e5b44442f0c64c691ec00f4 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 00:09:15 +0300 Subject: [PATCH 08/33] oops --- packages/tosu/src/entities/BeatmapPpData/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 445505a2..b7da0295 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -4,7 +4,6 @@ import fs from 'fs'; import { Beatmap as ParsedBeatmap } from 'osu-classes'; import { BeatmapDecoder } from 'osu-parsers'; import path from 'path'; -import fs from 'fs'; import { BeatmapStrains } from '@/api/types/v1'; import { DataRepo } from '@/entities/DataRepoList'; From 74c22da92cc8480338b96d7b89ed4df363865a4a Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 01:05:22 +0300 Subject: [PATCH 09/33] fix: Remove useless(?) timeout --- packages/updater/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/updater/index.ts b/packages/updater/index.ts index e1fbf14a..df54a7db 100644 --- a/packages/updater/index.ts +++ b/packages/updater/index.ts @@ -59,11 +59,13 @@ export const autoUpdater = () => if (versionName.includes(currentVersion)) { wLogger.info(`You're using latest version [${currentVersion}] `); - if (fs.existsSync(fileDestination)) + if (fs.existsSync(fileDestination)) { await deleteNotLocked(fileDestination); - await sleep(5 * 1000); - if (fs.existsSync(backupExecutablePath)) + } + + if (fs.existsSync(backupExecutablePath)) { await deleteNotLocked(backupExecutablePath); + } resolve('exact'); return; From 86eb7eddb827776d89381b78d2b2f969b4b624a8 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 01:09:09 +0300 Subject: [PATCH 10/33] feat: Make enabling ingame overlay a little bit better --- packages/common/utils/config.ts | 29 ++- packages/game-overlay/package.json | 1 - packages/game-overlay/src/index.ts | 49 +++- packages/server/router/index.ts | 2 +- .../tosu/src/entities/AllTimesData/index.ts | 8 +- packages/tosu/src/index.ts | 2 +- .../objects/instanceManager/osuInstance.ts | 16 +- pnpm-lock.yaml | 220 ++---------------- 8 files changed, 100 insertions(+), 227 deletions(-) diff --git a/packages/common/utils/config.ts b/packages/common/utils/config.ts index 43f9d4c5..c7eab026 100644 --- a/packages/common/utils/config.ts +++ b/packages/common/utils/config.ts @@ -62,6 +62,8 @@ export const config = { enableGosuOverlay: (process.env.ENABLE_GOSU_OVERLAY || '') === 'true' }; +let HTTPServer: any; + export const updateConfigFile = () => { let newOptions = ''; @@ -115,15 +117,17 @@ export const updateConfigFile = () => { }; export const watchConfigFile = ({ httpServer }: { httpServer: any }) => { - refreshConfig(httpServer, false); + HTTPServer = httpServer; + + refreshConfig(false); updateConfigFile(); - fs.watchFile(configPath, (current, previous) => { - refreshConfig(httpServer, true); + fs.watchFile(configPath, () => { + refreshConfig(true); }); }; -export const refreshConfig = (httpServer: any, refresh: boolean) => { +export const refreshConfig = (refresh: boolean) => { let updated = false; const status = refresh == true ? 'reload' : 'load'; @@ -159,7 +163,18 @@ export const refreshConfig = (httpServer: any, refresh: boolean) => { config.serverIP = serverIP; config.serverPort = serverPort; - httpServer.restart(); + HTTPServer.restart(); + } + + const osuInstances: any = Object.values( + HTTPServer.instanceManager.osuInstances || {} + ); + if ( + osuInstances.length == 1 && + enableGosuOverlay == true && + updated == true + ) { + osuInstances[0].injectGameOverlay(); } config.debugLogging = debugLogging; @@ -181,7 +196,7 @@ export const refreshConfig = (httpServer: any, refresh: boolean) => { if (updated) wLogger.info(`Config ${status}ed`); }; -export const writeConfig = (httpServer: any, text: string) => { +export const writeConfig = (text: string) => { fs.writeFileSync(configPath, text, 'utf8'); - refreshConfig(httpServer, true); + refreshConfig(true); }; diff --git a/packages/game-overlay/package.json b/packages/game-overlay/package.json index 9b5b5334..c4486b77 100644 --- a/packages/game-overlay/package.json +++ b/packages/game-overlay/package.json @@ -9,7 +9,6 @@ "build": "tsc" }, "dependencies": { - "decompress": "^4.2.1", "tsprocess": "workspace:*", "@tosu/common": "workspace:*" } diff --git a/packages/game-overlay/src/index.ts b/packages/game-overlay/src/index.ts index f2da610b..11c5f74e 100644 --- a/packages/game-overlay/src/index.ts +++ b/packages/game-overlay/src/index.ts @@ -1,21 +1,20 @@ -import { downloadFile, wLogger } from '@tosu/common'; -import decompress from 'decompress'; +import { downloadFile, unzip, wLogger } from '@tosu/common'; import { execFile } from 'node:child_process'; -import { existsSync, writeFileSync } from 'node:fs'; +import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import { mkdir, rm } from 'node:fs/promises'; import path from 'node:path'; import { Process } from 'tsprocess/dist/process'; +const configPath = path.join(process.cwd(), 'config.ini'); const checkGameOverlayConfig = () => { - const configPath = path.join(process.cwd(), 'config.ini'); if (!existsSync(configPath)) { writeFileSync( configPath, `[GameOverlay]; https://github.com/l3lackShark/gosumemory/wiki/GameOverlay -enabled = false +enabled = true gameWidth = 1920 gameHeight = 1080 -overlayURL = http://127.0.0.1:24050/InGame2/index.html +overlayURL = overlayWidth = 380 overlayHeight = 110 overlayOffsetX = 0 @@ -25,11 +24,28 @@ overlayScale = 10` } }; +const checkGosuConfig = (p: Process, checking?: boolean) => { + if (!existsSync(configPath)) return null; + + const read = readFileSync(configPath, 'utf8'); + const parseURL = /overlayURL[ ]*=[ ]*(.*)/.exec(read); + if (!parseURL || !parseURL?.[1]) { + setTimeout(() => { + checkGosuConfig(p, true); + }, 1000); + return 'empty'; + } + + if (checking == true) injectGameOverlay(p); + return 'specified'; +}; + export const injectGameOverlay = async (p: Process) => { if (process.platform !== 'win32') { - throw new Error( - 'Gameoverlay can run only under windows, sorry linux/darwin user!' + wLogger.error( + `[gosu-overlay] Ingame overlay can run only under windows, sorry linux/darwin user!` ); + return; } // Check for DEPRECATED GOSU CONFIG, due its needed to read [GameOverlay] section from original configuration @@ -44,7 +60,8 @@ export const injectGameOverlay = async (p: Process) => { 'https://dl.kotworks.cyou/gosu-gameoverlay.zip', archivePath ); - await decompress(archivePath, gameOverlayPath); + + await unzip(archivePath, gameOverlayPath); await rm(archivePath); } @@ -53,8 +70,18 @@ export const injectGameOverlay = async (p: Process) => { path.join(process.cwd(), 'gameOverlay', 'gosumemoryoverlay.dll') ) ) { - wLogger.info('Please delete gameOverlay folder, and restart program!'); - process.exit(1); + wLogger.info( + '[gosu-overlay] Please delete gameOverlay folder, and restart program!' + ); + return; + } + + const overlayURLstatus = checkGosuConfig(p); + if (overlayURLstatus == 'empty') { + wLogger.warn( + `[gosu-overlay] Specify overlayURL for gameOverlay in config.ini` + ); + return; } return await new Promise((resolve, reject) => { diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index e7857b4e..49c08b25 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -215,7 +215,7 @@ export default function buildBaseApi(app: HttpServer) { }); } - writeConfig(app.Server, body); + writeConfig(body); sendJson(res, { status: 'updated' diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 603a8957..33371eaa 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -389,9 +389,9 @@ export class AllTimesData extends AbstractEntity { if (this.configStateErrorAttempts > 5) { wLogger.error( - "ATD(updateConfigState) Can't update config state", + "ATD(updateConfigState) Can't update config state", exc - ); + ); } } } @@ -421,9 +421,9 @@ export class AllTimesData extends AbstractEntity { if (this.bindingStateErrorAttempts > 5) { wLogger.error( - "ATD(updateBindingState) Can't update binding state", + "ATD(updateBindingState) Can't update binding state", exc - ); + ); } } } diff --git a/packages/tosu/src/index.ts b/packages/tosu/src/index.ts index 7d256a4a..e32ccbff 100644 --- a/packages/tosu/src/index.ts +++ b/packages/tosu/src/index.ts @@ -10,6 +10,7 @@ import { InstanceManager } from './objects/instanceManager/instanceManager'; const instanceManager = new InstanceManager(); const httpServer = new Server({ instanceManager }); + httpServer.start(); watchConfigFile({ httpServer }); const { update } = argumetsParser(process.argv); @@ -23,5 +24,4 @@ import { InstanceManager } from './objects/instanceManager/instanceManager'; wLogger.info('Searching for osu!'); instanceManager.runWatcher(); - httpServer.start(); })(); diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 39befbf2..2fdc6e9c 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -157,7 +157,7 @@ export class OsuInstance { this.isTourneySpectator = newVal; } - async start() { + start() { wLogger.info( `Running memory chimera... RESOLVING PATTERNS FOR ${this.pid}` ); @@ -208,7 +208,7 @@ export class OsuInstance { * ENABLING GOSU OVERLAY */ if (config.enableGosuOverlay) { - await injectGameOverlay(this.process); + this.injectGameOverlay(); } this.update(); @@ -219,6 +219,10 @@ export class OsuInstance { this.watchProcessHealth(); } + async injectGameOverlay() { + await injectGameOverlay(this.process); + } + async update() { wLogger.debug('OI(update) starting'); @@ -432,9 +436,9 @@ export class OsuInstance { beatmapPpData.updateMapMetadata(currentMods); } catch (exc) { wLogger.error( - "OI(updateMapMetadata) Can't update beatmap metadata", + "OI(updateMapMetadata) Can't update beatmap metadata", exc - ); + ); } } @@ -455,8 +459,8 @@ export class OsuInstance { if (!Process.isProcessExist(this.process.handle)) { this.isDestroyed = true; wLogger.info( - `OI(watchProcessHealth) osu!.exe at ${this.pid} got destroyed` - ); + `OI(watchProcessHealth) osu!.exe at ${this.pid} got destroyed` + ); this.emitter.emit('onDestroy', this.pid); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b10756e6..9a15a4f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,6 @@ importers: '@tosu/common': specifier: workspace:* version: link:../common - decompress: - specifier: ^4.2.1 - version: 4.2.1 tsprocess: specifier: workspace:* version: link:../tsprocess @@ -595,13 +592,7 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: false + dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -631,25 +622,6 @@ packages: fill-range: 7.0.1 dev: true - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: false - - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: false - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false - - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: false - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -659,6 +631,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: true /cacache@18.0.2: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} @@ -760,6 +733,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -769,6 +743,7 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -782,10 +757,6 @@ packages: engines: {node: '>=16'} dev: true - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -979,6 +950,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1040,59 +1012,6 @@ packages: mimic-response: 3.1.0 dev: true - /decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} - dependencies: - file-type: 5.2.0 - is-stream: 1.1.0 - tar-stream: 1.6.2 - dev: false - - /decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 6.2.0 - is-stream: 1.1.0 - seek-bzip: 1.0.6 - unbzip2-stream: 1.4.3 - dev: false - - /decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 5.2.0 - is-stream: 1.1.0 - dev: false - - /decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} - dependencies: - file-type: 3.9.0 - get-stream: 2.3.1 - pify: 2.3.0 - yauzl: 2.10.0 - dev: false - - /decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - decompress-tarbz2: 4.1.1 - decompress-targz: 4.1.1 - decompress-unzip: 4.0.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - pify: 2.3.0 - strip-dirs: 2.1.0 - dev: false - /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1166,6 +1085,7 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + dev: true /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -1237,12 +1157,6 @@ packages: reusify: 1.0.4 dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: false - /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -1250,21 +1164,6 @@ packages: escape-string-regexp: 1.0.5 dev: true - /file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - dev: false - - /file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - dev: false - - /file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - dev: false - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1325,6 +1224,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -1379,14 +1279,6 @@ packages: yargs: 16.2.0 dev: true - /get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - dev: false - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1577,6 +1469,7 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} @@ -1594,6 +1487,7 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1652,10 +1546,6 @@ packages: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: false - /is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: false - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1671,11 +1561,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1690,6 +1575,7 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1878,13 +1764,6 @@ packages: resolution: {integrity: sha512-dHjXHlgcS8r2K+4t8kAycGE4xMVQxPzMTCrrYhaFEtQDmjXh/A7xq4D88oOfEtjTR9XFzTAML9AuBrm4jXLigA==} dev: false - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: false - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -2176,15 +2055,11 @@ packages: path-key: 4.0.0 dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -2393,10 +2268,6 @@ packages: engines: {node: '>=14', npm: '>=7'} dev: false - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: false - /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2411,22 +2282,12 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + dev: true /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: false - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + dev: true /pkg-fetch@3.4.2: resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} @@ -2505,6 +2366,7 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -2596,6 +2458,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -2604,6 +2467,7 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: true /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -2664,9 +2528,11 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2674,13 +2540,6 @@ packages: dev: false optional: true - /seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: false - /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -2869,11 +2728,13 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: true /stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} @@ -2897,12 +2758,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} - dependencies: - is-natural-number: 4.0.1 - dev: false - /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -2948,19 +2803,6 @@ packages: tar-stream: 2.2.0 dev: true - /tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.1.1 - xtend: 4.0.2 - dev: false - /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -3004,10 +2846,7 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: false + dev: true /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -3114,13 +2953,6 @@ packages: dev: true optional: true - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - dev: false - /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -3146,6 +2978,7 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -3206,6 +3039,7 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true /ws@8.16.0: resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} @@ -3223,6 +3057,7 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -3255,13 +3090,6 @@ packages: yargs-parser: 20.2.9 dev: true - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: false - /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} From 984c3a4585960a588b3606fcd5df3a414ffb7922 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 03:54:20 +0300 Subject: [PATCH 11/33] fix: use boolean for checkGosuConfig --- packages/game-overlay/src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/game-overlay/src/index.ts b/packages/game-overlay/src/index.ts index 11c5f74e..7ab9ddbd 100644 --- a/packages/game-overlay/src/index.ts +++ b/packages/game-overlay/src/index.ts @@ -33,11 +33,11 @@ const checkGosuConfig = (p: Process, checking?: boolean) => { setTimeout(() => { checkGosuConfig(p, true); }, 1000); - return 'empty'; + return false; } if (checking == true) injectGameOverlay(p); - return 'specified'; + return true; }; export const injectGameOverlay = async (p: Process) => { @@ -77,7 +77,7 @@ export const injectGameOverlay = async (p: Process) => { } const overlayURLstatus = checkGosuConfig(p); - if (overlayURLstatus == 'empty') { + if (!overlayURLstatus) { wLogger.warn( `[gosu-overlay] Specify overlayURL for gameOverlay in config.ini` ); From ae1a94a5b1c716b8a0ebd7589c14b01e785c154e Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 04:01:09 +0300 Subject: [PATCH 12/33] ^$ --- packages/game-overlay/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/game-overlay/src/index.ts b/packages/game-overlay/src/index.ts index 7ab9ddbd..970778cd 100644 --- a/packages/game-overlay/src/index.ts +++ b/packages/game-overlay/src/index.ts @@ -28,7 +28,7 @@ const checkGosuConfig = (p: Process, checking?: boolean) => { if (!existsSync(configPath)) return null; const read = readFileSync(configPath, 'utf8'); - const parseURL = /overlayURL[ ]*=[ ]*(.*)/.exec(read); + const parseURL = /^overlayURL[ ]*=[ ]*(.*)$/m.exec(read); if (!parseURL || !parseURL?.[1]) { setTimeout(() => { checkGosuConfig(p, true); From 9a320a0c8b4c6238cbc643e6d62a987725f6bcd5 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 04:03:16 +0300 Subject: [PATCH 13/33] remove field --- packages/game-overlay/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/game-overlay/src/index.ts b/packages/game-overlay/src/index.ts index 970778cd..4a998fba 100644 --- a/packages/game-overlay/src/index.ts +++ b/packages/game-overlay/src/index.ts @@ -11,7 +11,6 @@ const checkGameOverlayConfig = () => { writeFileSync( configPath, `[GameOverlay]; https://github.com/l3lackShark/gosumemory/wiki/GameOverlay -enabled = true gameWidth = 1920 gameHeight = 1080 overlayURL = From 5b730584d68027a62840f1a4ebf10f937f99faa0 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 04:06:19 +0300 Subject: [PATCH 14/33] go back --- packages/common/utils/config.ts | 18 +++++++----------- packages/server/router/index.ts | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/common/utils/config.ts b/packages/common/utils/config.ts index c7eab026..eb387bab 100644 --- a/packages/common/utils/config.ts +++ b/packages/common/utils/config.ts @@ -62,8 +62,6 @@ export const config = { enableGosuOverlay: (process.env.ENABLE_GOSU_OVERLAY || '') === 'true' }; -let HTTPServer: any; - export const updateConfigFile = () => { let newOptions = ''; @@ -117,17 +115,15 @@ export const updateConfigFile = () => { }; export const watchConfigFile = ({ httpServer }: { httpServer: any }) => { - HTTPServer = httpServer; - - refreshConfig(false); + refreshConfig(httpServer, false); updateConfigFile(); fs.watchFile(configPath, () => { - refreshConfig(true); + refreshConfig(httpServer, true); }); }; -export const refreshConfig = (refresh: boolean) => { +export const refreshConfig = (httpServer: any, refresh: boolean) => { let updated = false; const status = refresh == true ? 'reload' : 'load'; @@ -163,11 +159,11 @@ export const refreshConfig = (refresh: boolean) => { config.serverIP = serverIP; config.serverPort = serverPort; - HTTPServer.restart(); + httpServer.restart(); } const osuInstances: any = Object.values( - HTTPServer.instanceManager.osuInstances || {} + httpServer.instanceManager.osuInstances || {} ); if ( osuInstances.length == 1 && @@ -196,7 +192,7 @@ export const refreshConfig = (refresh: boolean) => { if (updated) wLogger.info(`Config ${status}ed`); }; -export const writeConfig = (text: string) => { +export const writeConfig = (httpServer: any, text: string) => { fs.writeFileSync(configPath, text, 'utf8'); - refreshConfig(true); + refreshConfig(httpServer, true); }; diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index 49c08b25..dcf936cf 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -215,7 +215,7 @@ export default function buildBaseApi(app: HttpServer) { }); } - writeConfig(body); + writeConfig(app, body); sendJson(res, { status: 'updated' From 861e619c37daa387c34f5946013cfff77b3ef76a Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 05:00:01 +0300 Subject: [PATCH 15/33] fix: wrong variable --- packages/server/router/index.ts | 2 +- packages/server/utils/counters.ts | 66 +++++++++++++++++-------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index dcf936cf..e7857b4e 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -215,7 +215,7 @@ export default function buildBaseApi(app: HttpServer) { }); } - writeConfig(app, body); + writeConfig(app.Server, body); sendJson(res, { status: 'updated' diff --git a/packages/server/utils/counters.ts b/packages/server/utils/counters.ts index 89220a7b..0fb71cc3 100644 --- a/packages/server/utils/counters.ts +++ b/packages/server/utils/counters.ts @@ -1,4 +1,4 @@ -import { config, recursiveFilesSearch } from '@tosu/common'; +import { config, recursiveFilesSearch, wLogger } from '@tosu/common'; import fs from 'fs'; import http from 'http'; import path from 'path'; @@ -217,37 +217,43 @@ function rebuildJSON({ } function getLocalCounters() { - const staticPath = - config.staticFolderPath || path.join(pkgRunningFolder, 'static'); - - const countersListTXT = recursiveFilesSearch({ - dir: staticPath, - fileList: [], - filename: 'metadata.txt' - }); + try { + const staticPath = + config.staticFolderPath || path.join(pkgRunningFolder, 'static'); + + const countersListTXT = recursiveFilesSearch({ + dir: staticPath, + fileList: [], + filename: 'metadata.txt' + }); - const countersListHTML = recursiveFilesSearch({ - dir: staticPath, - fileList: [], - filename: 'index.html' - }); + const countersListHTML = recursiveFilesSearch({ + dir: staticPath, + fileList: [], + filename: 'index.html' + }); - const arrayOfLocal = countersListHTML - .filter((r) => { - const folder = path.dirname(r); - return ( - countersListTXT.find((s) => path.dirname(s) == folder) == null - ); - }) - .map((r) => ({ - name: path.basename(path.dirname(r)), - author: 'local', - resolution: [-2, '400'], - authorlinks: [] - })); - - const array = countersListTXT.map((r) => parseTXT(r)); - return array.concat(arrayOfLocal).filter((r) => r.name != ''); + const arrayOfLocal = countersListHTML + .filter((r) => { + const folder = path.dirname(r); + return ( + countersListTXT.find((s) => path.dirname(s) == folder) == + null + ); + }) + .map((r) => ({ + name: path.basename(path.dirname(r)), + author: 'local', + resolution: [-2, '400'], + authorlinks: [] + })); + + const array = countersListTXT.map((r) => parseTXT(r)); + return array.concat(arrayOfLocal).filter((r) => r.name != ''); + } catch (error) { + wLogger.error((error as any).message); + return []; + } } export function buildLocalCounters(res: http.ServerResponse, query?: string) { From 49f1ede2be30d970454293b44a86ee04992588a8 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 08:46:22 +0300 Subject: [PATCH 16/33] fix: unknown bancho statuses --- packages/tosu/src/api/types/v2.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/tosu/src/api/types/v2.ts b/packages/tosu/src/api/types/v2.ts index 2d89cc9d..c8afe2e7 100644 --- a/packages/tosu/src/api/types/v2.ts +++ b/packages/tosu/src/api/types/v2.ts @@ -16,9 +16,20 @@ export enum Modes { } export enum BanchoStatusEnum { - Idle = 0, - Afk = 1, - Playing = 2 + Idle, + Afk, + Playing, + Editing, + Modding, + Multiplayer, + Watching, + Unknown, + Testing, + Submitting, + Paused, + Lobby, + Multiplaying, + OsuDirect } export enum UserLoginStatus { From 2a6a30f61f55a755dd62418b8619eb544c6825d4 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:51:14 +0300 Subject: [PATCH 17/33] fix: FIx broken bpm --- packages/tosu/src/entities/BeatmapPpData/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index b7da0295..7d72cc4a 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -259,14 +259,15 @@ export class BeatmapPPData extends AbstractEntity { const decoder = new BeatmapDecoder(); lazerBeatmap = decoder.decodeFromString(beatmapContent, { + parseEvents: true, + parseTimingPoints: true, + parseColours: false, parseDifficulty: false, parseEditor: false, - parseEvents: true, parseGeneral: false, parseStoryboard: false, - parseMetadata: false, - parseTimingPoints: false + parseMetadata: false }); const { bpm, bpmMin, bpmMax } = lazerBeatmap; From 505c21ecf0088dbde44bc7dcb054f73346141c07 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:55:51 +0300 Subject: [PATCH 18/33] BREAKING CHANGE: v2 `state` & `progressBar` updated --- packages/tosu/src/api/types/v2.ts | 39 ++++++++++++++++++- packages/tosu/src/api/utils/buildResultV2.ts | 12 +++++- .../tosu/src/entities/AllTimesData/index.ts | 10 +++-- packages/tosu/src/entities/Settings/index.ts | 2 +- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/packages/tosu/src/api/types/v2.ts b/packages/tosu/src/api/types/v2.ts index c8afe2e7..72ed1cbb 100644 --- a/packages/tosu/src/api/types/v2.ts +++ b/packages/tosu/src/api/types/v2.ts @@ -99,8 +99,43 @@ export enum ChatStatus { VisibleWithFriendsList } +export enum ProgressBarType { + Off, + Pie, + TopRight, + BottomRight, + Bottom +} + +export enum GameState { + Menu, + Edit, + Play, + Exit, + SelectEdit, + SelectPlay, + SelectDrawings, + ResultScreen, + Update, + Busy, + Unknown, + Lobby, + MatchSetup, + SelectMulti, + RankingVs, + OnlineSelection, + OptionsOffsetWizard, + RankingTagCoop, + RankingTeam, + BeatmapImport, + PackageUpdater, + Benchmark, + Tourney, + Charts +} + export interface ApiV2Answer { - state: number; + state: NumberName; session: Session; settings: Settings; profile: Profile; @@ -133,7 +168,7 @@ export interface Settings { chatVisibilityStatus: NumberName; leaderboard: SettingsLeaderboard; - progressBarType: boolean; + progressBar: NumberName; bassDensity: number; resolution: Resolution; diff --git a/packages/tosu/src/api/utils/buildResultV2.ts b/packages/tosu/src/api/utils/buildResultV2.ts index 5db53ffa..4456b8ff 100644 --- a/packages/tosu/src/api/utils/buildResultV2.ts +++ b/packages/tosu/src/api/utils/buildResultV2.ts @@ -13,10 +13,12 @@ import { BanchoStatusEnum, BeatmapStatuses, ChatStatus, + GameState, GroupType, Leaderboard, LeaderboardType, Modes, + ProgressBarType, ScoreMeterType, SortType, Tourney, @@ -100,7 +102,10 @@ export const buildResult = ( : allTimesData.MenuMods; return { - state: allTimesData.Status, + state: { + number: allTimesData.Status, + name: GameState[allTimesData.Status] + }, session: { playTime: allTimesData.GameTime, playCount: 0 // need counting @@ -123,7 +128,10 @@ export const buildResult = ( } }, - progressBarType: settings.progressBarType, + progressBar: { + number: settings.progressBarType, + name: ProgressBarType[settings.progressBarType] + }, bassDensity: bassDensityData.density, resolution: settings.resolution, diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 33371eaa..20adc198 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -89,7 +89,7 @@ export class AllTimesData extends AbstractEntity { ScoreMeterScale: { type: 'double', setValue: (settings, value) => { - settings.scoreMeter.size = value; + settings.scoreMeter.size = parseFloat((value || 0).toFixed(2)); } }, Offset: { @@ -101,13 +101,15 @@ export class AllTimesData extends AbstractEntity { CursorSize: { type: 'double', setValue: (settings, value) => { - settings.cursor.size = value; + settings.cursor.size = parseFloat((value || 0).toFixed(2)); } }, MouseSpeed: { type: 'double', setValue: (settings, value) => { - settings.mouse.sensitivity = value; + settings.mouse.sensitivity = parseFloat( + (value || 0).toFixed(2) + ); } }, Fullscreen: { @@ -378,7 +380,7 @@ export class AllTimesData extends AbstractEntity { break; } - if (value) { + if (value != null) { this.configList[key].setValue(settings, value); } } diff --git a/packages/tosu/src/entities/Settings/index.ts b/packages/tosu/src/entities/Settings/index.ts index 7a6b5379..44231df9 100644 --- a/packages/tosu/src/entities/Settings/index.ts +++ b/packages/tosu/src/entities/Settings/index.ts @@ -145,7 +145,7 @@ export class Settings { sortType: number = 0; leaderboardType: number = 0; - progressBarType: boolean = false; + progressBarType: number = 0; showInterface: boolean = false; gameFolder: string = ''; From f543affb79dbd7f960fc35f99bcfde5edc33db8b Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:56:17 +0300 Subject: [PATCH 19/33] fix: Updating keyoverlay until process is dead --- packages/tosu/src/objects/instanceManager/osuInstance.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 2fdc6e9c..9c38603e 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -379,16 +379,16 @@ export class OsuInstance { default: // no-default } - - setTimeout(() => { - this.updateKeyOverlay(allTimesData, gamePlayData); - }, config.keyOverlayPollRate); } catch (exc) { wLogger.error( 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse' ); console.error(exc); } + + setTimeout(() => { + this.updateKeyOverlay(allTimesData, gamePlayData); + }, config.keyOverlayPollRate); } initMapMetadata() { From 4df0c9c6e6b3fd18340ac58a3862d005df37aff0 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 23:35:46 +0300 Subject: [PATCH 20/33] fix: reuse cached beatmap --- packages/tosu/src/entities/BeatmapPpData/index.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 7d72cc4a..9d876a6f 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -432,6 +432,10 @@ export class BeatmapPPData extends AbstractEntity { } updateEditorPP() { + if (!this.beatmap) { + return; + } + const start_time = performance.now(); const { allTimesData, menuData, settings } = this.services.getServices([ @@ -456,14 +460,6 @@ export class BeatmapPPData extends AbstractEntity { return; } - const beatmap = new Beatmap({ - content: beatmapContent, - ar: menuData.AR, - od: menuData.OD, - cs: menuData.CS, - hp: menuData.HP - }); - const decoder = new BeatmapDecoder().decodeFromString(beatmapContent, { parseHitObjects: true, @@ -490,7 +486,7 @@ export class BeatmapPPData extends AbstractEntity { const curPerformance = new Calculator({ passedObjects: passedObjects.length - }).performance(beatmap); + }).performance(this.beatmap); const calculate_time = performance.now(); From 86233130c3583f4624347cbbe7f395de6fed4bb2 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Thu, 7 Mar 2024 23:48:20 +0300 Subject: [PATCH 21/33] fix order --- packages/tosu/src/index.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/tosu/src/index.ts b/packages/tosu/src/index.ts index e32ccbff..cbac6a11 100644 --- a/packages/tosu/src/index.ts +++ b/packages/tosu/src/index.ts @@ -10,18 +10,17 @@ import { InstanceManager } from './objects/instanceManager/instanceManager'; const instanceManager = new InstanceManager(); const httpServer = new Server({ instanceManager }); - httpServer.start(); - watchConfigFile({ httpServer }); - const { update } = argumetsParser(process.argv); - if ( process.env.NODE_ENV != 'development' && ((update != null && update == true) || update == null) ) await autoUpdater(); + watchConfigFile({ httpServer }); + wLogger.info('Searching for osu!'); + httpServer.start(); instanceManager.runWatcher(); })(); From 41a54d852369cafc908abe470846d50199720762 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:31:45 +0300 Subject: [PATCH 22/33] fix: Move detailed errors to debug --- packages/server/router/index.ts | 6 ++++-- packages/tosu/src/entities/AllTimesData/index.ts | 8 ++++---- packages/tosu/src/entities/BeatmapPpData/index.ts | 4 ++-- packages/tosu/src/entities/MenuData/index.ts | 2 +- .../src/entities/TourneyUserProfileData/index.ts | 3 ++- .../src/objects/instanceManager/instanceManager.ts | 3 ++- .../tosu/src/objects/instanceManager/osuInstance.ts | 13 +++++++------ 7 files changed, 22 insertions(+), 17 deletions(-) diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index e7857b4e..faeca660 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -149,7 +149,8 @@ export default function buildBaseApi(app: HttpServer) { exec(`start "" "${folderPath}"`, (err, stdout, stderr) => { if (err) { - wLogger.error('Error opening file explorer:', err); + wLogger.error('Error opening file explorer:'); + wLogger.debug(err); return sendJson(res, { error: `Error opening file explorer: ${err.message}` }); @@ -304,7 +305,8 @@ export default function buildBaseApi(app: HttpServer) { performance: calculator.performance(parseBeatmap) }); } catch (error) { - wLogger.error(error); + wLogger.error((error as any).message); + wLogger.debug(error); return sendJson(res, { error: (error as any).message diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 20adc198..740b8557 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -391,9 +391,9 @@ export class AllTimesData extends AbstractEntity { if (this.configStateErrorAttempts > 5) { wLogger.error( - "ATD(updateConfigState) Can't update config state", - exc + "ATD(updateConfigState) Can't update config state" ); + wLogger.debug(exc); } } } @@ -423,9 +423,9 @@ export class AllTimesData extends AbstractEntity { if (this.bindingStateErrorAttempts > 5) { wLogger.error( - "ATD(updateBindingState) Can't update binding state", - exc + "ATD(updateBindingState) Can't update binding state" ); + wLogger.debug(exc); } } } diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 9d876a6f..6df47cbb 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -294,9 +294,9 @@ export class BeatmapPPData extends AbstractEntity { this.updateTimings(firstObj, full); } catch (exc) { wLogger.error( - "BPPD(updateMapMetadata) Something happend, when we're tried to parse beatmap", - exc + "BPPD(updateMapMetadata) Something happend, when we're tried to parse beatmap" ); + wLogger.debug(exc); return; } diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index 4b67f9a4..9e0c731e 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -153,7 +153,7 @@ export class MenuData extends AbstractEntity { wLogger.error( `Unable to parse beatmap mp3 length (you can ignore it)` ); - console.error(exc); + wLogger.debug(exc); } } } diff --git a/packages/tosu/src/entities/TourneyUserProfileData/index.ts b/packages/tosu/src/entities/TourneyUserProfileData/index.ts index 31bab737..71ff366f 100644 --- a/packages/tosu/src/entities/TourneyUserProfileData/index.ts +++ b/packages/tosu/src/entities/TourneyUserProfileData/index.ts @@ -56,7 +56,8 @@ export class TourneyUserProfileData extends AbstractEntity { // UserDrawable + 0x70 this.UserID = process.readInt(spectatingUserDrawable + 0x70); } catch (exc) { - wLogger.error('TUPD(updateState) signature failed', exc); + wLogger.error('TUPD(updateState) signature failed'); + wLogger.debug(exc); } wLogger.debug(`TUPD(updateState) updated`); diff --git a/packages/tosu/src/objects/instanceManager/instanceManager.ts b/packages/tosu/src/objects/instanceManager/instanceManager.ts index 09d12529..07958348 100644 --- a/packages/tosu/src/objects/instanceManager/instanceManager.ts +++ b/packages/tosu/src/objects/instanceManager/instanceManager.ts @@ -54,7 +54,8 @@ export class InstanceManager { osuInstance.start(); } } catch (error) { - wLogger.error(error); + wLogger.error((error as any).message); + wLogger.debug(error); } } diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 9c38603e..fa3d7931 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -196,9 +196,9 @@ export class OsuInstance { this.isReady = true; } catch (exc) { wLogger.error( - 'PATTERN SCANNING FAILED, TRYING ONE MORE TIME...', - exc + 'PATTERN SCANNING FAILED, TRYING ONE MORE TIME...' ); + wLogger.debug(exc); this.emitter.emit('onResolveFailed', this.pid); return; } @@ -345,7 +345,8 @@ export class OsuInstance { userProfile.updateState(); } catch (exc) { - wLogger.error('error happend while another loop executed', exc); + wLogger.error('error happend while another loop executed'); + wLogger.debug(exc); } await sleep(config.pollRate); @@ -383,7 +384,7 @@ export class OsuInstance { wLogger.error( 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse' ); - console.error(exc); + wLogger.debug(exc); } setTimeout(() => { @@ -436,9 +437,9 @@ export class OsuInstance { beatmapPpData.updateMapMetadata(currentMods); } catch (exc) { wLogger.error( - "OI(updateMapMetadata) Can't update beatmap metadata", - exc + "OI(updateMapMetadata) Can't update beatmap metadata" ); + wLogger.debug(exc); } } From 99f9dc233afb7a549ce74cc836b5daccc0fab6b0 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 04:37:53 +0300 Subject: [PATCH 23/33] update error messages --- packages/server/router/index.ts | 4 ---- packages/tosu/src/objects/instanceManager/instanceManager.ts | 2 +- packages/tosu/src/objects/instanceManager/osuInstance.ts | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index faeca660..6dd9f257 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -150,7 +150,6 @@ export default function buildBaseApi(app: HttpServer) { exec(`start "" "${folderPath}"`, (err, stdout, stderr) => { if (err) { wLogger.error('Error opening file explorer:'); - wLogger.debug(err); return sendJson(res, { error: `Error opening file explorer: ${err.message}` }); @@ -305,9 +304,6 @@ export default function buildBaseApi(app: HttpServer) { performance: calculator.performance(parseBeatmap) }); } catch (error) { - wLogger.error((error as any).message); - wLogger.debug(error); - return sendJson(res, { error: (error as any).message }); diff --git a/packages/tosu/src/objects/instanceManager/instanceManager.ts b/packages/tosu/src/objects/instanceManager/instanceManager.ts index 07958348..cc7f18a6 100644 --- a/packages/tosu/src/objects/instanceManager/instanceManager.ts +++ b/packages/tosu/src/objects/instanceManager/instanceManager.ts @@ -54,7 +54,7 @@ export class InstanceManager { osuInstance.start(); } } catch (error) { - wLogger.error((error as any).message); + wLogger.error('InstanceManager', (error as any).message); wLogger.debug(error); } } diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index fa3d7931..1ea6e22a 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -345,7 +345,7 @@ export class OsuInstance { userProfile.updateState(); } catch (exc) { - wLogger.error('error happend while another loop executed'); + wLogger.error('error happend while another loop executed', exc); wLogger.debug(exc); } From 06cee1be66421b19f62d8fc007144e1c6c344e61 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 05:43:32 +0300 Subject: [PATCH 24/33] fix you --- packages/server/router/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index 6dd9f257..8e4c9cfd 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -236,7 +236,6 @@ export default function buildBaseApi(app: HttpServer) { }); app.route('/homepage.min.css', 'GET', (req, res) => { - // FIXME: REMOVE THAT SHIT fs.readFile( path.join(pkgAssetsPath, 'homepage.min.css'), 'utf8', From 06e0c5186672d74f942e69b8862634f146fee969 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 05:44:24 +0300 Subject: [PATCH 25/33] Feat: Add process id and patterns scan progress --- packages/common/utils/downloader.ts | 18 ++++++++++-- packages/common/utils/logger.ts | 26 ++++++++++------- .../objects/instanceManager/osuInstance.ts | 29 ++++++++++++++----- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/packages/common/utils/downloader.ts b/packages/common/utils/downloader.ts index 93e58339..52600bd6 100644 --- a/packages/common/utils/downloader.ts +++ b/packages/common/utils/downloader.ts @@ -1,14 +1,26 @@ import fs from 'fs'; import https from 'https'; +import { colorText } from './logger'; + const progressBarWidth = 40; -const updateProgressBar = (progress: number): void => { +export const updateProgressBar = ( + title: string, + progress: number, + message: string = '' +): void => { + const colored_text = colorText('info'); + if (message) message = ` - ${message}`; + const filledWidth = Math.round(progressBarWidth * progress); const emptyWidth = progressBarWidth - filledWidth; const progressBar = 'â–ˆ'.repeat(filledWidth) + 'â–‘'.repeat(emptyWidth); + process.stdout.write( - `Downloading: [${progressBar}] ${(progress * 100).toFixed(2)}%\r` + `${colored_text} ${title}: [${progressBar}] ${(progress * 100).toFixed( + 2 + )}%${message}\r` ); if (progress === 1) { @@ -66,7 +78,7 @@ export const downloadFile = ( response.on('data', (data) => { downloadedSize += data.length; const progress = downloadedSize / totalSize; - updateProgressBar(progress); + updateProgressBar('Downloading', progress); }); response.pipe(file); diff --git a/packages/common/utils/logger.ts b/packages/common/utils/logger.ts index b8395d21..6f4329a5 100644 --- a/packages/common/utils/logger.ts +++ b/packages/common/utils/logger.ts @@ -9,25 +9,31 @@ const colors = { grey: '\x1b[90m' }; -function colorText(status: string, ...anything: any) { +export function colorText(status: string) { const colorCode = colors[status] || colors.reset; const timestamp = new Date().toISOString().split('T')[1].replace('Z', ''); const time = `${colors.grey}${timestamp}${colors.reset}`; - console.log( - time, - `${colorCode} ${status.toUpperCase()} ${colors.reset}`, - ...anything - ); + return `${time} ${colorCode} ${status.toUpperCase()} ${colors.reset}`; } export const wLogger = { - info: (...args: any) => colorText('info', ...args), + info: (...args: any) => { + const colored_text = colorText('info'); + console.log(colored_text, ...args); + }, debug: (...args: any) => { if (config.debugLogging != true) return; - colorText('debug', ...args); + const colored_text = colorText('debug'); + console.log(colored_text, ...args); + }, + error: (...args: any) => { + const colored_text = colorText('error'); + console.log(colored_text, ...args); }, - error: (...args: any) => colorText('error', ...args), - warn: (...args: any) => colorText('warn', ...args) + warn: (...args: any) => { + const colored_text = colorText('warn'); + console.log(colored_text, ...args); + } }; diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 1ea6e22a..a67692d3 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -1,4 +1,4 @@ -import { config, sleep, wLogger } from '@tosu/common'; +import { config, sleep, updateProgressBar, wLogger } from '@tosu/common'; import { injectGameOverlay } from '@tosu/game-overlay'; import EventEmitter from 'events'; import fs from 'fs'; @@ -158,9 +158,7 @@ export class OsuInstance { } start() { - wLogger.info( - `Running memory chimera... RESOLVING PATTERNS FOR ${this.pid}` - ); + wLogger.info(`[${this.pid}] Running memory chimera..`); while (!this.isReady) { const patternsRepo = this.entities.get('patterns'); if (!patternsRepo) { @@ -170,12 +168,23 @@ export class OsuInstance { } try { + const total = Object.keys(SCAN_PATTERNS).length; + let completed = 0; for (const baseKey in SCAN_PATTERNS) { + const s1 = performance.now(); const patternValue = this.process.scanSync( SCAN_PATTERNS[baseKey].pattern, true ); + completed += 1; if (patternValue === 0) { + updateProgressBar( + `[${this.pid}] Scanning`, + completed / total, + `${(performance.now() - s1).toFixed( + 2 + )}ms ${baseKey}` + ); continue; } @@ -183,20 +192,26 @@ export class OsuInstance { baseKey as never, patternValue + (SCAN_PATTERNS[baseKey].offset || 0) ); + + updateProgressBar( + `[${this.pid}] Scanning`, + completed / total, + `${(performance.now() - s1).toFixed(2)}ms ${baseKey}` + ); } + const s1 = performance.now(); if (!patternsRepo.checkIsBasesValid()) { - wLogger.info('PATTERN RESOLVING FAILED, TRYING AGAIN....'); throw new Error('Memory resolve failed'); } wLogger.info( - 'ALL PATTERNS ARE RESOLVED, STARTING WATCHING THE DATA' + `[${this.pid}] ALL PATTERNS ARE RESOLVED, STARTING WATCHING THE DATA` ); this.isReady = true; } catch (exc) { wLogger.error( - 'PATTERN SCANNING FAILED, TRYING ONE MORE TIME...' + `[${this.pid}] PATTERN SCANNING FAILED, TRYING ONE MORE TIME...` ); wLogger.debug(exc); this.emitter.emit('onResolveFailed', this.pid); From 4f703f873c6b6da6dd801e72a88323b08dd117a5 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 05:48:49 +0300 Subject: [PATCH 26/33] fix: More detailed errors --- .../src/entities/BassDensityData/index.ts | 102 ++++---- .../tosu/src/entities/GamePlayData/index.ts | 232 ++++++++++-------- packages/tosu/src/entities/MenuData/index.ts | 178 +++++++------- .../src/entities/ResultsScreenData/index.ts | 145 +++++------ .../src/entities/TourneyManagerData/index.ts | 211 ++++++++-------- .../tosu/src/entities/UserProfile/index.ts | 56 +++-- 6 files changed, 486 insertions(+), 438 deletions(-) diff --git a/packages/tosu/src/entities/BassDensityData/index.ts b/packages/tosu/src/entities/BassDensityData/index.ts index 2d799eef..56b4bf7b 100644 --- a/packages/tosu/src/entities/BassDensityData/index.ts +++ b/packages/tosu/src/entities/BassDensityData/index.ts @@ -12,66 +12,72 @@ export class BassDensityData extends AbstractEntity { constructor(services: DataRepo) { super(services); } - + // FIXME updateState() { - const { process: osuProcess, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); - if (osuProcess === null) { - throw new Error('Process not found'); - } + try { + const { process: osuProcess, patterns } = this.services.getServices( + ['process', 'patterns'] + ); + if (osuProcess === null) { + throw new Error('Process not found'); + } - const isWin = process.platform === 'win32'; - const leaderStart = isWin ? 0x8 : 0xc; + const isWin = process.platform === 'win32'; + const leaderStart = isWin ? 0x8 : 0xc; - // Ruleset = [[Rulesets - 0xB] + 0x4] - const rulesetAddr = osuProcess.readInt( - osuProcess.readInt(patterns.getPattern('rulesetsAddr') - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('BDD(updateState) rulesetAddr is zero'); - return; - } + // Ruleset = [[Rulesets - 0xB] + 0x4] + const rulesetAddr = osuProcess.readInt( + osuProcess.readInt(patterns.getPattern('rulesetsAddr') - 0xb) + + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('BDD(updateState) rulesetAddr is zero'); + return; + } - // [Ruleset + 0x44] + 0x10 - const audioVelocityBase = osuProcess.readInt( - osuProcess.readInt(rulesetAddr + 0x44) + 0x10 - ); + // [Ruleset + 0x44] + 0x10 + const audioVelocityBase = osuProcess.readInt( + osuProcess.readInt(rulesetAddr + 0x44) + 0x10 + ); - const bassDensityLength = osuProcess.readInt(audioVelocityBase + 0x4); - if (bassDensityLength < 40) { - wLogger.debug( - 'BDD(updateState) bassDensity length less than 40 (basically it have 1024 values)' + const bassDensityLength = osuProcess.readInt( + audioVelocityBase + 0x4 ); - return; - } + if (bassDensityLength < 40) { + wLogger.debug( + 'BDD(updateState) bassDensity length less than 40 (basically it have 1024 values)' + ); + return; + } + + let bass = 0.0; + let currentAudioVelocity = this.currentAudioVelocity; + for (let i = 0; i < 40; i++) { + const current = audioVelocityBase + leaderStart + 0x4 * i; - let bass = 0.0; - let currentAudioVelocity = this.currentAudioVelocity; - for (let i = 0; i < 40; i++) { - const current = audioVelocityBase + leaderStart + 0x4 * i; + const value = osuProcess.readFloat(current); + if (value < 0) { + this.density = 0.5; + return; + } + bass += (2 * value * (40 - i)) / 40; + } - const value = osuProcess.readFloat(current); - if (value < 0) { + if (isNaN(currentAudioVelocity) || isNaN(bass)) { + this.currentAudioVelocity = 0; this.density = 0.5; return; } - bass += (2 * value * (40 - i)) / 40; - } + currentAudioVelocity = Math.max( + currentAudioVelocity, + Math.min(bass * 1.5, 6) + ); + currentAudioVelocity *= 0.95; - if (isNaN(currentAudioVelocity) || isNaN(bass)) { - this.currentAudioVelocity = 0; - this.density = 0.5; - return; + this.currentAudioVelocity = currentAudioVelocity; + this.density = (1 + currentAudioVelocity) * 0.5; + } catch (exc) { + wLogger.error(`BDD(updateState) ${(exc as any).message}`, exc); } - currentAudioVelocity = Math.max( - currentAudioVelocity, - Math.min(bass * 1.5, 6) - ); - currentAudioVelocity *= 0.95; - - this.currentAudioVelocity = currentAudioVelocity; - this.density = (1 + currentAudioVelocity) * 0.5; } } diff --git a/packages/tosu/src/entities/GamePlayData/index.ts b/packages/tosu/src/entities/GamePlayData/index.ts index 15022f8c..756a2297 100644 --- a/packages/tosu/src/entities/GamePlayData/index.ts +++ b/packages/tosu/src/entities/GamePlayData/index.ts @@ -108,128 +108,144 @@ export class GamePlayData extends AbstractEntity { } updateState() { - const { process, patterns, allTimesData, menuData } = - this.services.getServices([ - 'process', - 'patterns', - 'allTimesData', - 'menuData' + try { + const { process, patterns, allTimesData, menuData } = + this.services.getServices([ + 'process', + 'patterns', + 'allTimesData', + 'menuData' + ]); + + const { baseAddr, rulesetsAddr } = patterns.getPatterns([ + 'baseAddr', + 'rulesetsAddr' ]); - const { baseAddr, rulesetsAddr } = patterns.getPatterns([ - 'baseAddr', - 'rulesetsAddr' - ]); + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('GD(updateState) RulesetAddr is 0'); + return; + } - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('GD(updateState) RulesetAddr is 0'); - return; - } + const gameplayBase = process.readInt(rulesetAddr + 0x68); + if (gameplayBase === 0) { + wLogger.debug('GD(updateState) gameplayBase is zero'); + return; + } - const gameplayBase = process.readInt(rulesetAddr + 0x68); - if (gameplayBase === 0) { - wLogger.debug('GD(updateState) gameplayBase is zero'); - return; - } + const scoreBase = process.readInt(gameplayBase + 0x38); + if (scoreBase === 0) { + wLogger.debug('GD(updateState) scoreBase is zero'); + return; + } - const scoreBase = process.readInt(gameplayBase + 0x38); - if (scoreBase === 0) { - wLogger.debug('GD(updateState) scoreBase is zero'); - return; - } + let hpBarBase = process.readInt(gameplayBase + 0x40); + if (hpBarBase === 0) { + wLogger.debug('GD(updateState) hpBar is zero'); + return; + } - let hpBarBase = process.readInt(gameplayBase + 0x40); - if (hpBarBase === 0) { - wLogger.debug('GD(updateState) hpBar is zero'); - return; - } + // Resetting default state value, to define other componenets that we have touched gamePlayData + // needed for ex like you done with replay watching/gameplay and return to mainMenu, you need alteast one reset to gamePlayData/resultsScreenData + this.isDefaultState = false; - // Resetting default state value, to define other componenets that we have touched gamePlayData - // needed for ex like you done with replay watching/gameplay and return to mainMenu, you need alteast one reset to gamePlayData/resultsScreenData - this.isDefaultState = false; + if (allTimesData.IsWatchingReplay) { + // rulesetAddr mean ReplayWatcher... Sooo.... + // Ruleset + 0x1d8 + this.isReplayUiHidden = Boolean( + process.readByte(rulesetAddr + 0x1d8) + ); + } else { + this.isReplayUiHidden = false; + } - if (allTimesData.IsWatchingReplay) { - // rulesetAddr mean ReplayWatcher... Sooo.... - // Ruleset + 0x1d8 - this.isReplayUiHidden = Boolean( - process.readByte(rulesetAddr + 0x1d8) + // [Base - 0x33] + 0x8 + this.Retries = process.readInt( + process.readInt(baseAddr - 0x33) + 0x8 + ); + // [[[Ruleset + 0x68] + 0x38] + 0x28] + this.PlayerName = process.readSharpString( + process.readInt(scoreBase + 0x28) + ); + // [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0xC ^ [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0x8 + this.Mods = + process.readInt(process.readInt(scoreBase + 0x1c) + 0xc) ^ + process.readInt(process.readInt(scoreBase + 0x1c) + 0x8); + // [[Ruleset + 0x68] + 0x38] + 0x64 + this.Mode = process.readInt(scoreBase + 0x64); + // [[Ruleset + 0x68] + 0x38] + 0x68 + this.MaxCombo = process.readShort(scoreBase + 0x68); + // [[Ruleset + 0x68] + 0x38] + 0x78 + this.Score = process.readInt(rulesetAddr + 0x100); + // [[Ruleset + 0x68] + 0x38] + 0x88 + this.Hit100 = process.readShort(scoreBase + 0x88); + // [[Ruleset + 0x68] + 0x38] + 0x8A + this.Hit300 = process.readShort(scoreBase + 0x8a); + // [[Ruleset + 0x68] + 0x38] + 0x8C + this.Hit50 = process.readShort(scoreBase + 0x8c); + // [[Ruleset + 0x68] + 0x38] + 0x8E + this.HitGeki = process.readShort(scoreBase + 0x8e); + // [[Ruleset + 0x68] + 0x38] + 0x90 + this.HitKatu = process.readShort(scoreBase + 0x90); + // [[Ruleset + 0x68] + 0x38] + 0x92 + this.HitMiss = process.readShort(scoreBase + 0x92); + // [[Ruleset + 0x68] + 0x38] + 0x94 + this.Combo = process.readShort(scoreBase + 0x94); + // [[Ruleset + 0x68] + 0x40] + 0x14 + this.PlayerHPSmooth = process.readDouble(hpBarBase + 0x14) || 0; + // [[Ruleset + 0x68] + 0x40] + 0x1C + this.PlayerHP = process.readDouble(hpBarBase + 0x1c); + // [[Ruleset + 0x68] + 0x48] + 0xC + this.Accuracy = process.readDouble( + process.readInt(gameplayBase + 0x48) + 0xc ); - } else { - this.isReplayUiHidden = false; - } - // [Base - 0x33] + 0x8 - this.Retries = process.readInt(process.readInt(baseAddr - 0x33) + 0x8); - // [[[Ruleset + 0x68] + 0x38] + 0x28] - this.PlayerName = process.readSharpString( - process.readInt(scoreBase + 0x28) - ); - // [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0xC ^ [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0x8 - this.Mods = - process.readInt(process.readInt(scoreBase + 0x1c) + 0xc) ^ - process.readInt(process.readInt(scoreBase + 0x1c) + 0x8); - // [[Ruleset + 0x68] + 0x38] + 0x64 - this.Mode = process.readInt(scoreBase + 0x64); - // [[Ruleset + 0x68] + 0x38] + 0x68 - this.MaxCombo = process.readShort(scoreBase + 0x68); - // [[Ruleset + 0x68] + 0x38] + 0x78 - this.Score = process.readInt(rulesetAddr + 0x100); - // [[Ruleset + 0x68] + 0x38] + 0x88 - this.Hit100 = process.readShort(scoreBase + 0x88); - // [[Ruleset + 0x68] + 0x38] + 0x8A - this.Hit300 = process.readShort(scoreBase + 0x8a); - // [[Ruleset + 0x68] + 0x38] + 0x8C - this.Hit50 = process.readShort(scoreBase + 0x8c); - // [[Ruleset + 0x68] + 0x38] + 0x8E - this.HitGeki = process.readShort(scoreBase + 0x8e); - // [[Ruleset + 0x68] + 0x38] + 0x90 - this.HitKatu = process.readShort(scoreBase + 0x90); - // [[Ruleset + 0x68] + 0x38] + 0x92 - this.HitMiss = process.readShort(scoreBase + 0x92); - // [[Ruleset + 0x68] + 0x38] + 0x94 - this.Combo = process.readShort(scoreBase + 0x94); - // [[Ruleset + 0x68] + 0x40] + 0x14 - this.PlayerHPSmooth = process.readDouble(hpBarBase + 0x14) || 0; - // [[Ruleset + 0x68] + 0x40] + 0x1C - this.PlayerHP = process.readDouble(hpBarBase + 0x1c); - // [[Ruleset + 0x68] + 0x48] + 0xC - this.Accuracy = process.readDouble( - process.readInt(gameplayBase + 0x48) + 0xc - ); + if (this.MaxCombo > 0) { + const baseUR = this.calculateUR(); + if ((this.Mods & OsuMods.DoubleTime) === OsuMods.DoubleTime) { + this.UnstableRate = baseUR / 1.5; + } else if ( + (this.Mods & OsuMods.HalfTime) === + OsuMods.HalfTime + ) { + this.UnstableRate = baseUR * 1.33; + } else { + this.UnstableRate = baseUR; + } + } - if (this.MaxCombo > 0) { - const baseUR = this.calculateUR(); - if ((this.Mods & OsuMods.DoubleTime) === OsuMods.DoubleTime) { - this.UnstableRate = baseUR / 1.5; - } else if ((this.Mods & OsuMods.HalfTime) === OsuMods.HalfTime) { - this.UnstableRate = baseUR * 1.33; - } else { - this.UnstableRate = baseUR; + if (this.ComboPrev > this.MaxCombo) { + this.ComboPrev = 0; } - } + if ( + this.Combo < this.ComboPrev && + this.HitMiss === this.HitMissPrev + ) { + this.HitSB += 1; + } + this.HitMissPrev = this.HitMiss; + this.ComboPrev = this.Combo; + + // [[[Ruleset + 0x68] + 0x38] + 0x38] + this.HitErrors = this.getHitErrors( + process, + patterns.getLeaderStart(), + scoreBase + ); - if (this.ComboPrev > this.MaxCombo) { - this.ComboPrev = 0; - } - if (this.Combo < this.ComboPrev && this.HitMiss === this.HitMissPrev) { - this.HitSB += 1; + this.updateLeaderboard( + process, + patterns.getLeaderStart(), + rulesetAddr + ); + this.updateGrade(menuData); + this.updateStarsAndPerformance(); + } catch (exc) { + wLogger.error(`GPD(updateState) ${(exc as any).message}`, exc); } - this.HitMissPrev = this.HitMiss; - this.ComboPrev = this.Combo; - - // [[[Ruleset + 0x68] + 0x38] + 0x38] - this.HitErrors = this.getHitErrors( - process, - patterns.getLeaderStart(), - scoreBase - ); - - this.updateLeaderboard(process, patterns.getLeaderStart(), rulesetAddr); - this.updateGrade(menuData); - this.updateStarsAndPerformance(); } updateKeyOverlay() { diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index 9e0c731e..207b6ade 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -39,94 +39,102 @@ export class MenuData extends AbstractEntity { } updateState() { - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); + try { + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); - const baseAddr = patterns.getPattern('baseAddr'); + const baseAddr = patterns.getPattern('baseAddr'); - const beatmapAddr = process.readPointer(baseAddr - 0xc); - if (beatmapAddr === 0) { - wLogger.debug('MD(updateState) beatmapAddr is 0'); - return; - } - // [[Beatmap] + 0x6C] - this.MD5 = process.readSharpString(process.readInt(beatmapAddr + 0x6c)); - // [[Beatmap] + 0x90] - this.Path = process.readSharpString( - process.readInt(beatmapAddr + 0x90) - ); - // [Base - 0x33] - this.MenuGameMode = process.readPointer(baseAddr - 0x33); - - if (this.MD5 === this.previousMD5 || !this.Path.endsWith('.osu')) { - return; - } + const beatmapAddr = process.readPointer(baseAddr - 0xc); + if (beatmapAddr === 0) { + wLogger.debug('MD(updateState) beatmapAddr is 0'); + return; + } + // [[Beatmap] + 0x6C] + this.MD5 = process.readSharpString( + process.readInt(beatmapAddr + 0x6c) + ); + // [[Beatmap] + 0x90] + this.Path = process.readSharpString( + process.readInt(beatmapAddr + 0x90) + ); + // [Base - 0x33] + this.MenuGameMode = process.readPointer(baseAddr - 0x33); + + if (this.MD5 === this.previousMD5 || !this.Path.endsWith('.osu')) { + return; + } + + // [Base - 0x33] + 0xC + this.Plays = process.readInt( + process.readInt(baseAddr - 0x33) + 0xc + ); + // [[Beatmap] + 0x18] + this.Artist = process.readSharpString( + process.readInt(beatmapAddr + 0x18) + ); + // // [[Beatmap] + 0x1C] + this.ArtistOriginal = process.readSharpString( + process.readInt(beatmapAddr + 0x1c) + ); + // // [[Beatmap] + 0x24] + this.Title = process.readSharpString( + process.readInt(beatmapAddr + 0x24) + ); + // // [[Beatmap] + 0x28] + this.TitleOriginal = process.readSharpString( + process.readInt(beatmapAddr + 0x28) + ); - // [Base - 0x33] + 0xC - this.Plays = process.readInt(process.readInt(baseAddr - 0x33) + 0xc); - // [[Beatmap] + 0x18] - this.Artist = process.readSharpString( - process.readInt(beatmapAddr + 0x18) - ); - // // [[Beatmap] + 0x1C] - this.ArtistOriginal = process.readSharpString( - process.readInt(beatmapAddr + 0x1c) - ); - // // [[Beatmap] + 0x24] - this.Title = process.readSharpString( - process.readInt(beatmapAddr + 0x24) - ); - // // [[Beatmap] + 0x28] - this.TitleOriginal = process.readSharpString( - process.readInt(beatmapAddr + 0x28) - ); - - // [Beatmap] + 0x2C - this.AR = process.readFloat(beatmapAddr + 0x2c); - // [Beatmap] + 0x30 - this.CS = process.readFloat(beatmapAddr + 0x30); - // [Beatmap] + 0x34 - this.HP = process.readFloat(beatmapAddr + 0x34); - // [Beatmap] + 0x38 - this.OD = process.readFloat(beatmapAddr + 0x38); - // [[Beatmap] + 0x64] - this.AudioFilename = process.readSharpString( - process.readInt(beatmapAddr + 0x64) - ); - // // [[Beatmap] + 0x68] - this.BackgroundFilename = process.readSharpString( - process.readInt(beatmapAddr + 0x68) - ); - // this.BackgroundFilename = ""; - // [[Beatmap] + 0x78] - this.Folder = process.readSharpString( - process.readInt(beatmapAddr + 0x78) - ); - // [[Beatmap] + 0x7C] - this.Creator = process.readSharpString( - process.readInt(beatmapAddr + 0x7c) - ); - // [[Beatmap] + 0x80] - this.Name = process.readSharpString( - process.readInt(beatmapAddr + 0x80) - ); - // [[Beatmap] + 0xAC] - this.Difficulty = process.readSharpString( - process.readInt(beatmapAddr + 0xac) - ); - // [Beatmap] + 0xC8 - this.MapID = process.readInt(beatmapAddr + 0xc8); - // [Beatmap] + 0xCC - this.SetID = process.readInt(beatmapAddr + 0xcc); - // unknown, unsubmitted, pending/wip/graveyard, unused, ranked, approved, qualified - // [Beatmap] + 0x12C - this.RankedStatus = process.readInt(beatmapAddr + 0x12c); - // [Beatmap] + 0xF8 - this.ObjectCount = process.readInt(beatmapAddr + 0xf8); - - this.previousMD5 = this.MD5; + // [Beatmap] + 0x2C + this.AR = process.readFloat(beatmapAddr + 0x2c); + // [Beatmap] + 0x30 + this.CS = process.readFloat(beatmapAddr + 0x30); + // [Beatmap] + 0x34 + this.HP = process.readFloat(beatmapAddr + 0x34); + // [Beatmap] + 0x38 + this.OD = process.readFloat(beatmapAddr + 0x38); + // [[Beatmap] + 0x64] + this.AudioFilename = process.readSharpString( + process.readInt(beatmapAddr + 0x64) + ); + // // [[Beatmap] + 0x68] + this.BackgroundFilename = process.readSharpString( + process.readInt(beatmapAddr + 0x68) + ); + // this.BackgroundFilename = ""; + // [[Beatmap] + 0x78] + this.Folder = process.readSharpString( + process.readInt(beatmapAddr + 0x78) + ); + // [[Beatmap] + 0x7C] + this.Creator = process.readSharpString( + process.readInt(beatmapAddr + 0x7c) + ); + // [[Beatmap] + 0x80] + this.Name = process.readSharpString( + process.readInt(beatmapAddr + 0x80) + ); + // [[Beatmap] + 0xAC] + this.Difficulty = process.readSharpString( + process.readInt(beatmapAddr + 0xac) + ); + // [Beatmap] + 0xC8 + this.MapID = process.readInt(beatmapAddr + 0xc8); + // [Beatmap] + 0xCC + this.SetID = process.readInt(beatmapAddr + 0xcc); + // unknown, unsubmitted, pending/wip/graveyard, unused, ranked, approved, qualified + // [Beatmap] + 0x12C + this.RankedStatus = process.readInt(beatmapAddr + 0x12c); + // [Beatmap] + 0xF8 + this.ObjectCount = process.readInt(beatmapAddr + 0xf8); + + this.previousMD5 = this.MD5; + } catch (exc) { + wLogger.error(`MB(updateState) ${(exc as any).message}`, exc); + } } updateMP3Length() { diff --git a/packages/tosu/src/entities/ResultsScreenData/index.ts b/packages/tosu/src/entities/ResultsScreenData/index.ts index 3de647a7..31de09d6 100644 --- a/packages/tosu/src/entities/ResultsScreenData/index.ts +++ b/packages/tosu/src/entities/ResultsScreenData/index.ts @@ -46,79 +46,86 @@ export class ResultsScreenData extends AbstractEntity { } updateState() { - const { process, patterns, allTimesData } = this.services.getServices([ - 'process', - 'patterns', - 'allTimesData' - ]); - if (process === null) { - throw new Error('Process not found'); - } - if (patterns === null) { - throw new Error('Bases repo not found'); - } - if (allTimesData === null) { - throw new Error('AllTimesData not found'); - } - - const { rulesetsAddr } = patterns.getPatterns(['rulesetsAddr']); + try { + const { process, patterns, allTimesData } = + this.services.getServices([ + 'process', + 'patterns', + 'allTimesData' + ]); + if (process === null) { + throw new Error('Process not found'); + } + if (patterns === null) { + throw new Error('Bases repo not found'); + } + if (allTimesData === null) { + throw new Error('AllTimesData not found'); + } - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('RSD(init) rulesetAddr is zero'); - return; - } + const { rulesetsAddr } = patterns.getPatterns(['rulesetsAddr']); - const resultScreenBase = process.readInt(rulesetAddr + 0x38); - if (resultScreenBase === 0) { - wLogger.debug('RSD(init) resultScreenBase is zero'); - return; - } + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('RSD(init) rulesetAddr is zero'); + return; + } - // PlayerName string `mem:"[[Ruleset + 0x38] + 0x28]"` - this.PlayerName = process.readSharpString( - process.readInt(resultScreenBase + 0x28) - ); - // ModsXor1 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0xC"` ^ ModsXor2 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0x8"` - this.Mods = - process.readInt(process.readInt(resultScreenBase + 0x1c) + 0xc) ^ - process.readInt(process.readInt(resultScreenBase + 0x1c) + 0x8); - // Mode int32 `mem:"[Ruleset + 0x38] + 0x64"` - this.Mode = process.readInt(resultScreenBase + 0x64); - // MaxCombo int16 `mem:"[Ruleset + 0x38] + 0x68"` - this.MaxCombo = process.readShort(resultScreenBase + 0x68); - // Score int32 `mem:"[Ruleset + 0x38] + 0x78"` - this.Score = process.readInt(resultScreenBase + 0x78); - // Hit100 int16 `mem:"[Ruleset + 0x38] + 0x88"` - this.Hit100 = process.readShort(resultScreenBase + 0x88); - // Hit300 int16 `mem:"[Ruleset + 0x38] + 0x8A"` - this.Hit300 = process.readShort(resultScreenBase + 0x8a); - // Hit50 int16 `mem:"[Ruleset + 0x38] + 0x8C"` - this.Hit50 = process.readShort(resultScreenBase + 0x8c); - // HitGeki int16 `mem:"[Ruleset + 0x38] + 0x8E"` - this.HitGeki = process.readShort(resultScreenBase + 0x8e); - // HitKatu int16 `mem:"[Ruleset + 0x38] + 0x90"` - this.HitKatu = process.readShort(resultScreenBase + 0x90); - // HitMiss int16 `mem:"[Ruleset + 0x38] + 0x92"` - this.HitMiss = process.readShort(resultScreenBase + 0x92); - this.Grade = calculateGrade({ - mods: this.Mods, - mode: this.Mode, - hits: { - 300: this.Hit300, - geki: 0, - 100: this.Hit100, - katu: 0, - 50: this.Hit50, - 0: this.HitMiss + const resultScreenBase = process.readInt(rulesetAddr + 0x38); + if (resultScreenBase === 0) { + wLogger.debug('RSD(init) resultScreenBase is zero'); + return; } - }); - this.Date = netDateBinaryToDate( - process.readInt(resultScreenBase + 0xa4), - process.readInt(resultScreenBase + 0xa0) - ).toISOString(); + // PlayerName string `mem:"[[Ruleset + 0x38] + 0x28]"` + this.PlayerName = process.readSharpString( + process.readInt(resultScreenBase + 0x28) + ); + // ModsXor1 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0xC"` ^ ModsXor2 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0x8"` + this.Mods = + process.readInt( + process.readInt(resultScreenBase + 0x1c) + 0xc + ) ^ + process.readInt(process.readInt(resultScreenBase + 0x1c) + 0x8); + // Mode int32 `mem:"[Ruleset + 0x38] + 0x64"` + this.Mode = process.readInt(resultScreenBase + 0x64); + // MaxCombo int16 `mem:"[Ruleset + 0x38] + 0x68"` + this.MaxCombo = process.readShort(resultScreenBase + 0x68); + // Score int32 `mem:"[Ruleset + 0x38] + 0x78"` + this.Score = process.readInt(resultScreenBase + 0x78); + // Hit100 int16 `mem:"[Ruleset + 0x38] + 0x88"` + this.Hit100 = process.readShort(resultScreenBase + 0x88); + // Hit300 int16 `mem:"[Ruleset + 0x38] + 0x8A"` + this.Hit300 = process.readShort(resultScreenBase + 0x8a); + // Hit50 int16 `mem:"[Ruleset + 0x38] + 0x8C"` + this.Hit50 = process.readShort(resultScreenBase + 0x8c); + // HitGeki int16 `mem:"[Ruleset + 0x38] + 0x8E"` + this.HitGeki = process.readShort(resultScreenBase + 0x8e); + // HitKatu int16 `mem:"[Ruleset + 0x38] + 0x90"` + this.HitKatu = process.readShort(resultScreenBase + 0x90); + // HitMiss int16 `mem:"[Ruleset + 0x38] + 0x92"` + this.HitMiss = process.readShort(resultScreenBase + 0x92); + this.Grade = calculateGrade({ + mods: this.Mods, + mode: this.Mode, + hits: { + 300: this.Hit300, + geki: 0, + 100: this.Hit100, + katu: 0, + 50: this.Hit50, + 0: this.HitMiss + } + }); + + this.Date = netDateBinaryToDate( + process.readInt(resultScreenBase + 0xa4), + process.readInt(resultScreenBase + 0xa0) + ).toISOString(); + } catch (exc) { + wLogger.error(`RSD(updateState) ${(exc as any).message}`, exc); + } } } diff --git a/packages/tosu/src/entities/TourneyManagerData/index.ts b/packages/tosu/src/entities/TourneyManagerData/index.ts index 4e2ae2fb..dc6ca8de 100644 --- a/packages/tosu/src/entities/TourneyManagerData/index.ts +++ b/packages/tosu/src/entities/TourneyManagerData/index.ts @@ -29,128 +29,133 @@ export class TourneyManagerData extends AbstractEntity { } async updateState() { - wLogger.debug(`TMD(updateState) Starting`); + try { + wLogger.debug(`TMD(updateState) Starting`); - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); - const rulesetsAddr = patterns.getPattern('rulesetsAddr'); + const rulesetsAddr = patterns.getPattern('rulesetsAddr'); - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('TMD(updateState) RulesetAddr is 0'); - return; - } - - if (this.ChatAreaAddr === 0) { - this.ChatAreaAddr = await process.scanAsync( - TOURNAMENT_CHAT_ENGINE, - true + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 ); - wLogger.debug('TMD(updateState) Chat area found'); - return; - } + if (rulesetAddr === 0) { + wLogger.debug('TMD(updateState) RulesetAddr is 0'); + return; + } - const teamLeftBase = process.readInt(rulesetAddr + 0x1c); - const teamRightBase = process.readInt(rulesetAddr + 0x20); - - // IPCState int32 `mem:"Ruleset + 0x54"` - this.IPCState = process.readInt(rulesetAddr + 0x54); - // LeftStars int32 `mem:"[Ruleset + 0x1C] + 0x2C"` - this.LeftStars = process.readInt(teamLeftBase + 0x2c); - // RightStars int32 `mem:"[Ruleset + 0x20] + 0x2C"` - this.RightStars = process.readInt(teamRightBase + 0x2c); - // BO int32 `mem:"[Ruleset + 0x20] + 0x30"` - this.BestOf = process.readInt(teamRightBase + 0x30); - // StarsVisible int8 `mem:"[Ruleset + 0x20] + 0x38"` - this.StarsVisible = Boolean(process.readByte(teamRightBase + 0x38)); - // ScoreVisible int8 `mem:"[Ruleset + 0x20] + 0x39"` - this.ScoreVisible = Boolean(process.readByte(teamRightBase + 0x39)); - // TeamOneName string `mem:"[[[Ruleset + 0x1C] + 0x20] + 0x144]"` - this.FirstTeamName = process.readSharpString( - process.readInt(process.readInt(teamLeftBase + 0x20) + 0x144) - ); - // TeamTwoName string `mem:"[[[Ruleset + 0x20] + 0x20] + 0x144]"` - this.SecondTeamName = process.readSharpString( - process.readInt(process.readInt(teamRightBase + 0x20) + 0x144) - ); - // TeamOneScore int32 `mem:"[Ruleset + 0x1C] + 0x28"` - this.FirstTeamScore = process.readInt(teamLeftBase + 0x28); - // TeamTwoScore int32 `mem:"[Ruleset + 0x20] + 0x28"` - this.SecondTeamScore = process.readInt(teamRightBase + 0x28); - // IPCBaseAddr uint32 `mem:"[[Ruleset + 0x34] + 0x4] + 0x4"` - this.IPCBaseAddr = process.readInt( - process.readInt(process.readInt(rulesetAddr + 0x34) + 0x4) + 0x4 - ); - - const channelsList = process.readPointer(this.ChatAreaAddr + 0x15); - const channelsItems = process.readInt(channelsList + 0x4); - - const channelsLength = process.readInt(channelsItems + 0x4); - // Reversing array is needed for make more fast search, - // because osu creates 40 channels with language topics, lobby, osu, etc... (bancho announces this to you) - // and 41 is commonly for multiplayer in tourney client - for (let i = channelsLength - 1; i >= 0; i--) { - const current = channelsItems + patterns.getLeaderStart() + 0x4 * i; - - const channelAddr = process.readInt(current); - if (channelAddr === 0) { - continue; + if (this.ChatAreaAddr === 0) { + this.ChatAreaAddr = await process.scanAsync( + TOURNAMENT_CHAT_ENGINE, + true + ); + wLogger.debug('TMD(updateState) Chat area found'); + return; } - const chatTag = process.readSharpString( - process.readInt(channelAddr + 0x4) + const teamLeftBase = process.readInt(rulesetAddr + 0x1c); + const teamRightBase = process.readInt(rulesetAddr + 0x20); + + // IPCState int32 `mem:"Ruleset + 0x54"` + this.IPCState = process.readInt(rulesetAddr + 0x54); + // LeftStars int32 `mem:"[Ruleset + 0x1C] + 0x2C"` + this.LeftStars = process.readInt(teamLeftBase + 0x2c); + // RightStars int32 `mem:"[Ruleset + 0x20] + 0x2C"` + this.RightStars = process.readInt(teamRightBase + 0x2c); + // BO int32 `mem:"[Ruleset + 0x20] + 0x30"` + this.BestOf = process.readInt(teamRightBase + 0x30); + // StarsVisible int8 `mem:"[Ruleset + 0x20] + 0x38"` + this.StarsVisible = Boolean(process.readByte(teamRightBase + 0x38)); + // ScoreVisible int8 `mem:"[Ruleset + 0x20] + 0x39"` + this.ScoreVisible = Boolean(process.readByte(teamRightBase + 0x39)); + // TeamOneName string `mem:"[[[Ruleset + 0x1C] + 0x20] + 0x144]"` + this.FirstTeamName = process.readSharpString( + process.readInt(process.readInt(teamLeftBase + 0x20) + 0x144) + ); + // TeamTwoName string `mem:"[[[Ruleset + 0x20] + 0x20] + 0x144]"` + this.SecondTeamName = process.readSharpString( + process.readInt(process.readInt(teamRightBase + 0x20) + 0x144) + ); + // TeamOneScore int32 `mem:"[Ruleset + 0x1C] + 0x28"` + this.FirstTeamScore = process.readInt(teamLeftBase + 0x28); + // TeamTwoScore int32 `mem:"[Ruleset + 0x20] + 0x28"` + this.SecondTeamScore = process.readInt(teamRightBase + 0x28); + // IPCBaseAddr uint32 `mem:"[[Ruleset + 0x34] + 0x4] + 0x4"` + this.IPCBaseAddr = process.readInt( + process.readInt(process.readInt(rulesetAddr + 0x34) + 0x4) + 0x4 ); - if (chatTag !== '#multiplayer') { - continue; - } - const result: ITourneyManagetChatItem[] = []; + const channelsList = process.readPointer(this.ChatAreaAddr + 0x15); + const channelsItems = process.readInt(channelsList + 0x4); - const messagesAddr = process.readInt(channelAddr + 0x10); + const channelsLength = process.readInt(channelsItems + 0x4); + // Reversing array is needed for make more fast search, + // because osu creates 40 channels with language topics, lobby, osu, etc... (bancho announces this to you) + // and 41 is commonly for multiplayer in tourney client + for (let i = channelsLength - 1; i >= 0; i--) { + const current = + channelsItems + patterns.getLeaderStart() + 0x4 * i; - const messagesItems = process.readInt(messagesAddr + 0x4); - const messagesSize = process.readInt(messagesAddr + 0xc); + const channelAddr = process.readInt(current); + if (channelAddr === 0) { + continue; + } - if (this.Messages.length === messagesSize) { - // Not needed an update - continue; - } + const chatTag = process.readSharpString( + process.readInt(channelAddr + 0x4) + ); + if (chatTag !== '#multiplayer') { + continue; + } - for (let i = 0; i < messagesSize; i++) { - const current = - messagesItems + patterns.getLeaderStart() + 0x4 * i; - const currentItem = process.readInt(current); + const result: ITourneyManagetChatItem[] = []; - // [Base + 0x4] - const content = process.readSharpString( - process.readInt(currentItem + 0x4) - ); - // NOTE: Check for empty, and !mp commands - if (content === '' || content.startsWith('!mp')) { + const messagesAddr = process.readInt(channelAddr + 0x10); + + const messagesItems = process.readInt(messagesAddr + 0x4); + const messagesSize = process.readInt(messagesAddr + 0xc); + + if (this.Messages.length === messagesSize) { + // Not needed an update continue; } - // [Base + 0x8] - const timeName = process.readSharpString( - process.readInt(currentItem + 0x8) - ); - const [time, name] = timeName.split(' '); - result.push({ - time: time.trim(), - name: name.substring(0, name.length - 1), - content - }); + for (let i = 0; i < messagesSize; i++) { + const current = + messagesItems + patterns.getLeaderStart() + 0x4 * i; + const currentItem = process.readInt(current); + + // [Base + 0x4] + const content = process.readSharpString( + process.readInt(currentItem + 0x4) + ); + // NOTE: Check for empty, and !mp commands + if (content === '' || content.startsWith('!mp')) { + continue; + } + // [Base + 0x8] + const timeName = process.readSharpString( + process.readInt(currentItem + 0x8) + ); + const [time, name] = timeName.split(' '); + + result.push({ + time: time.trim(), + name: name.substring(0, name.length - 1), + content + }); + } + + this.Messages = result; + wLogger.debug('TMD(updateState) Chat Updated'); } - this.Messages = result; - wLogger.debug('TMD(updateState) Chat Updated'); + wLogger.debug(`TMD(updateState) updated`); + } catch (exc) { + wLogger.error(`TMD(updateState) ${(exc as any).message}`, exc); } - - wLogger.debug(`TMD(updateState) updated`); } } diff --git a/packages/tosu/src/entities/UserProfile/index.ts b/packages/tosu/src/entities/UserProfile/index.ts index e25bc3e8..850b670f 100644 --- a/packages/tosu/src/entities/UserProfile/index.ts +++ b/packages/tosu/src/entities/UserProfile/index.ts @@ -1,3 +1,5 @@ +import { wLogger } from '@tosu/common'; + import { AbstractEntity } from '../AbstractEntity'; import { DataRepo } from '../DataRepoList'; @@ -21,33 +23,37 @@ export class UserProfile extends AbstractEntity { } updateState() { - const { patterns, process } = this.services.getServices([ - 'patterns', - 'process' - ]); + try { + const { patterns, process } = this.services.getServices([ + 'patterns', + 'process' + ]); - const profileBase = process.readPointer( - patterns.getPattern('userProfilePtr') - ); + const profileBase = process.readPointer( + patterns.getPattern('userProfilePtr') + ); - this.rawLoginStatus = process.readPointer( - patterns.getPattern('rawLoginStatusPtr') - ); - this.rawBanchoStatus = process.readByte(profileBase + 0x88); + this.rawLoginStatus = process.readPointer( + patterns.getPattern('rawLoginStatusPtr') + ); + this.rawBanchoStatus = process.readByte(profileBase + 0x88); - this.name = process.readSharpString( - process.readInt(profileBase + 0x30) - ); - this.accuracy = process.readDouble(profileBase + 0x4); - this.rankedScore = process.readLong(profileBase + 0xc); - this.id = process.readInt(profileBase + 0x70); - this.level = process.readFloat(profileBase + 0x74); - this.playCount = process.readInt(profileBase + 0x7c); - this.playMode = process.readInt(profileBase + 0x80); - this.rank = process.readInt(profileBase + 0x84); - this.countryCode = process.readInt(profileBase + 0x98); - this.performancePoints = process.readShort(profileBase + 0x9c); - // ARGB, to convert use UserProfile.backgroundColour.toString(16) - this.backgroundColour = process.readUInt(profileBase + 0xac); + this.name = process.readSharpString( + process.readInt(profileBase + 0x30) + ); + this.accuracy = process.readDouble(profileBase + 0x4); + this.rankedScore = process.readLong(profileBase + 0xc); + this.id = process.readInt(profileBase + 0x70); + this.level = process.readFloat(profileBase + 0x74); + this.playCount = process.readInt(profileBase + 0x7c); + this.playMode = process.readInt(profileBase + 0x80); + this.rank = process.readInt(profileBase + 0x84); + this.countryCode = process.readInt(profileBase + 0x98); + this.performancePoints = process.readShort(profileBase + 0x9c); + // ARGB, to convert use UserProfile.backgroundColour.toString(16) + this.backgroundColour = process.readUInt(profileBase + 0xac); + } catch (exc) { + wLogger.error(`UP(updateState) ${(exc as any).message}`, exc); + } } } From ce1b0be67995bf9c12ceebf6d2acce2409739b97 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 05:49:23 +0300 Subject: [PATCH 27/33] fix: cache beatmap for editor --- .../tosu/src/entities/BeatmapPpData/index.ts | 58 +++++++------------ 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 6df47cbb..5184e98d 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -57,6 +57,7 @@ interface BeatmapPPTimings { export class BeatmapPPData extends AbstractEntity { beatmap?: Beatmap; + beatmapContent?: string; strains: number[]; strainsAll: BeatmapStrains; commonBPM: number; @@ -202,17 +203,15 @@ export class BeatmapPPData extends AbstractEntity { menuData.Path ); - let beatmapContent: string; - try { - beatmapContent = fs.readFileSync(mapPath, 'utf8'); + this.beatmapContent = fs.readFileSync(mapPath, 'utf8'); } catch (error) { wLogger.debug(`BPPD(updateMapMetadata) Can't get map: ${mapPath}`); return; } this.beatmap = new Beatmap({ - content: beatmapContent, + content: this.beatmapContent, ar: menuData.AR, od: menuData.OD, cs: menuData.CS, @@ -258,7 +257,7 @@ export class BeatmapPPData extends AbstractEntity { try { const decoder = new BeatmapDecoder(); - lazerBeatmap = decoder.decodeFromString(beatmapContent, { + lazerBeatmap = decoder.decodeFromString(this.beatmapContent, { parseEvents: true, parseTimingPoints: true, @@ -432,46 +431,29 @@ export class BeatmapPPData extends AbstractEntity { } updateEditorPP() { - if (!this.beatmap) { + if (!this.beatmap || !this.beatmapContent) { return; } const start_time = performance.now(); - const { allTimesData, menuData, settings } = this.services.getServices([ - 'allTimesData', - 'menuData', - 'settings', - 'beatmapPpData' - ]); + const { allTimesData } = this.services.getServices(['allTimesData']); - const mapPath = path.join( - settings.songsFolder, - menuData.Folder, - menuData.Path - ); + const decoder = new BeatmapDecoder().decodeFromString( + this.beatmapContent, + { + parseHitObjects: true, - let beatmapContent: string; - - try { - beatmapContent = fs.readFileSync(mapPath, 'utf8'); - } catch (error) { - wLogger.debug(`can't get map: ${mapPath}`); - return; - } - - const decoder = new BeatmapDecoder().decodeFromString(beatmapContent, { - parseHitObjects: true, - - parseColours: false, - parseDifficulty: false, - parseEditor: false, - parseEvents: true, - parseGeneral: false, - parseMetadata: false, - parseStoryboard: false, - parseTimingPoints: false - }); + parseColours: false, + parseDifficulty: false, + parseEditor: false, + parseEvents: true, + parseGeneral: false, + parseMetadata: false, + parseStoryboard: false, + parseTimingPoints: false + } + ); const beatmap_parse_time = performance.now(); wLogger.debug( From b8bbc5a2b47e7df18ea3d6537ef0aa7745082de2 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 05:50:06 +0300 Subject: [PATCH 28/33] hide updateBindingState too --- .../tosu/src/entities/AllTimesData/index.ts | 140 +++++++++--------- 1 file changed, 74 insertions(+), 66 deletions(-) diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 740b8557..5a32715d 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -385,7 +385,8 @@ export class AllTimesData extends AbstractEntity { } } - this.configStateErrorAttempts = 0; + if (this.configStateErrorAttempts != 0) + this.configStateErrorAttempts = 0; } catch (exc) { this.configStateErrorAttempts += 1; @@ -417,7 +418,8 @@ export class AllTimesData extends AbstractEntity { } } - this.bindingStateErrorAttempts = 0; + if (this.bindingStateErrorAttempts != 0) + this.bindingStateErrorAttempts = 0; } catch (exc) { this.bindingStateErrorAttempts += 1; @@ -431,75 +433,81 @@ export class AllTimesData extends AbstractEntity { } updateState() { - const { process, patterns, settings } = this.services.getServices([ - 'process', - 'patterns', - 'settings' - ]); + try { + const { process, patterns, settings } = this.services.getServices([ + 'process', + 'patterns', + 'settings' + ]); - const { - statusPtr, - playTimeAddr, - menuModsPtr, - chatCheckerAddr, - skinDataAddr, - settingsClassAddr, - configurationAddr, - bindingsAddr, - canRunSlowlyAddr, - gameTimePtr - } = patterns.getPatterns([ - 'statusPtr', - 'playTimeAddr', - 'menuModsPtr', - 'chatCheckerAddr', - 'skinDataAddr', - 'settingsClassAddr', - 'configurationAddr', - 'bindingsAddr', - 'canRunSlowlyAddr', - 'gameTimePtr' - ]); + const { + statusPtr, + playTimeAddr, + menuModsPtr, + chatCheckerAddr, + skinDataAddr, + settingsClassAddr, + configurationAddr, + bindingsAddr, + canRunSlowlyAddr, + gameTimePtr + } = patterns.getPatterns([ + 'statusPtr', + 'playTimeAddr', + 'menuModsPtr', + 'chatCheckerAddr', + 'skinDataAddr', + 'settingsClassAddr', + 'configurationAddr', + 'bindingsAddr', + 'canRunSlowlyAddr', + 'gameTimePtr' + ]); - const skinOsuAddr = process.readInt(skinDataAddr + 0x7); - if (skinOsuAddr === 0) { - return; - } - const skinOsuBase = process.readInt(skinOsuAddr); + const skinOsuAddr = process.readInt(skinDataAddr + 0x7); + if (skinOsuAddr === 0) { + return; + } + const skinOsuBase = process.readInt(skinOsuAddr); - // [Status - 0x4] - this.Status = process.readPointer(statusPtr); - // [PlayTime + 0x5] - this.PlayTime = process.readInt(process.readInt(playTimeAddr + 0x5)); - this.GameTime = process.readPointer(gameTimePtr); - // [MenuMods + 0x9] - this.MenuMods = process.readPointer(menuModsPtr); - // ChatChecker - 0x20 - this.ChatStatus = process.readByte(chatCheckerAddr - 0x20); - this.SkinFolder = process.readSharpString( - process.readInt(skinOsuBase + 0x44) - ); - this.IsWatchingReplay = process.readByte( - process.readInt(canRunSlowlyAddr + 0x46) - ); - this.SongsFolder = process.readSharpString( - process.readInt( + // [Status - 0x4] + this.Status = process.readPointer(statusPtr); + // [PlayTime + 0x5] + this.PlayTime = process.readInt( + process.readInt(playTimeAddr + 0x5) + ); + this.GameTime = process.readPointer(gameTimePtr); + // [MenuMods + 0x9] + this.MenuMods = process.readPointer(menuModsPtr); + // ChatChecker - 0x20 + this.ChatStatus = process.readByte(chatCheckerAddr - 0x20); + this.SkinFolder = process.readSharpString( + process.readInt(skinOsuBase + 0x44) + ); + this.IsWatchingReplay = process.readByte( + process.readInt(canRunSlowlyAddr + 0x46) + ); + this.SongsFolder = process.readSharpString( process.readInt( - process.readInt(settingsClassAddr + 0x8) + 0xb8 - ) + 0x4 - ) - ); + process.readInt( + process.readInt(settingsClassAddr + 0x8) + 0xb8 + ) + 0x4 + ) + ); - // this.updateConfigState( - // process, - // settings, - // process.readPointer(configurationAddr) - // ); + // this.updateConfigState( + // process, + // settings, + // process.readPointer(configurationAddr) + // ); - this.updateBindingState( - process, - settings, - process.readPointer(bindingsAddr) - ); + // this.updateBindingState( + // process, + // settings, + // process.readPointer(bindingsAddr) + // ); + } catch (exc) { + wLogger.error(`ATD(updateState) ${(exc as any).message}`, exc); + } } } From cd96e32b724f69d9562e52d6490e77fcd9b76215 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 07:03:16 +0300 Subject: [PATCH 29/33] cleanup --- .../objects/instanceManager/osuInstance.ts | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index a67692d3..b8335809 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -390,7 +390,6 @@ export class OsuInstance { } gamePlayData.updateKeyOverlay(); - // await break; default: // no-default @@ -421,19 +420,20 @@ export class OsuInstance { this.updateMapMetadata(entities); } - updateMapMetadata({ - menuData, - allTimesData, - settings, - gamePlayData, - beatmapPpData - }: { + updateMapMetadata(entries: { menuData: MenuData; allTimesData: AllTimesData; settings: Settings; gamePlayData: GamePlayData; beatmapPpData: BeatmapPPData; }) { + const { + menuData, + allTimesData, + settings, + gamePlayData, + beatmapPpData + } = entries; const currentMods = allTimesData.Status === 2 || allTimesData.Status === 7 ? gamePlayData.Mods @@ -459,13 +459,7 @@ export class OsuInstance { } setTimeout(() => { - this.updateMapMetadata({ - menuData, - allTimesData, - settings, - gamePlayData, - beatmapPpData - }); + this.updateMapMetadata(entries); }, config.pollRate); } From 1fee3daee6ecf6defc20d40c550e4b424bf4f03e Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 07:26:34 +0300 Subject: [PATCH 30/33] cleanup --- packages/tosu/src/objects/instanceManager/osuInstance.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index b8335809..9bb5e21f 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -200,7 +200,6 @@ export class OsuInstance { ); } - const s1 = performance.now(); if (!patternsRepo.checkIsBasesValid()) { throw new Error('Memory resolve failed'); } From 4b6dd42290d60a5d728572410e1a3c55e6233492 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 08:34:22 +0300 Subject: [PATCH 31/33] fix: return reading interface visible from settingsClassAddr --- packages/tosu/src/api/utils/buildResult.ts | 2 +- packages/tosu/src/api/utils/buildResultV2.ts | 2 +- packages/tosu/src/entities/AllTimesData/index.ts | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/tosu/src/api/utils/buildResult.ts b/packages/tosu/src/api/utils/buildResult.ts index a4290488..bd25ef60 100644 --- a/packages/tosu/src/api/utils/buildResult.ts +++ b/packages/tosu/src/api/utils/buildResult.ts @@ -76,7 +76,7 @@ export const buildResult = ( return { settings: { - showInterface: settings.showInterface, + showInterface: allTimesData.ShowInterface, folders: { game: settings.gameFolder, skin: settings.skinFolder, diff --git a/packages/tosu/src/api/utils/buildResultV2.ts b/packages/tosu/src/api/utils/buildResultV2.ts index 4456b8ff..2452feef 100644 --- a/packages/tosu/src/api/utils/buildResultV2.ts +++ b/packages/tosu/src/api/utils/buildResultV2.ts @@ -111,7 +111,7 @@ export const buildResult = ( playCount: 0 // need counting }, settings: { - interfaceVisible: settings.showInterface, + interfaceVisible: allTimesData.ShowInterface, replayUIVisible: gamePlayData.isReplayUiHidden == false, chatVisibilityStatus: { number: allTimesData.ChatStatus, diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 5a32715d..71e7b33a 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -495,6 +495,15 @@ export class AllTimesData extends AbstractEntity { ) ); + // [[SettingsClass + 0x8] + 0x4] + 0xC + this.ShowInterface = Boolean( + process.readByte( + process.readInt( + process.readInt(settingsClassAddr + 0x8) + 0x4 + ) + 0xc + ) + ); + // this.updateConfigState( // process, // settings, From eb5eb5df1a7f45d92cfe6287e416f54f3b5e9b63 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 08:34:32 +0300 Subject: [PATCH 32/33] reduce error spam --- packages/tosu/src/entities/BassDensityData/index.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/tosu/src/entities/BassDensityData/index.ts b/packages/tosu/src/entities/BassDensityData/index.ts index 56b4bf7b..57fb9d7d 100644 --- a/packages/tosu/src/entities/BassDensityData/index.ts +++ b/packages/tosu/src/entities/BassDensityData/index.ts @@ -9,6 +9,8 @@ export class BassDensityData extends AbstractEntity { currentAudioVelocity: number = 0.0; density: number = 0.0; + updateStateErrorAttempts: number = 0; + constructor(services: DataRepo) { super(services); } @@ -76,8 +78,15 @@ export class BassDensityData extends AbstractEntity { this.currentAudioVelocity = currentAudioVelocity; this.density = (1 + currentAudioVelocity) * 0.5; + + if (this.updateStateErrorAttempts != 0) + this.updateStateErrorAttempts = 0; } catch (exc) { - wLogger.error(`BDD(updateState) ${(exc as any).message}`, exc); + this.updateStateErrorAttempts += 1; + + if (this.updateStateErrorAttempts > 5) { + wLogger.error(`BDD(updateState) ${(exc as any).message}`, exc); + } } } } From 721152efbb3f4d29f1cf42f7e8a13ff45e08fa22 Mon Sep 17 00:00:00 2001 From: ck <21735205+cyperdark@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:06:28 +0300 Subject: [PATCH 33/33] to private --- packages/tosu/src/entities/AllTimesData/index.ts | 4 ++-- packages/tosu/src/entities/BassDensityData/index.ts | 4 ++-- packages/tosu/src/entities/MenuData/index.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index 71e7b33a..34894de3 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -28,8 +28,8 @@ export class AllTimesData extends AbstractEntity { bindingNames = new Map(); - configStateErrorAttempts: number = 0; - bindingStateErrorAttempts: number = 0; + private configStateErrorAttempts: number = 0; + private bindingStateErrorAttempts: number = 0; private configList: Record = { VolumeUniversal: { diff --git a/packages/tosu/src/entities/BassDensityData/index.ts b/packages/tosu/src/entities/BassDensityData/index.ts index 57fb9d7d..c09233d0 100644 --- a/packages/tosu/src/entities/BassDensityData/index.ts +++ b/packages/tosu/src/entities/BassDensityData/index.ts @@ -9,12 +9,12 @@ export class BassDensityData extends AbstractEntity { currentAudioVelocity: number = 0.0; density: number = 0.0; - updateStateErrorAttempts: number = 0; + private updateStateErrorAttempts: number = 0; constructor(services: DataRepo) { super(services); } - // FIXME + updateState() { try { const { process: osuProcess, patterns } = this.services.getServices( diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index 207b6ade..f8e9bd28 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -32,7 +32,7 @@ export class MenuData extends AbstractEntity { previousMD5: string = ''; - mp3ErrorAttempts: number = 0; + private mp3ErrorAttempts: number = 0; constructor(services: DataRepo) { super(services);