Advertisement
Dragonbj

meu main

May 2nd, 2025
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const { app, BrowserWindow, ipcMain, dialog, Tray } = require("electron");
  2. const path = require("path");
  3. const { spawn, exec } = require("child_process");
  4. const fs = require("fs");
  5. const archiver = require('archiver');
  6. const { verificarFlatpaks } = require(path.join(process.resourcesPath, "utils", "verificar-flatpaks"));
  7.  
  8. let tray = null;
  9. let mainWindow;
  10.  
  11. const horasPath = path.join(app.getPath('home'), '.raijinplus/hoursPlay/horas.json');
  12.  
  13. function getTop10Horas() {
  14.   return new Promise((resolve, reject) => {
  15.     fs.readFile(horasPath, 'utf-8', (err, data) => {
  16.       if (err) return reject("Erro ao ler horas.json: " + err);
  17.  
  18.       try {
  19.         const json = JSON.parse(data);
  20.         const listaOrdenada = Object.entries(json)
  21.           .sort((a, b) => b[1].tempoHoras - a[1].tempoHoras)
  22.           .slice(0, 10)
  23.           .map(([jogo, info]) => ({
  24.             nome: jogo,
  25.             plataforma: info.plataforma,
  26.             tempo: info.tempoHoras
  27.           }));
  28.  
  29.         resolve(listaOrdenada);
  30.       } catch (e) {
  31.         reject("Erro ao processar JSON: " + e);
  32.       }
  33.     });
  34.   });
  35. }
  36.  
  37. ipcMain.handle('get-top-horas', async () => {
  38.   return await getTop10Horas();
  39. });
  40.  
  41. ipcMain.on("minimizar", () => {
  42.   const win = BrowserWindow.getFocusedWindow();
  43.   if (win) win.minimize();
  44. });
  45.  
  46. ipcMain.on("fechar", () => {
  47.   const win = BrowserWindow.getFocusedWindow();
  48.   if (win) win.close();
  49. });
  50.  
  51. ipcMain.handle("verificar-flatpaks", async () => {
  52.   return new Promise(resolve => {
  53.     verificarFlatpaks(faltando => resolve(faltando));
  54.   });
  55. });
  56.  
  57. ipcMain.handle("instalar-flatpaks", async () => {
  58.   const isPackaged = app.isPackaged;
  59.  
  60.   const scriptInstalador = isPackaged
  61.     ? path.join(process.resourcesPath, "scripts", "instalador-flatpaks.sh")
  62.     : path.join(__dirname, "scripts", "instalador-flatpaks.sh");
  63.  
  64.   const scriptPermissoes = isPackaged
  65.     ? path.join(process.resourcesPath, "scripts", "permissoes-flatpaks.sh")
  66.     : path.join(__dirname, "scripts", "permissoes-flatpaks.sh");
  67.  
  68.   const win = BrowserWindow.getAllWindows()[0];
  69.  
  70.   return new Promise((resolve, reject) => {
  71.     const processo = spawn("bash", [scriptInstalador]);
  72.  
  73.     processo.stdout.on("data", (data) => {
  74.       const linhas = data.toString().split("\n");
  75.       linhas.forEach(linha => {
  76.         if (linha.startsWith("INSTALANDO:")) {
  77.           const [, atual, total, nome] = linha.match(/^INSTALANDO:(\d+)\/(\d+):(.+)$/) || [];
  78.           if (atual && total && nome) {
  79.             win.webContents.send("progresso-flatpak", {
  80.               atual: parseInt(atual),
  81.               total: parseInt(total),
  82.               nome: nome.trim()
  83.             });
  84.           }
  85.         }
  86.       });
  87.     });
  88.  
  89.     processo.stderr.on("data", data => {
  90.       console.warn("Erro Flatpak:", data.toString());
  91.     });
  92.  
  93.     processo.on("close", (code) => {
  94.       if (code !== 0) return reject("Erro ao instalar Flatpaks");
  95.  
  96.       const permissao = spawn("bash", [scriptPermissoes]);
  97.  
  98.       permissao.stdout.on("data", (data) => {
  99.         const linhas = data.toString().split("\n");
  100.         linhas.forEach(linha => {
  101.           if (linha.startsWith("PERMISSAO:")) {
  102.             const [, atual, total, nome] = linha.match(/^PERMISSAO:(\d+)\/(\d+):(.+)$/) || [];
  103.             if (atual && total && nome) {
  104.               win.webContents.send("progresso-flatpak", {
  105.                 atual: parseInt(atual),
  106.                 total: parseInt(total),
  107.                 nome: "Permissão: " + nome.trim()
  108.               });
  109.             }
  110.           }
  111.         });
  112.       });
  113.  
  114.       permissao.on("close", (codigo) => {
  115.         if (codigo === 0) {
  116.           win.webContents.send("progresso-flatpak", { concluido: true });
  117.           resolve();
  118.         } else {
  119.           reject("Erro ao aplicar permissões.");
  120.         }
  121.       });
  122.     });
  123.   });
  124. });
  125.  
  126. ipcMain.handle("instalar-flatpak-unico", async (_, nome) => {
  127.   return new Promise((resolve, reject) => {
  128.     const comando = `flatpak install -y flathub ${nome}`;
  129.     exec(comando, (err, stdout, stderr) => {
  130.       if (err) return reject(stderr);
  131.       resolve(stdout);
  132.     });
  133.   });
  134. });
  135.  
  136. function createWindow() {
  137.   const isDev = !app.isPackaged;
  138.  
  139.   const win = new BrowserWindow({
  140.   width: 900,
  141.   height: 720,
  142.   icon: path.join(__dirname, 'assets/icone.png'),
  143.   resizable: true,
  144.   frame: false, // <- isso remove a moldura da janela do sistema
  145.   titleBarStyle: "hidden", // opcional no macOS
  146.   webPreferences: {
  147.     preload: path.join(__dirname, "preload.js"),
  148.     contextIsolation: true,
  149.     sandbox: true,
  150.     enableRemoteModule: false,
  151.   },
  152.   show: false
  153. });
  154.  
  155.   win.once('ready-to-show', () => {
  156.     win.show(); // Mostre a janela quando estiver pronta
  157. });
  158.  
  159.   win.removeMenu();
  160.  
  161.   win.webContents.closeDevTools();
  162.  
  163.   if (isDev) {
  164.     win.loadURL(MAIN_WINDOW_WEBPACK_ENTRY);
  165.   } else {
  166.     win.loadFile(path.join(__dirname, "index.html"));
  167.   }
  168.  
  169.   tray = new Tray(path.join(__dirname, 'assets/icone.png'));
  170.   tray.setToolTip('RaijinPlus');
  171.   tray.on('click', () => {
  172.     win.isVisible() ? win.focus() : win.show();
  173.   });
  174. }
  175.  
  176. ipcMain.on("alternar-fullscreen", () => {
  177.   const janela = BrowserWindow.getFocusedWindow();
  178.   if (janela) {
  179.     const estaEmTelaCheia = janela.isFullScreen();
  180.     janela.setFullScreen(!estaEmTelaCheia);
  181.   }
  182. });
  183.  
  184. ipcMain.handle("executar-python", async (_, { plataforma, pasta }) => {
  185.   const script = app.isPackaged
  186.     ? path.join(process.resourcesPath, "scripts", "gerar_lista_jogos.py")
  187.     : path.join(__dirname, "src", "scripts", "gerar_lista_jogos.py");
  188.  
  189.   return new Promise((resolve, reject) => {
  190.     const processo = spawn("python3", [script, plataforma, pasta]);
  191.  
  192.     processo.stdout.on("data", (data) => {
  193.       const linhas = data.toString().split("\n");
  194.       linhas.forEach((linha) => {
  195.         if (linha.startsWith("PROGRESS:")) {
  196.           const [, atual, total, etapa] = linha.match(/^PROGRESS:(\d+)\/(\d+):(.*)$/) || [];
  197.           if (atual && total && etapa) {
  198.             BrowserWindow.getAllWindows()[0].webContents.send("atualizar-progresso", {
  199.               atual: parseInt(atual),
  200.               total: parseInt(total),
  201.               etapa: etapa.trim()
  202.             });
  203.           }
  204.         }
  205.       });
  206.     });
  207.  
  208.     processo.stderr.on("data", (data) => {
  209.       console.error("Erro do Python:", data.toString());
  210.     });
  211.  
  212.     processo.on("close", (code) => {
  213.       if (code === 0) resolve();
  214.       else reject(`Python saiu com código ${code}`);
  215.     });
  216.   });
  217. });
  218.  
  219. ipcMain.handle("executar-shell", async (_, { plataforma, caminho }) => {
  220.   const isDev = !app.isPackaged;
  221.  
  222.   const script = app.isPackaged
  223.     ? path.join(process.resourcesPath, "scripts", "executaveis", `${plataforma}-launcher.sh`)
  224.     : path.join(__dirname, "src", "scripts", "executaveis", `${plataforma}-launcher.sh`);
  225.  
  226.   if (!fs.existsSync(script)) throw new Error(`Script não encontrado: ${script}`);
  227.  
  228.   return new Promise((resolve, reject) => {
  229.     const processo = spawn("sh", [script, caminho]);
  230.  
  231.     processo.on("close", (code) => {
  232.       if (code === 0) resolve();
  233.       else reject(new Error(`Script terminou com código ${code}`));
  234.     });
  235.  
  236.     processo.stderr.on("data", (data) => {
  237.       console.error("Erro do shell:", data.toString());
  238.     });
  239.   });
  240. });
  241.  
  242. ipcMain.handle("ler-json", async (_, plataforma) => {
  243.   const jsonPath = path.join(app.getPath("home"), ".raijinplus", "json", `${plataforma}.json`);
  244.   const dados = fs.readFileSync(jsonPath, "utf8");
  245.   return JSON.parse(dados);
  246. });
  247.  
  248. app.whenReady().then(createWindow);
  249.  
  250. app.on("window-all-closed", () => {
  251.   if (process.platform !== "darwin") app.quit();
  252. });
  253.  
  254. // Função de backup
  255. function fazerBackup(nome, caminho) {
  256.     return new Promise((resolve, reject) => {
  257.         const origem = path.join(process.env.HOME || process.env.USERPROFILE, '.raijinplus');
  258.         const destino = path.join(caminho, `${nome}.zip`);
  259.  
  260.         // Cria o diretório de destino se não existir
  261.         if (!fs.existsSync(caminho)) {
  262.             fs.mkdirSync(caminho, { recursive: true });
  263.         }
  264.  
  265.         const output = fs.createWriteStream(destino);
  266.         const archive = archiver('zip', { zlib: { level: 9 } });
  267.  
  268.         output.on('close', () => {
  269.             resolve(`Backup criado com sucesso: ${destino} (${archive.pointer()} bytes)`);
  270.         });
  271.  
  272.         archive.on('error', err => reject('Erro ao criar backup: ' + err));
  273.  
  274.         archive.pipe(output);
  275.        
  276.         archive.on('progress', (data) => {
  277.   const { entries, fs } = data;
  278.   BrowserWindow.getAllWindows()[0].webContents.send('progresso-backup', {
  279.     arquivos: entries.processed,
  280.     total: entries.total,
  281.     tamanho: fs.processed
  282.   });
  283. });
  284.  
  285.  
  286.         archive.directory(origem, false); // inclui a pasta inteira
  287.         archive.finalize();
  288.     });
  289. }
  290.  
  291. // Ouvir o evento de backup do Renderer
  292. ipcMain.handle('backup', async (event, nome, caminho) => {
  293.     try {
  294.         const mensagem = await fazerBackup(nome, caminho);
  295.         return mensagem;
  296.     } catch (error) {
  297.         return error;
  298.     }
  299. });
  300.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement