mirror of
https://github.com/samuelthomas2774/nxapi.git
synced 2026-10-26 19:43:11 -05:00
Add CoralApiInterface
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
import { BrowserWindow, clipboard, dialog, IpcMain, KeyboardEvent, Menu, MenuItem, ShareMenu, SharingItem, shell, systemPreferences } from './electron.js';
|
||||
import * as util from 'node:util';
|
||||
import { BrowserWindow, clipboard, IpcMain, KeyboardEvent, Menu, MenuItem, ShareMenu, SharingItem, shell, systemPreferences } from './electron.js';
|
||||
import { User } from 'discord-rpc';
|
||||
import openWebService, { QrCodeReaderOptions, WebServiceIpc, WebServiceValidationError } from './webservices.js';
|
||||
import { createModalWindow, createWindow, getWindowConfiguration, setWindowHeight } from './windows.js';
|
||||
import openWebService, { handleOpenWebServiceError, QrCodeReaderOptions, WebServiceIpc, WebServiceValidationError } from './webservices.js';
|
||||
import { createModalWindow, getWindowConfiguration, setWindowHeight } from './windows.js';
|
||||
import { askAddNsoAccount, askAddPctlAccount } from './na-auth.js';
|
||||
import { App } from './index.js';
|
||||
import { EmbeddedPresenceMonitor } from './monitor.js';
|
||||
@@ -60,21 +59,9 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) {
|
||||
ipcMain.handle('nxapi:coral:webservices', (e, token: string) => store.users.get(token).then(u => u.getWebServices()));
|
||||
ipcMain.handle('nxapi:coral:openwebservice', (e, webservice: WebService, token: string, qs?: string) =>
|
||||
store.users.get(token).then(u => openWebService(store, token, u.nso, u.data, webservice, qs)
|
||||
.catch(err => err instanceof WebServiceValidationError ? dialog.showMessageBox(BrowserWindow.fromWebContents(e.sender)!, {
|
||||
type: 'error',
|
||||
message: (err instanceof Error ? err.name : 'Error') + ' opening web service',
|
||||
detail: (err instanceof Error ? err.stack ?? err.message : err) + '\n\n' + util.inspect({
|
||||
webservice: {
|
||||
id: webservice.id,
|
||||
name: webservice.name,
|
||||
uri: webservice.uri,
|
||||
},
|
||||
qs,
|
||||
user_na_id: u.data.user.id,
|
||||
user_nsa_id: u.data.nsoAccount.user.nsaId,
|
||||
user_coral_id: u.data.nsoAccount.user.id,
|
||||
}, {compact: true}),
|
||||
}) : null)));
|
||||
.catch(err => err instanceof WebServiceValidationError ?
|
||||
handleOpenWebServiceError(err, webservice, qs, u.data, BrowserWindow.fromWebContents(e.sender)!) :
|
||||
null)));
|
||||
ipcMain.handle('nxapi:coral:activeevent', (e, token: string) => store.users.get(token).then(u => u.getActiveEvent()));
|
||||
ipcMain.handle('nxapi:coral:friendcodeurl', (e, token: string) => store.users.get(token).then(u => u.nso.getFriendCodeUrl()));
|
||||
ipcMain.handle('nxapi:coral:friendcode', (e, token: string, friendcode: string, hash?: string) => store.users.get(token).then(u => u.nso.getUserByFriendCode(friendcode, hash)));
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import { app, dialog, Menu, Tray, nativeImage, MenuItem, BrowserWindow, KeyboardEvent } from './electron.js';
|
||||
import { app, Menu, Tray, nativeImage, MenuItem, BrowserWindow, KeyboardEvent } from './electron.js';
|
||||
import path from 'node:path';
|
||||
import * as util from 'node:util';
|
||||
import { askAddNsoAccount, askAddPctlAccount } from './na-auth.js';
|
||||
import { App } from './index.js';
|
||||
import openWebService, { WebServiceValidationError } from './webservices.js';
|
||||
import openWebService, { handleOpenWebServiceError, WebServiceValidationError } from './webservices.js';
|
||||
import { EmbeddedPresenceMonitor, EmbeddedProxyPresenceMonitor } from './monitor.js';
|
||||
import { createModalWindow, createWindow } from './windows.js';
|
||||
import { createModalWindow } from './windows.js';
|
||||
import { WindowType } from '../common/types.js';
|
||||
import CoralApi from '../../api/coral.js';
|
||||
import { CoralApiInterface } from '../../api/coral.js';
|
||||
import { WebService } from '../../api/coral-types.js';
|
||||
import { SavedToken } from '../../common/auth/coral.js';
|
||||
import { SavedMoonToken } from '../../common/auth/moon.js';
|
||||
@@ -155,11 +154,7 @@ export default class MenuApp {
|
||||
|
||||
await this.openWebService(token, nso, data, webservice);
|
||||
} catch (err) {
|
||||
dialog.showMessageBox({
|
||||
type: 'error',
|
||||
message: (err instanceof Error ? err.name : 'Error') + ' opening web service',
|
||||
detail: '' + (err instanceof Error ? err.stack ?? err.message : err),
|
||||
});
|
||||
handleOpenWebServiceError(err, webservice);
|
||||
}
|
||||
},
|
||||
}));
|
||||
@@ -168,26 +163,13 @@ export default class MenuApp {
|
||||
return items;
|
||||
}
|
||||
|
||||
async openWebService(token: string, nso: CoralApi, data: SavedToken, webservice: WebService) {
|
||||
async openWebService(token: string, coral: CoralApiInterface, data: SavedToken, webservice: WebService) {
|
||||
try {
|
||||
await openWebService(this.app.store, token, nso, data, webservice);
|
||||
await openWebService(this.app.store, token, coral, data, webservice);
|
||||
} catch (err) {
|
||||
if (!(err instanceof WebServiceValidationError)) return;
|
||||
|
||||
dialog.showMessageBox({
|
||||
type: 'error',
|
||||
message: (err instanceof Error ? err.name : 'Error') + ' opening web service',
|
||||
detail: (err instanceof Error ? err.stack ?? err.message : err) + '\n\n' + util.inspect({
|
||||
webservice: {
|
||||
id: webservice.id,
|
||||
name: webservice.name,
|
||||
uri: webservice.uri,
|
||||
},
|
||||
user_na_id: data.user.id,
|
||||
user_nsa_id: data.nsoAccount.user.nsaId,
|
||||
user_coral_id: data.nsoAccount.user.id,
|
||||
}, {compact: true}),
|
||||
});
|
||||
handleOpenWebServiceError(err, webservice, undefined, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { app, BrowserWindow, clipboard, dialog, IpcMainInvokeEvent, nativeImage, nativeTheme, Notification, ShareMenu, shell, WebContents } from './electron.js';
|
||||
import { app, BrowserWindow, clipboard, dialog, IpcMainInvokeEvent, MessageBoxOptions, nativeImage, nativeTheme, Notification, ShareMenu, shell, WebContents } from './electron.js';
|
||||
import * as path from 'node:path';
|
||||
import { constants } from 'node:fs';
|
||||
import * as fs from 'node:fs/promises';
|
||||
@@ -10,7 +10,7 @@ import { createWebServiceWindow } from './windows.js';
|
||||
import { askUserForUri } from './util.js';
|
||||
import type { DownloadImagesRequest, NativeShareRequest, NativeShareUrlRequest, QrCodeReaderCameraOptions, QrCodeReaderCheckinOptions, QrCodeReaderCheckinResult, QrCodeReaderPhotoLibraryOptions, SendMessageOptions } from '../preload-webservice/znca-js-api.js';
|
||||
import createDebug from '../../util/debug.js';
|
||||
import CoralApi from '../../api/coral.js';
|
||||
import { CoralApiInterface, CoralAuthData } from '../../api/coral.js';
|
||||
import { CurrentUser, WebService, WebServiceToken } from '../../api/coral-types.js';
|
||||
import { NintendoAccountUser } from '../../api/na.js';
|
||||
import { SavedToken } from '../../common/auth/coral.js';
|
||||
@@ -18,10 +18,10 @@ import { SavedToken } from '../../common/auth/coral.js';
|
||||
const debug = createDebug('app:main:webservices');
|
||||
|
||||
const windows = new Map<string, BrowserWindow>();
|
||||
const windowapi = new WeakMap<WebContents, [Store, string, CoralApi, SavedToken, WebService]>();
|
||||
const windowapi = new WeakMap<WebContents, [Store, string, CoralApiInterface, SavedToken, WebService]>();
|
||||
|
||||
export default async function openWebService(
|
||||
store: Store, token: string, nso: CoralApi, data: SavedToken,
|
||||
store: Store, token: string, coral: CoralApiInterface, data: SavedToken,
|
||||
webservice: WebService, qs?: string
|
||||
) {
|
||||
const windowid = data.nsoAccount.user.nsaId + ':' + webservice.id;
|
||||
@@ -54,7 +54,7 @@ export default async function openWebService(
|
||||
const window = createWebServiceWindow(data.nsoAccount.user.nsaId, webservice, user_title_prefix);
|
||||
|
||||
windows.set(windowid, window);
|
||||
windowapi.set(window.webContents, [store, token, nso, data, webservice]);
|
||||
windowapi.set(window.webContents, [store, token, coral, data, webservice]);
|
||||
|
||||
window.on('closed', () => {
|
||||
windows.delete(windowid);
|
||||
@@ -85,7 +85,7 @@ export default async function openWebService(
|
||||
return {action: 'deny'};
|
||||
});
|
||||
|
||||
const webserviceToken = await getWebServiceToken(nso, webservice, data.user, data.nsoAccount.user, window);
|
||||
const webserviceToken = await getWebServiceToken(coral, webservice, qs, data, window);
|
||||
|
||||
const url = new URL(webservice.uri);
|
||||
url.search = new URLSearchParams({
|
||||
@@ -120,31 +120,19 @@ export default async function openWebService(
|
||||
export class WebServiceValidationError extends Error {}
|
||||
|
||||
async function getWebServiceToken(
|
||||
nso: CoralApi, webservice: WebService,
|
||||
user: NintendoAccountUser, nsoAccount: CurrentUser,
|
||||
window: BrowserWindow
|
||||
coral: CoralApiInterface,
|
||||
webservice: WebService, qs: string | undefined,
|
||||
auth_data: CoralAuthData,
|
||||
window: BrowserWindow,
|
||||
): Promise<WebServiceToken> {
|
||||
try {
|
||||
return await nso.getWebServiceToken(webservice.id);
|
||||
return await coral.getWebServiceToken(webservice.id);
|
||||
} catch (err) {
|
||||
const result = await dialog.showMessageBox(window, {
|
||||
type: 'error',
|
||||
message: (err instanceof Error ? err.name : 'Error') + ' requesting web service token',
|
||||
detail: (err instanceof Error ? err.stack ?? err.message : err) + '\n\n' + util.inspect({
|
||||
webservice: {
|
||||
id: webservice.id,
|
||||
name: webservice.name,
|
||||
uri: webservice.uri,
|
||||
},
|
||||
user_na_id: user.id,
|
||||
user_nsa_id: nsoAccount.nsaId,
|
||||
user_coral_id: nsoAccount.id,
|
||||
}, {compact: true}),
|
||||
buttons: ['Retry', 'Close ' + webservice.name, 'Ignore'],
|
||||
});
|
||||
const result = await handleOpenWebServiceError(err, webservice, qs, auth_data, window,
|
||||
['Retry', 'Close ' + webservice.name, 'Ignore']);
|
||||
|
||||
if (result.response === 0) {
|
||||
return getWebServiceToken(nso, webservice, user, nsoAccount, window);
|
||||
return getWebServiceToken(coral, webservice, qs, auth_data, window);
|
||||
}
|
||||
if (result.response === 1) {
|
||||
window.close();
|
||||
@@ -197,6 +185,38 @@ function askUserForWebServiceUri(store: Store, uri: string) {
|
||||
return askUserForUri(store, uri, 'Select a user to open this web service');
|
||||
}
|
||||
|
||||
export async function handleOpenWebServiceError(
|
||||
err: unknown,
|
||||
webservice: WebService, qs?: string, auth_data?: CoralAuthData,
|
||||
window?: BrowserWindow, buttons?: string[],
|
||||
) {
|
||||
const data = {
|
||||
webservice: {
|
||||
id: webservice.id,
|
||||
name: webservice.name,
|
||||
uri: webservice.uri,
|
||||
},
|
||||
qs,
|
||||
user_na_id: auth_data?.user.id,
|
||||
user_nsa_id: auth_data?.nsoAccount.user.nsaId,
|
||||
user_coral_id: auth_data?.nsoAccount.user.id,
|
||||
};
|
||||
|
||||
const options: MessageBoxOptions = {
|
||||
type: 'error',
|
||||
message: (err instanceof Error ? err.name : 'Error') + ' opening web service',
|
||||
detail: (err instanceof Error ? err.stack ?? err.message : err) +
|
||||
'\n\n' + util.inspect(data, {compact: true}),
|
||||
buttons,
|
||||
};
|
||||
|
||||
const result = window ?
|
||||
await dialog.showMessageBox(window, options) :
|
||||
await dialog.showMessageBox(options);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export interface WebServiceData {
|
||||
webservice: WebService;
|
||||
url: string;
|
||||
@@ -223,6 +243,7 @@ export class WebServiceIpc {
|
||||
store: data[0],
|
||||
token: data[1],
|
||||
nso: data[2],
|
||||
data: data[3],
|
||||
nintendoAccountToken: data[3].nintendoAccountToken,
|
||||
user: data[3].user,
|
||||
nsoAccount: data[3].nsoAccount,
|
||||
@@ -319,12 +340,12 @@ export class WebServiceIpc {
|
||||
}
|
||||
|
||||
async requestGameWebToken(event: IpcMainInvokeEvent): Promise<string> {
|
||||
const {nso, user, nsoAccount, webservice} = this.getWindowData(event.sender);
|
||||
const {nso, data, nsoAccount, webservice} = this.getWindowData(event.sender);
|
||||
const window = BrowserWindow.fromWebContents(event.sender)!;
|
||||
|
||||
debug('Web service %s, user %s, called requestGameWebToken', webservice.name, nsoAccount.user.name);
|
||||
|
||||
const webserviceToken = await getWebServiceToken(nso, webservice, user, nsoAccount.user, window);
|
||||
const webserviceToken = await getWebServiceToken(nso, webservice, undefined, data, window);
|
||||
|
||||
return webserviceToken.accessToken;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user