Added few internals modules
- Added game setting parser/stringifier 📝 - Added skin upload using mojang api 👾 - Added server ping using mcsrvstat.us 🖥️ - Added api and endpoints to the config ⚙️ - Added syscalls for modules 🧩
This commit is contained in:
parent
5c8be610f1
commit
13c6f14886
@ -8,7 +8,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
<button class="close" onclick="sys.call('window::close')">
|
<button class="close" onclick="system.call('window::close')">
|
||||||
<i class="fas fa-times"></i>
|
<i class="fas fa-times"></i>
|
||||||
</button>
|
</button>
|
||||||
<nav hidden>
|
<nav hidden>
|
||||||
|
|||||||
14
config.json
14
config.json
@ -5,5 +5,19 @@
|
|||||||
"fileHash": "/api/v1/file/hash/",
|
"fileHash": "/api/v1/file/hash/",
|
||||||
"checkBanStatus": "/api/v1/ban/iam"
|
"checkBanStatus": "/api/v1/ban/iam"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minecraft": {
|
||||||
|
"server": {
|
||||||
|
"host": "mc.thealfiperf.com",
|
||||||
|
"port": 3145
|
||||||
|
},
|
||||||
|
"services": {
|
||||||
|
"api": {
|
||||||
|
"base": "https://api.minecraftservices.com",
|
||||||
|
"endpoints": {
|
||||||
|
"uploadSkin": "/minecraft/profile/skins"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
29
main.js
29
main.js
@ -2,8 +2,9 @@ const { BrowserWindow, app, net, dialog, ipcMain, nativeImage } = require("elect
|
|||||||
const os = require("os")
|
const os = require("os")
|
||||||
const hwid = require("./modules/hwid")
|
const hwid = require("./modules/hwid")
|
||||||
const path = require("node:path")
|
const path = require("node:path")
|
||||||
|
const serverPing = require("./modules/serverPing")
|
||||||
const config = require("./config.json")
|
const config = require("./config.json")
|
||||||
let launcherWindow
|
let launcherWindow, auth, skinPath
|
||||||
|
|
||||||
async function createLauncherWindow() {
|
async function createLauncherWindow() {
|
||||||
if (net.isOnline()) {
|
if (net.isOnline()) {
|
||||||
@ -80,7 +81,7 @@ app.on("window-all-closed", () => {
|
|||||||
app.quit()
|
app.quit()
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on("call", (event, data) => {
|
ipcMain.on("call", async (event, data) => {
|
||||||
switch (data.method) {
|
switch (data.method) {
|
||||||
case "hardware::ramInformation":
|
case "hardware::ramInformation":
|
||||||
launcherWindow.webContents.send("hardware::ramInformation", {
|
launcherWindow.webContents.send("hardware::ramInformation", {
|
||||||
@ -88,5 +89,29 @@ ipcMain.on("call", (event, data) => {
|
|||||||
avaibleRam: Math.round(os.freemem() / 1024 / 1024 * 100) / 100,
|
avaibleRam: Math.round(os.freemem() / 1024 / 1024 * 100) / 100,
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
|
case "server::ping":
|
||||||
|
const status = await serverPing.fetchServerStatus()
|
||||||
|
launcherWindow.webContents.send("Response<server::ping>", status)
|
||||||
|
break
|
||||||
|
case "window::close":
|
||||||
|
launcherWindow.close()
|
||||||
|
app.quit()
|
||||||
|
break
|
||||||
|
case "skin::set":
|
||||||
|
const file = await dialog.showOpenDialog(launcherWindow, {
|
||||||
|
filters: [
|
||||||
|
{ name: "Images", extensions: ["png", "jpg", "jpeg"] }
|
||||||
|
],
|
||||||
|
properties: ["openFile", "dontAddToRecent", "showHiddenFiles"],
|
||||||
|
title: "Sélectionner l'image de votre skin",
|
||||||
|
securityScopedBookmarks: true
|
||||||
|
})
|
||||||
|
if (!file.canceled) {
|
||||||
|
skinPath = file.filePaths[0]
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case "skin::reset":
|
||||||
|
skinPath = null
|
||||||
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
43
modules/gameSettings.js
Normal file
43
modules/gameSettings.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
const fs = require("node:fs")
|
||||||
|
const path = require("node:path")
|
||||||
|
|
||||||
|
function parseSettings(settingsFile) {
|
||||||
|
const settings = fs.readFileSync(settingsFile, "utf-8").toString().split("\n").filter(line => line.trim() !== "")
|
||||||
|
const parseSettings = {}
|
||||||
|
for (let i = 0; i < settings.length; i++) {
|
||||||
|
const line = settings[i].trim()
|
||||||
|
const [key, value] = line.split(":")
|
||||||
|
if (key && value) {
|
||||||
|
const trimmedValue = value.trim().toLowerCase()
|
||||||
|
if (trimmedValue === "true" || trimmedValue === "false") {
|
||||||
|
parseSettings[key.trim()] = trimmedValue === "true"
|
||||||
|
} else {
|
||||||
|
parseSettings[key.trim()] = isNaN(value) ? value.trim() : parseInt(value, 10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parseSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
function stringfySettings(settingsFile) {
|
||||||
|
const settingsObject = JSON.parse(fs.readFileSync(settingsFile, "utf-8").toString())
|
||||||
|
const settingsArray = []
|
||||||
|
if (typeof settingsObject !== "object" || settingsObject === null) {
|
||||||
|
throw new Error("Invalid settings object")
|
||||||
|
}
|
||||||
|
for (const settingKey in settingsObject) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(settingsObject, settingKey)) {
|
||||||
|
const settingValue = settingsObject[settingKey]
|
||||||
|
if (typeof settingValue === "object" || typeof settingValue === "function" || typeof settingValue === "symbol") {
|
||||||
|
throw new Error(`Invalid value for setting "${settingKey}": ${settingValue}`)
|
||||||
|
}
|
||||||
|
settingsArray.push(`${settingKey}:${settingValue}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return settingsArray.join("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
parseSettings,
|
||||||
|
stringfySettings
|
||||||
|
}
|
||||||
26
modules/mojangAPI.js
Normal file
26
modules/mojangAPI.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const fs = require("node:fs")
|
||||||
|
const path = require("node:path")
|
||||||
|
const config = require("../config.json")
|
||||||
|
|
||||||
|
async function uploadSkin(filePath, variant, token) {
|
||||||
|
const form = new FormData()
|
||||||
|
form.append("variant", variant)
|
||||||
|
form.append("file", fs.readFileSync(filePath), path.parse(filePath).base)
|
||||||
|
const response = await fetch(`${config.minecraft.services.api.base}${config.minecraft.services.api.endpoints.uploadSkin}`, {
|
||||||
|
method: "POST",
|
||||||
|
body: form,
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (response.ok) {
|
||||||
|
const json = await response.json()
|
||||||
|
return json
|
||||||
|
} else {
|
||||||
|
throw new Error(`Error uploading skin: ${response.status} ${response.statusText}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
uploadSkin
|
||||||
|
}
|
||||||
18
modules/serverPing.js
Normal file
18
modules/serverPing.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const config = require("../config.json")
|
||||||
|
|
||||||
|
async function fetchServerStatus() {
|
||||||
|
const response = await fetch(`https://api.mcsrvstat.us/3/${config.minecraft.server.host}:${config.minecraft.server.port}`)
|
||||||
|
const json = await response.json()
|
||||||
|
return {
|
||||||
|
online: json.online,
|
||||||
|
players: {
|
||||||
|
online: json.players.online || 0,
|
||||||
|
max: json.players.max || 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
fetchServerStatus
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user