feat: diagnostic exports

This commit is contained in:
2025-04-30 21:19:15 +00:00
parent edef5cc6dc
commit 2e17e0ae75
7 changed files with 83 additions and 16 deletions

View File

@ -480,13 +480,18 @@ pub async fn create_shortcut(_app: AppHandle, profile_meta: ProfileMeta) -> Resu
}
#[tauri::command]
pub async fn export_profile(state: State<'_, Mutex<AppData>>, export_keychip: bool, files: Vec<String>) -> Result<(), String> {
pub async fn export_profile(
state: State<'_, Mutex<AppData>>,
is_diagnostic: bool,
export_keychip: bool,
files: Vec<String>
) -> Result<(), String> {
log::debug!("invoke: export_profile({:?}, {:?} files)", export_keychip, files.len());
let appd = state.lock().await;
match &appd.profile {
Some(p) => {
p.export(export_keychip, files)
p.export(export_keychip, files, is_diagnostic)
.map_err(|e| e.to_string())?;
}
None => {

View File

@ -29,6 +29,10 @@ impl PatchFileVec {
}
pub fn find_patches(&self, target: impl AsRef<Path>) -> Result<Vec<Patch>> {
if !target.as_ref().exists() {
log::warn!("invalid target path: {:?}", target.as_ref());
anyhow::bail!("Unable to open {:?}. Make sure the game path is correct.", target.as_ref());
}
let checksum = try_digest(target.as_ref())?;
let mut res_patches = Vec::new();

View File

@ -36,7 +36,7 @@ impl Profile {
Ok(())
}
pub fn export(&self, export_keychip: bool, extra_files: Vec<String>) -> anyhow::Result<()> {
pub fn export(&self, export_keychip: bool, extra_files: Vec<String>, is_diagnostic: bool) -> anyhow::Result<()> {
let mut prf = self.clone();
let dir = util::config_dir().join("exports");
@ -45,7 +45,7 @@ impl Profile {
std::fs::create_dir(&dir)?;
}
let path = dir.join(format!("{}-{}-template.zip", &self.meta.game, &self.meta.name));
let path = dir.join(format!("{}-{}-{}.zip", &self.meta.game, &self.meta.name, if is_diagnostic { "diagnostic" } else { "template" } ));
{
let sgt = &mut prf.data.sgt;
@ -66,7 +66,7 @@ impl Profile {
if network.local_path.is_absolute() {
network.local_path = PathBuf::new();
}
if !export_keychip {
if !export_keychip || is_diagnostic {
network.keychip = String::new();
}
}
@ -83,6 +83,29 @@ impl Profile {
zip.write_all(&std::fs::read(self.config_dir().join(file))?)?;
}
if is_diagnostic {
let name = "mu3.exe.log";
let path = self.data_dir().join(name);
if path.exists() {
zip.start_file(name, options)?;
zip.write_all(&std::fs::read(path)?)?;
}
let name = "chusanApp.exe.log";
let path = self.data_dir().join(name);
if path.exists() {
zip.start_file(name, options)?;
zip.write_all(&std::fs::read(path)?)?;
}
let name = "amdaemon.exe.log";
let path = self.data_dir().join(name);
if path.exists() {
zip.start_file(name, options)?;
zip.write_all(&std::fs::read(path)?)?;
}
}
zip.finish()?;
Ok(())

View File

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "STARTLINER",
"version": "0.18.3",
"version": "0.19.0",
"identifier": "zip.patafour.startliner",
"build": {
"beforeDevCommand": "bun run dev",

View File

@ -29,23 +29,34 @@ const files = new Set<string>();
).includes('chunithm');
})();
const fileList = {
ongeki: ['aime.txt', 'inohara.cfg', 'mu3.ini', 'segatools-base.ini'],
chunithm: ['aime.txt', 'saekawa.toml', 'segatools-base.ini'],
};
const diagnosticList = {
ongeki: ['mu3.ini', 'segatools-base.ini'],
chunithm: ['segatools-base.ini'],
};
const diagnostic = ref(false);
const exportTemplate = async () => {
const fl = [...files.values()];
exportVisible.value = false;
await invoke('export_profile', {
exportKeychip: exportKeychip.value,
files: fl,
isDiagnostic: diagnostic.value,
files:
diagnostic.value === true
? diagnosticList[prf.current!.meta.game]
: fl,
});
await invoke('open_file', {
path: await path.join(await general.configDir, 'exports'),
});
};
const fileList = {
ongeki: ['aime.txt', 'inohara.cfg', 'mu3.ini', 'segatools-base.ini'],
chunithm: ['aime.txt', 'saekawa.toml', 'segatools-base.ini'],
};
const fileListCurrent: Ref<string[]> = ref([]);
const recalcFileList = async () => {
@ -91,16 +102,36 @@ const importPick = async () => {
:visible="exportVisible"
:closable="false /*this shit doesn't work */"
:header="`${t('profile.export')} ${prf.current?.meta.name}`"
:style="{ width: '300px', scale: client.scaleValue }"
:style="{ width: '330px', scale: client.scaleValue }"
>
<div class="flex flex-col gap-4">
<div class="flex flex-col items-center">
<SelectButton
v-model="diagnostic"
:options="[
{
title: t('profile.standardExport'),
value: false,
},
{
title: t('profile.diagnostic'),
value: true,
},
]"
:allow-empty="false"
option-label="title"
option-value="value"
>
</SelectButton>
</div>
<div class="flex flex-row">
<div class="grow">{{ t('profile.export') }} keychip</div>
<ToggleSwitch v-model="exportKeychip" />
<ToggleSwitch :disabled="diagnostic" v-model="exportKeychip" />
</div>
<div class="flex flex-row" v-for="f in fileListCurrent">
<div class="grow">{{ t('profile.export') }} {{ f }}</div>
<ToggleSwitch
:disabled="diagnostic"
:model-value="true"
@update:model-value="
(v) => {

View File

@ -44,8 +44,10 @@ export default {
reallyDelete: 'Are you sure you want to delete {profile}?',
template: 'STARTLINER template',
importTemplate: 'Import template',
exportTemplate: 'Export template',
exportTemplate: 'Export profile',
export: 'Export',
standardExport: 'Template',
diagnostic: 'Diagnostic',
},
creator: {
header: 'Package creator',

View File

@ -44,8 +44,10 @@ export default {
reallyDelete: 'Czy na pewno chcesz usunąć {profile}?',
template: 'Szablon',
importTemplate: 'Importuj szablon',
exportTemplate: 'Eksportuj szablon',
exportTemplate: 'Eksportuj profil',
export: 'Eksportuj',
standardExport: 'Szablon',
diagnostic: 'Diagnostyka',
},
creator: {
header: 'Kreator pakietów',