[feat] added account sync option

This commit is contained in:
kwaroran
2023-07-02 20:09:43 +09:00
parent c2e20d1de1
commit ddfaafb7cf
5 changed files with 50 additions and 12 deletions

View File

@@ -319,6 +319,10 @@ export const languageEnglish = {
notLoggedIn: "Not Logged in to Risu Account", notLoggedIn: "Not Logged in to Risu Account",
googleDriveInfo: "Connect to google drive to sync your data.", googleDriveInfo: "Connect to google drive to sync your data.",
googleDriveConnection: "Google Drive Connection", googleDriveConnection: "Google Drive Connection",
googleDriveConnected: "Google Drive Connected" googleDriveConnected: "Google Drive Connected",
SaveDataInAccount: "Save Data in Account",
dataSavingInAccount: "Saving Data in Account",
logout: "Logout",
loadDataFromAccount: "Load Data from Account",
saveCurrentDataToAccount: "Save Current Data to Account"
} }

View File

@@ -5,6 +5,8 @@
import { loadRisuAccountData, saveRisuAccountData } from "src/ts/drive/accounter"; import { loadRisuAccountData, saveRisuAccountData } from "src/ts/drive/accounter";
import { DataBase } from "src/ts/storage/database"; import { DataBase } from "src/ts/storage/database";
import Check from "src/lib/Others/Check.svelte"; import Check from "src/lib/Others/Check.svelte";
import { alertSelect } from "src/ts/alert";
import { isTauri } from "src/ts/storage/globalApi";
let openIframe = false let openIframe = false
let openIframeURL = '' let openIframeURL = ''
let popup:Window = null let popup:Window = null
@@ -53,14 +55,23 @@
<h1 class="text-3xl font-black min-w-0">Risu Account{#if $DataBase.account} <h1 class="text-3xl font-black min-w-0">Risu Account{#if $DataBase.account}
<button class="bg-selected p-1 text-sm font-light rounded-md hover:bg-green-500 transition-colors float-right" on:click={async () => { <button class="bg-selected p-1 text-sm font-light rounded-md hover:bg-green-500 transition-colors float-right" on:click={async () => {
$DataBase.account = undefined $DataBase.account = undefined
}}>Logout</button> }}>{language.logout}</button>
{/if}</h1> {/if}</h1>
</div> </div>
{#if $DataBase.account} {#if $DataBase.account}
<span class="mb-4 text-gray-400">ID: {$DataBase.account.id}</span> <span class="mb-4 text-gray-400">ID: {$DataBase.account.id}</span>
{#if $DataBase.useExperimental && localStorage.getItem('ac_flag!') === "able"} {#if $DataBase.useExperimental && (!isTauri)}
<div class="flex items-center mt-2"> <div class="flex items-center mt-2">
<Check bind:check={$DataBase.account.useSync} name='Sync Data between Devices'/> {#if $DataBase.account.useSync}
<span>{language.dataSavingInAccount}</span>
{:else}
<Check check={false} name={language.SaveDataInAccount} onChange={(v) => {
if(v){
localStorage.setItem('dosync', 'sync')
location.reload()
}
}}/>
{/if}
</div> </div>
{/if} {/if}

View File

@@ -3,6 +3,7 @@ import { DataBase } from "./database"
import { hubURL } from "../characterCards" import { hubURL } from "../characterCards"
import localforage from "localforage" import localforage from "localforage"
import { alertLogin } from "../alert" import { alertLogin } from "../alert"
import { getUnpargeables } from "./globalApi"
export class AccountStorage{ export class AccountStorage{
auth:string auth:string
@@ -21,6 +22,9 @@ export class AccountStorage{
'x-risu-auth': this.auth 'x-risu-auth': this.auth
} }
}) })
if(da.status === 304){
return key
}
if(da.status === 403){ if(da.status === 403){
localStorage.setItem("fallbackRisuToken",await alertLogin()) localStorage.setItem("fallbackRisuToken",await alertLogin())
this.checkAuth() this.checkAuth()
@@ -66,10 +70,11 @@ export class AccountStorage{
return Buffer.from(ab) return Buffer.from(ab)
} }
async keys():Promise<string[]>{ async keys():Promise<string[]>{
throw "Error: You cannot list in account. report this to dev if you found this." let db = get(DataBase)
return getUnpargeables(db, 'pure')
} }
async removeItem(key:string){ async removeItem(key:string){
throw "Error: You remove data in account. report this to dev if you found this." throw "Error: You cannot remove data in account. report this to dev if you found this."
} }
private checkAuth(){ private checkAuth(){
@@ -78,6 +83,7 @@ export class AccountStorage{
if(!this.auth){ if(!this.auth){
db.account = JSON.parse(localStorage.getItem("fallbackRisuToken")) db.account = JSON.parse(localStorage.getItem("fallbackRisuToken"))
this.auth = db?.account?.token this.auth = db?.account?.token
db.account.useSync = true
} }
} }

View File

@@ -2,11 +2,12 @@ import localforage from "localforage"
import { getUnpargeables, isNodeServer, replaceDbResources } from "./globalApi" import { getUnpargeables, isNodeServer, replaceDbResources } from "./globalApi"
import { NodeStorage } from "./nodeStorage" import { NodeStorage } from "./nodeStorage"
import { OpfsStorage } from "./opfsStorage" import { OpfsStorage } from "./opfsStorage"
import { alertConfirm, alertStore } from "../alert" import { alertConfirm, alertSelect, alertStore } from "../alert"
import { get } from "svelte/store" import { get } from "svelte/store"
import { DataBase } from "./database" import { DataBase } from "./database"
import { AccountStorage } from "./accountStorage" import { AccountStorage } from "./accountStorage"
import { encodeRisuSave } from "./risuSave"; import { encodeRisuSave } from "./risuSave";
import { language } from "src/lang"
export class AutoStorage{ export class AutoStorage{
isAccount:boolean = false isAccount:boolean = false
@@ -41,12 +42,28 @@ export class AutoStorage{
if(this.isAccount){ if(this.isAccount){
return true return true
} }
if(db.account?.useSync && (localStorage.getItem('accountst') !== 'able')){ if((localStorage.getItem('dosync') === 'sync' || db.account?.useSync) && (localStorage.getItem('accountst') !== 'able')){
getUnpargeables(db) getUnpargeables(db)
console.log("migrating") console.log("migrating")
const keys = await this.realStorage.keys() const keys = await this.realStorage.keys()
let i = 0; let i = 0;
const accountStorage = new AccountStorage() const accountStorage = new AccountStorage()
const a = accountStorage.getItem('database/database.bin')
if(a){
const sel = await alertSelect([language.loadDataFromAccount, language.saveCurrentDataToAccount])
if(sel === "0"){
this.realStorage = accountStorage
alertStore.set({
type: "none",
msg: ""
})
localStorage.setItem('accountst', 'able')
localStorage.setItem('fallbackRisuToken',JSON.stringify(db.account))
this.isAccount = true
return true
}
}
let replaced:{[key:string]:string} = {} let replaced:{[key:string]:string} = {}
for(const key of keys){ for(const key of keys){

View File

@@ -677,7 +677,7 @@ function getBasename(data:string){
return lasts return lasts
} }
export function getUnpargeables(db:Database) { export function getUnpargeables(db:Database, uptype:'basename'|'pure' = 'basename') {
let unpargeable:string[] = [] let unpargeable:string[] = []
function addUnparge(data:string){ function addUnparge(data:string){
@@ -687,9 +687,9 @@ export function getUnpargeables(db:Database) {
if(data === ''){ if(data === ''){
return return
} }
const bn = getBasename(data) const bn = uptype === 'basename' ? getBasename(data) : data
if(!unpargeable.includes(bn)){ if(!unpargeable.includes(bn)){
unpargeable.push(getBasename(data)) unpargeable.push(bn)
} }
} }