Add support for all Discord presence options for the app

This commit is contained in:
Samuel Elliott 2022-06-18 12:46:03 +01:00
parent 7e5988685d
commit 1fc6cce5a6
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
4 changed files with 60 additions and 22 deletions

View File

@ -21,23 +21,25 @@ export enum ZncStatus {
FORBIDDEN = 9405,
UNAUTHORISED = 9406,
NSA_NOT_LINKED = 9407,
USER_NOT_FOUND = 9408,
APPLICATION_ID_NOT_SUPPORTED = 9409,
EVENT_NOT_ACTIVATED_ERROR = 9412,
NOT_JOINED_VOICE_CHAT_ERROR = 9416,
DUPLICATE_APPLICATION_ID_ERROR = 9417,
OPERATION_NOT_ALLOWED_ERROR = 9422,
RATING_AGE_ERROR = 9423,
USER_NOT_ACTIVATED_ERROR = 9424,
INVITATION_LIMIT_EXCEEDED_ERROR = 9425,
MULTIPLE_LOGIN_ERROR = 9426,
EVENT_NOT_FOUND = 9411,
EVENT_NOT_ACTIVATED = 9412,
NOT_JOINED_VOICE_CHAT = 9416,
DUPLICATE_APPLICATION_ID = 9417,
OPERATION_NOT_ALLOWED = 9422,
RATING_AGE = 9423,
USER_NOT_ACTIVATED = 9424,
INVITATION_LIMIT_EXCEEDED = 9425,
MULTIPLE_LOGIN = 9426,
UPGRADE_REQUIRED = 9427,
ACCOUNT_DISABLED_ERROR = 9428,
MEMBERSHIP_REQUIRED_ERROR = 9450,
SERVICE_CLOSED_ERROR = 9499,
ACCOUNT_DISABLED = 9428,
MEMBERSHIP_REQUIRED = 9450,
SERVICE_CLOSED = 9499,
INTERNAL_SERVER_ERROR = 9500,
SERVICE_UNAVAILABLE = 9501,
MAINTENANCE_ERROR = 9511,
UNEXPECTED_ERROR = 9599,
MAINTENANCE = 9511,
UNEXPECTED = 9599,
// UNKNOWN = -1,
}

View File

@ -1,3 +1,5 @@
import { DiscordPresencePlayTime } from '../../discord/util.js';
export enum WindowType {
MAIN_WINDOW = 'App',
FRIEND = 'Friend',
@ -19,6 +21,11 @@ export interface DiscordPresenceConfiguration {
source: DiscordPresenceSource;
/** Discord user ID */
user?: string;
/** Friend code in the format "0000-0000-0000" */
friend_code?: string;
show_console_online?: boolean;
show_active_event?: boolean;
show_play_time?: DiscordPresencePlayTime;
}
export type DiscordPresenceSource = DiscordPresenceSourceZnc | DiscordPresenceSourceUrl;

View File

@ -200,8 +200,7 @@ export class Store extends EventEmitter {
monitor.friend_notifications = user.friend_notifications;
if (monitor.presence_user) {
monitor.discord_client_filter = state.discord_presence?.user ?
monitors.createDiscordClientFilter(state.discord_presence.user) : undefined;
monitors.setDiscordPresenceConfigurationForMonitor(monitor, state.discord_presence!);
this.emit('update-discord-presence-source', monitors.getDiscordPresenceSource());
}
});
@ -214,8 +213,8 @@ export class Store extends EventEmitter {
if (state.discord_presence && 'url' in state.discord_presence.source) {
try {
const monitor = await monitors.startUrl(state.discord_presence.source.url);
monitor.discord_client_filter = state.discord_presence?.user ?
monitors.createDiscordClientFilter(state.discord_presence.user) : undefined;
monitors.setDiscordPresenceConfigurationForMonitor(monitor, state.discord_presence);
this.emit('update-discord-presence-source', monitors.getDiscordPresenceSource());
} catch (err) {
dialog.showErrorBox('Error restoring monitor for presence URL ' + state.discord_presence.source.url,
err instanceof Error ? err.stack ?? err.message : err as any);

View File

@ -8,7 +8,7 @@ import { LoopResult } from '../../util/loop.js';
import { tryGetNativeImageFromUrl } from './util.js';
import { App } from './index.js';
import { DiscordPresenceConfiguration, DiscordPresenceSource } from '../common/types.js';
import { DiscordPresence } from '../../discord/util.js';
import { DiscordPresence, DiscordPresencePlayTime } from '../../discord/util.js';
import { DiscordRpcClient } from '../../discord/rpc.js';
const debug = createDebug('app:main:monitor');
@ -115,6 +115,11 @@ export class PresenceMonitorManager {
return {
source,
user: this.getDiscordClientFilterConfiguration(monitor.discord_client_filter),
friend_code: monitor.show_friend_code && monitor.force_friend_code ?
monitor.force_friend_code.id : undefined,
show_console_online: monitor.show_console_online,
show_active_event: monitor.show_active_event,
show_play_time: monitor.show_play_time,
};
}
@ -122,13 +127,26 @@ export class PresenceMonitorManager {
if (!config) return this.setDiscordPresenceSource(null);
await this.setDiscordPresenceSource(config.source, monitor => {
monitor.discord_client_filter = config.user ? this.createDiscordClientFilter(config.user) : undefined;
this.setDiscordPresenceConfigurationForMonitor(monitor, config);
monitor.skipIntervalInCurrentLoop();
});
await this.app.store.saveMonitorState(this);
}
setDiscordPresenceConfigurationForMonitor(
monitor: EmbeddedPresenceMonitor | EmbeddedProxyPresenceMonitor,
config: DiscordPresenceConfiguration
) {
monitor.discord_client_filter = config.user ? this.createDiscordClientFilter(config.user) : undefined;
monitor.show_friend_code = !!config.friend_code;
monitor.force_friend_code = config.friend_code ?
{id: config.friend_code, regenerable: false, regenerableAt: 0} : undefined;
monitor.show_console_online = config.show_console_online ?? false;
if (monitor instanceof ZncDiscordPresence) monitor.show_active_event = config.show_active_event ?? false;
monitor.show_play_time = config.show_play_time ?? DiscordPresencePlayTime.DETAILED_PLAY_TIME_SINCE;
}
private discord_client_filter_config = new WeakMap<
Exclude<ZncDiscordPresence['discord_client_filter'], undefined>,
/** Discord user ID */
@ -171,7 +189,7 @@ export class PresenceMonitorManager {
) {
await this.start(source.na_id, monitor => {
monitor.presence_user = source.friend_nsa_id ?? monitor.data.nsoAccount.user.nsaId;
monitor.discord_client_filter = existing.discord_client_filter;
this.setDiscordPresenceSourceCopyConfiguration(monitor, existing);
callback?.call(null, monitor);
monitor.skipIntervalInCurrentLoop();
});
@ -207,13 +225,13 @@ export class PresenceMonitorManager {
if (source && 'na_id' in source) {
await this.start(source.na_id, monitor => {
monitor.presence_user = source.friend_nsa_id ?? monitor.data.nsoAccount.user.nsaId;
monitor.discord_client_filter = existing?.discord_client_filter;
if (existing) this.setDiscordPresenceSourceCopyConfiguration(monitor, existing);
callback?.call(null, monitor);
monitor.skipIntervalInCurrentLoop();
});
} else if (source && 'url' in source) {
const monitor = await this.startUrl(source.url);
monitor.discord_client_filter = existing?.discord_client_filter;
if (existing) this.setDiscordPresenceSourceCopyConfiguration(monitor, existing);
callback?.call(null, monitor);
}
@ -223,6 +241,18 @@ export class PresenceMonitorManager {
this.app.store.emit('update-discord-presence-source', source);
}
}
private setDiscordPresenceSourceCopyConfiguration(
monitor: EmbeddedPresenceMonitor | EmbeddedProxyPresenceMonitor,
existing: EmbeddedPresenceMonitor | EmbeddedProxyPresenceMonitor,
) {
monitor.discord_client_filter = existing.discord_client_filter;
monitor.show_friend_code = existing.show_friend_code && !!existing.force_friend_code;
monitor.force_friend_code = existing.force_friend_code;
monitor.show_console_online = existing.show_console_online;
if (monitor instanceof ZncDiscordPresence) monitor.show_active_event = existing.show_active_event;
monitor.show_play_time = existing.show_play_time;
}
}
export class EmbeddedPresenceMonitor extends ZncDiscordPresence {