1+ <!-- UIGF4导入导出组件 -->
12<template >
23 <TOverlay v-model =" visible " blur-val="5px">
34 <div class =" ugo-box" >
3233 >
3334 <div class =" ugo-item" @click =" toggle" >
3435 <div class =" ugo-item-left" >
35- <div class =" ugo-item-title" >{{ item.uid }} - {{ item.length }}条记录</div >
36+ <div class =" ugo-item-title" >
37+ <span >{{ item.uid }} - {{ item.length }}条</span >
38+ <span >{{ item.isUgc ? "颂愿记录" : "祈愿记录" }}</span >
39+ </div >
3640 <div class =" ugo-item-sub" >{{ item.time }}</div >
3741 </div >
3842 <div class =" ugo-item-right" >
@@ -55,6 +59,7 @@ import TOverlay from "@comp/app/t-overlay.vue";
5559import showLoading from " @comp/func/loading.js" ;
5660import showSnackbar from " @comp/func/snackbar.js" ;
5761import TSUserGacha from " @Sqlm/userGacha.js" ;
62+ import TSUserGachaB from " @Sqlm/userGachaB.js" ;
5863import { path } from " @tauri-apps/api" ;
5964import { open } from " @tauri-apps/plugin-dialog" ;
6065import TGLogger from " @utils/TGLogger.js" ;
@@ -68,7 +73,19 @@ type UgoUidProps = {
6873 /** filePathImport,导出路径 */
6974 fpi? : string ;
7075};
71- type UgoUidItem = { uid: string ; length: number ; time: string };
76+ /**
77+ * UID项
78+ */
79+ type UgoUidItem = {
80+ /** UID */
81+ uid: string ;
82+ /** 数据条数 */
83+ length: number ;
84+ /** 数据时间段 */
85+ time: string ;
86+ /** 是否是颂愿数据 */
87+ isUgc: boolean ;
88+ };
7289/** 兼容不同版本的导入 */
7390type UgoUidImportRaw =
7491 | { isV4: true ; data: TGApp .Plugins .UIGF .Schema4 }
@@ -98,7 +115,7 @@ watch(
98115
99116async function getDefaultSavePath(): Promise <string > {
100117 const tsNow = Math .floor (Date .now () / 1000 );
101- return ` ${await path .downloadDir ()}${path .sep ()}UIGFv4.1_ ${tsNow }.json ` ;
118+ return ` ${await path .downloadDir ()}${path .sep ()}UIGFv4.2_ ${tsNow }.json ` ;
102119}
103120
104121async function refreshData(): Promise <void > {
@@ -147,7 +164,9 @@ async function refreshImport(): Promise<void> {
147164 if (isV4 ) {
148165 const read = await readUigf4Data (fp .value );
149166 importRaw .value = { isV4: true , data: read };
150- data .value = read .hk4e .map (parseData4 );
167+ const hk4eUids = read .hk4e ?.map (parseData4 ) ?? [];
168+ const ugcUids = read .hk4e_ugc ?.map (parseUgc ) ?? [];
169+ data .value = [... hk4eUids , ... ugcUids ];
151170 } else {
152171 const read = await readUigfData (fp .value );
153172 console .log (read .list .length );
@@ -172,6 +191,7 @@ function parseData(data: TGApp.Plugins.UIGF.Schema): UgoUidItem {
172191 uid: data .info .uid ,
173192 length: data .list .length ,
174193 time: ` ${timestampToDate (Math .min (... timeList ))} ~ ${timestampToDate (Math .max (... timeList ))} ` ,
194+ isUgc: false ,
175195 };
176196}
177197
@@ -181,25 +201,52 @@ function parseData4(data: TGApp.Plugins.UIGF.GachaHk4e): UgoUidItem {
181201 uid: data .uid .toString (),
182202 length: data .list .length ,
183203 time: ` ${timestampToDate (Math .min (... timeList ))} ~ ${timestampToDate (Math .max (... timeList ))} ` ,
204+ isUgc: false ,
205+ };
206+ }
207+
208+ function parseUgc(data : TGApp .Plugins .UIGF .GachaUgc ): UgoUidItem {
209+ const timeList = data .list .map ((item ) => new Date (item .time ).getTime ());
210+ return {
211+ uid: data .uid .toString (),
212+ length: data .list .length ,
213+ time: ` ${timestampToDate (Math .min (... timeList ))} ~ ${timestampToDate (Math .max (... timeList ))} ` ,
214+ isUgc: true ,
184215 };
185216}
186217
187218async function refreshExport(): Promise <void > {
188- const uidList = await TSUserGacha .getUidList ();
219+ const uidHk4e = await TSUserGacha .getUidList ();
220+ const uidUgc = await TSUserGachaB .getUidList ();
189221 const tmpData: Array <UgoUidItem > = [];
190- for (const uid of uidList ) {
222+ for (const uid of uidHk4e ) {
191223 const dataRaw = await TSUserGacha .record .all (uid );
192- tmpData .push (parseDataRaw (dataRaw ));
224+ tmpData .push (parseLocalHk4e (dataRaw ));
225+ }
226+ for (const uid of uidUgc ) {
227+ const dataRaw = await TSUserGachaB .getGachaRecords (uid );
228+ tmpData .push (parseLocalUgc (dataRaw ));
193229 }
194230 data .value = tmpData ;
195231}
196232
197- function parseDataRaw (data : Array <TGApp .Sqlite .Gacha .Gacha >): UgoUidItem {
233+ function parseLocalHk4e (data : Array <TGApp .Sqlite .Gacha .Gacha >): UgoUidItem {
198234 const timeList = data .map ((item ) => new Date (item .time ).getTime ());
199235 return {
200236 uid: data [0 ].uid ,
201237 length: data .length ,
202238 time: ` ${timestampToDate (Math .min (... timeList ))} ~ ${timestampToDate (Math .max (... timeList ))} ` ,
239+ isUgc: false ,
240+ };
241+ }
242+
243+ function parseLocalUgc(data : Array <TGApp .Sqlite .Gacha .GachaB >): UgoUidItem {
244+ const timeList = data .map ((item ) => new Date (item .time ).getTime ());
245+ return {
246+ uid: data [0 ].uid ,
247+ length: data .length ,
248+ time: ` ${timestampToDate (Math .min (... timeList ))} ~ ${timestampToDate (Math .max (... timeList ))} ` ,
249+ isUgc: true ,
203250 };
204251}
205252
@@ -222,13 +269,23 @@ async function handleImport(): Promise<void> {
222269 if (importRaw .value .isV4 ) {
223270 for (const item of selectedData .value ) {
224271 await showLoading .update (` 正在导入UID: ${item .uid } ` );
225- const dataFind = importRaw .value .data .hk4e .find ((i ) => i .uid .toString () === item .uid );
226- if (! dataFind ) {
227- showSnackbar .error (` 未找到UID: ${item .uid } ` );
228- await new Promise <void >((resolve ) => setTimeout (resolve , 1000 ));
229- continue ;
272+ if (! item .isUgc ) {
273+ const dataFind = importRaw .value .data .hk4e ?.find ((i ) => i .uid .toString () === item .uid );
274+ if (! dataFind ) {
275+ showSnackbar .error (` 未找到UID: ${item .uid } ` );
276+ await new Promise <void >((resolve ) => setTimeout (resolve , 1000 ));
277+ continue ;
278+ }
279+ await TSUserGacha .mergeUIGF4 (dataFind , true );
280+ } else {
281+ const dataFind = importRaw .value .data .hk4e_ugc ?.find ((i ) => i .uid .toString () === item .uid );
282+ if (! dataFind ) {
283+ showSnackbar .error (` 未找到UID: ${item .uid } ` );
284+ await new Promise <void >((resolve ) => setTimeout (resolve , 1000 ));
285+ continue ;
286+ }
287+ await TSUserGachaB .mergeUIGF4 (dataFind , true );
230288 }
231- await TSUserGacha .mergeUIGF4 (dataFind , true );
232289 }
233290 } else {
234291 const iUid = selectedData .value [0 ].uid ;
@@ -251,7 +308,8 @@ async function handleExport(): Promise<void> {
251308 ` ${selectedData .value .length }条UID - ${totalCnt }条记录 ` ,
252309 );
253310 await exportUigf4Data (
254- selectedData .value .map ((s ) => s .uid .toString ()),
311+ selectedData .value .filter ((i ) => ! i .isUgc ).map ((s ) => s .uid .toString ()),
312+ selectedData .value .filter ((i ) => i .isUgc ).map ((s ) => s .uid .toString ()),
255313 fp .value ,
256314 );
257315 await showLoading .end ();
@@ -348,8 +406,17 @@ async function handleExport(): Promise<void> {
348406}
349407
350408.ugo-item-title {
409+ position : relative ;
410+ display : flex ;
411+ align-items : center ;
412+ justify-content : flex-start ;
413+ column-gap : 8px ;
351414 font-family : var (--font-title );
352415 font-size : 16px ;
416+
417+ :last-child {
418+ color : var (--tgc-od-red );
419+ }
353420}
354421
355422.ugo-item-sub {
0 commit comments