mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2024-11-23 11:59:48 +00:00
Better mod searching
This commit is contained in:
parent
31f77355f1
commit
b46a1d1fcf
@ -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]
|
||||||
|
@ -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 />
|
||||||
|
@ -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: {
|
||||||
|
Loading…
Reference in New Issue
Block a user