Add Discord presence/friend notification options to app context menus

This commit is contained in:
Samuel Elliott 2022-07-01 14:00:45 +01:00
parent 8d38b94dcd
commit 62604f3c2a
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
5 changed files with 66 additions and 12 deletions

View File

@ -37,8 +37,7 @@ export default function DiscordSetup(props: DiscordSetupProps) {
useEffect(() => {
if (!discord_presence_source) {
setSelectedMode(props.users?.length && props.friend_nsa_id ?
DiscordSourceType.CORAL : DiscordSourceType.NONE);
setSelectedMode(props.friend_nsa_id ? DiscordSourceType.CORAL : DiscordSourceType.NONE);
} else if ('na_id' in discord_presence_source) {
setSelectedMode(DiscordSourceType.CORAL);
setSelectedUserId(discord_presence_source.na_id);

View File

@ -247,6 +247,7 @@ export class Store extends EventEmitter {
detail: err instanceof Error ? err.stack ?? err.message : err as any,
type: 'error',
buttons: ['OK', 'Retry'],
defaultId: 1,
});
if (response === 1) {
@ -273,6 +274,7 @@ export class Store extends EventEmitter {
detail: err instanceof Error ? err.stack ?? err.message : err as any,
type: 'error',
buttons: ['OK', 'Retry'],
defaultId: 1,
});
if (response === 1) {

View File

@ -15,6 +15,7 @@ import { getDiscordRpcClients } from '../../discord/rpc.js';
import { defaultTitle } from '../../discord/titles.js';
import type { FriendProps } from '../browser/friend/index.js';
import type { DiscordSetupProps } from '../browser/discord/index.js';
import { EmbeddedPresenceMonitor } from './monitor.js';
const debug = createDebug('app:main:ipc');
@ -137,15 +138,9 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) {
ipcMain.handle('nxapi:misc:share', (e, item: SharingItem) =>
new ShareMenu(item).popup({window: BrowserWindow.fromWebContents(e.sender)!}));
ipcMain.handle('nxapi:menu:user', (e, user: NintendoAccountUser, nso?: CurrentUser, moon?: boolean) => (Menu.buildFromTemplate([
new MenuItem({label: 'Nintendo Account ID: ' + user.id, enabled: false}),
...(nso ? [
new MenuItem({label: 'Coral ID: ' + nso.id, enabled: false}),
new MenuItem({label: 'NSA ID: ' + nso.nsaId, enabled: false}),
] : []),
new MenuItem({type: 'separator'}),
new MenuItem({label: 'Use the nxapi command to remove this user', enabled: false}),
]).popup({window: BrowserWindow.fromWebContents(e.sender)!}), undefined));
ipcMain.handle('nxapi:menu:user', (e, user: NintendoAccountUser, nso?: CurrentUser, moon?: boolean) =>
(buildUserMenu(appinstance, user, nso, moon, BrowserWindow.fromWebContents(e.sender) ?? undefined)
.popup({window: BrowserWindow.fromWebContents(e.sender)!}), undefined));
ipcMain.handle('nxapi:menu:add-user', e => (Menu.buildFromTemplate([
new MenuItem({label: 'Add Nintendo Switch Online account', click: () => askAddNsoAccount(storage)}),
new MenuItem({label: 'Add Nintendo Switch Parental Controls account', click: () => askAddPctlAccount(storage)}),
@ -182,6 +177,62 @@ function sendToAllWindows(channel: string, ...args: any[]) {
}
}
function buildUserMenu(app: App, user: NintendoAccountUser, nso?: CurrentUser, moon?: boolean, window?: BrowserWindow) {
const dm = app.monitors.getActiveDiscordPresenceMonitor();
const monitor = app.monitors.monitors.find(m => m instanceof EmbeddedPresenceMonitor && m.data.user.id === user.id);
return Menu.buildFromTemplate([
new MenuItem({label: 'Nintendo Account ID: ' + user.id, enabled: false}),
...(nso ? [
new MenuItem({label: 'Coral ID: ' + nso.id, enabled: false}),
new MenuItem({label: 'NSA ID: ' + nso.nsaId, enabled: false}),
new MenuItem({type: 'separator'}),
...(monitor?.presence_user === nso.nsaId ? [
new MenuItem({label: 'Disable Discord presence',
click: () => app.menu?.setActiveDiscordPresenceUser(null)}),
] : monitor?.presence_user ? [
new MenuItem({label: 'Discord presence enabled for ' +
monitor.user?.friends.result.friends.find(f => f.nsaId === monitor.presence_user)?.name ??
monitor.presence_user,
enabled: false}),
new MenuItem({label: 'Disable Discord presence',
click: () => app.menu?.setActiveDiscordPresenceUser(null)}),
] : dm?.presence_user === nso.nsaId ? [
new MenuItem({label: 'Discord presence enabled using ' +
dm.data.user.nickname +
(dm.data.user.nickname!== dm.data.nsoAccount.user.name ? '/' + dm.data.nsoAccount.user.name : ''),
enabled: false}),
new MenuItem({label: 'Disable Discord presence',
click: () => app.menu?.setActiveDiscordPresenceUser(null)}),
] : [
new MenuItem({label: 'Enable Discord presence for this user...',
click: () => createWindow(WindowType.DISCORD_PRESENCE, {
friend_nsa_id: nso.nsaId,
}, {
parent: window,
modal: true,
show: false,
maximizable: false,
minimizable: false,
width: 560,
height: 300,
minWidth: 450,
maxWidth: 700,
minHeight: 300,
maxHeight: 300,
})}),
]),
new MenuItem({label: 'Enable friend notifications', type: 'checkbox',
checked: monitor?.friend_notifications,
click: () => app.menu?.setFriendNotificationsActive(user.id, !monitor?.friend_notifications)}),
new MenuItem({label: 'Update now', enabled: !!monitor,
click: () => monitor?.skipIntervalInCurrentLoop(true)}),
] : []),
new MenuItem({type: 'separator'}),
new MenuItem({label: 'Use the nxapi command to remove this user', enabled: false}),
]);
}
function buildFriendMenu(app: App, user: NintendoAccountUser, nso: CurrentUser, friend: Friend) {
const discord_presence_source = app.monitors.getDiscordPresenceSource();
const discord_presence_active = !!discord_presence_source && 'na_id' in discord_presence_source &&

View File

@ -270,11 +270,13 @@ export class PresenceMonitorManager {
(err.stack ?? err.message),
type: 'error',
buttons: ['OK', 'Retry'],
defaultId: 0,
} : {
message: 'Error updating presence monitor',
detail: err instanceof Error ? err.stack ?? err.message : err as any,
type: 'error',
buttons: ['OK', 'Retry'],
defaultId: 0,
});
if (response === 1) {

View File

@ -316,7 +316,7 @@ export class ZncProxyDiscordPresence extends Loop {
readonly friend_notifications = false;
update_interval = 30;
presence_user: string | null = null;
presence_user: null = null;
discord_preconnect = false;
show_friend_code = false;
force_friend_code: CurrentUser['links']['friendCode'] | undefined = undefined;