mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-30 03:23:48 +01:00
Merge pull request #2312 from MartinFournier/feature/electron-toasts
Electron toasts & terminal access + information
This commit is contained in:
commit
1372c28a1b
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
const { app, BrowserWindow, shell } = require("electron");
|
const { app, BrowserWindow } = require("electron");
|
||||||
const log = require("electron-log");
|
const log = require("electron-log");
|
||||||
const utils = require("./utils");
|
const utils = require("./utils");
|
||||||
const achievements = require("./achievements");
|
const achievements = require("./achievements");
|
||||||
@ -31,9 +31,7 @@ async function createWindow(killall) {
|
|||||||
|
|
||||||
// and open every other protocols on the browser
|
// and open every other protocols on the browser
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
shell.openExternal(url);
|
utils.openExternal(url);
|
||||||
|
|
||||||
global.app_playerOpenedExternalLink = true;
|
|
||||||
});
|
});
|
||||||
window.webContents.backgroundThrottling = false;
|
window.webContents.backgroundThrottling = false;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
const { Menu, clipboard } = require("electron");
|
const { Menu, clipboard, dialog } = require("electron");
|
||||||
const log = require("electron-log");
|
const log = require("electron-log");
|
||||||
const api = require("./api-server");
|
const api = require("./api-server");
|
||||||
const utils = require("./utils");
|
const utils = require("./utils");
|
||||||
@ -54,12 +54,21 @@ function getMenu(window) {
|
|||||||
{
|
{
|
||||||
label: api.isListening() ? 'Disable Server' : 'Enable Server',
|
label: api.isListening() ? 'Disable Server' : 'Enable Server',
|
||||||
click: (async () => {
|
click: (async () => {
|
||||||
|
let success = false;
|
||||||
try {
|
try {
|
||||||
await api.toggleServer();
|
await api.toggleServer();
|
||||||
|
success = true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error(error);
|
log.error(error);
|
||||||
utils.showErrorBox('Error Toggling Server', error);
|
utils.showErrorBox('Error Toggling Server', error);
|
||||||
}
|
}
|
||||||
|
if (success && api.isListening()) {
|
||||||
|
utils.writeToast(window, "Started API Server", "success");
|
||||||
|
} else if (success && !api.isListening()) {
|
||||||
|
utils.writeToast(window, "Stopped API Server", "success");
|
||||||
|
} else {
|
||||||
|
utils.writeToast(window, 'Error Toggling Server', "error");
|
||||||
|
}
|
||||||
refreshMenu(window);
|
refreshMenu(window);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -67,6 +76,11 @@ function getMenu(window) {
|
|||||||
label: api.isAutostart() ? 'Disable Autostart' : 'Enable Autostart',
|
label: api.isAutostart() ? 'Disable Autostart' : 'Enable Autostart',
|
||||||
click: (async () => {
|
click: (async () => {
|
||||||
api.toggleAutostart();
|
api.toggleAutostart();
|
||||||
|
if (api.isAutostart()) {
|
||||||
|
utils.writeToast(window, "Enabled API Server Autostart", "success");
|
||||||
|
} else {
|
||||||
|
utils.writeToast(window, "Disabled API Server Autostart", "success");
|
||||||
|
}
|
||||||
refreshMenu(window);
|
refreshMenu(window);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -76,8 +90,33 @@ function getMenu(window) {
|
|||||||
const token = api.getAuthenticationToken();
|
const token = api.getAuthenticationToken();
|
||||||
log.log('Wrote authentication token to clipboard');
|
log.log('Wrote authentication token to clipboard');
|
||||||
clipboard.writeText(token);
|
clipboard.writeText(token);
|
||||||
|
utils.writeToast(window, "Copied Authentication Token to Clipboard", "info");
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'separator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Information',
|
||||||
|
click: () => {
|
||||||
|
dialog.showMessageBox({
|
||||||
|
type: 'info',
|
||||||
|
title: 'Bitburner > API Server Information',
|
||||||
|
message: 'The API Server is used to write script files to your in-game home.',
|
||||||
|
detail: 'There is an official Visual Studio Code extension that makes use of that feature.\n\n' +
|
||||||
|
'It allows you to write your script file in an external IDE and have them pushed over to the game automatically.\n' +
|
||||||
|
'If you want more information, head over to: https://github.com/bitburner-official/bitburner-vscode.',
|
||||||
|
buttons: ['Dismiss', 'Open Extension Link (GitHub)'],
|
||||||
|
defaultId: 0,
|
||||||
|
cancelId: 0,
|
||||||
|
noLink: true,
|
||||||
|
}).then(({response}) => {
|
||||||
|
if (response === 1) {
|
||||||
|
utils.openExternal('https://github.com/bitburner-official/bitburner-vscode');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
const { app, dialog } = require("electron");
|
const { app, dialog, shell } = require("electron");
|
||||||
const log = require("electron-log");
|
const log = require("electron-log");
|
||||||
|
|
||||||
const achievements = require("./achievements");
|
const achievements = require("./achievements");
|
||||||
@ -93,7 +93,23 @@ async function exportSave(window) {
|
|||||||
.executeJavaScript(`${exportSaveFromIndexedDb.toString()}; exportSaveFromIndexedDb();`, true);
|
.executeJavaScript(`${exportSaveFromIndexedDb.toString()}; exportSaveFromIndexedDb();`, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function writeTerminal(window, message, type = null) {
|
||||||
|
await window.webContents
|
||||||
|
.executeJavaScript(`window.appNotifier.terminal("${message}", "${type}");`, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function writeToast(window, message, type = "info", duration = 2000) {
|
||||||
|
await window.webContents
|
||||||
|
.executeJavaScript(`window.appNotifier.toast("${message}", "${type}", ${duration});`, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
function openExternal(url) {
|
||||||
|
shell.openExternal(url);
|
||||||
|
global.app_playerOpenedExternalLink = true;
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
reloadAndKill, showErrorBox, exportSave,
|
reloadAndKill, showErrorBox, exportSave,
|
||||||
attachUnresponsiveAppHandler, detachUnresponsiveAppHandler,
|
attachUnresponsiveAppHandler, detachUnresponsiveAppHandler,
|
||||||
|
openExternal, writeTerminal, writeToast,
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,9 @@ import { Server } from "./Server/Server";
|
|||||||
import { Router } from "./ui/GameRoot";
|
import { Router } from "./ui/GameRoot";
|
||||||
import { Page } from "./ui/Router";
|
import { Page } from "./ui/Router";
|
||||||
import { removeLeadingSlash } from "./Terminal/DirectoryHelpers";
|
import { removeLeadingSlash } from "./Terminal/DirectoryHelpers";
|
||||||
|
import { Terminal } from './Terminal';
|
||||||
|
import { SnackbarEvents } from "./ui/React/Snackbar";
|
||||||
|
import { IMap } from "./types";
|
||||||
|
|
||||||
interface Achievement {
|
interface Achievement {
|
||||||
ID: string;
|
ID: string;
|
||||||
@ -414,9 +417,14 @@ function calculateAchievements(): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function initElectron(): void {
|
export function initElectron(): void {
|
||||||
|
const userAgent = navigator.userAgent.toLowerCase();
|
||||||
|
if (userAgent.indexOf(' electron/') > -1) {
|
||||||
|
// Electron-specific code
|
||||||
setAchievements([]);
|
setAchievements([]);
|
||||||
initWebserver();
|
initWebserver();
|
||||||
setInterval(calculateAchievements, 5000);
|
setInterval(calculateAchievements, 5000);
|
||||||
|
initAppNotifier();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initWebserver(): void {
|
function initWebserver(): void {
|
||||||
@ -451,3 +459,27 @@ function initWebserver(): void {
|
|||||||
return "not a script file";
|
return "not a script file";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Expose certain alert functions to allow the wrapper to sends message to the game
|
||||||
|
function initAppNotifier(): void {
|
||||||
|
const funcs = {
|
||||||
|
terminal: (message: string, type?: string) => {
|
||||||
|
const typesFn: IMap<(s: string) => void> = {
|
||||||
|
info: Terminal.info,
|
||||||
|
warn: Terminal.warn,
|
||||||
|
error: Terminal.error,
|
||||||
|
success: Terminal.success
|
||||||
|
};
|
||||||
|
let fn;
|
||||||
|
if (type) fn = typesFn[type];
|
||||||
|
if (!fn) fn = Terminal.print;
|
||||||
|
fn.bind(Terminal)(message);
|
||||||
|
},
|
||||||
|
toast: (message: string, type: "info" | "success" | "warning" | "error" , duration = 2000) =>
|
||||||
|
SnackbarEvents.emit(message, type, duration),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Will be consumud by the electron wrapper.
|
||||||
|
// @ts-ignore
|
||||||
|
window.appNotifier = funcs;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user