diff --git a/src/api/znc-proxy.ts b/src/api/znc-proxy.ts index 8e15480..79a0db1 100644 --- a/src/api/znc-proxy.ts +++ b/src/api/znc-proxy.ts @@ -1,6 +1,6 @@ import fetch from 'node-fetch'; import createDebug from 'debug'; -import { ActiveEvent, Announcements, CurrentUser, Event, Friend, PresencePermissions, User, WebService, WebServiceToken, ZncStatus, ZncSuccessResponse } from './znc-types.js'; +import { ActiveEvent, Announcements, CurrentUser, Event, Friend, Presence, PresencePermissions, User, WebService, WebServiceToken, ZncStatus, ZncSuccessResponse } from './znc-types.js'; import { ErrorResponse } from './util.js'; import ZncApi from './znc.js'; import { SavedToken, version } from '../util.js'; @@ -137,3 +137,37 @@ export default class ZncProxyApi implements ZncApi { return {nso, data}; } } + +export type PresenceUrlResponse = + Presence | {presence: Presence} | + CurrentUser | {user: CurrentUser} | + Friend | {friend: Friend}; + +export async function getPresenceFromUrl(presence_url: string) { + const response = await fetch(presence_url); + + debug('fetch %s %s, response %s', 'GET', presence_url, response.status); + + if (response.status !== 200) { + throw new ErrorResponse('[zncproxy] Unknown error', response, await response.text()); + } + + const data = await response.json() as PresenceUrlResponse; + + const user: CurrentUser | Friend | undefined = + 'user' in data ? data.user : + 'friend' in data ? data.friend : + 'nsaId' in data ? data : + undefined; + const presence: Presence = + 'presence' in data ? data.presence : + 'user' in data ? data.user.presence : + 'friend' in data ? data.friend.presence : + data; + + if (!('state' in presence)) { + throw new Error('Invalid presence data'); + } + + return [presence, user] as const; +} diff --git a/src/cli/nso/presence.ts b/src/cli/nso/presence.ts index 8c08fae..6f18b36 100644 --- a/src/cli/nso/presence.ts +++ b/src/cli/nso/presence.ts @@ -9,6 +9,7 @@ import { ArgumentsCamelCase, Argv, getToken, initStorage, LoopResult, SavedToken import { DiscordPresenceContext, getDiscordPresence, getInactiveDiscordPresence } from '../../discord/util.js'; import { handleEnableSplatNet2Monitoring, ZncNotifications } from './notify.js'; import { ErrorResponse } from '../../index.js'; +import { getPresenceFromUrl } from '../../api/znc-proxy.js'; const debug = createDebug('cli:nso:presence'); const debugProxy = createDebug('cli:nso:presence:proxy'); @@ -309,6 +310,7 @@ export class ZncDiscordPresence extends ZncNotifications { nsaid: this.presence_user!, user, }; + const discordpresence = 'name' in presence.game ? getDiscordPresence(presence.state, presence.game, presencecontext) : getInactiveDiscordPresence(presence.state, presence.logoutAt, presencecontext); @@ -455,11 +457,6 @@ export class ZncDiscordPresence extends ZncNotifications { } } -type PresenceUrlResponse = - Presence | {presence: Presence} | - CurrentUser | {user: CurrentUser} | - Friend | {friend: Friend}; - export class ZncProxyDiscordPresence extends ZncDiscordPresence { constructor( readonly argv: ArgumentsCamelCase, @@ -479,28 +476,7 @@ export class ZncProxyDiscordPresence extends ZncDiscordPresence { } async update() { - const response = await fetch(this.presence_url); - debugProxy('fetch %s %s, response %s', 'GET', this.presence_url, response.status); - if (response.status !== 200) { - console.error('Non-200 status code', await response.text()); - throw new Error('Unknown error'); - } - const data = await response.json() as PresenceUrlResponse; - - const user: CurrentUser | Friend | undefined = - 'user' in data ? data.user : - 'friend' in data ? data.friend : - 'nsaId' in data ? data : - undefined; - const presence: Presence = - 'presence' in data ? data.presence : - 'user' in data ? data.user.presence : - 'friend' in data ? data.friend.presence : - data; - - if (!('state' in presence)) { - throw new Error('Invalid presence data'); - } + const [presence, user] = await getPresenceFromUrl(this.presence_url); await this.updatePresenceForDiscord(presence, user); await this.updatePresenceForSplatNet2Monitor(presence, this.presence_url); diff --git a/src/cli/util/discord-activity.ts b/src/cli/util/discord-activity.ts index 336443d..10fe3e6 100644 --- a/src/cli/util/discord-activity.ts +++ b/src/cli/util/discord-activity.ts @@ -1,5 +1,6 @@ import createDebug from 'debug'; import fetch from 'node-fetch'; +import { getPresenceFromUrl } from '../../api/znc-proxy.js'; import { ActiveEvent, CurrentUser, Friend, Game, Presence, PresenceState } from '../../api/znc-types.js'; import type { Arguments as ParentArguments } from '../../cli.js'; import { DiscordPresenceContext, getDiscordPresence, getInactiveDiscordPresence } from '../../discord/util.js'; @@ -129,21 +130,6 @@ async function getPresenceFromJson(json: string) { return [presence] as const; } -async function getPresenceFromUrl(presence_url: string) { - const response = await fetch(presence_url); - - debug('fetch %s %s, response %s', 'GET', presence_url, response.status); - - if (response.status !== 200) { - console.error('Non-200 status code', await response.text()); - throw new Error('Unknown error'); - } - - const presence = await response.json() as Presence; - - return [presence] as const; -} - async function getPresenceFromZnc(argv: ArgumentsCamelCase) { const storage = await initStorage(argv.dataPath);