mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-03-09 15:40:26 +00:00
71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import flexSearch from "flexsearch";
|
|
import { orderBy } from "lodash-es";
|
|
|
|
import type { GameRepack, GameShop, CatalogueEntry } from "@types";
|
|
|
|
import { formatName, getSteamAppAsset, repackerFormatter } from "@main/helpers";
|
|
import { stateManager } from "@main/state-manager";
|
|
|
|
const { Index } = flexSearch;
|
|
const repacksIndex = new Index();
|
|
const steamGamesIndex = new Index({ tokenize: "forward" });
|
|
|
|
const repacks = stateManager.getValue("repacks");
|
|
const steamGames = stateManager.getValue("steamGames");
|
|
|
|
for (let i = 0; i < repacks.length; i++) {
|
|
const repack = repacks[i];
|
|
const formatter =
|
|
repackerFormatter[repack.repacker as keyof typeof repackerFormatter];
|
|
|
|
repacksIndex.add(i, formatName(formatter(repack.title)));
|
|
}
|
|
|
|
for (let i = 0; i < steamGames.length; i++) {
|
|
const steamGame = steamGames[i];
|
|
steamGamesIndex.add(i, formatName(steamGame.name));
|
|
}
|
|
|
|
export const searchRepacks = (title: string): GameRepack[] => {
|
|
return orderBy(
|
|
repacksIndex
|
|
.search(formatName(title))
|
|
.map((index) => repacks.at(index as number)!),
|
|
["uploadDate"],
|
|
"desc"
|
|
);
|
|
};
|
|
|
|
export interface SearchGamesArgs {
|
|
query?: string;
|
|
take?: number;
|
|
skip?: number;
|
|
}
|
|
|
|
export const searchGames = async ({
|
|
query,
|
|
take,
|
|
skip,
|
|
}: SearchGamesArgs): Promise<CatalogueEntry[]> => {
|
|
const results = steamGamesIndex
|
|
.search(formatName(query || ""), { limit: take, offset: skip })
|
|
.map((index) => {
|
|
const result = steamGames.at(index as number)!;
|
|
|
|
return {
|
|
objectID: String(result.id),
|
|
title: result.name,
|
|
shop: "steam" as GameShop,
|
|
cover: getSteamAppAsset("library", String(result.id)),
|
|
repacks: searchRepacks(result.name),
|
|
};
|
|
});
|
|
|
|
return Promise.all(results).then((resultsWithRepacks) =>
|
|
orderBy(
|
|
resultsWithRepacks,
|
|
[({ repacks }) => repacks.length, "repacks"],
|
|
["desc"]
|
|
)
|
|
);
|
|
};
|