145145 </v-window >
146146 </div >
147147 <UgoUid v-model =" ovShow " :mode =" ovMode " />
148- <UgoHutaoDownload v-model =" showHutaoD " @selected =" handleHutaoDownload " />
148+ <UgoHutaoDu v-model =" hutaoShow " : mode = " htMode " @selected =" handleHutaoDu " />
149149</template >
150150<script lang="ts" setup>
151151import showDialog from " @comp/func/dialog.js" ;
@@ -156,8 +156,9 @@ import GroHistory from "@comp/userGacha/gro-history.vue";
156156import GroIframe from " @comp/userGacha/gro-iframe.vue" ;
157157import GroOverview from " @comp/userGacha/gro-overview.vue" ;
158158import GroTable from " @comp/userGacha/gro-table.vue" ;
159- import UgoHutaoDownload from " @comp/userGacha/ugo-hutao-download .vue" ;
159+ import UgoHutaoDu from " @comp/userGacha/ugo-hutao-du .vue" ;
160160import UgoUid from " @comp/userGacha/ugo-uid.vue" ;
161+ import hutao from " @Hutao/index.js" ;
161162import hk4eReq from " @req/hk4eReq.js" ;
162163import takumiReq from " @req/takumiReq.js" ;
163164import TSUserGacha from " @Sqlm/userGacha.js" ;
@@ -168,6 +169,7 @@ import { path } from "@tauri-apps/api";
168169import { open , save } from " @tauri-apps/plugin-dialog" ;
169170import Hakushi from " @utils/Hakushi.js" ;
170171import TGLogger from " @utils/TGLogger.js" ;
172+ import { str2timeStr , timeStr2str } from " @utils/toolFunc.js" ;
171173import { exportUigfData , readUigfData , verifyUigfData } from " @utils/UIGF.js" ;
172174import { storeToRefs } from " pinia" ;
173175import { onMounted , ref , shallowRef , watch } from " vue" ;
@@ -180,14 +182,15 @@ const hutaoStore = useHutaoStore();
180182
181183const { isLogin } = storeToRefs (useAppStore ());
182184const { account, cookie } = storeToRefs (useUserStore ());
183- const { isLogin : isLoginHutao, userName } = storeToRefs (hutaoStore );
185+ const { isLogin : isLoginHutao, accessToken, userName, userInfo } = storeToRefs (hutaoStore );
184186
185187const authkey = ref <string >(" " );
186188const uidCur = ref <string >();
187189const tab = ref <string >(" overview" );
188190const ovShow = ref <boolean >(false );
189- const showHutaoD = ref <boolean >(false );
191+ const hutaoShow = ref <boolean >(false );
190192const ovMode = ref <" export" | " import" >(" import" );
193+ const htMode = ref <" download" | " upload" >(" download" );
191194const selectItem = shallowRef <Array <string >>([]);
192195const gachaListCur = shallowRef <Array <TGApp .Sqlite .Gacha .Gacha >>([]);
193196const hakushiData = shallowRef <Array <TGApp .Plugins .Hakushi .ConvertData >>([]);
@@ -229,17 +232,74 @@ async function tryLoginHutao(): Promise<void> {
229232}
230233
231234async function tryUploadGacha(): Promise <void > {
232- // TODO: implement upload gacha records to hutao cloud
235+ if (! isLoginHutao .value ) return ;
236+ htMode .value = " upload" ;
237+ hutaoShow .value = true ;
233238}
234239
235240async function tryDownloadGacha(): Promise <void > {
236241 if (! isLoginHutao .value ) return ;
237- showHutaoD .value = true ;
242+ htMode .value = " download" ;
243+ hutaoShow .value = true ;
244+ }
245+
246+ async function handleHutaoDu(uids : Array <string >, isUpload : boolean ): Promise <void > {
247+ if (isUpload ) await handleHutaoUpload (uids );
248+ else await handleHutaoDownload (uids );
249+ }
250+
251+ async function handleHutaoUpload(uids : Array <string >): Promise <void > {
252+ if (uids .length === 0 ) {
253+ showSnackbar .warn (" 没有选中的UID" );
254+ return ;
255+ }
256+ if (! isLoginHutao .value ) {
257+ showSnackbar .warn (" 未登录胡桃云账号" );
258+ return ;
259+ }
260+ if (! userInfo .value ) {
261+ await hutaoStore .tryRefreshInfo ();
262+ if (! userInfo .value ) {
263+ showSnackbar .warn (" 未检测到胡桃云用户信息" );
264+ return ;
265+ }
266+ }
267+ const isExpire = hutaoStore .checkGachaExpire ();
268+ if (isExpire ) {
269+ const check = await showDialog .checkF ({
270+ title: " 胡桃云祈愿已过期,确定上传?" ,
271+ text: ` 到期时间:${timeStr2str (userInfo .value .GachaLogExpireAt )} ` ,
272+ });
273+ if (! check ) return ;
274+ }
275+ await showLoading .start (" 正在上传至胡桃云..." , " 正在刷新Token" );
276+ await hutaoStore .tryRefreshToken ();
277+ for (const u of uids ) {
278+ await showLoading .update (` 正在上传UID:${u } ` );
279+ const dataRaw = await TSUserGacha .record .all (u );
280+ const data: TGApp .Plugins .Hutao .Gacha .UploadData = {
281+ Uid: u ,
282+ Items: dataRaw .map ((i ) => ({
283+ GachaType: Number (i .gachaType ),
284+ QueryType: Number (i .uigfType ),
285+ ItemId: Number (i .itemId ),
286+ Time: str2timeStr (i .time ),
287+ Id: BigInt (i .id ),
288+ })),
289+ };
290+ const resp = await hutao .Gacha .upload (accessToken .value ! , data );
291+ if (resp .retcode === 0 ) {
292+ showSnackbar .success (` 成功上传祈愿数据:${resp .message } ` );
293+ } else {
294+ showSnackbar .warn (` [${resp .retcode }] ${resp .message } ` );
295+ }
296+ }
297+ await showLoading .end ();
238298}
239299
240300async function handleHutaoDownload(uids : Array <string >): Promise <void > {
241301 console .log (uids );
242- // TODO: implement download gacha records from hutao cloud
302+ // TODO:implement download gacha logs
243303}
244304
245305async function reloadUid(): Promise <void > {
0 commit comments