mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-19 09:13:57 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee02811aea | ||
|
|
c21ebe1ce2 | ||
|
|
214e39adda | ||
|
|
8258127616 | ||
|
|
f9906bfe95 | ||
|
|
ff91284a91 | ||
|
|
b4f99418e9 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydralauncher",
|
"name": "hydralauncher",
|
||||||
"version": "2.1.0",
|
"version": "2.1.3",
|
||||||
"description": "Hydra",
|
"description": "Hydra",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"author": "Los Broxas",
|
"author": "Los Broxas",
|
||||||
|
|||||||
@@ -3,12 +3,19 @@ import { databasePath } from "./constants";
|
|||||||
import { Hydra2_0_3 } from "./migrations/20240830143811_Hydra_2_0_3";
|
import { Hydra2_0_3 } from "./migrations/20240830143811_Hydra_2_0_3";
|
||||||
import { RepackUris } from "./migrations/20240830143906_RepackUris";
|
import { RepackUris } from "./migrations/20240830143906_RepackUris";
|
||||||
import { UpdateUserLanguage } from "./migrations/20240913213944_update_user_language";
|
import { UpdateUserLanguage } from "./migrations/20240913213944_update_user_language";
|
||||||
|
import { EnsureRepackUris } from "./migrations/20240915035339_ensure_repack_uris";
|
||||||
|
import { app } from "electron";
|
||||||
|
|
||||||
export type HydraMigration = Knex.Migration & { name: string };
|
export type HydraMigration = Knex.Migration & { name: string };
|
||||||
|
|
||||||
class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
||||||
getMigrations(): Promise<HydraMigration[]> {
|
getMigrations(): Promise<HydraMigration[]> {
|
||||||
return Promise.resolve([Hydra2_0_3, RepackUris, UpdateUserLanguage]);
|
return Promise.resolve([
|
||||||
|
Hydra2_0_3,
|
||||||
|
RepackUris,
|
||||||
|
UpdateUserLanguage,
|
||||||
|
EnsureRepackUris,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
getMigrationName(migration: HydraMigration): string {
|
getMigrationName(migration: HydraMigration): string {
|
||||||
return migration.name;
|
return migration.name;
|
||||||
@@ -19,6 +26,7 @@ class MigrationSource implements Knex.MigrationSource<HydraMigration> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const knexClient = knex({
|
export const knexClient = knex({
|
||||||
|
debug: !app.isPackaged,
|
||||||
client: "better-sqlite3",
|
client: "better-sqlite3",
|
||||||
connection: {
|
connection: {
|
||||||
filename: databasePath,
|
filename: databasePath,
|
||||||
|
|||||||
@@ -4,55 +4,15 @@ import type { Knex } from "knex";
|
|||||||
export const RepackUris: HydraMigration = {
|
export const RepackUris: HydraMigration = {
|
||||||
name: "RepackUris",
|
name: "RepackUris",
|
||||||
up: async (knex: Knex) => {
|
up: async (knex: Knex) => {
|
||||||
await knex.schema.createTable("temporary_repack", (table) => {
|
await knex.schema.alterTable("repack", (table) => {
|
||||||
const timestamp = new Date().getTime();
|
|
||||||
table.increments("id").primary();
|
|
||||||
table
|
|
||||||
.text("title")
|
|
||||||
.notNullable()
|
|
||||||
.unique({ indexName: "repack_title_unique_" + timestamp });
|
|
||||||
table
|
|
||||||
.text("magnet")
|
|
||||||
.notNullable()
|
|
||||||
.unique({ indexName: "repack_magnet_unique_" + timestamp });
|
|
||||||
table.text("repacker").notNullable();
|
|
||||||
table.text("fileSize").notNullable();
|
|
||||||
table.datetime("uploadDate").notNullable();
|
|
||||||
table.datetime("createdAt").notNullable().defaultTo(knex.fn.now());
|
|
||||||
table.datetime("updatedAt").notNullable().defaultTo(knex.fn.now());
|
|
||||||
table
|
|
||||||
.integer("downloadSourceId")
|
|
||||||
.references("download_source.id")
|
|
||||||
.onDelete("CASCADE");
|
|
||||||
table.text("uris").notNullable().defaultTo("[]");
|
table.text("uris").notNullable().defaultTo("[]");
|
||||||
});
|
});
|
||||||
await knex.raw(
|
|
||||||
`INSERT INTO "temporary_repack"("id", "title", "magnet", "repacker", "fileSize", "uploadDate", "createdAt", "updatedAt", "downloadSourceId") SELECT "id", "title", "magnet", "repacker", "fileSize", "uploadDate", "createdAt", "updatedAt", "downloadSourceId" FROM "repack"`
|
|
||||||
);
|
|
||||||
await knex.schema.dropTable("repack");
|
|
||||||
await knex.schema.renameTable("temporary_repack", "repack");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
down: async (knex: Knex) => {
|
down: async (knex: Knex) => {
|
||||||
await knex.schema.renameTable("repack", "temporary_repack");
|
await knex.schema.alterTable("repack", (table) => {
|
||||||
await knex.schema.createTable("repack", (table) => {
|
|
||||||
table.increments("id").primary();
|
|
||||||
table.text("title").notNullable().unique();
|
|
||||||
table.text("magnet").notNullable().unique();
|
|
||||||
table.integer("page");
|
table.integer("page");
|
||||||
table.text("repacker").notNullable();
|
table.dropColumn("uris");
|
||||||
table.text("fileSize").notNullable();
|
|
||||||
table.datetime("uploadDate").notNullable();
|
|
||||||
table.datetime("createdAt").notNullable().defaultTo(knex.fn.now());
|
|
||||||
table.datetime("updatedAt").notNullable().defaultTo(knex.fn.now());
|
|
||||||
table
|
|
||||||
.integer("downloadSourceId")
|
|
||||||
.references("download_source.id")
|
|
||||||
.onDelete("CASCADE");
|
|
||||||
});
|
});
|
||||||
await knex.raw(
|
|
||||||
`INSERT INTO "repack"("id", "title", "magnet", "repacker", "fileSize", "uploadDate", "createdAt", "updatedAt", "downloadSourceId") SELECT "id", "title", "magnet", "repacker", "fileSize", "uploadDate", "createdAt", "updatedAt", "downloadSourceId" FROM "temporary_repack"`
|
|
||||||
);
|
|
||||||
await knex.schema.dropTable("temporary_repack");
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
17
src/main/migrations/20240915035339_ensure_repack_uris.ts
Normal file
17
src/main/migrations/20240915035339_ensure_repack_uris.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import type { HydraMigration } from "@main/knex-client";
|
||||||
|
import type { Knex } from "knex";
|
||||||
|
|
||||||
|
export const EnsureRepackUris: HydraMigration = {
|
||||||
|
name: "EnsureRepackUris",
|
||||||
|
up: async (knex: Knex) => {
|
||||||
|
await knex.schema.hasColumn("repack", "uris").then(async (exists) => {
|
||||||
|
if (!exists) {
|
||||||
|
await knex.schema.table("repack", (table) => {
|
||||||
|
table.text("uris").notNullable().defaultTo("[]");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
down: async (_knex: Knex) => {},
|
||||||
|
};
|
||||||
@@ -81,54 +81,54 @@ export class HydraApi {
|
|||||||
baseURL: import.meta.env.MAIN_VITE_API_URL,
|
baseURL: import.meta.env.MAIN_VITE_API_URL,
|
||||||
});
|
});
|
||||||
|
|
||||||
// this.instance.interceptors.request.use(
|
this.instance.interceptors.request.use(
|
||||||
// (request) => {
|
(request) => {
|
||||||
// logger.log(" ---- REQUEST -----");
|
logger.log(" ---- REQUEST -----");
|
||||||
// logger.log(request.method, request.url, request.params, request.data);
|
logger.log(request.method, request.url, request.params, request.data);
|
||||||
// return request;
|
return request;
|
||||||
// },
|
},
|
||||||
// (error) => {
|
(error) => {
|
||||||
// logger.error("request error", error);
|
logger.error("request error", error);
|
||||||
// return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
// }
|
}
|
||||||
// );
|
);
|
||||||
|
|
||||||
// this.instance.interceptors.response.use(
|
this.instance.interceptors.response.use(
|
||||||
// (response) => {
|
(response) => {
|
||||||
// logger.log(" ---- RESPONSE -----");
|
logger.log(" ---- RESPONSE -----");
|
||||||
// logger.log(
|
logger.log(
|
||||||
// response.status,
|
response.status,
|
||||||
// response.config.method,
|
response.config.method,
|
||||||
// response.config.url,
|
response.config.url,
|
||||||
// response.data
|
response.data
|
||||||
// );
|
);
|
||||||
// return response;
|
return response;
|
||||||
// },
|
},
|
||||||
// (error) => {
|
(error) => {
|
||||||
// logger.error(" ---- RESPONSE ERROR -----");
|
logger.error(" ---- RESPONSE ERROR -----");
|
||||||
|
|
||||||
// const { config } = error;
|
const { config } = error;
|
||||||
|
|
||||||
// logger.error(
|
logger.error(
|
||||||
// config.method,
|
config.method,
|
||||||
// config.baseURL,
|
config.baseURL,
|
||||||
// config.url,
|
config.url,
|
||||||
// config.headers,
|
config.headers,
|
||||||
// config.data
|
config.data
|
||||||
// );
|
);
|
||||||
|
|
||||||
// if (error.response) {
|
if (error.response) {
|
||||||
// logger.error("Response", error.response.status, error.response.data);
|
logger.error("Response", error.response.status, error.response.data);
|
||||||
// } else if (error.request) {
|
} else if (error.request) {
|
||||||
// logger.error("Request", error.request);
|
logger.error("Request", error.request);
|
||||||
// } else {
|
} else {
|
||||||
// logger.error("Error", error.message);
|
logger.error("Error", error.message);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// logger.error(" ----- END RESPONSE ERROR -------");
|
logger.error(" ----- END RESPONSE ERROR -------");
|
||||||
// return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
// }
|
}
|
||||||
// );
|
);
|
||||||
|
|
||||||
const userAuth = await userAuthRepository.findOne({
|
const userAuth = await userAuthRepository.findOne({
|
||||||
where: { id: 1 },
|
where: { id: 1 },
|
||||||
@@ -192,7 +192,11 @@ export class HydraApi {
|
|||||||
|
|
||||||
private static handleUnauthorizedError = (err) => {
|
private static handleUnauthorizedError = (err) => {
|
||||||
if (err instanceof AxiosError && err.response?.status === 401) {
|
if (err instanceof AxiosError && err.response?.status === 401) {
|
||||||
logger.error("401 - Current credentials:", this.userAuth);
|
logger.error(
|
||||||
|
"401 - Current credentials:",
|
||||||
|
this.userAuth,
|
||||||
|
err.response?.data
|
||||||
|
);
|
||||||
|
|
||||||
this.userAuth = {
|
this.userAuth = {
|
||||||
authToken: "",
|
authToken: "",
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ export class WindowManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
authWindow.loadURL(
|
authWindow.loadURL(
|
||||||
`https://auth.hydra.losbroxas.org/?${searchParams.toString()}`
|
`https://auth.hydralauncher.gg/?${searchParams.toString()}`
|
||||||
);
|
);
|
||||||
|
|
||||||
authWindow.once("ready-to-show", () => {
|
authWindow.once("ready-to-show", () => {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { useEffect, useMemo, useRef } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { UserFriendModalTab } from "@renderer/pages/shared-modals/user-friend-modal";
|
import { UserFriendModalTab } from "@renderer/pages/shared-modals/user-friend-modal";
|
||||||
|
|
||||||
const LONG_POLLING_INTERVAL = 10_000;
|
const LONG_POLLING_INTERVAL = 60_000;
|
||||||
|
|
||||||
export function SidebarProfile() {
|
export function SidebarProfile() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -100,6 +100,7 @@ export function SidebarProfile() {
|
|||||||
textOverflow: "ellipsis",
|
textOverflow: "ellipsis",
|
||||||
whiteSpace: "nowrap",
|
whiteSpace: "nowrap",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
|
textAlign: "left",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<small>{gameRunning.title}</small>
|
<small>{gameRunning.title}</small>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export const sidebar = recipe({
|
|||||||
paddingTop: `${SPACING_UNIT * 6}px`,
|
paddingTop: `${SPACING_UNIT * 6}px`,
|
||||||
},
|
},
|
||||||
false: {
|
false: {
|
||||||
paddingTop: `${SPACING_UNIT * 2}px`,
|
paddingTop: `${SPACING_UNIT}px`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -160,12 +160,15 @@ export function DownloadSettingsModal({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{selectedDownloader && selectedDownloader !== Downloader.Torrent && (
|
{selectedDownloader != null &&
|
||||||
<p style={{ marginTop: `${SPACING_UNIT}px` }}>
|
selectedDownloader !== Downloader.Torrent && (
|
||||||
<span style={{ color: vars.color.warning }}>{t("warning")}</span>{" "}
|
<p style={{ marginTop: `${SPACING_UNIT}px` }}>
|
||||||
{t("hydra_needs_to_remain_open")}
|
<span style={{ color: vars.color.warning }}>
|
||||||
</p>
|
{t("warning")}
|
||||||
)}
|
</span>{" "}
|
||||||
|
{t("hydra_needs_to_remain_open")}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -72,16 +72,12 @@ export function Sidebar() {
|
|||||||
<p>{numberFormatter.format(stats?.playerCount)}</p>
|
<p>{numberFormatter.format(stats?.playerCount)}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
|
||||||
className={styles.contentSidebarTitle}
|
|
||||||
style={{ border: "none" }}
|
|
||||||
>
|
|
||||||
<h3>{t("requirements")}</h3>
|
|
||||||
</div>
|
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<div className={styles.contentSidebarTitle} style={{ border: "none" }}>
|
||||||
|
<h3>{t("requirements")}</h3>
|
||||||
|
</div>
|
||||||
<div className={styles.requirementButtonContainer}>
|
<div className={styles.requirementButtonContainer}>
|
||||||
<Button
|
<Button
|
||||||
className={styles.requirementButton}
|
className={styles.requirementButton}
|
||||||
|
|||||||
Reference in New Issue
Block a user