From 62604f3c2a296be371d7949b709d33dd155331ca Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Fri, 1 Jul 2022 14:00:45 +0100 Subject: [PATCH] Add Discord presence/friend notification options to app context menus --- src/app/browser/discord/index.tsx | 3 +- src/app/main/index.ts | 2 + src/app/main/ipc.ts | 69 +++++++++++++++++++++++++++---- src/app/main/monitor.ts | 2 + src/common/presence.ts | 2 +- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/app/browser/discord/index.tsx b/src/app/browser/discord/index.tsx index 68fea61..a9acf26 100644 --- a/src/app/browser/discord/index.tsx +++ b/src/app/browser/discord/index.tsx @@ -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); diff --git a/src/app/main/index.ts b/src/app/main/index.ts index 474da07..7882d43 100644 --- a/src/app/main/index.ts +++ b/src/app/main/index.ts @@ -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) { diff --git a/src/app/main/ipc.ts b/src/app/main/ipc.ts index b025b97..a96bc1d 100644 --- a/src/app/main/ipc.ts +++ b/src/app/main/ipc.ts @@ -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 && diff --git a/src/app/main/monitor.ts b/src/app/main/monitor.ts index b28b2a9..aa50fc9 100644 --- a/src/app/main/monitor.ts +++ b/src/app/main/monitor.ts @@ -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) { diff --git a/src/common/presence.ts b/src/common/presence.ts index 32b209c..bb90732 100644 --- a/src/common/presence.ts +++ b/src/common/presence.ts @@ -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;