From 81a228cfb849a8d55290e230012188f693ebeea6 Mon Sep 17 00:00:00 2001 From: rosalina Date: Sat, 13 Jan 2024 01:59:04 -0500 Subject: [PATCH] event stream implementation (committing this right now because event streams seem broke) --- s3si.ts | 6 ++++-- src/app.ts | 30 +++++++++++++++++++++++++++++- src/constant.ts | 2 ++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/s3si.ts b/s3si.ts index cae0203..186c94e 100644 --- a/s3si.ts +++ b/s3si.ts @@ -4,7 +4,7 @@ import { flags } from "./deps.ts"; const parseArgs = (args: string[]) => { const parsed = flags.parse(args, { - string: ["profilePath", "exporter", "skipMode", "listMethod"], + string: ["profilePath", "exporter", "skipMode", "listMethod", "nxapiPresenceUrl"], boolean: ["help", "noProgress", "monitor", "withSummary"], alias: { "help": "h", @@ -15,6 +15,7 @@ const parseArgs = (args: string[]) => { "skipMode": ["s", "skip-mode"], "withSummary": "with-summary", "listMethod": "list-method", + "nxapiPresenceUrl": ["nxapi-presence-url", "nxapi-presence"] }, }); return parsed; @@ -39,7 +40,8 @@ Options: --skip-mode , -s Skip mode (default: null) ("vs", "coop") --with-summary Include summary in the output - --help Show this help message and exit`, + --help Show this help message and exit + --nxapi-presence-url Extends monitoring mode to use Nintendo Switch presence from nxapi`, ); Deno.exit(0); } diff --git a/src/app.ts b/src/app.ts index 4d5e9e6..94304cf 100644 --- a/src/app.ts +++ b/src/app.ts @@ -9,6 +9,7 @@ import { FileExporter } from "./exporters/file.ts"; import { delay, showError } from "./utils.ts"; import { GameFetcher } from "./GameFetcher.ts"; import { DEFAULT_ENV, Env } from "./env.ts"; +import { SPLATOON3_TITLE_ID } from "./constant.ts"; export type Opts = { profilePath: string; @@ -21,6 +22,7 @@ export type Opts = { cache?: Cache; stateBackend?: StateBackend; env: Env; + nxapiPresenceUrl?: string; }; export const DEFAULT_OPTS: Opts = { @@ -162,6 +164,7 @@ function progress({ total, currentUrl, done }: StepProgress): Progress { export class App { profile: Profile; env: Env; + isSplatoon3Active = false; constructor(public opts: Opts) { const stateBackend = opts.stateBackend ?? @@ -395,6 +398,29 @@ export class App { } } } + async monitorWithNxapi() { + this.env.logger.debug("Monitoring with nxapi presence"); + await this.exportOnce(); + this.env.logger.debug("Connecting to event stream"); + const nxapiEventStream = new EventSource(this.opts.nxapiPresenceUrl!); + nxapiEventStream.addEventListener("title", (event) => { + this.env.logger.debug("Received a new title event", event, event.data) + const eventData = JSON.parse(event.data) + const newStatus = eventData.id === SPLATOON3_TITLE_ID; + if (this.isSplatoon3Active !== newStatus) { + this.env.logger.log("Splatoon 3 presence changed, new status: ", newStatus ? "active" : "inactive"); + } + this.isSplatoon3Active = newStatus; + }) + + while (true) { + await this.countDown(this.profile.state.monitorInterval); + if (this.isSplatoon3Active) { + this.env.logger.log("Splatoon 3 is active, exporting data"); + await this.exportOnce(); + } + } + } async monitor() { while (true) { await this.exportOnce(); @@ -432,7 +458,9 @@ export class App { }); } - if (this.opts.monitor) { + if (this.opts.nxapiPresenceUrl) { + await this.monitorWithNxapi(); + } else if (this.opts.monitor) { await this.monitor(); } else { await this.exportOnce(); diff --git a/src/constant.ts b/src/constant.ts index ad0ec0a..ea945ec 100644 --- a/src/constant.ts +++ b/src/constant.ts @@ -116,3 +116,5 @@ export const SPLATNET3_STATINK_MAP: { 2: "high", }, }; + +export const SPLATOON3_TITLE_ID = "0100c2500fc20000";