Client/index.js

170 lines
5.8 KiB
JavaScript

var app = require("app"); // Module to control application life.
var ipc = require("ipc");
var fs = require("fs-extra");
var os = require("os");
var dialog = require("dialog");
var BrowserWindow = require("browser-window");
var mainWindow = null;
app.commandLine.appendSwitch("--enable-npapi");
function initialSetup(firstTime) {
// Display a small window to inform the user that the app is working
setupWindow = new BrowserWindow({
width: 275,
height: 450,
resizable: false,
center: true,
frame: false,
});
setupWindow.loadUrl("file://" + __dirname + "/initialsetup.html");
// Exec installUnity.bat and wait for it to finish.
var child = require("child_process").spawn("cmd.exe", [
"/c",
"utils\\installUnity.bat",
]);
child.on("exit", function () {
console.log("Unity installed.");
if (!firstTime) {
// migration from pre-1.4
// Back everything up, just in case
fs.copySync(
app.getPath("userData") + "\\config.json",
app.getPath("userData") + "\\config.json.bak"
);
fs.copySync(
app.getPath("userData") + "\\servers.json",
app.getPath("userData") + "\\servers.json.bak"
);
fs.copySync(
app.getPath("userData") + "\\versions.json",
app.getPath("userData") + "\\versions.json.bak"
);
} else {
// first-time setup
// Copy default servers
fs.copySync(
__dirname + "\\defaults\\servers.json",
app.getPath("userData") + "\\servers.json"
);
}
// Copy default versions and config
fs.copySync(
__dirname + "\\defaults\\versions.json",
app.getPath("userData") + "\\versions.json"
);
fs.copySync(
__dirname + "\\defaults\\config.json",
app.getPath("userData") + "\\config.json"
);
console.log("JSON files copied.");
setupWindow.destroy();
showMainWindow();
});
}
ipc.on("exit", function (id) {
mainWindow.destroy();
});
// Quit when all windows are closed.
app.on("window-all-closed", function () {
if (process.platform != "darwin") app.quit();
});
app.on("ready", function () {
// Check just in case the user forgot to extract the zip.
zip_check = app.getPath("exe").includes(os.tmpdir());
if (zip_check) {
errormsg =
"It has been detected that OpenFusionClient is running from the TEMP folder.\n\n" +
"Please extract the entire Client folder to a location of your choice before starting OpenFusionClient.";
dialog.showErrorBox("Error!", errormsg);
return;
}
// Create the browser window.
mainWindow = new BrowserWindow({
width: 1280,
height: 720,
show: false,
"web-preferences": { plugins: true },
});
mainWindow.setMinimumSize(640, 480);
// Check for first run
var configPath = app.getPath("userData") + "\\config.json";
try {
if (!fs.existsSync(configPath)) {
console.log("Config file not found. Running initial setup.");
initialSetup(true);
} else {
var config = fs.readJsonSync(configPath);
if (!config["last-version-initialized"]) {
console.log("Pre-1.4 config detected. Running migration.");
initialSetup(false);
} else {
showMainWindow();
}
}
} catch (e) {
console.log("An error occurred while checking for the config.");
}
// Makes it so external links are opened in the system browser, not Electron
mainWindow.webContents.on("new-window", function (e, url) {
e.preventDefault();
require("shell").openExternal(url);
});
mainWindow.on("closed", function () {
mainWindow = null;
});
});
function showMainWindow() {
// Load the index.html of the app.
mainWindow.loadUrl("file://" + __dirname + "/index.html");
// Reduces white flash when opening the program
mainWindow.webContents.on("did-finish-load", function () {
mainWindow.show();
// everything's loaded, tell the renderer process to do its thing
mainWindow.webContents.executeJavaScript("loadConfig();");
mainWindow.webContents.executeJavaScript("loadGameVersions();");
mainWindow.webContents.executeJavaScript("loadServerList();");
});
mainWindow.webContents.on("plugin-crashed", function () {
console.log("Unity Web Player crashed.");
});
mainWindow.webContents.on("will-navigate", function (evt, url) {
evt.preventDefault();
// TODO: showMessageBox rather than showErrorBox?
switch (url) {
case "https://audience.fusionfall.com/ff/regWizard.do?_flowId=fusionfall-registration-flow":
errormsg =
"The register page is currently unimplemented.\n\n" +
'You can still create an account: type your desired username and password into the provided boxes and click "Log In". ' +
"Your account will then be automatically created on the server. \nBe sure to remember these details!";
dialog.showErrorBox("Sorry!", errormsg);
break;
case "https://audience.fusionfall.com/ff/login.do":
dialog.showErrorBox(
"Sorry!",
"Account management is not available."
);
break;
case "http://forums.fusionfall.com/":
require("shell").openExternal("https://discord.gg/DYavckB");
break;
default:
mainWindow.webContents.loadURL(url);
}
});
}