18 Commits

Author SHA1 Message Date
c3f0882951 Merge pull request 'add dynamic beatmap images to presence' (#12) from dev into master
Reviewed-on: #12
2024-03-11 17:55:54 +00:00
c17cbc48d8 fix user reset 2024-03-11 18:46:04 +01:00
513692c2d5 reset user on exit 2024-03-11 18:37:33 +01:00
90717ed960 display user as small image, fix dynamic beatmap images 2024-03-11 18:06:24 +01:00
6bcce04b72 Merge branch 'dev' of https://git.ez-pp.farm/EZPPFarm/EZPPLauncher into dev 2024-03-11 17:34:38 +01:00
8d2024aa0a check if rpc is connected 2024-03-11 17:34:36 +01:00
22815e74b6 check if beatmap is not null 2024-03-11 15:46:07 +01:00
c4d9862860 assign the cover url to a const 2024-03-11 15:42:08 +01:00
d56d4875e0 add dynamic beatmap image to presence 2024-03-11 15:38:20 +01:00
4c33323e9e Merge pull request 'oops' (#10) from dev into master
Reviewed-on: #10
2024-01-30 08:52:43 +00:00
da8e237679 oops 2024-01-30 09:51:23 +01:00
eb166c0165 Merge pull request 'bump patch version' (#9) from dev into master
Reviewed-on: #9
2024-01-29 07:58:55 +00:00
c4cd8fed12 bump patch version 2024-01-29 08:58:42 +01:00
6bca0b32a9 Merge pull request 'disable unhandled error logging for now' (#8) from dev into master
Reviewed-on: #8
2024-01-29 07:57:48 +00:00
72d466b1ec disable unhandled error logging for now 2024-01-29 08:57:28 +01:00
401be3c977 Merge pull request 'remove console logging, add unhandled error dialog' (#7) from dev into master
Reviewed-on: #7
2024-01-25 13:20:12 +00:00
0b679d320f remove console logging 2024-01-25 14:19:35 +01:00
5b1407638a add dialog for unhandled errors 2024-01-25 14:10:18 +01:00
8 changed files with 155 additions and 24 deletions

View File

@@ -1,4 +1,4 @@
const appName = "EZPPLauncher"; const appName = "EZPPLauncher";
const appVersion = "2.1.0"; const appVersion = "2.1.1";
module.exports = { appName, appVersion }; module.exports = { appName, appVersion };

15
electron/imageUtil.js Normal file
View File

@@ -0,0 +1,15 @@
async function checkImageExists(url) {
try {
const response = await fetch(url, { method: "HEAD" });
if (!response.ok) {
return false;
}
const contentType = response.headers.get("content-type");
if (!contentType) return false;
return contentType.startsWith("image/");
} catch (error) {
return false;
}
}
module.exports = { checkImageExists };

View File

@@ -2,7 +2,10 @@ const DiscordRPC = require("discord-auto-rpc");
const { appName, appVersion } = require("./appInfo.js"); const { appName, appVersion } = require("./appInfo.js");
const clientId = "1032772293220384808"; const clientId = "1032772293220384808";
/** @type {DiscordRPC.AutoClient} */
let richPresence; let richPresence;
let intervalId; let intervalId;
let currentStatus = { let currentStatus = {
@@ -32,6 +35,7 @@ module.exports = {
richPresence = new DiscordRPC.AutoClient({ transport: "ipc" }); richPresence = new DiscordRPC.AutoClient({ transport: "ipc" });
richPresence.endlessLogin({ clientId }); richPresence.endlessLogin({ clientId });
richPresence.once("ready", () => { richPresence.once("ready", () => {
console.log("connected presence with user " + richPresence.user.username);
richPresence.setActivity(currentStatus); richPresence.setActivity(currentStatus);
intervalId = setInterval(() => { intervalId = setInterval(() => {
richPresence.setActivity(currentStatus); richPresence.setActivity(currentStatus);
@@ -47,16 +51,17 @@ module.exports = {
richPresence = null; richPresence = null;
} }
}, },
updateStatus: ({ state, details }) => { updateStatus: ({ state, details, largeImageKey }) => {
currentStatus.state = state ?? " "; currentStatus.state = state ?? " ";
currentStatus.details = details ?? " "; currentStatus.details = details ?? " ";
currentStatus.largeImageKey = largeImageKey ?? "ezppfarm";
}, },
updateVersion: (osuVersion) => { updateUser: ({ username, id }) => {
currentStatus.smallImageKey = osuVersion ? "osu" : " "; currentStatus.smallImageKey = id ? `https://a.ez-pp.farm/${id}` : " ";
currentStatus.smallImageText = osuVersion ? `osu! ${osuVersion}` : " "; currentStatus.smallImageText = username ?? " ";
}, },
update: () => { update: () => {
if (richPresence) { if (richPresence && richPresence.user) {
richPresence.setActivity(currentStatus); richPresence.setActivity(currentStatus);
} }
}, },

76
main.js
View File

@@ -2,6 +2,16 @@
const { app, BrowserWindow, Menu, ipcMain, dialog, shell } = require( const { app, BrowserWindow, Menu, ipcMain, dialog, shell } = require(
"electron", "electron",
); );
/* const unhandled = require("electron-unhandled");
unhandled({
logger: console.error,
showDialog: true,
reportButton: () => {
shell.openExternal("https://ez-pp.farm/discord");
},
}); */
const path = require("path"); const path = require("path");
const serve = require("electron-serve"); const serve = require("electron-serve");
const loadURL = serve({ directory: "public" }); const loadURL = serve({ directory: "public" });
@@ -36,6 +46,7 @@ const { getHwId } = require("./electron/hwidUtil");
const { appName, appVersion } = require("./electron/appInfo"); const { appName, appVersion } = require("./electron/appInfo");
const { updateAvailable, releasesUrl } = require("./electron/updateCheck"); const { updateAvailable, releasesUrl } = require("./electron/updateCheck");
const fkill = require("fkill"); const fkill = require("fkill");
const { checkImageExists } = require("./electron/imageUtil");
// Keep a global reference of the window object, if you don't, the window will // Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected. // be closed automatically when the JavaScript object is garbage collected.
@@ -62,6 +73,25 @@ function startOsuStatus() {
if (firstInstance) { if (firstInstance) {
if (!osuLoaded) { if (!osuLoaded) {
osuLoaded = true; osuLoaded = true;
try {
const currentUserInfo = await fetch(`https://api.ez-pp.farm/get_player_info?name=${currentUser.username}&scope=info`);
const currentUserInfoJson = await currentUserInfo.json();
if ("player" in currentUserInfoJson && currentUserInfoJson.player != null) {
if ("info" in currentUserInfoJson.player && currentUserInfoJson.player.info != null) {
const id = currentUserInfoJson.player.info.id;
const username = currentUserInfoJson.player.info.name;
richPresence.updateUser({
id,
username,
});
richPresence.update();
}
}
} catch {
}
setTimeout(() => { setTimeout(() => {
if (patch) { if (patch) {
const patcherExecuteable = path.join( const patcherExecuteable = path.join(
@@ -86,15 +116,32 @@ function startOsuStatus() {
if (!("player_status" in currentStatus)) return; if (!("player_status" in currentStatus)) return;
if (!("status" in currentStatus.player_status)) return; if (!("status" in currentStatus.player_status)) return;
let largeImageKey = "ezppfarm";
let details = "Idle..."; let details = "Idle...";
let infoText = currentStatus.player_status.status.info_text.length > 0 let infoText = currentStatus.player_status.status.info_text.length > 0
? currentStatus.player_status.status.info_text ? currentStatus.player_status.status.info_text
: " "; : " ";
if (
"beatmap" in currentStatus.player_status.status &&
currentStatus.player_status.status.beatmap !== null
) {
const setId = currentStatus.player_status.status.beatmap.set_id;
if (setId) {
const coverImage =
`https://assets.ppy.sh/beatmaps/${setId}/covers/list@2x.jpg`;
if (
checkImageExists(coverImage)
) {
largeImageKey = coverImage;
}
}
}
switch (currentStatus.player_status.status.action) { switch (currentStatus.player_status.status.action) {
case 1: case 1:
details = "AFK..."; details = "AFK...";
infoText = " "; infoText = " ";
largeImageKey = "ezppfarm";
break; break;
case 2: case 2:
details = "Playing..."; details = "Playing...";
@@ -108,6 +155,7 @@ function startOsuStatus() {
case 5: case 5:
details = "Multiplayer: Selecting a Beatmap..."; details = "Multiplayer: Selecting a Beatmap...";
infoText = " "; infoText = " ";
largeImageKey = "ezppfarm";
break; break;
case 6: case 6:
details = "Watching..."; details = "Watching...";
@@ -117,10 +165,12 @@ function startOsuStatus() {
break; break;
case 9: case 9:
details = "Submitting..."; details = "Submitting...";
largeImageKey = "ezppfarm";
break; break;
case 11: case 11:
details = "Multiplayer: Idle..."; details = "Multiplayer: Idle...";
infoText = " "; infoText = " ";
largeImageKey = "ezppfarm";
break; break;
case 12: case 12:
details = "Multiplayer: Playing..."; details = "Multiplayer: Playing...";
@@ -128,12 +178,14 @@ function startOsuStatus() {
case 13: case 13:
details = "Browsing osu!direct..."; details = "Browsing osu!direct...";
infoText = " "; infoText = " ";
largeImageKey = "ezppfarm";
break; break;
} }
richPresence.updateStatus({ richPresence.updateStatus({
details, details,
state: infoText, state: infoText,
largeImageKey,
}); });
richPresence.update(); richPresence.update();
@@ -376,9 +428,8 @@ function registerIPCPipes() {
progress: Math.ceil(data.progress), progress: Math.ceil(data.progress),
}); });
mainWindow.webContents.send("ezpplauncher:launchstatus", { mainWindow.webContents.send("ezpplauncher:launchstatus", {
status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${ status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${formatBytes(data.total)
formatBytes(data.total) })...`,
})...`,
}); });
}); });
await uiDownloader.startDownload(); await uiDownloader.startDownload();
@@ -407,9 +458,8 @@ function registerIPCPipes() {
progress: Math.ceil(data.progress), progress: Math.ceil(data.progress),
}); });
mainWindow.webContents.send("ezpplauncher:launchstatus", { mainWindow.webContents.send("ezpplauncher:launchstatus", {
status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${ status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${formatBytes(data.total)
formatBytes(data.total) })...`,
})...`,
}); });
}); });
await updateDownloader.startDownload(); await updateDownloader.startDownload();
@@ -454,9 +504,8 @@ function registerIPCPipes() {
progress: Math.ceil(data.progress), progress: Math.ceil(data.progress),
}); });
mainWindow.webContents.send("ezpplauncher:launchstatus", { mainWindow.webContents.send("ezpplauncher:launchstatus", {
status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${ status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${formatBytes(data.total)
formatBytes(data.total) })...`,
})...`,
}); });
}); });
await patcherDownloader.startDownload(); await patcherDownloader.startDownload();
@@ -528,11 +577,9 @@ function registerIPCPipes() {
}); });
} }
} }
} catch {} } catch { }
const userConfig = getUserConfig(osuPath); const userConfig = getUserConfig(osuPath);
richPresence.updateVersion(await userConfig.get("LastVersion"));
richPresence.update();
if (richPresence.hasPresence) { if (richPresence.hasPresence) {
await userConfig.set("DiscordRichPresence", "0"); await userConfig.set("DiscordRichPresence", "0");
} }
@@ -553,7 +600,10 @@ function registerIPCPipes() {
mainWindow.show(); mainWindow.show();
mainWindow.focus(); mainWindow.focus();
stopOsuStatus(); stopOsuStatus();
richPresence.updateVersion(); richPresence.updateUser({
username: " ",
id: undefined
});
richPresence.updateStatus({ richPresence.updateStatus({
state: "Idle in Launcher...", state: "Idle in Launcher...",
details: undefined, details: undefined,

66
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ezpplauncher-next", "name": "ezpplauncher-next",
"version": "2.0.0", "version": "2.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ezpplauncher-next", "name": "ezpplauncher-next",
"version": "2.0.0", "version": "2.1.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -18,6 +18,7 @@
"custom-electron-titlebar": "^4.2.7", "custom-electron-titlebar": "^4.2.7",
"discord-auto-rpc": "^1.0.17", "discord-auto-rpc": "^1.0.17",
"electron-serve": "^1.1.0", "electron-serve": "^1.1.0",
"electron-unhandled": "^4.0.1",
"fkill": "^7.2.1", "fkill": "^7.2.1",
"get-window-by-name": "^2.0.0", "get-window-by-name": "^2.0.0",
"regedit-rs": "^1.0.2", "regedit-rs": "^1.0.2",
@@ -3720,6 +3721,14 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/electron-is-dev": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-2.0.0.tgz",
"integrity": "sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-publish": { "node_modules/electron-publish": {
"version": "24.8.1", "version": "24.8.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz",
@@ -3787,6 +3796,46 @@
"integrity": "sha512-f7/be56VjRRQk+Ric6PmIrEtPcIqsn3tElyAu9Sh6egha2VLJ82qwkcOdcnT06W+Pb6RUulV1ckzrGbKzVcTHg==", "integrity": "sha512-f7/be56VjRRQk+Ric6PmIrEtPcIqsn3tElyAu9Sh6egha2VLJ82qwkcOdcnT06W+Pb6RUulV1ckzrGbKzVcTHg==",
"dev": true "dev": true
}, },
"node_modules/electron-unhandled": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/electron-unhandled/-/electron-unhandled-4.0.1.tgz",
"integrity": "sha512-6BsLnBg+i96eUnbaIFZyYdyfNX3f80/Nlfqy34YEMxXT9JP3ddNsNnUeiOF8ezN4+et4t4D37gjghKTP0V3jyw==",
"dependencies": {
"clean-stack": "^2.1.0",
"electron-is-dev": "^2.0.0",
"ensure-error": "^2.0.0",
"lodash.debounce": "^4.0.8",
"serialize-error": "^8.1.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-unhandled/node_modules/serialize-error": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
"integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
"dependencies": {
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron-unhandled/node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/electron/node_modules/@types/node": { "node_modules/electron/node_modules/@types/node": {
"version": "18.19.6", "version": "18.19.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.6.tgz",
@@ -3818,6 +3867,14 @@
"once": "^1.4.0" "once": "^1.4.0"
} }
}, },
"node_modules/ensure-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ensure-error/-/ensure-error-2.1.0.tgz",
"integrity": "sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==",
"engines": {
"node": ">=8"
}
},
"node_modules/entities": { "node_modules/entities": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@@ -5266,6 +5323,11 @@
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"dev": true "dev": true
}, },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"node_modules/lodash.memoize": { "node_modules/lodash.memoize": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "ezpplauncher-next", "name": "ezpplauncher-next",
"version": "2.1.0", "version": "2.1.1",
"description": "EZPPLauncher rewritten with Svelte.", "description": "EZPPLauncher rewritten with Svelte.",
"private": false, "private": false,
"license": "MIT", "license": "MIT",
@@ -45,6 +45,7 @@
"custom-electron-titlebar": "^4.2.7", "custom-electron-titlebar": "^4.2.7",
"discord-auto-rpc": "^1.0.17", "discord-auto-rpc": "^1.0.17",
"electron-serve": "^1.1.0", "electron-serve": "^1.1.0",
"electron-unhandled": "^4.0.1",
"fkill": "^7.2.1", "fkill": "^7.2.1",
"get-window-by-name": "^2.0.0", "get-window-by-name": "^2.0.0",
"regedit-rs": "^1.0.2", "regedit-rs": "^1.0.2",

View File

@@ -83,7 +83,6 @@
}); });
window.addEventListener("alert", (e) => { window.addEventListener("alert", (e) => {
console.log((e as CustomEvent).detail);
const toastMessage = (e as CustomEvent).detail; const toastMessage = (e as CustomEvent).detail;
switch (toastMessage.type) { switch (toastMessage.type) {
case "success": { case "success": {

View File

@@ -80,7 +80,6 @@
const resultData = customEvent.detail; const resultData = customEvent.detail;
const isGuest = "guest" in resultData; const isGuest = "guest" in resultData;
const wasSuccessful = "user" in resultData; const wasSuccessful = "user" in resultData;
console.log(resultData);
if (isGuest) { if (isGuest) {
currentPage.set(Page.Launch); currentPage.set(Page.Launch);
res(); res();