feat: initial profile refactor

This commit is contained in:
Chubby Granny Chaser
2024-09-12 00:53:16 +01:00
parent 6273ca1376
commit ada7b452a0
48 changed files with 10733 additions and 922 deletions

View File

@@ -1,9 +1,8 @@
import { getSteamAppAsset } from "@main/helpers";
import type { CatalogueEntry, GameShop } from "@types";
import { registerEvent } from "../register-event";
import { RepacksManager, requestSteam250 } from "@main/services";
import { formatName } from "@shared";
import { formatName, steamUrlBuilder } from "@shared";
const resultSize = 12;
@@ -24,7 +23,7 @@ const getCatalogue = async (_event: Electron.IpcMainInvokeEvent) => {
objectID,
title,
shop: "steam" as GameShop,
cover: getSteamAppAsset("library", objectID),
cover: steamUrlBuilder.library(objectID),
};
results.push({ ...catalogueEntry, repacks });

View File

@@ -3,9 +3,9 @@ import flexSearch from "flexsearch";
import type { GameShop, CatalogueEntry, SteamGame } from "@types";
import { getSteamAppAsset } from "@main/helpers";
import { steamGamesWorker } from "@main/workers";
import { RepacksManager } from "@main/services";
import { steamUrlBuilder } from "@shared";
export interface SearchGamesArgs {
query?: string;
@@ -19,7 +19,7 @@ export const convertSteamGameToCatalogueEntry = (
objectID: String(game.id),
title: game.name,
shop: "steam" as GameShop,
cover: getSteamAppAsset("library", String(game.id)),
cover: steamUrlBuilder.library(String(game.id)),
repacks: [],
});

View File

@@ -3,10 +3,11 @@ import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getFileBase64, getSteamAppAsset } from "@main/helpers";
import { getFileBase64 } from "@main/helpers";
import { steamGamesWorker } from "@main/workers";
import { createGame } from "@main/services/library-sync";
import { steamUrlBuilder } from "@shared";
const addGameToLibrary = async (
_event: Electron.IpcMainInvokeEvent,
@@ -32,7 +33,7 @@ const addGameToLibrary = async (
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", objectID, steamGame.clientIcon)
? steamUrlBuilder.icon(objectID, steamGame.clientIcon)
: null;
await gameRepository

View File

@@ -1,18 +1,18 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { HydraApi, logger } from "@main/services";
import axios from "axios";
import fs from "node:fs";
import path from "node:path";
import { fileTypeFromFile } from "file-type";
import { UpdateProfileProps, UserProfile } from "@types";
import type { UpdateProfileRequest, UserProfile } from "@types";
const patchUserProfile = async (updateProfile: UpdateProfileProps) => {
const patchUserProfile = async (updateProfile: UpdateProfileRequest) => {
return HydraApi.patch("/profile", updateProfile);
};
const updateProfile = async (
_event: Electron.IpcMainInvokeEvent,
updateProfile: UpdateProfileProps
updateProfile: UpdateProfileRequest
): Promise<UserProfile> => {
if (!updateProfile.profileImageUrl) {
return patchUserProfile(updateProfile);
@@ -40,7 +40,11 @@ const updateProfile = async (
});
return profileImageUrl as string;
})
.catch(() => undefined);
.catch((err) => {
logger.error("Error uploading profile image", err);
return undefined;
});
return patchUserProfile({ ...updateProfile, profileImageUrl });
};

View File

@@ -7,12 +7,13 @@ import {
import { registerEvent } from "../register-event";
import type { StartGameDownloadPayload } from "@types";
import { getFileBase64, getSteamAppAsset } from "@main/helpers";
import { getFileBase64 } from "@main/helpers";
import { DownloadManager } from "@main/services";
import { Not } from "typeorm";
import { steamGamesWorker } from "@main/workers";
import { createGame } from "@main/services/library-sync";
import { steamUrlBuilder } from "@shared";
const startGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
@@ -65,7 +66,7 @@ const startGameDownload = async (
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", objectID, steamGame.clientIcon)
? steamUrlBuilder.icon(objectID, steamGame.clientIcon)
: null;
await gameRepository

View File

@@ -1,10 +1,9 @@
import { registerEvent } from "../register-event";
import { HydraApi } from "@main/services";
import { steamGamesWorker } from "@main/workers";
import { GameRunning, UserGame, UserProfile } from "@types";
import { convertSteamGameToCatalogueEntry } from "../helpers/search-games";
import { getSteamAppAsset } from "@main/helpers";
import type { UserProfile } from "@types";
import { getUserFriends } from "./get-user-friends";
import { steamUrlBuilder } from "@shared";
const getUser = async (
_event: Electron.IpcMainInvokeEvent,
@@ -12,65 +11,47 @@ const getUser = async (
): Promise<UserProfile | null> => {
try {
const [profile, friends] = await Promise.all([
HydraApi.get(`/users/${userId}`),
HydraApi.get<UserProfile | null>(`/users/${userId}`),
getUserFriends(userId, 12, 0).catch(() => {
return { totalFriends: 0, friends: [] };
}),
]);
if (!profile) return null;
const recentGames = await Promise.all(
profile.recentGames.map(async (game) => {
return getSteamUserGame(game);
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
name: "getById",
});
return {
...game,
title: steamGame.name,
iconUrl: steamUrlBuilder.icon(game.objectId, steamGame.clientIcon),
};
})
);
const libraryGames = await Promise.all(
profile.libraryGames.map(async (game) => {
return getSteamUserGame(game);
})
);
// const libraryGames = await Promise.all(
// profile.libraryGames.map(async (game) => {
// return getSteamUserGame(game);
// })
// );
const currentGame = await getGameRunning(profile.currentGame);
// const currentGame = await getGameRunning(profile.currentGame);
return {
...profile,
libraryGames,
// libraryGames,
recentGames,
friends: friends.friends,
totalFriends: friends.totalFriends,
currentGame,
// currentGame,
};
} catch (err) {
return null;
}
};
const getGameRunning = async (currentGame): Promise<GameRunning | null> => {
if (!currentGame) {
return null;
}
const gameRunning = await getSteamUserGame(currentGame);
return {
...gameRunning,
sessionDurationInMillis: currentGame.sessionDurationInSeconds * 1000,
};
};
const getSteamUserGame = async (game): Promise<UserGame> => {
const steamGame = await steamGamesWorker.run(Number(game.objectId), {
name: "getById",
});
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", game.objectId, steamGame.clientIcon)
: null;
return {
...game,
...convertSteamGameToCatalogueEntry(steamGame),
iconUrl,
};
};
registerEvent("getUser", getUser);

View File

@@ -2,23 +2,6 @@ import axios from "axios";
import { JSDOM } from "jsdom";
import UserAgent from "user-agents";
export const getSteamAppAsset = (
category: "library" | "hero" | "logo" | "icon",
objectID: string,
clientIcon?: string
) => {
if (category === "library")
return `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/header.jpg`;
if (category === "hero")
return `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/library_hero.jpg`;
if (category === "logo")
return `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/logo.png`;
return `https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/${objectID}/${clientIcon}.ico`;
};
export const getFileBuffer = async (url: string) =>
fetch(url, { method: "GET" }).then((response) =>
response.arrayBuffer().then((buffer) => Buffer.from(buffer))
@@ -34,15 +17,6 @@ export const getFileBase64 = async (url: string) =>
})
);
export const steamUrlBuilder = {
library: (objectID: string) =>
`https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/header.jpg`,
libraryHero: (objectID: string) =>
`https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/library_hero.jpg`,
logo: (objectID: string) =>
`https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/logo.png`,
};
export const sleep = (ms: number) =>
new Promise((resolve) => setTimeout(resolve, ms));

View File

@@ -77,54 +77,54 @@ export class HydraApi {
baseURL: import.meta.env.MAIN_VITE_API_URL,
});
this.instance.interceptors.request.use(
(request) => {
logger.log(" ---- REQUEST -----");
logger.log(request.method, request.url, request.params, request.data);
return request;
},
(error) => {
logger.error("request error", error);
return Promise.reject(error);
}
);
// this.instance.interceptors.request.use(
// (request) => {
// logger.log(" ---- REQUEST -----");
// logger.log(request.method, request.url, request.params, request.data);
// return request;
// },
// (error) => {
// logger.error("request error", error);
// return Promise.reject(error);
// }
// );
this.instance.interceptors.response.use(
(response) => {
logger.log(" ---- RESPONSE -----");
logger.log(
response.status,
response.config.method,
response.config.url,
response.data
);
return response;
},
(error) => {
logger.error(" ---- RESPONSE ERROR -----");
// this.instance.interceptors.response.use(
// (response) => {
// logger.log(" ---- RESPONSE -----");
// logger.log(
// response.status,
// response.config.method,
// response.config.url,
// response.data
// );
// return response;
// },
// (error) => {
// logger.error(" ---- RESPONSE ERROR -----");
const { config } = error;
// const { config } = error;
logger.error(
config.method,
config.baseURL,
config.url,
config.headers,
config.data
);
// logger.error(
// config.method,
// config.baseURL,
// config.url,
// config.headers,
// config.data
// );
if (error.response) {
logger.error("Response", error.response.status, error.response.data);
} else if (error.request) {
logger.error("Request", error.request);
} else {
logger.error("Error", error.message);
}
// if (error.response) {
// logger.error("Response", error.response.status, error.response.data);
// } else if (error.request) {
// logger.error("Request", error.request);
// } else {
// logger.error("Error", error.message);
// }
logger.error(" ----- END RESPONSE ERROR -------");
return Promise.reject(error);
}
);
// logger.error(" ----- END RESPONSE ERROR -------");
// return Promise.reject(error);
// }
// );
const userAuth = await userAuthRepository.findOne({
where: { id: 1 },

View File

@@ -1,7 +1,7 @@
import { gameRepository } from "@main/repository";
import { HydraApi } from "../hydra-api";
import { steamGamesWorker } from "@main/workers";
import { getSteamAppAsset } from "@main/helpers";
import { steamUrlBuilder } from "@shared";
export const mergeWithRemoteGames = async () => {
return HydraApi.get("/profile/games")
@@ -44,7 +44,7 @@ export const mergeWithRemoteGames = async () => {
if (steamGame) {
const iconUrl = steamGame?.clientIcon
? getSteamAppAsset("icon", game.objectId, steamGame.clientIcon)
? steamUrlBuilder.icon(game.objectId, steamGame.clientIcon)
: null;
gameRepository.insert({