Better mod searching

This commit is contained in:
Thoronium 2023-04-26 19:20:49 -06:00
parent 31f77355f1
commit b46a1d1fcf
3 changed files with 65 additions and 60 deletions

View File

@ -13,15 +13,26 @@ pub async fn get_download_links(mod_id: String) -> String {
} }
#[tauri::command] #[tauri::command]
pub async fn list_submissions(mode: String, page: String) -> String { pub async fn list_submissions(mode: String, page: String, search: String) -> String {
web::query( if search.is_empty() {
format!( web::query(
"{}/apiv9/Util/Game/Submissions?_idGameRow=8552&_nPage={}&_nPerpage=50&_sMode={}", format!(
SITE_URL, page, mode "{}/apiv9/Util/Game/Submissions?_idGameRow=8552&_nPage={}&_nPerpage=50&_sMode={}",
SITE_URL, page, mode
)
.as_str(),
) )
.as_str(), .await
) } else {
.await web::query(
format!(
"{}/apiv11/Util/Search/Results?_nPage={}&_sOrder=best_match&_idGameRow=8552&_sSearchString={}&_csvFields=name,description,article,attribs,studio,owner,credits",
SITE_URL, page, search
)
.as_str()
)
.await
}
} }
#[tauri::command] #[tauri::command]

View File

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import { getConfigOption } from '../../../utils/configuration' import { getConfigOption } from '../../../utils/configuration'
import { getAllMods, getInstalledMods, getMods, ModData, PartialModData } from '../../../utils/gamebanana' import { getInstalledMods, getMods, ModData, PartialModData } from '../../../utils/gamebanana'
import { LoadingCircle } from './LoadingCircle' import { LoadingCircle } from './LoadingCircle'
import './ModList.css' import './ModList.css'
@ -17,11 +17,11 @@ interface IState {
horny: boolean horny: boolean
modList: ModData[] | null modList: ModData[] | null
installedList: installedList:
| { | {
path: string path: string
info: ModData | PartialModData info: ModData | PartialModData
}[] }[]
| null | null
} }
export class ModList extends React.Component<IProps, IState> { export class ModList extends React.Component<IProps, IState> {
@ -64,16 +64,7 @@ export class ModList extends React.Component<IProps, IState> {
return return
} }
let mods: ModData[] const mods = await getMods(this.props.mode, this.props.page, this.props.search)
if (!(this.props.search == '')) {
// idk the api so just filter all mods to search
mods = (await getAllMods(this.props.mode)).filter((mod) =>
mod.name.toLowerCase().includes(this.props.search.toLowerCase())
)
} else {
mods = await getMods(this.props.mode, this.props.page)
}
const horny = await getConfigOption('horny_mode') const horny = await getConfigOption('horny_mode')
@ -91,21 +82,21 @@ export class ModList extends React.Component<IProps, IState> {
return ( return (
<div className="ModList"> <div className="ModList">
{(this.state.modList && this.props.mode !== 'installed') || {(this.state.modList && this.props.mode !== 'installed') ||
(this.state.installedList && this.props.mode === 'installed') ? ( (this.state.installedList && this.props.mode === 'installed') ? (
<div className="ModListInner"> <div className="ModListInner">
{this.props.mode === 'installed' {this.props.mode === 'installed'
? this.state.installedList?.map((mod) => ( ? this.state.installedList?.map((mod) => (
<ModTile <ModTile
horny={this.state.horny} horny={this.state.horny}
path={mod.path} path={mod.path}
mod={mod.info} mod={mod.info}
key={mod.info.name} key={mod.info.name}
onClick={this.downloadMod} onClick={this.downloadMod}
/> />
)) ))
: this.state.modList?.map((mod: ModData) => ( : this.state.modList?.map((mod: ModData) => (
<ModTile horny={this.state.horny} mod={mod} key={mod.id} onClick={this.downloadMod} /> <ModTile horny={this.state.horny} mod={mod} key={mod.id} onClick={this.downloadMod} />
))} ))}
</div> </div>
) : ( ) : (
<LoadingCircle /> <LoadingCircle />

View File

@ -117,13 +117,38 @@ interface ModDownload {
containsExe: boolean containsExe: boolean
} }
export async function getMods(mode: string, page: number) { export async function getMods(mode: string, page: number, search: string) {
let modList: GamebananaResponse[] = [] let modList: GamebananaResponse[] = []
if (search.length > 0) {
let hadMods = true
let page = 1
while (hadMods) {
const resp = JSON.parse(
await invoke('list_submissions', {
mode,
page: '' + page,
search: search
})
)
const total = resp._aMetadata._nRecordCount
if (page > (total / 15)) hadMods = false
modList = [...modList, ...resp._aRecords]
page++
}
return formatGamebananaData(modList)
}
const resp = JSON.parse( const resp = JSON.parse(
await invoke('list_submissions', { await invoke('list_submissions', {
mode, mode,
page: '' + page, page: '' + page,
search: '',
}) })
) )
@ -132,28 +157,6 @@ export async function getMods(mode: string, page: number) {
return formatGamebananaData(modList) return formatGamebananaData(modList)
} }
export async function getAllMods(mode: string) {
let modList: GamebananaResponse[] = []
let hadMods = true
let page = 1
while (hadMods) {
const resp = JSON.parse(
await invoke('list_submissions', {
mode,
page: '' + page,
})
)
if (resp.length === 0) hadMods = false
modList = [...modList, ...resp]
page++
}
return formatGamebananaData(modList)
}
export async function formatGamebananaData(obj: GamebananaResponse[]) { export async function formatGamebananaData(obj: GamebananaResponse[]) {
if (!obj) return [] if (!obj) return []
@ -166,8 +169,8 @@ export async function formatGamebananaData(obj: GamebananaResponse[]) {
name: itm._sName, name: itm._sName,
images: img images: img
? img.map((i) => { ? img.map((i) => {
return i._sBaseUrl + '/' + i._sFile220 return i._sBaseUrl + '/' + i._sFile220
}) })
: [], : [],
dateadded: itm._tsDateAdded, dateadded: itm._tsDateAdded,
submitter: { submitter: {