mirror of
https://github.com/samuelthomas2774/nxapi.git
synced 2026-08-24 11:35:09 -05:00
Support user and friend URLs for --presence-url in nxapi util discord-activity
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user