This commit is contained in:
Gilles Lazures 2025-04-29 18:05:54 +02:00
parent 13c6f14886
commit 4b8d7f1679
9 changed files with 262 additions and 31 deletions

View File

@ -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;

View File

@ -33,3 +33,11 @@ function hideNavBar() {
button.removeAttribute("hidden")
}
}
window.onload = () => {
system.call("server::ping")
}
system.result("server::ping", (data) => {
playersStatus.innerText = `${data.players.online}/${data.players.max}`
})

View File

@ -92,15 +92,12 @@
<label for="slim">Slim (Alex)</label>
</div>
</fieldset>
<button class="classic" onclick="system.call('skin::set')">
<button class="classic" onclick="system.call('skin::set', { variant: temp1.querySelector('input:checked').value })">
Choisir le fichier
</button>
<button class="classic" onclick="system.call('skin::validate')">
Valider
</button>
</article>
</details>
<button class="nav" onclick="system.openInBrowser('https://catboat.fr')">
<button class="nav" onclick="system.openInBrowser('https://nyancraft.catboat.fr/support')">
<i class="fas fa-siren-on"></i>
<span>
Police
@ -119,6 +116,19 @@
</span>
</button>
</nav>
<section class="twitch">
<webview src="https://player.twitch.tv/?channel=catboat&parent=localhost&muted=true" bo></webview>
</section>
<section class="players">
<p class="players">
<span>
Joueurs :
<span id="playersStatus">
0/0
</span>
</span>
</p>
</section>
<footer>
<section class="left">
<button class="default" onclick="showNavBar()">
@ -137,14 +147,6 @@
</section>
<section class="right">
<img class="mascot" src="./assets/img/alcaz_mascote.png" alt="">
<p class="players">
<span>
Joueurs :
<span>
0/0
</span>
</span>
</p>
</section>
</footer>
</main>

View File

@ -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": {

82
main.js
View File

@ -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
}
})

View File

@ -13,5 +13,6 @@ function getMojangAuth(username, password) {
}
module.exports = {
getMicrosoftAuth
getMicrosoftAuth,
getMojangAuth
}

View File

@ -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))
})

140
package-lock.json generated
View File

@ -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",

View File

@ -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"
}
}