2019-06-26 22:09:01 +02:00
|
|
|
import * as path from "path";
|
|
|
|
import * as electron from "electron";
|
|
|
|
import * as fs from "fs-extra";
|
|
|
|
|
|
|
|
import {BrowserWindow, ipcMain as ipc} from "electron";
|
|
|
|
import {Arguments, process_args} from "../../shared/process-arguments";
|
|
|
|
import {main_window} from "../main_window";
|
2019-06-30 17:24:10 +02:00
|
|
|
import * as winmgr from "../window";
|
2019-06-26 22:09:01 +02:00
|
|
|
|
2019-07-03 13:16:38 +02:00
|
|
|
export interface UserData {
|
|
|
|
session_id: string;
|
|
|
|
username: string;
|
|
|
|
|
|
|
|
application_data: string;
|
|
|
|
application_data_sign: string;
|
|
|
|
}
|
|
|
|
|
2019-06-26 22:09:01 +02:00
|
|
|
let current_window: BrowserWindow;
|
|
|
|
let _current_data: UserData;
|
|
|
|
|
|
|
|
function update_data(data?: UserData) {
|
|
|
|
_current_data = data;
|
|
|
|
electron.webContents.getAllWebContents().forEach(content => {
|
|
|
|
content.send('teaforo-update', data);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function config_file_path() {
|
|
|
|
return path.join(electron.app.getPath('userData'), "forum_data.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
async function load_data() {
|
|
|
|
try {
|
|
|
|
const file = config_file_path();
|
|
|
|
if((await fs.stat(file)).isFile()) {
|
|
|
|
const raw_data = await fs.readFile(config_file_path());
|
|
|
|
const data = JSON.parse(raw_data.toString());
|
|
|
|
update_data(data as UserData);
|
|
|
|
console.log("Initialized forum account from config!");
|
|
|
|
} else {
|
|
|
|
console.log("Missing forum config file. Ignoring forum auth");
|
|
|
|
}
|
|
|
|
} catch(error) {
|
|
|
|
console.error("Failed to load forum account connection: %o", error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function save_data() {
|
|
|
|
const file = config_file_path();
|
|
|
|
try {
|
|
|
|
await fs.ensureFile(file);
|
|
|
|
} catch(error) {
|
|
|
|
console.error("Failed to ensure forum config file as file %o", error);
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
await fs.writeJSON(file, _current_data);
|
|
|
|
} catch(error) {
|
|
|
|
console.error("Failed to save forum config: %o", error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function open_login(enforce: boolean = false) : Promise<UserData> {
|
|
|
|
if(_current_data && !enforce) return Promise.resolve(_current_data);
|
|
|
|
|
|
|
|
if(current_window) {
|
|
|
|
current_window.close();
|
|
|
|
current_window = undefined;
|
|
|
|
}
|
|
|
|
current_window = new BrowserWindow({
|
|
|
|
width: 400,
|
|
|
|
height: 400,
|
|
|
|
show: true,
|
|
|
|
parent: main_window,
|
|
|
|
webPreferences: {
|
2019-06-30 17:24:10 +02:00
|
|
|
webSecurity: false,
|
|
|
|
nodeIntegration: true
|
2019-06-26 22:09:01 +02:00
|
|
|
},
|
|
|
|
});
|
|
|
|
current_window.setMenu(null);
|
2019-06-30 17:24:10 +02:00
|
|
|
winmgr.apply_bounds('forum-manager', current_window);
|
|
|
|
winmgr.track_bounds('forum-manager', current_window);
|
2019-06-26 22:09:01 +02:00
|
|
|
console.log("Main: " + main_window);
|
|
|
|
|
|
|
|
current_window.loadFile(path.join(path.dirname(module.filename), "ui", "index.html"));
|
|
|
|
if(process_args.has_flag(...Arguments.DEV_TOOLS))
|
|
|
|
current_window.webContents.openDevTools();
|
|
|
|
|
|
|
|
return new Promise<UserData>((resolve, reject) => {
|
|
|
|
let response = false;
|
|
|
|
ipc.once("teaforo-callback", (event, data) => {
|
|
|
|
if(response) return;
|
|
|
|
response = true;
|
|
|
|
current_window.close();
|
|
|
|
current_window = undefined;
|
|
|
|
|
|
|
|
update_data(data);
|
|
|
|
save_data();
|
|
|
|
if(data)
|
|
|
|
resolve(data);
|
|
|
|
else
|
|
|
|
reject();
|
|
|
|
});
|
|
|
|
|
|
|
|
current_window.on('closed', event => {
|
|
|
|
if(response) return;
|
|
|
|
response = true;
|
|
|
|
|
|
|
|
current_window = undefined;
|
|
|
|
reject();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function current_data() : UserData | undefined {
|
|
|
|
return this._current_data;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function logout() {
|
|
|
|
update_data(undefined);
|
|
|
|
save_data();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function initialize() {
|
|
|
|
await load_data();
|
|
|
|
}
|
|
|
|
|
|
|
|
export function setup() {
|
|
|
|
ipc.on('teaforo-login', event => {
|
|
|
|
open_login().catch(error => {}); //TODO may local notify
|
|
|
|
});
|
|
|
|
|
|
|
|
ipc.on('teaforo-logout', event => {
|
|
|
|
logout();
|
|
|
|
});
|
|
|
|
ipc.on('teaforo-update', event => {
|
|
|
|
update_data(_current_data);
|
|
|
|
});
|
|
|
|
}
|