Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fixing seeding on level #1444

Merged
merged 10 commits into from
Feb 16, 2025
2 changes: 2 additions & 0 deletions python_rpc/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ def action():
downloader = downloads.get(game_id)
if downloader:
downloader.pause_download()

if downloading_game_id == game_id:
downloading_game_id = -1
elif action == 'cancel':
downloader = downloads.get(game_id)
Expand Down
5 changes: 4 additions & 1 deletion scripts/postinstall.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,10 @@ const copyAria2Macos = async () => {
};

const copyAria2 = () => {
if (fs.existsSync("aria2")) {
const aria2Path =
process.platform === "win32" ? "aria2/aria2c.exe" : "aria2/aria2c";

if (fs.existsSync(aria2Path)) {
console.log("Aria2 already exists, skipping download...");
return;
}
Expand Down
6 changes: 3 additions & 3 deletions src/main/events/library/add-game-to-library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type { Game, GameShop } from "@types";
import { steamGamesWorker } from "@main/workers";
import { createGame } from "@main/services/library-sync";
import { steamUrlBuilder } from "@shared";
import { updateLocalUnlockedAchivements } from "@main/services/achievements/update-local-unlocked-achivements";
import { updateLocalUnlockedAchievements } from "@main/services/achievements/update-local-unlocked-achivements";
import { downloadsSublevel, gamesSublevel, levelKeys } from "@main/level";

const addGameToLibrary = async (
Expand Down Expand Up @@ -46,9 +46,9 @@ const addGameToLibrary = async (

await gamesSublevel.put(levelKeys.game(shop, objectId), game);

updateLocalUnlockedAchivements(game);
await createGame(game).catch(() => {});

createGame(game).catch(() => {});
updateLocalUnlockedAchievements(game);
}
};

Expand Down
9 changes: 8 additions & 1 deletion src/main/events/torrenting/cancel-game-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,14 @@ const cancelGameDownload = async (

await DownloadManager.cancelDownload(downloadKey);

await downloadsSublevel.del(downloadKey);
const download = await downloadsSublevel.get(downloadKey);

if (!download) return;

await downloadsSublevel.put(downloadKey, {
...download,
status: "removed",
});
};

registerEvent("cancelGameDownload", cancelGameDownload);
1 change: 1 addition & 0 deletions src/main/events/torrenting/pause-game-seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const pauseGameSeed = async (

await downloadsSublevel.put(downloadKey, {
...download,
status: "complete",
shouldSeed: false,
});

Expand Down
6 changes: 4 additions & 2 deletions src/main/events/torrenting/resume-game-seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ const resumeGameSeed = async (
shop: GameShop,
objectId: string
) => {
const download = await downloadsSublevel.get(levelKeys.game(shop, objectId));
const downloadKey = levelKeys.game(shop, objectId);
const download = await downloadsSublevel.get(downloadKey);

if (!download) return;

await downloadsSublevel.put(levelKeys.game(shop, objectId), {
await downloadsSublevel.put(downloadKey, {
...download,
status: "seeding",
shouldSeed: true,
});

Expand Down
6 changes: 3 additions & 3 deletions src/main/events/user/get-unlocked-achievements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const getUnlockedAchievements = async (

return achievementsData
.map((achievementData) => {
const unlockedAchiementData = unlockedAchievements.find(
const unlockedAchievementData = unlockedAchievements.find(
(localAchievement) => {
return (
localAchievement.name.toUpperCase() ==
Expand All @@ -45,11 +45,11 @@ export const getUnlockedAchievements = async (
? achievementData.icon
: achievementData.icongray;

if (unlockedAchiementData) {
if (unlockedAchievementData) {
return {
...achievementData,
unlocked: true,
unlockTime: unlockedAchiementData.unlockTime,
unlockTime: unlockedAchievementData.unlockTime,
};
}

Expand Down
20 changes: 9 additions & 11 deletions src/main/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,23 +57,21 @@ export const loadState = async () => {
.values()
.all()
.then((games) => {
return sortBy(
games.filter((game) => game.queued),
"timestamp",
"DESC"
);
return sortBy(games, "timestamp", "DESC");
});

const [nextItemOnQueue] = downloads;
const [nextItemOnQueue] = downloads.filter((game) => game.queued);

const downloadsToSeed = downloads.filter(
(download) =>
download.shouldSeed &&
download.downloader === Downloader.Torrent &&
download.progress === 1 &&
download.uri !== null
(game) =>
game.shouldSeed &&
game.downloader === Downloader.Torrent &&
game.progress === 1 &&
game.uri !== null
);

console.log("downloadsToSeed", downloadsToSeed);

await DownloadManager.startRPC(nextItemOnQueue, downloadsToSeed);

startMainLoop();
Expand Down
30 changes: 14 additions & 16 deletions src/main/services/achievements/merge-achievements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,21 @@ const saveAchievementsOnLocal = async (
return gameAchievementsSublevel
.get(levelKey)
.then(async (gameAchievement) => {
if (gameAchievement) {
await gameAchievementsSublevel.put(levelKey, {
...gameAchievement,
unlockedAchievements: unlockedAchievements,
});
await gameAchievementsSublevel.put(levelKey, {
achievements: gameAchievement?.achievements ?? [],
unlockedAchievements: unlockedAchievements,
});

if (!sendUpdateEvent) return;
if (!sendUpdateEvent) return;

return getUnlockedAchievements(objectId, shop, true)
.then((achievements) => {
WindowManager.mainWindow?.webContents.send(
`on-update-achievements-${objectId}-${shop}`,
achievements
);
})
.catch(() => {});
}
return getUnlockedAchievements(objectId, shop, true)
.then((achievements) => {
WindowManager.mainWindow?.webContents.send(
`on-update-achievements-${objectId}-${shop}`,
achievements
);
})
.catch(() => {});
});
};

Expand Down Expand Up @@ -133,7 +131,7 @@ export const mergeAchievements = async (
);
})
.catch((err) => {
if (err! instanceof SubscriptionRequiredError) {
if (err instanceof SubscriptionRequiredError) {
achievementsLogger.log(
"Achievements not synchronized on API due to lack of subscription",
game.objectId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { parseAchievementFile } from "./parse-achievement-file";
import { mergeAchievements } from "./merge-achievements";
import type { Game, UnlockedAchievement } from "@types";

export const updateLocalUnlockedAchivements = async (game: Game) => {
export const updateLocalUnlockedAchievements = async (game: Game) => {
const gameAchievementFiles = findAchievementFiles(game);

const achievementFileInsideDirectory =
Expand Down
6 changes: 4 additions & 2 deletions src/main/services/download/download-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,10 @@ export class DownloadManager {
} as PauseDownloadPayload)
.catch(() => {});

WindowManager.mainWindow?.setProgressBar(-1);
this.downloadingGameId = null;
if (downloadKey === this.downloadingGameId) {
WindowManager.mainWindow?.setProgressBar(-1);
this.downloadingGameId = null;
}
}

static async resumeDownload(download: Download) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/services/library-sync/merge-with-remote-games.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const mergeWithRemoteGames = async () => {
? game.playTimeInMilliseconds
: localGame.playTimeInMilliseconds;

gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
await gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...localGame,
remoteId: game.id,
lastTimePlayed: updatedLastTimePlayed,
Expand All @@ -39,7 +39,7 @@ export const mergeWithRemoteGames = async () => {
? steamUrlBuilder.icon(game.objectId, steamGame.clientIcon)
: null;

gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
await gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
objectId: game.objectId,
title: steamGame?.name,
remoteId: game.id,
Expand Down
5 changes: 4 additions & 1 deletion src/renderer/src/components/sidebar/sidebar.scss
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
&__content {
display: flex;
flex-direction: column;
flex: 1;
padding: calc(globals.$spacing-unit * 2);
gap: calc(globals.$spacing-unit * 2);
width: 100%;
Expand Down Expand Up @@ -54,6 +55,7 @@
display: flex;
color: globals.$muted-color;
border-radius: 4px;

&:hover {
background-color: rgba(255, 255, 255, 0.15);
}
Expand Down Expand Up @@ -104,13 +106,14 @@
&__container {
display: flex;
flex-direction: column;
flex: 1;
overflow: hidden;
}

&__section {
gap: calc(globals.$spacing-unit * 2);
display: flex;
flex-direction: column;
gap: calc(globals.$spacing-unit * 2);
padding-bottom: globals.$spacing-unit;
}

Expand Down
2 changes: 1 addition & 1 deletion src/renderer/src/hooks/use-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export function useDownload() {
const pauseDownload = async (shop: GameShop, objectId: string) => {
await window.electron.pauseGameDownload(shop, objectId);
await updateLibrary();
dispatch(clearDownload());
if (lastPacket?.gameId === `${shop}:${objectId}`) dispatch(clearDownload());
};

const resumeDownload = async (shop: GameShop, objectId: string) => {
Expand Down
8 changes: 8 additions & 0 deletions src/renderer/src/pages/downloads/download-group.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
flex-direction: column;
gap: calc(globals.$spacing-unit * 2);

&__details-with-article {
display: flex;
align-items: center;
gap: calc(globals.$spacing-unit / 2);
align-self: flex-start;
cursor: pointer;
}

&__header {
display: flex;
align-items: center;
Expand Down
28 changes: 20 additions & 8 deletions src/renderer/src/pages/downloads/download-group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
DownloadIcon,
LinkIcon,
PlayIcon,
QuestionIcon,
ThreeBarsIcon,
TrashIcon,
UnlinkIcon,
Expand Down Expand Up @@ -122,8 +123,12 @@ export function DownloadGroup({
</p>

{download.downloader === Downloader.Torrent && (
<small>
<small
className="download-group__details-with-article"
data-open-article="peers-and-seeds"
>
{lastPacket?.numPeers} peers / {lastPacket?.numSeeds} seeds
<QuestionIcon size={12} />
</small>
)}
</>
Expand All @@ -136,7 +141,14 @@ export function DownloadGroup({
return download.status === "seeding" &&
download.downloader === Downloader.Torrent ? (
<>
<p>{t("seeding")}</p>
<p
data-open-article="seeding"
className="download-group__details-with-article"
>
{t("seeding")}

<QuestionIcon />
</p>
{uploadSpeed && <p>{uploadSpeed}/s</p>}
</>
) : (
Expand Down Expand Up @@ -174,7 +186,7 @@ export function DownloadGroup({

const deleting = isGameDeleting(game.id);

if (download?.progress === 1) {
if (game.download?.progress === 1) {
return [
{
label: t("install"),
Expand All @@ -189,8 +201,8 @@ export function DownloadGroup({
disabled: deleting,
icon: <UnlinkIcon />,
show:
download.status === "seeding" &&
download.downloader === Downloader.Torrent,
game.download?.status === "seeding" &&
game.download?.downloader === Downloader.Torrent,
onClick: () => {
pauseSeeding(game.shop, game.objectId);
},
Expand All @@ -200,8 +212,8 @@ export function DownloadGroup({
disabled: deleting,
icon: <LinkIcon />,
show:
download.status !== "seeding" &&
download.downloader === Downloader.Torrent,
game.download?.status !== "seeding" &&
game.download?.downloader === Downloader.Torrent,
onClick: () => {
resumeSeeding(game.shop, game.objectId);
},
Expand All @@ -217,7 +229,7 @@ export function DownloadGroup({
];
}

if (isGameDownloading || download?.status === "active") {
if (isGameDownloading) {
return [
{
label: t("pause"),
Expand Down
Loading
Loading