Files
risuai/src/ts/persona.ts

127 lines
3.4 KiB
TypeScript

import { get } from "svelte/store"
import { DataBase, saveImage, setDatabase } from "./storage/database.svelte"
import { getUserName, selectSingleFile, sleep } from "./util"
import { alertError, alertNormal, alertStore } from "./alert"
import { downloadFile, readImage } from "./storage/globalApi"
import { language } from "src/lang"
import { reencodeImage } from "./process/files/image"
import { PngChunk } from "./pngChunk"
import { v4 } from "uuid"
export async function selectUserImg() {
const selected = await selectSingleFile(['png'])
if(!selected){
return
}
const img = selected.data
let db = get(DataBase)
const imgp = await saveImage(img)
db.userIcon = imgp
db.personas[db.selectedPersona] = {
name: db.username,
icon: db.userIcon,
personaPrompt: db.personaPrompt,
id: v4()
}
setDatabase(db)
}
export function saveUserPersona() {
let db = get(DataBase)
db.personas[db.selectedPersona].name=db.username
db.personas[db.selectedPersona].icon=db.userIcon,
db.personas[db.selectedPersona].personaPrompt=db.personaPrompt,
db.personas[db.selectedPersona].largePortrait=db.personas[db.selectedPersona]?.largePortrait,
setDatabase(db)
}
export function changeUserPersona(id:number, save:'save'|'noSave' = 'save') {
if(save === 'save'){
saveUserPersona()
}
let db = get(DataBase)
const pr = db.personas[id]
db.personaPrompt = pr.personaPrompt
db.username = pr.name,
db.userIcon = pr.icon
db.selectedPersona = id
setDatabase(db)
}
interface PersonaCard {
name: string
personaPrompt: string
}
export async function exportUserPersona(){
let db = get(DataBase)
if(!db.userIcon){
alertError(language.errors.noUserIcon)
return
}
if((!db.username) || (!db.personaPrompt)){
alertError("username or persona prompt is empty")
return
}
let img = await readImage(db.userIcon)
let card:PersonaCard = structuredClone({
name: db.username,
personaPrompt: db.personaPrompt,
})
alertStore.set({
type: 'wait',
msg: 'Loading... (Writing Exif)'
})
await sleep(10)
img = (await PngChunk.write(await reencodeImage(img), {
"persona":Buffer.from(JSON.stringify(card)).toString('base64')
})) as Uint8Array
alertStore.set({
type: 'wait',
msg: 'Loading... (Writing)'
})
await sleep(10)
await downloadFile(`${db.username.replace(/[<>:"/\\|?*\.\,]/g, "")}_export.png`, img)
alertNormal(language.successExport)
}
export async function importUserPersona(){
try {
const v = await selectSingleFile(['png'])
const decoded = PngChunk.read(v.data, ['persona'])?.persona
if(!decoded){
alertError(language.errors.noData)
return
}
const data:PersonaCard = JSON.parse(Buffer.from(decoded, 'base64').toString('utf-8'))
if(data.name && data.personaPrompt){
let db = get(DataBase)
db.personas.push({
name: data.name,
icon: await saveImage(await reencodeImage(v.data)),
personaPrompt: data.personaPrompt,
id: v4()
})
setDatabase(db)
alertNormal(language.successImport)
}else{
alertError(language.errors.noData)
}
} catch (error) {
alertError(`${error}`)
return
}
}