feat: persona binding

This commit is contained in:
kwaroran
2024-07-30 00:40:09 +09:00
parent 634056b0cb
commit b9b7201889
11 changed files with 187 additions and 31 deletions

View File

@@ -6,7 +6,10 @@ import { Capacitor } from "@capacitor/core"
import { DataBase, type MessageGenerationInfo } from "./storage/database"
interface alertData{
type: 'error'| 'normal'|'none'|'ask'|'wait'|'selectChar'|'input'|'toast'|'wait2'|'markdown'|'select'|'login'|'tos'|'cardexport'|'requestdata'|'addchar'|'hypaV2'|'selectModule',
type: 'error'|'normal'|'none'|'ask'|'wait'|'selectChar'
|'input'|'toast'|'wait2'|'markdown'|'select'|'login'
|'tos'|'cardexport'|'requestdata'|'addchar'|'hypaV2'|'selectModule'
|'chatOptions',
msg: string,
submsg?: string
}
@@ -94,6 +97,21 @@ export async function alertAddCharacter() {
return get(alertStore).msg
}
export async function alertChatOptions() {
alertStore.set({
'type': 'chatOptions',
'msg': language.chatOptions
})
while(true){
if (get(alertStore).type === 'none'){
break
}
await sleep(10)
}
return parseInt(get(alertStore).msg)
}
export async function alertLogin(){
alertStore.set({
'type': 'login',

View File

@@ -6,6 +6,7 @@ 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'])
@@ -17,21 +18,20 @@ export async function selectUserImg() {
const imgp = await saveImage(img)
db.userIcon = imgp
db.personas[db.selectedPersona] = {
name: getUserName(),
name: db.username,
icon: db.userIcon,
personaPrompt: db.personaPrompt
personaPrompt: db.personaPrompt,
id: v4()
}
setDatabase(db)
}
export function saveUserPersona() {
let db = get(DataBase)
db.personas[db.selectedPersona] = {
name: getUserName(),
icon: db.userIcon,
personaPrompt: db.personaPrompt,
largePortrait: db.personas[db.selectedPersona]?.largePortrait,
}
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)
}
@@ -111,7 +111,8 @@ export async function importUserPersona(){
db.personas.push({
name: data.name,
icon: await saveImage(await reencodeImage(v.data)),
personaPrompt: data.personaPrompt
personaPrompt: data.personaPrompt,
id: v4()
})
setDatabase(db)
alertNormal(language.successImport)

View File

@@ -595,6 +595,7 @@ export interface Database{
name:string
icon:string
largePortrait?:boolean
id?:string
}[]
assetWidth:number
animationSpeed:number
@@ -1005,6 +1006,7 @@ export interface Chat{
scriptstate?:{[key:string]:string|number|boolean}
modules?:string[]
id?:string
bindedPersona?:string
}
export interface Message{

View File

@@ -923,6 +923,11 @@ async function checkNewFormat() {
return v
})
db.personas = (db.personas ?? []).map((v) => {
v.id ??= uuidv4()
return v
})
if(!db.formatversion){
function checkParge(data:string){

View File

@@ -2,7 +2,7 @@ import { get, writable, type Writable } from "svelte/store";
import { DataBase, type Chat, type character, type groupChat } from "./storage/database";
import { isEqual } from "lodash";
import type { simpleCharacterArgument } from "./parser";
import { getUserIcon, getUserName, sleep } from "./util";
import { getUserIcon, getUserIconProtrait, getUserName, sleep } from "./util";
import { getModules } from "./process/modules";
function updateSize(){
@@ -43,6 +43,7 @@ export const OpenRealmStore = writable(false)
export const ShowRealmFrameStore = writable('')
export const PlaygroundStore = writable(0)
export const HideIconStore = writable(false)
export const UserIconProtrait = writable(false)
let lastGlobalEnabledModules: string[] = []
let lastChatEnabledModules: string[] = []
let moduleHideIcon = false
@@ -136,7 +137,10 @@ async function preInit(){
CurrentUsername.set(getUserName())
}
if(getUserIcon() !== get(CurrentUserIcon)){
CurrentUserIcon.set(data.userIcon)
CurrentUserIcon.set(getUserIcon())
}
if(getUserIconProtrait() !== get(UserIconProtrait)){
UserIconProtrait.set(getUserIconProtrait())
}
if(data.showMemoryLimit !== get(CurrentShowMemoryLimit)){
CurrentShowMemoryLimit.set(data.showMemoryLimit)
@@ -161,7 +165,15 @@ async function preInit(){
characterHideIcon = char?.hideChatIcon
HideIconStore.set(characterHideIcon || moduleHideIcon)
}
if(getUserName() !== get(CurrentUsername)){
CurrentUsername.set(getUserName())
}
if(getUserIcon() !== get(CurrentUserIcon)){
CurrentUserIcon.set(getUserIcon())
}
if(getUserIconProtrait() !== get(UserIconProtrait)){
UserIconProtrait.set(getUserIconProtrait())
}
if(charId === -1 || charId > db.characters.length){
return
}

View File

@@ -107,21 +107,65 @@ export const replacePlaceholders = (msg:string, name:string) => {
.replace(/(\{\{((set)|(get))var::.+?\}\})/gu,'')
}
function checkPersonaBinded(){
try {
let db = get(DataBase)
const selectedChar = get(selectedCharID)
const character = db.characters[selectedChar]
const chat = character.chats[character.chatPage]
console.log(chat.bindedPersona)
if(!chat.bindedPersona){
return null
}
const persona = db.personas.find(v => v.id === chat.bindedPersona)
console.log(db.personas, persona)
return persona
} catch (error) {
return null
}
}
export function getUserName(){
const bindedPersona = checkPersonaBinded()
if(bindedPersona){
return bindedPersona.name
}
const db = get(DataBase)
return db.username ?? 'User'
}
export function getUserIcon(){
const bindedPersona = checkPersonaBinded()
console.log(`Icon: ${bindedPersona?.icon}`)
if(bindedPersona){
return bindedPersona.icon
}
const db = get(DataBase)
return db.userIcon ?? ''
}
export function getPersonaPrompt(){
const bindedPersona = checkPersonaBinded()
if(bindedPersona){
return bindedPersona.personaPrompt
}
const db = get(DataBase)
return db.personaPrompt ?? ''
}
export function getUserIconProtrait(){
try {
const bindedPersona = checkPersonaBinded()
if(bindedPersona){
return bindedPersona.largePortrait
}
const db = get(DataBase)
return db.personas[db.selectedPersona].largePortrait
} catch (error) {
return false
}
}
export function checkIsIos(){
return /(iPad|iPhone|iPod)/g.test(navigator.userAgent)
}