client version setting

This commit is contained in:
SpikeHD
2022-07-15 17:25:14 -07:00
parent aa10a908ad
commit 9c64c1f282
5 changed files with 102 additions and 12 deletions

View File

@@ -12,6 +12,7 @@ import { getConfigOption, setConfigOption } from '../../../utils/configuration'
import { invoke } from '@tauri-apps/api' import { invoke } from '@tauri-apps/api'
import { listen } from '@tauri-apps/api/event' import { listen } from '@tauri-apps/api/event'
import HelpButton from '../common/HelpButton' import HelpButton from '../common/HelpButton'
import { getVersionCache, VersionData } from '../../../utils/resources'
interface IProps { interface IProps {
closeFn: () => void; closeFn: () => void;
@@ -24,6 +25,7 @@ interface IState {
repo_downloading: boolean repo_downloading: boolean
grasscutter_set: boolean grasscutter_set: boolean
resources_exist: boolean resources_exist: boolean
version_data: VersionData | null
} }
export default class Downloads extends React.Component<IProps, IState> { export default class Downloads extends React.Component<IProps, IState> {
@@ -35,7 +37,8 @@ export default class Downloads extends React.Component<IProps, IState> {
resources_downloading: this.props.downloadManager.downloadingResources(), resources_downloading: this.props.downloadManager.downloadingResources(),
repo_downloading: this.props.downloadManager.downloadingRepo(), repo_downloading: this.props.downloadManager.downloadingRepo(),
grasscutter_set: false, grasscutter_set: false,
resources_exist: false resources_exist: false,
version_data: null
} }
this.getGrasscutterFolder = this.getGrasscutterFolder.bind(this) this.getGrasscutterFolder = this.getGrasscutterFolder.bind(this)
@@ -49,6 +52,11 @@ export default class Downloads extends React.Component<IProps, IState> {
async componentDidMount() { async componentDidMount() {
const gc_path = await getConfigOption('grasscutter_path') const gc_path = await getConfigOption('grasscutter_path')
const versionData = await getVersionCache()
this.setState({
version_data: versionData,
})
listen('jar_extracted', () => { listen('jar_extracted', () => {
this.setState({ grasscutter_set: true }, this.forceUpdate) this.setState({ grasscutter_set: true }, this.forceUpdate)
@@ -103,7 +111,7 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterStableRepo() { async downloadGrasscutterStableRepo() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () =>{ this.props.downloadManager.addDownload(this.state.version_data?.stable, folder + '\\grasscutter_repo.zip', () =>{
unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons) unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons)
}) })
@@ -112,7 +120,7 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterDevRepo() { async downloadGrasscutterDevRepo() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () =>{ this.props.downloadManager.addDownload(this.state.version_data?.dev, folder + '\\grasscutter_repo.zip', () =>{
unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons) unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons)
}) })
@@ -121,7 +129,7 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterStable() { async downloadGrasscutterStable() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', () =>{ this.props.downloadManager.addDownload(this.state.version_data?.stableJar, folder + '\\grasscutter.zip', () =>{
unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons) unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons)
}) })
@@ -133,7 +141,7 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterLatest() { async downloadGrasscutterLatest() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', () =>{ this.props.downloadManager.addDownload(this.state.version_data?.devJar, folder + '\\grasscutter.zip', () =>{
unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons) unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons)
}) })
@@ -145,7 +153,7 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadResources() { async downloadResources() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(RESOURCES_DOWNLOAD, folder + '\\resources.zip', async () => { this.props.downloadManager.addDownload(this.state.version_data?.resources, folder + '\\resources.zip', async () => {
// Delete the existing folder if it exists // Delete the existing folder if it exists
if (await invoke('dir_exists', { if (await invoke('dir_exists', {
path: folder + '\\resources' path: folder + '\\resources'

View File

@@ -12,6 +12,7 @@ import * as server from '../../../utils/server'
import './Options.css' import './Options.css'
import BigButton from '../common/BigButton' import BigButton from '../common/BigButton'
import { cacheLauncherResources, getVersions } from '../../../utils/resources'
interface IProps { interface IProps {
closeFn: () => void; closeFn: () => void;
@@ -20,6 +21,7 @@ interface IProps {
interface IState { interface IState {
game_install_path: string game_install_path: string
grasscutter_path: string grasscutter_path: string
client_version: string
java_path: string java_path: string
grasscutter_with_game: boolean grasscutter_with_game: boolean
language_options: { [key: string]: string }[], language_options: { [key: string]: string }[],
@@ -41,6 +43,7 @@ export default class Options extends React.Component<IProps, IState> {
this.state = { this.state = {
game_install_path: '', game_install_path: '',
grasscutter_path: '', grasscutter_path: '',
client_version: '',
java_path: '', java_path: '',
grasscutter_with_game: false, grasscutter_with_game: false,
language_options: [], language_options: [],
@@ -58,6 +61,7 @@ export default class Options extends React.Component<IProps, IState> {
this.setGameExec = this.setGameExec.bind(this) this.setGameExec = this.setGameExec.bind(this)
this.setGrasscutterJar = this.setGrasscutterJar.bind(this) this.setGrasscutterJar = this.setGrasscutterJar.bind(this)
this.setJavaPath = this.setJavaPath.bind(this) this.setJavaPath = this.setJavaPath.bind(this)
this.setClientVersion = this.setClientVersion.bind(this)
this.setAkebi = this.setAkebi.bind(this) this.setAkebi = this.setAkebi.bind(this)
this.toggleGrasscutterWithGame = this.toggleGrasscutterWithGame.bind(this) this.toggleGrasscutterWithGame = this.toggleGrasscutterWithGame.bind(this)
this.setCustomBackground = this.setCustomBackground.bind(this) this.setCustomBackground = this.setCustomBackground.bind(this)
@@ -77,6 +81,7 @@ export default class Options extends React.Component<IProps, IState> {
game_install_path: config.game_install_path || '', game_install_path: config.game_install_path || '',
grasscutter_path: config.grasscutter_path || '', grasscutter_path: config.grasscutter_path || '',
java_path: config.java_path || '', java_path: config.java_path || '',
client_version: config.client_version || '',
grasscutter_with_game: config.grasscutter_with_game || false, grasscutter_with_game: config.grasscutter_with_game || false,
language_options: languages, language_options: languages,
current_language: config.language || 'en', current_language: config.language || 'en',
@@ -101,6 +106,16 @@ export default class Options extends React.Component<IProps, IState> {
}) })
} }
async setClientVersion(value: string) {
setConfigOption('client_version', value)
await cacheLauncherResources()
this.setState({
client_version: value
})
}
setGrasscutterJar(value: string) { setGrasscutterJar(value: string) {
setConfigOption('grasscutter_path', value) setConfigOption('grasscutter_path', value)
@@ -199,6 +214,25 @@ export default class Options extends React.Component<IProps, IState> {
<DirInput onChange={this.setGameExec} value={this.state?.game_install_path} extensions={['exe']} /> <DirInput onChange={this.setGameExec} value={this.state?.game_install_path} extensions={['exe']} />
</div> </div>
</div> </div>
<div className='OptionSection' id="menuOptionsContainerClientVersion">
<div className='OptionLabel' id="menuOptionsLabelClientVersion">
<Tr text="options.game_exec" />
</div>
<div className='OptionValue' id="menuOptionsDirClientVersion">
<select value={this.state.client_version} id="menuOptionsSelectMenuThemes" onChange={(event) => {
this.setClientVersion(event.target.value)
}}>
{getVersions().map(t => (
<option
key={t}
value={t}>
{t}
</option>
))}
</select>
</div>
</div>
{ {
this.state.swag && ( this.state.swag && (
<div className='OptionSection' id="menuOptionsContainerAkebi"> <div className='OptionSection' id="menuOptionsContainerAkebi">

View File

@@ -17,6 +17,7 @@ let defaultConfig: Configuration
last_port: '443', last_port: '443',
language: 'en', language: 'en',
customBackground: '', customBackground: '',
client_version: '2.7.0',
cert_generated: false, cert_generated: false,
theme: 'default', theme: 'default',
https_enabled: false, https_enabled: false,
@@ -39,6 +40,7 @@ export interface Configuration {
last_port: string last_port: string
language: string language: string
customBackground: string customBackground: string
client_version: string
cert_generated: boolean cert_generated: boolean
theme: string theme: string
https_enabled: boolean https_enabled: boolean

View File

@@ -107,7 +107,9 @@ export default class DownloadHandler {
return this.downloads.some(d => d.path.includes('grasscutter_repo.zip')) return this.downloads.some(d => d.path.includes('grasscutter_repo.zip'))
} }
addDownload(url: string, path: string, onFinish?: () => void) { addDownload(url: string | null | undefined, path: string, onFinish?: () => void) {
if (!url) return
// Begin download from rust backend, don't add if the download addition fails // Begin download from rust backend, don't add if the download addition fails
invoke('download_file', { url, path }) invoke('download_file', { url, path })
const obj = { const obj = {

View File

@@ -1,14 +1,27 @@
import { invoke } from '@tauri-apps/api' import { fs, invoke } from '@tauri-apps/api'
import { dataDir } from '@tauri-apps/api/path'
import { getConfig } from './configuration' import { getConfig } from './configuration'
const globals = { export interface VersionData {
game: string
metadata: string | null
resources: string
stableJar: string | null
devJar: string | null
stable: string | null
dev: string | null
}
const globals: {
[key: string]: VersionData
} = {
'2.8.0': { '2.8.0': {
game: '2.8.0', game: '2.8.0',
metadata: '2.8.0', metadata: '2.8.0',
resources: 'https://gitlab.com/yukiz/GrasscutterResources/-/archive/2.8/GrasscutterResources-2.8.zip', resources: 'https://gitlab.com/yukiz/GrasscutterResources/-/archive/2.8/GrasscutterResources-2.8.zip',
stableJar: '', stableJar: null,
devJar: 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/2.8/Grasscutter.zip', devJar: 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/2.8/Grasscutter.zip',
stable: '', stable: null,
dev: 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/2.8.zip' dev: 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/2.8.zip'
}, },
'2.7.0': { '2.7.0': {
@@ -25,12 +38,14 @@ const globals = {
metadata: null, metadata: null,
resources: 'https://github.com/Koko-boya/Grasscutter_Resources/archive/0e99a59218a346c2d56c54953f99077882de4a6d.zip', resources: 'https://github.com/Koko-boya/Grasscutter_Resources/archive/0e99a59218a346c2d56c54953f99077882de4a6d.zip',
stableJar: 'https://github.com/Grasscutters/Grasscutter/releases/download/v1.1.0/grasscutter-1.1.0.jar', stableJar: 'https://github.com/Grasscutters/Grasscutter/releases/download/v1.1.0/grasscutter-1.1.0.jar',
devJar: null,
stable: 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/2.6.zip', stable: 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/2.6.zip',
dev: '' dev: null
} }
} }
export async function cacheLauncherResources() { export async function cacheLauncherResources() {
const config = await getConfig()
const versionAPIUrl = 'https://sdk-os-static.mihoyo.com/hk4e_global/mdk/launcher/api/resource?channel_id=1&key=gcStgarh&launcher_id=10&sub_channel_id=0' const versionAPIUrl = 'https://sdk-os-static.mihoyo.com/hk4e_global/mdk/launcher/api/resource?channel_id=1&key=gcStgarh&launcher_id=10&sub_channel_id=0'
// Get versions from API // Get versions from API
@@ -42,4 +57,33 @@ export async function cacheLauncherResources() {
console.log('Failed to get versions from API') console.log('Failed to get versions from API')
return false return false
} }
console.log(versions)
const selectedVersion = config.client_version
const selectedVersionData = globals[selectedVersion]
if (!selectedVersionData) {
console.log('Failed to get version for selected version')
return false
}
// Write
fs.writeFile({
path: await dataDir() + 'cultivation/resources.json',
contents: JSON.stringify(selectedVersionData)
})
}
export async function getVersionCache() {
const raw = await fs.readTextFile(await dataDir() + 'cultivation/resources.json').catch(e => {
console.log(e)
return null
})
return raw ? JSON.parse(raw) as VersionData : null
}
export function getVersions() {
return Object.keys(globals)
} }