From 4b8d7f167935a65908e24924056983436d62cfb0 Mon Sep 17 00:00:00 2001 From: Azure Date: Tue, 29 Apr 2025 18:05:54 +0200 Subject: [PATCH] Sync --- app/assets/css/index.css | 12 ++++ app/assets/js/index.js | 10 ++- app/logged.html | 28 ++++---- config.json | 6 ++ main.js | 82 ++++++++++++++++++++--- modules/authenticate.js | 3 +- modules/preload.js | 9 +-- package-lock.json | 140 ++++++++++++++++++++++++++++++++++++++- package.json | 3 +- 9 files changed, 262 insertions(+), 31 deletions(-) diff --git a/app/assets/css/index.css b/app/assets/css/index.css index c8b99b9..c081e4b 100644 --- a/app/assets/css/index.css +++ b/app/assets/css/index.css @@ -183,6 +183,12 @@ button.default:hover { background-color: #00000060; } +section.players { + position: absolute; + bottom: 54px; + right: 70px; +} + p.players { width: 185px; padding: 3px 3px 3px 3px; @@ -235,6 +241,12 @@ main > footer > section.right { height: 100%; } +main > section.twitch { + position: absolute; + top: 60px; + right: 60px; +} + [hidden] { display: none; visibility: hidden; diff --git a/app/assets/js/index.js b/app/assets/js/index.js index 88690af..36b8650 100644 --- a/app/assets/js/index.js +++ b/app/assets/js/index.js @@ -32,4 +32,12 @@ function hideNavBar() { for (const button of uiButton.children) { button.removeAttribute("hidden") } -} \ No newline at end of file +} + +window.onload = () => { + system.call("server::ping") +} + +system.result("server::ping", (data) => { + playersStatus.innerText = `${data.players.online}/${data.players.max}` +}) \ No newline at end of file diff --git a/app/logged.html b/app/logged.html index c8e056c..7890633 100644 --- a/app/logged.html +++ b/app/logged.html @@ -92,15 +92,12 @@ - - - +
+ +
+
+

+ + Joueurs : + + 0/0 + + +

+
diff --git a/config.json b/config.json index 7701d56..6813f3d 100644 --- a/config.json +++ b/config.json @@ -4,6 +4,12 @@ "endpoints": { "fileHash": "/api/v1/file/hash/", "checkBanStatus": "/api/v1/ban/iam" + }, + "websockets": { + "base": "wss://localhost:8535", + "rooms": { + "updateGameFiles": "/game/updates" + } } }, "minecraft": { diff --git a/main.js b/main.js index 300ed11..05278ab 100644 --- a/main.js +++ b/main.js @@ -1,9 +1,11 @@ -const { BrowserWindow, app, net, dialog, ipcMain, nativeImage } = require("electron") +const { BrowserWindow, app, net, dialog, ipcMain, nativeImage, session, shell } = require("electron") +const msmc = require("msmc") const os = require("os") const hwid = require("./modules/hwid") const path = require("node:path") const serverPing = require("./modules/serverPing") const config = require("./config.json") +const { Authenticator } = require("minecraft-launcher-core") let launcherWindow, auth, skinPath async function createLauncherWindow() { @@ -24,11 +26,53 @@ async function createLauncherWindow() { webPreferences: { nodeIntegration: false, contextIsolation: true, - preload: path.join(__dirname, "modules", "preload.html") + preload: path.join(__dirname, "modules", "preload.js"), + webviewTag: true } }) + if (os.platform() == "darwin") { + app.dock.setIcon(nativeImage.createFromPath(path.join(__dirname, "app", "assets", "img", "icon.png"))) + } + launcherWindow.setIcon(path.join(__dirname, "app", "assets", "img", "icon.png")) if (isLauncherNotBanned.success) { launcherWindow.loadFile(path.join(__dirname, "app", "logged.html")) + session.defaultSession.webRequest.onBeforeRequest({ + urls: [ + "https://embed.twitch.tv/*channel=*" + ] + }, (details, callback) => { + const url = details.url + const urlParams = new URLSearchParams(url.replace("https://embed.twitch.tv/", "")) + if (urlParams.get("parent")) { + callback({}) + return + } + + urlParams.set("parent", "localhost") + urlParams.set("referrer", "https://localhost/") + + const redirectUrl = `https://embed.twitch.tv/?${urlParams.toString()}` + callback({ + cancel: false, + redirectURL: redirectUrl + }) + }) + + session.defaultSession.webRequest.onHeadersReceived({ + urls: [ + "https://www.twitch.tv/*", + "https://player.twitch.tv/*", + "https://embed.twitch.tv/*" + ] + }, (details, callback) => { + const responseHeaders = details.responseHeaders + delete responseHeaders["Content-Security-Policy"] + callback({ + cancel: false, + responseHeaders + }) + }) + launcherWindow.webContents.openDevTools() } else { launcherWindow.loadFile(path.join(__dirname, "app", "banned.html")) launcherWindow.webContents.executeJavaScript(` @@ -37,10 +81,6 @@ async function createLauncherWindow() { setBannedBecause("${isLauncherNotBanned.reason}") `) } - if (os.platform() == "darwin") { - app.dock.setIcon(nativeImage.createFromPath(path.join(__dirname, "app", "assets", "img", "icon.png"))) - } - launcherWindow.setIcon(path.join(__dirname, "app", "assets", "img", "icon.png")) } else { dialog.showErrorBox("Connexion internet", "Le launcher requiert une connexion internet.") } @@ -107,11 +147,35 @@ ipcMain.on("call", async (event, data) => { securityScopedBookmarks: true }) if (!file.canceled) { - skinPath = file.filePaths[0] + const confirmDialog = await dialog.showMessageBox(launcherWindow, { + type: "question", + message: "Êtes-vous sûr de vouloir changer votre skin ?", + buttons: [ + "Oui", + "Annuler" + ], + title: "Confirmer le changement de skin" + }) + confirmDialog.response == 0 ? skinPath = file.filePaths[0] : skinPath = null } break - case "skin::reset": - skinPath = null + case "auth::mojang": + auth = Authenticator.getAuth(data.args.username, data.args.password) + break + case "auth::msmc": + const authManager = new msmc.Auth("select_account") + const xboxManager = await authManager.launch("raw") + const token = await xboxManager.getMinecraft() + auth = token.mclc() + break + case "shell::openExternal": + shell.openExternal(data.args.url) + break + case "audio::mute": + launcherWindow.webContents.setAudioMuted(true) + break + case "audio::unmute": + launcherWindow.webContents.setAudioMuted(false) break } }) \ No newline at end of file diff --git a/modules/authenticate.js b/modules/authenticate.js index 6fd16e1..9011838 100644 --- a/modules/authenticate.js +++ b/modules/authenticate.js @@ -13,5 +13,6 @@ function getMojangAuth(username, password) { } module.exports = { - getMicrosoftAuth + getMicrosoftAuth, + getMojangAuth } \ No newline at end of file diff --git a/modules/preload.js b/modules/preload.js index 9fad43d..eb0c2fe 100644 --- a/modules/preload.js +++ b/modules/preload.js @@ -1,6 +1,7 @@ -const { shell, contextBridge, ipcRenderer } = require("electron") +const { contextBridge, ipcRenderer } = require("electron") -contextBridge.executeInMainWorld("system", { - openInBrowser: (url) => shell.openExternal(url), - call: (method, args) => ipcRenderer.send("call", { method, args }) +contextBridge.exposeInMainWorld("system", { + openInBrowser: (url) => ipcRenderer.send("call", { method: "shell::openExternal", args: { url } }), + call: (method, args) => ipcRenderer.send("call", { method, args }), + result: (method, callback) => ipcRenderer.on(`Response<${method}>`, (event, data) => callback(data)) }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1d4be89..734768d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "discord-rpc": "^4.0.1", "minecraft-launcher-core": "^3.18.2", - "msmc": "^5.0.5" + "msmc": "^5.0.5", + "socket.io-client": "^4.8.1" }, "devDependencies": { "electron": "^35.2.1", @@ -827,6 +828,12 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -2527,6 +2534,66 @@ "once": "^1.4.0" } }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -4008,7 +4075,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/msmc": { @@ -4922,6 +4988,68 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/socks": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", @@ -5642,6 +5770,14 @@ "node": ">=8.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 11b6c2c..85df588 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "dependencies": { "discord-rpc": "^4.0.1", "minecraft-launcher-core": "^3.18.2", - "msmc": "^5.0.5" + "msmc": "^5.0.5", + "socket.io-client": "^4.8.1" } }