Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
b7f24e897e | |||
f31126e2b1 | |||
d171545f18 | |||
b6b48da5fa | |||
6551f0b369 | |||
f046746037 | |||
74e233ecc3 | |||
a848f078be | |||
9f71ad0f8e | |||
45c5b329b5 | |||
b0f180f1fb | |||
6d42b4fe89 | |||
b8f45ad0b8 | |||
cd8f42327c | |||
6881a0d1d5 | |||
9f9804f161 | |||
86c9bc4a60 | |||
3bd1fb9edb | |||
8a8856772e | |||
80343bd929 | |||
9da481b991 | |||
70643c4287 | |||
db03ed552f |
@@ -1,4 +1,4 @@
|
||||
const appName = "EZPPLauncher";
|
||||
const appVersion = "2.1.5";
|
||||
const appVersion = "2.1.7";
|
||||
|
||||
module.exports = { appName, appVersion };
|
||||
|
@@ -16,17 +16,25 @@ const platforms = {
|
||||
};
|
||||
const crypto = require("crypto");
|
||||
|
||||
const defaultHWID = "recorderinthesandybridge";
|
||||
|
||||
/**
|
||||
* Returns machine hardware id.
|
||||
* Returns `undefined` if cannot determine.
|
||||
* @return {string?}
|
||||
* @return {Promise<string>}
|
||||
*/
|
||||
function getHwId() {
|
||||
const getter = platforms[process.platform];
|
||||
if (!getter) return;
|
||||
const result = getter[1].exec(child_process.execSync(getter[0], options));
|
||||
if (!result) return;
|
||||
return crypto.createHash("md5").update(result[1]).digest("hex") ||
|
||||
undefined;
|
||||
return new Promise((resolve) => {
|
||||
try {
|
||||
const getter = platforms[process.platform];
|
||||
if (getter) {
|
||||
const result = getter[1].exec(child_process.execSync(getter[0], options));
|
||||
if (result) resolve(crypto.createHash("md5").update(result[1]).digest("hex"));
|
||||
}
|
||||
resolve(crypto.createHash("md5").update(defaultHWID).digest("hex"));
|
||||
} catch {
|
||||
resolve(crypto.createHash("md5").update(defaultHWID).digest("hex"));
|
||||
}
|
||||
})
|
||||
}
|
||||
exports.getHwId = getHwId;
|
||||
|
@@ -1,6 +1,12 @@
|
||||
async function checkImageExists(url) {
|
||||
try {
|
||||
const response = await fetch(url, { method: "HEAD" });
|
||||
const response = await fetch(url, {
|
||||
method: "HEAD",
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
if (!response.ok) {
|
||||
return false;
|
||||
}
|
||||
|
@@ -152,7 +152,12 @@ function getUserConfig(osuPath) {
|
||||
}
|
||||
|
||||
async function getUpdateFiles(releaseStream) {
|
||||
const releaseData = await fetch(checkUpdateURL + releaseStream);
|
||||
const releaseData = await fetch(checkUpdateURL + releaseStream, {
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
return releaseData.ok ? await releaseData.json() : undefined;
|
||||
}
|
||||
|
||||
@@ -244,6 +249,10 @@ async function getEZPPLauncherUpdateFiles(osuPath) {
|
||||
const filesToDownload = [];
|
||||
const updateFilesRequest = await fetch(ezppLauncherUpdateList, {
|
||||
method: "PATCH",
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
const updateFiles = await updateFilesRequest.json();
|
||||
for (const updateFile of updateFiles) {
|
||||
@@ -264,13 +273,48 @@ async function getEZPPLauncherUpdateFiles(osuPath) {
|
||||
filesToDownload.push(updateFile);
|
||||
}
|
||||
}
|
||||
return filesToDownload;
|
||||
return [filesToDownload, updateFiles];
|
||||
}
|
||||
|
||||
async function downloadEZPPLauncherUpdateFiles(osuPath, updateFiles) {
|
||||
async function downloadEZPPLauncherUpdateFiles(osuPath, updateFiles, allFiles) {
|
||||
const eventEmitter = new EventEmitter();
|
||||
|
||||
const startDownload = async () => {
|
||||
//NOTE: delete files that are not in the updateFiles array
|
||||
const foldersToPrune = allFiles.map((file) =>
|
||||
path.dirname(path.join(osuPath, ...file.folder.split("/"), file.name))
|
||||
).filter((folder, index, self) => self.indexOf(folder) === index);
|
||||
for (const pruneFolder of foldersToPrune) {
|
||||
//NOTE: check if the folder is not the osu root folder.
|
||||
if (path.basename(pruneFolder) == "osu!") {
|
||||
continue;
|
||||
}
|
||||
if (fs.existsSync(pruneFolder)) {
|
||||
for (const files of await fs.promises.readdir(pruneFolder)) {
|
||||
const filePath = path.join(pruneFolder, files);
|
||||
const validFolder = allFiles.find((file) =>
|
||||
path.dirname(filePath).endsWith(file.folder)
|
||||
);
|
||||
if (!validFolder) {
|
||||
if (
|
||||
allFiles.find((file) => file.name == path.basename(filePath)) ===
|
||||
undefined
|
||||
) {
|
||||
eventEmitter.emit("data", {
|
||||
fileName: path.basename(filePath),
|
||||
});
|
||||
try {
|
||||
await fs.promises.rm(filePath, {
|
||||
recursive: true,
|
||||
force: true,
|
||||
});
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const updateFile of updateFiles) {
|
||||
try {
|
||||
const filePath = path.join(
|
||||
|
@@ -10,7 +10,12 @@ const releasesUrl =
|
||||
module.exports = {
|
||||
updateAvailable: async () => {
|
||||
try {
|
||||
const latestRelease = await fetch(repoApiUrl);
|
||||
const latestRelease = await fetch(repoApiUrl, {
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
const json = await latestRelease.json();
|
||||
if (json.length <= 0) return false;
|
||||
return {
|
||||
|
65
main.js
65
main.js
@@ -76,6 +76,12 @@ function startOsuStatus() {
|
||||
try {
|
||||
const currentUserInfo = await fetch(
|
||||
`https://api.ez-pp.farm/get_player_info?name=${currentUser.username}&scope=info`,
|
||||
{
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
},
|
||||
);
|
||||
const currentUserInfoJson = await currentUserInfo.json();
|
||||
if (
|
||||
@@ -116,7 +122,14 @@ function startOsuStatus() {
|
||||
const windowTitle = firstInstance.processTitle;
|
||||
lastOsuStatus = windowTitle;
|
||||
const currentStatusRequest = await fetch(
|
||||
"https://api.ez-pp.farm/v1/get_player_status?name=" + currentUser.username,
|
||||
"https://api.ez-pp.farm/v1/get_player_status?name=" +
|
||||
currentUser.username,
|
||||
{
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
},
|
||||
);
|
||||
const currentStatus = await currentStatusRequest.json();
|
||||
|
||||
@@ -127,7 +140,14 @@ function startOsuStatus() {
|
||||
const currentModeString = gamemodes[currentMode];
|
||||
|
||||
const currentInfoRequest = await fetch(
|
||||
"https://api.ez-pp.farm/v1/get_player_info?name=" + currentUser.username + "&scope=all",
|
||||
"https://api.ez-pp.farm/v1/get_player_info?name=" +
|
||||
currentUser.username + "&scope=all",
|
||||
{
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
},
|
||||
);
|
||||
const currentInfo = await currentInfoRequest.json();
|
||||
let currentUsername = currentInfo.player.info.name;
|
||||
@@ -228,7 +248,7 @@ function registerIPCPipes() {
|
||||
ipcMain.handle("ezpplauncher:login", async (e, args) => {
|
||||
let hwid = "";
|
||||
try {
|
||||
hwid = getHwId();
|
||||
hwid = await getHwId();
|
||||
} catch (err) {
|
||||
logger.error(`Failed to get HWID.`, err);
|
||||
return {
|
||||
@@ -237,7 +257,7 @@ function registerIPCPipes() {
|
||||
};
|
||||
}
|
||||
const timeout = new AbortController();
|
||||
const timeoutId = setTimeout(() => timeout.abort(), 8000);
|
||||
const timeoutId = setTimeout(() => timeout.abort(), 1000 * 10);
|
||||
logger.log(`Logging in with user ${args.username}...`);
|
||||
try {
|
||||
const fetchResult = await fetch("https://ez-pp.farm/login/check", {
|
||||
@@ -249,6 +269,8 @@ function registerIPCPipes() {
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
|
||||
@@ -268,7 +290,7 @@ function registerIPCPipes() {
|
||||
return result;
|
||||
}
|
||||
logger.log(
|
||||
`Login failed for user ${username}.\nResponse:\n${await fetchResult
|
||||
`Login failed for user ${args.username}.\nResponse:\n${await fetchResult
|
||||
.text()}`,
|
||||
);
|
||||
return {
|
||||
@@ -293,7 +315,7 @@ function registerIPCPipes() {
|
||||
});
|
||||
|
||||
ipcMain.handle("ezpplauncher:autologin", async (e) => {
|
||||
const hwid = getHwId();
|
||||
const hwid = await getHwId();
|
||||
const username = config.get("username");
|
||||
const guest = config.get("guest");
|
||||
if (guest) return { code: 200, message: "Login as guest", guest: true };
|
||||
@@ -317,6 +339,8 @@ function registerIPCPipes() {
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||
},
|
||||
});
|
||||
|
||||
@@ -384,7 +408,7 @@ function registerIPCPipes() {
|
||||
}
|
||||
|
||||
if (key == "logging") {
|
||||
logger.enabled = logging;
|
||||
logger.enabled = value;
|
||||
}
|
||||
|
||||
if (typeof value == "boolean") {
|
||||
@@ -430,6 +454,13 @@ function registerIPCPipes() {
|
||||
return config.all();
|
||||
});
|
||||
|
||||
ipcMain.handle("ezpplauncher:checkUpdate", async (e) => {
|
||||
const updateInfo = await updateAvailable();
|
||||
if (updateInfo.update) {
|
||||
mainWindow.webContents.send("ezpplauncher:update", updateInfo.release);
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle("ezpplauncher:exitAndUpdate", async (e) => {
|
||||
await shell.openExternal(releasesUrl);
|
||||
app.exit();
|
||||
@@ -552,12 +583,15 @@ function registerIPCPipes() {
|
||||
status: "Looking for patcher updates...",
|
||||
});
|
||||
await new Promise((res) => setTimeout(res, 1000));
|
||||
const patchFiles = await getEZPPLauncherUpdateFiles(osuPath);
|
||||
const [patchFiles, allUpdateFiles] = await getEZPPLauncherUpdateFiles(
|
||||
osuPath,
|
||||
);
|
||||
if (patchFiles.length > 0) {
|
||||
logger.log("EZPPLauncher updates found.");
|
||||
const patcherDownloader = await downloadEZPPLauncherUpdateFiles(
|
||||
osuPath,
|
||||
patchFiles,
|
||||
allUpdateFiles,
|
||||
);
|
||||
let errored = false;
|
||||
patcherDownloader.eventEmitter.on("error", (data) => {
|
||||
@@ -583,6 +617,15 @@ function registerIPCPipes() {
|
||||
}/${formatBytes(data.total)})...`,
|
||||
});
|
||||
});
|
||||
patcherDownloader.eventEmitter.on("delete", (data) => {
|
||||
logger.log(`Deleting ${data.fileName}!`);
|
||||
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
||||
progress: -1,
|
||||
});
|
||||
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||
status: `Deleting ${data.fileName}...`,
|
||||
});
|
||||
});
|
||||
await patcherDownloader.startDownload();
|
||||
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
||||
progress: -1,
|
||||
@@ -660,7 +703,7 @@ function registerIPCPipes() {
|
||||
if (fs.existsSync(updateFile)) {
|
||||
await fs.promises.rm(updateFile, {
|
||||
force: true,
|
||||
recursive: (await fs.promises.lstat(updateFile)).isDirectory,
|
||||
recursive: (await fs.promises.lstat(updateFile)).isDirectory(),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -819,10 +862,6 @@ function createWindow() {
|
||||
// Emitted when the window is ready to be shown
|
||||
// This helps in showing the window gracefully.
|
||||
mainWindow.once("ready-to-show", async () => {
|
||||
const updateInfo = await updateAvailable();
|
||||
if (updateInfo.update) {
|
||||
mainWindow.webContents.send("ezpplauncher:update", updateInfo.release);
|
||||
}
|
||||
mainWindow.show();
|
||||
mainWindow.focus();
|
||||
});
|
||||
|
26
package-lock.json
generated
26
package-lock.json
generated
@@ -1,18 +1,20 @@
|
||||
{
|
||||
"name": "ezpplauncher-next",
|
||||
"version": "2.1.2",
|
||||
"version": "2.1.7",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ezpplauncher-next",
|
||||
"version": "2.1.2",
|
||||
"version": "2.1.7",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/better-sqlite3": "^7.6.8",
|
||||
"axios": "^1.6.5",
|
||||
"better-sqlite3": "^9.2.2",
|
||||
"bsdiff-bin": "^0.1.0",
|
||||
"bsdiff-wasm": "^0.1.4",
|
||||
"crypto": "^1.0.1",
|
||||
"crypto-js": "^4.2.0",
|
||||
"custom-electron-titlebar": "^4.2.7",
|
||||
@@ -24,7 +26,7 @@
|
||||
"regedit-rs": "^1.0.2",
|
||||
"semver": "^7.5.4",
|
||||
"svelte-french-toast": "^1.2.0",
|
||||
"sweetalert2": "^11.10.3",
|
||||
"sweetalert2": "^11.10.8",
|
||||
"systeminformation": "^5.21.22"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -2004,6 +2006,18 @@
|
||||
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
||||
}
|
||||
},
|
||||
"node_modules/bsdiff-bin": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bsdiff-bin/-/bsdiff-bin-0.1.0.tgz",
|
||||
"integrity": "sha512-hXGe3uXRgyl2BI1W8c4PdLlDHlPXlYaOaYtWjd5R5MJhF7tq5L4Ng3/qbNGJe7ZIG1htaasM+ziY1TkB1SgrwQ==",
|
||||
"license": "BSD"
|
||||
},
|
||||
"node_modules/bsdiff-wasm": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/bsdiff-wasm/-/bsdiff-wasm-0.1.4.tgz",
|
||||
"integrity": "sha512-IdD9jw9NLVrerD96nUThyoj+0HyfCbrIJPdCf6iTB7yIdc86jZugpatw20qeMyepY7UDdN5p64bhti1ruHBmSg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
@@ -8533,9 +8547,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/sweetalert2": {
|
||||
"version": "11.10.7",
|
||||
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.7.tgz",
|
||||
"integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg==",
|
||||
"version": "11.10.8",
|
||||
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.8.tgz",
|
||||
"integrity": "sha512-oAkYROBfXBY+4sVbQEIcN+ZxAx69lsmz5WEBwdEpyS4m59vOBNlRU5/fJpAI1MVfiDwFZiGwVzB/KBpOyfLNtg==",
|
||||
"funding": {
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/limonte"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ezpplauncher-next",
|
||||
"version": "2.1.5",
|
||||
"version": "2.1.7",
|
||||
"description": "EZPPLauncher rewritten with Svelte.",
|
||||
"private": false,
|
||||
"license": "MIT",
|
||||
@@ -40,6 +40,8 @@
|
||||
"@types/better-sqlite3": "^7.6.8",
|
||||
"axios": "^1.6.5",
|
||||
"better-sqlite3": "^9.2.2",
|
||||
"bsdiff-bin": "^0.1.0",
|
||||
"bsdiff-wasm": "^0.1.4",
|
||||
"crypto": "^1.0.1",
|
||||
"crypto-js": "^4.2.0",
|
||||
"custom-electron-titlebar": "^4.2.7",
|
||||
@@ -51,7 +53,7 @@
|
||||
"regedit-rs": "^1.0.2",
|
||||
"semver": "^7.5.4",
|
||||
"svelte-french-toast": "^1.2.0",
|
||||
"sweetalert2": "^11.10.3",
|
||||
"sweetalert2": "^11.10.8",
|
||||
"systeminformation": "^5.21.22"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@@ -82,6 +82,10 @@ window.addEventListener("settings-set", async (e) => {
|
||||
await ipcRenderer.invoke("ezpplauncher:settings-set", e.detail);
|
||||
});
|
||||
|
||||
window.addEventListener("updateCheck", async () => {
|
||||
await ipcRenderer.invoke("ezpplauncher:checkUpdate");
|
||||
})
|
||||
|
||||
window.addEventListener("updateExit", async () => {
|
||||
await ipcRenderer.invoke("ezpplauncher:exitAndUpdate");
|
||||
});
|
||||
|
@@ -69,6 +69,7 @@ export default {
|
||||
resolve({
|
||||
browser: true,
|
||||
dedupe: ["svelte"],
|
||||
exportConditions: ["svelte"],
|
||||
}),
|
||||
typescript({
|
||||
sourceMap: !production,
|
||||
|
@@ -1,20 +1,16 @@
|
||||
<script lang="ts">
|
||||
import {
|
||||
Avatar,
|
||||
Dropdown,
|
||||
DropdownItem,
|
||||
DropdownHeader,
|
||||
DropdownDivider,
|
||||
Button,
|
||||
Indicator,
|
||||
} from "flowbite-svelte";
|
||||
import {
|
||||
ArrowLeftSolid,
|
||||
ArrowRightFromBracketSolid,
|
||||
ArrowRightToBracketSolid,
|
||||
HeartSolid,
|
||||
UserSettingsSolid,
|
||||
} from "flowbite-svelte-icons";
|
||||
import Avatar from "flowbite-svelte/Avatar.svelte";
|
||||
import Dropdown from "flowbite-svelte/Dropdown.svelte";
|
||||
import DropdownItem from "flowbite-svelte/DropdownItem.svelte";
|
||||
import DropdownHeader from "flowbite-svelte/DropdownHeader.svelte";
|
||||
import DropdownDivider from "flowbite-svelte/DropdownDivider.svelte";
|
||||
import Button from "flowbite-svelte/Button.svelte";
|
||||
import Indicator from "flowbite-svelte/Indicator.svelte";
|
||||
import ArrowLeftSolid from "flowbite-svelte-icons/ArrowLeftSolid.svelte";
|
||||
import ArrowRightFromBracketSolid from "flowbite-svelte-icons/ArrowRightFromBracketSolid.svelte";
|
||||
import ArrowRightToBracketSolid from "flowbite-svelte-icons/ArrowRightToBracketSolid.svelte";
|
||||
import HeartSolid from "flowbite-svelte-icons/HeartSolid.svelte";
|
||||
import UserSettingsSolid from "flowbite-svelte-icons/UserSettingsSolid.svelte";
|
||||
import ezppLogo from "../public/favicon.png";
|
||||
import {
|
||||
currentPage,
|
||||
@@ -66,6 +62,8 @@
|
||||
window.dispatchEvent(new CustomEvent("updateExit"));
|
||||
});
|
||||
|
||||
window.dispatchEvent(new CustomEvent("updateCheck"));
|
||||
|
||||
window.addEventListener("open-settings", (e) => {
|
||||
currentPage.set(Page.Settings);
|
||||
});
|
||||
|
@@ -1,11 +1,11 @@
|
||||
<script lang="ts">
|
||||
import { Button } from "flowbite-svelte";
|
||||
import Button from "flowbite-svelte/Button.svelte";
|
||||
import Progressbar from "../lib/Progressbar.svelte";
|
||||
import {
|
||||
launching,
|
||||
patch,
|
||||
launchStatus,
|
||||
launchPercentage
|
||||
launchPercentage,
|
||||
} from "./../storage/localStore";
|
||||
let progressbarFix = true;
|
||||
|
||||
|
@@ -1,10 +1,14 @@
|
||||
<script lang="ts">
|
||||
import { Input, Button, Spinner, Checkbox } from "flowbite-svelte";
|
||||
import Input from "flowbite-svelte/Input.svelte";
|
||||
import Button from "flowbite-svelte/Button.svelte";
|
||||
import Spinner from "flowbite-svelte/Spinner.svelte";
|
||||
import Checkbox from "flowbite-svelte/Checkbox.svelte";
|
||||
import { type User } from "../types/user";
|
||||
import { currentPage, currentUser, startup } from "../storage/localStore";
|
||||
import toast from "svelte-french-toast";
|
||||
import { Page } from "../consts/pages";
|
||||
import { EyeSlashSolid, EyeSolid } from "flowbite-svelte-icons";
|
||||
import EyeSolid from "flowbite-svelte-icons/EyeSolid.svelte";
|
||||
import EyeSlashSolid from "flowbite-svelte-icons/EyeSlashSolid.svelte";
|
||||
|
||||
let loading = false;
|
||||
let username = "";
|
||||
@@ -13,11 +17,20 @@
|
||||
let showPassword = false;
|
||||
|
||||
const processLogin = async () => {
|
||||
if (username.length <= 0 || password.length <= 0) {
|
||||
toast.error(`Please provice a valid Username and Password!`, {
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000,
|
||||
});
|
||||
return;
|
||||
}
|
||||
loading = true;
|
||||
const loginPromise = new Promise<void>((res, rej) => {
|
||||
const loginPromise = new Promise<string>((res, rej) => {
|
||||
window.addEventListener(
|
||||
"login-result",
|
||||
(e) => {
|
||||
async (e) => {
|
||||
const customEvent = e as CustomEvent;
|
||||
const resultData = customEvent.detail;
|
||||
const wasSuccessful = "user" in resultData;
|
||||
@@ -30,26 +43,26 @@
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 1500,
|
||||
}); */
|
||||
rej();
|
||||
rej(resultData.message);
|
||||
loading = false;
|
||||
return;
|
||||
}
|
||||
const userResult = resultData.user as User;
|
||||
currentUser.set(userResult);
|
||||
currentPage.set(Page.Launch);
|
||||
res();
|
||||
res("");
|
||||
toast.success(`Welcome back, ${userResult.name}!`, {
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 3000,
|
||||
});
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
window.dispatchEvent(
|
||||
new CustomEvent("login-attempt", {
|
||||
detail: { username, password, saveCredentials }
|
||||
detail: { username, password, saveCredentials },
|
||||
})
|
||||
);
|
||||
});
|
||||
@@ -58,20 +71,20 @@
|
||||
{
|
||||
loading: "Logging in...",
|
||||
success: "Successfully logged in!",
|
||||
error: "Invalid Username or Password!"
|
||||
error: (e) => e,
|
||||
},
|
||||
{
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 0,
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
const tryAutoLogin = async () => {
|
||||
loading = true;
|
||||
const loginPromise = new Promise<void>((res, rej) => {
|
||||
const loginPromise = new Promise<string>((res, rej) => {
|
||||
window.addEventListener(
|
||||
"login-result",
|
||||
(e) => {
|
||||
@@ -81,29 +94,29 @@
|
||||
const wasSuccessful = "user" in resultData;
|
||||
if (isGuest) {
|
||||
currentPage.set(Page.Launch);
|
||||
res();
|
||||
res("");
|
||||
toast.success(`Logged in as Guest`, {
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 3000,
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!wasSuccessful) {
|
||||
loading = false;
|
||||
rej();
|
||||
rej(resultData.message);
|
||||
return;
|
||||
}
|
||||
const userResult = resultData.user as User;
|
||||
currentUser.set(userResult);
|
||||
currentPage.set(Page.Launch);
|
||||
res();
|
||||
res("");
|
||||
toast.success(`Welcome back, ${userResult.name}!`, {
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 3000,
|
||||
});
|
||||
loading = false;
|
||||
},
|
||||
@@ -116,13 +129,13 @@
|
||||
{
|
||||
loading: "Logging in...",
|
||||
success: "Successfully logged in!",
|
||||
error: "Failed to login."
|
||||
error: (e) => e,
|
||||
},
|
||||
{
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 0,
|
||||
}
|
||||
);
|
||||
};
|
||||
@@ -134,7 +147,7 @@
|
||||
position: "bottom-center",
|
||||
className:
|
||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||
duration: 3000
|
||||
duration: 3000,
|
||||
});
|
||||
};
|
||||
|
||||
|
@@ -1,6 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { Button, ButtonGroup, Input, Toggle } from "flowbite-svelte";
|
||||
import { FileSearchSolid, FolderSolid } from "flowbite-svelte-icons";
|
||||
import Button from "flowbite-svelte/Button.svelte";
|
||||
import ButtonGroup from "flowbite-svelte/ButtonGroup.svelte";
|
||||
import Input from "flowbite-svelte/Input.svelte";
|
||||
import Toggle from "flowbite-svelte/Toggle.svelte";
|
||||
import FileSearchSolid from "flowbite-svelte-icons/FileSearchSolid.svelte";
|
||||
import FolderSolid from "flowbite-svelte-icons/FolderSolid.svelte";
|
||||
import { patch, presence, logging } from "./../storage/localStore";
|
||||
|
||||
let folderPath: string = "";
|
||||
|
7
test/patch.test.ts
Normal file
7
test/patch.test.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
const bs = require("bsdiff-bin")
|
||||
|
||||
(async () => {
|
||||
bs.patch('./osu!.exe', './osu!patched.exe', './osu!patch.diff', function(err){
|
||||
if(err) console.log("failed")
|
||||
});
|
||||
})();
|
BIN
working/bspatch.exe
Normal file
BIN
working/bspatch.exe
Normal file
Binary file not shown.
Reference in New Issue
Block a user