Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const { app, BrowserWindow, ipcMain, dialog, Tray } = require("electron");
- const path = require("path");
- const { spawn, exec } = require("child_process");
- const fs = require("fs");
- const archiver = require('archiver');
- const { verificarFlatpaks } = require(path.join(process.resourcesPath, "utils", "verificar-flatpaks"));
- let tray = null;
- let mainWindow;
- const horasPath = path.join(app.getPath('home'), '.raijinplus/hoursPlay/horas.json');
- function getTop10Horas() {
- return new Promise((resolve, reject) => {
- fs.readFile(horasPath, 'utf-8', (err, data) => {
- if (err) return reject("Erro ao ler horas.json: " + err);
- try {
- const json = JSON.parse(data);
- const listaOrdenada = Object.entries(json)
- .sort((a, b) => b[1].tempoHoras - a[1].tempoHoras)
- .slice(0, 10)
- .map(([jogo, info]) => ({
- nome: jogo,
- plataforma: info.plataforma,
- tempo: info.tempoHoras
- }));
- resolve(listaOrdenada);
- } catch (e) {
- reject("Erro ao processar JSON: " + e);
- }
- });
- });
- }
- ipcMain.handle('get-top-horas', async () => {
- return await getTop10Horas();
- });
- ipcMain.on("minimizar", () => {
- const win = BrowserWindow.getFocusedWindow();
- if (win) win.minimize();
- });
- ipcMain.on("fechar", () => {
- const win = BrowserWindow.getFocusedWindow();
- if (win) win.close();
- });
- ipcMain.handle("verificar-flatpaks", async () => {
- return new Promise(resolve => {
- verificarFlatpaks(faltando => resolve(faltando));
- });
- });
- ipcMain.handle("instalar-flatpaks", async () => {
- const isPackaged = app.isPackaged;
- const scriptInstalador = isPackaged
- ? path.join(process.resourcesPath, "scripts", "instalador-flatpaks.sh")
- : path.join(__dirname, "scripts", "instalador-flatpaks.sh");
- const scriptPermissoes = isPackaged
- ? path.join(process.resourcesPath, "scripts", "permissoes-flatpaks.sh")
- : path.join(__dirname, "scripts", "permissoes-flatpaks.sh");
- const win = BrowserWindow.getAllWindows()[0];
- return new Promise((resolve, reject) => {
- const processo = spawn("bash", [scriptInstalador]);
- processo.stdout.on("data", (data) => {
- const linhas = data.toString().split("\n");
- linhas.forEach(linha => {
- if (linha.startsWith("INSTALANDO:")) {
- const [, atual, total, nome] = linha.match(/^INSTALANDO:(\d+)\/(\d+):(.+)$/) || [];
- if (atual && total && nome) {
- win.webContents.send("progresso-flatpak", {
- atual: parseInt(atual),
- total: parseInt(total),
- nome: nome.trim()
- });
- }
- }
- });
- });
- processo.stderr.on("data", data => {
- console.warn("Erro Flatpak:", data.toString());
- });
- processo.on("close", (code) => {
- if (code !== 0) return reject("Erro ao instalar Flatpaks");
- const permissao = spawn("bash", [scriptPermissoes]);
- permissao.stdout.on("data", (data) => {
- const linhas = data.toString().split("\n");
- linhas.forEach(linha => {
- if (linha.startsWith("PERMISSAO:")) {
- const [, atual, total, nome] = linha.match(/^PERMISSAO:(\d+)\/(\d+):(.+)$/) || [];
- if (atual && total && nome) {
- win.webContents.send("progresso-flatpak", {
- atual: parseInt(atual),
- total: parseInt(total),
- nome: "Permissão: " + nome.trim()
- });
- }
- }
- });
- });
- permissao.on("close", (codigo) => {
- if (codigo === 0) {
- win.webContents.send("progresso-flatpak", { concluido: true });
- resolve();
- } else {
- reject("Erro ao aplicar permissões.");
- }
- });
- });
- });
- });
- ipcMain.handle("instalar-flatpak-unico", async (_, nome) => {
- return new Promise((resolve, reject) => {
- const comando = `flatpak install -y flathub ${nome}`;
- exec(comando, (err, stdout, stderr) => {
- if (err) return reject(stderr);
- resolve(stdout);
- });
- });
- });
- function createWindow() {
- const isDev = !app.isPackaged;
- const win = new BrowserWindow({
- width: 900,
- height: 720,
- icon: path.join(__dirname, 'assets/icone.png'),
- resizable: true,
- frame: false, // <- isso remove a moldura da janela do sistema
- titleBarStyle: "hidden", // opcional no macOS
- webPreferences: {
- preload: path.join(__dirname, "preload.js"),
- contextIsolation: true,
- sandbox: true,
- enableRemoteModule: false,
- },
- show: false
- });
- win.once('ready-to-show', () => {
- win.show(); // Mostre a janela quando estiver pronta
- });
- win.removeMenu();
- win.webContents.closeDevTools();
- if (isDev) {
- win.loadURL(MAIN_WINDOW_WEBPACK_ENTRY);
- } else {
- win.loadFile(path.join(__dirname, "index.html"));
- }
- tray = new Tray(path.join(__dirname, 'assets/icone.png'));
- tray.setToolTip('RaijinPlus');
- tray.on('click', () => {
- win.isVisible() ? win.focus() : win.show();
- });
- }
- ipcMain.on("alternar-fullscreen", () => {
- const janela = BrowserWindow.getFocusedWindow();
- if (janela) {
- const estaEmTelaCheia = janela.isFullScreen();
- janela.setFullScreen(!estaEmTelaCheia);
- }
- });
- ipcMain.handle("executar-python", async (_, { plataforma, pasta }) => {
- const script = app.isPackaged
- ? path.join(process.resourcesPath, "scripts", "gerar_lista_jogos.py")
- : path.join(__dirname, "src", "scripts", "gerar_lista_jogos.py");
- return new Promise((resolve, reject) => {
- const processo = spawn("python3", [script, plataforma, pasta]);
- processo.stdout.on("data", (data) => {
- const linhas = data.toString().split("\n");
- linhas.forEach((linha) => {
- if (linha.startsWith("PROGRESS:")) {
- const [, atual, total, etapa] = linha.match(/^PROGRESS:(\d+)\/(\d+):(.*)$/) || [];
- if (atual && total && etapa) {
- BrowserWindow.getAllWindows()[0].webContents.send("atualizar-progresso", {
- atual: parseInt(atual),
- total: parseInt(total),
- etapa: etapa.trim()
- });
- }
- }
- });
- });
- processo.stderr.on("data", (data) => {
- console.error("Erro do Python:", data.toString());
- });
- processo.on("close", (code) => {
- if (code === 0) resolve();
- else reject(`Python saiu com código ${code}`);
- });
- });
- });
- ipcMain.handle("executar-shell", async (_, { plataforma, caminho }) => {
- const isDev = !app.isPackaged;
- const script = app.isPackaged
- ? path.join(process.resourcesPath, "scripts", "executaveis", `${plataforma}-launcher.sh`)
- : path.join(__dirname, "src", "scripts", "executaveis", `${plataforma}-launcher.sh`);
- if (!fs.existsSync(script)) throw new Error(`Script não encontrado: ${script}`);
- return new Promise((resolve, reject) => {
- const processo = spawn("sh", [script, caminho]);
- processo.on("close", (code) => {
- if (code === 0) resolve();
- else reject(new Error(`Script terminou com código ${code}`));
- });
- processo.stderr.on("data", (data) => {
- console.error("Erro do shell:", data.toString());
- });
- });
- });
- ipcMain.handle("ler-json", async (_, plataforma) => {
- const jsonPath = path.join(app.getPath("home"), ".raijinplus", "json", `${plataforma}.json`);
- const dados = fs.readFileSync(jsonPath, "utf8");
- return JSON.parse(dados);
- });
- app.whenReady().then(createWindow);
- app.on("window-all-closed", () => {
- if (process.platform !== "darwin") app.quit();
- });
- // Função de backup
- function fazerBackup(nome, caminho) {
- return new Promise((resolve, reject) => {
- const origem = path.join(process.env.HOME || process.env.USERPROFILE, '.raijinplus');
- const destino = path.join(caminho, `${nome}.zip`);
- // Cria o diretório de destino se não existir
- if (!fs.existsSync(caminho)) {
- fs.mkdirSync(caminho, { recursive: true });
- }
- const output = fs.createWriteStream(destino);
- const archive = archiver('zip', { zlib: { level: 9 } });
- output.on('close', () => {
- resolve(`Backup criado com sucesso: ${destino} (${archive.pointer()} bytes)`);
- });
- archive.on('error', err => reject('Erro ao criar backup: ' + err));
- archive.pipe(output);
- archive.on('progress', (data) => {
- const { entries, fs } = data;
- BrowserWindow.getAllWindows()[0].webContents.send('progresso-backup', {
- arquivos: entries.processed,
- total: entries.total,
- tamanho: fs.processed
- });
- });
- archive.directory(origem, false); // inclui a pasta inteira
- archive.finalize();
- });
- }
- // Ouvir o evento de backup do Renderer
- ipcMain.handle('backup', async (event, nome, caminho) => {
- try {
- const mensagem = await fazerBackup(nome, caminho);
- return mensagem;
- } catch (error) {
- return error;
- }
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement