Support user and friend URLs for --presence-url in nxapi util discord-activity

This commit is contained in:
Samuel Elliott
2022-05-01 23:03:34 +01:00
parent 587bf9d5d0
commit c3d138a93a
3 changed files with 39 additions and 43 deletions

View File

@@ -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;
}

View File

@@ -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<Arguments>,
@@ -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);

View File

@@ -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<Arguments>) {
const storage = await initStorage(argv.dataPath);