From 59cc0b37b423d8acabe8de8c3d7d1f8747528e45 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Wed, 10 May 2023 20:31:17 +0900 Subject: [PATCH] [feat] added characterhub endpoint --- src/ts/characterCards.ts | 149 ++++++++++++++++++++++++--------------- src/ts/globalApi.ts | 4 ++ 2 files changed, 95 insertions(+), 58 deletions(-) diff --git a/src/ts/characterCards.ts b/src/ts/characterCards.ts index 6a6e4ace..64f8d1f1 100644 --- a/src/ts/characterCards.ts +++ b/src/ts/characterCards.ts @@ -27,29 +27,7 @@ export async function importCharacter() { } if((da.char_name || da.name) && (da.char_persona || da.description) && (da.char_greeting || da.first_mes)){ let db = get(DataBase) - db.characters.push({ - name: da.char_name ?? da.name, - firstMessage: da.char_greeting ?? da.first_mes, - desc: da.char_persona ?? da.description, - notes: '', - chats: [{ - message: [], - note: '', - name: 'Chat 1', - localLore: [] - }], - chatPage: 0, - image: '', - emotionImages: [], - bias: [], - globalLore: [], - viewScreen: 'none', - chaId: uuidv4(), - sdData: defaultSdDataFunc(), - utilityBot: false, - customscript: [], - exampleMessage: '' - }) + db.characters.push(convertOldTavernAndJSON(da)) DataBase.set(db) alertNormal(language.importedCharacter) return @@ -83,7 +61,6 @@ export async function importCharacter() { return } - let char:character = va.data let db = get(DataBase) if(char.emotionImages && char.emotionImages.length > 0){ @@ -118,38 +95,12 @@ export async function importCharacter() { } else if(readed.chara){ const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8')) - if(charaData.first_mes && charaData.name && charaData.description){ - const imgp = await saveImage(PngMetadata.filter(img)) - let db = get(DataBase) - db.characters.push({ - name: charaData.name, - firstMessage: charaData.first_mes, - desc: charaData.description, - notes: '', - chats: [{ - message: [], - note: '', - name: 'Chat 1', - localLore: [] - }], - chatPage: 0, - image: imgp, - emotionImages: [], - bias: [], - globalLore: [], - viewScreen: 'none', - chaId: uuidv4(), - sdData: defaultSdDataFunc(), - utilityBot: false, - customscript: [], - exampleMessage: '' - }) - DataBase.set(db) - alertNormal(language.importedCharacter) - return db.characters.length - 1 - } - alertError(language.errors.noData) - return null + const imgp = await saveImage(PngMetadata.filter(img)) + let db = get(DataBase) + db.characters.push(convertOldTavernAndJSON(charaData, imgp)) + DataBase.set(db) + alertNormal(language.importedCharacter) + return db.characters.length - 1 } else{ alertError(language.errors.noData) @@ -161,6 +112,88 @@ export async function importCharacter() { } } +export async function characterHubImport() { + const charPath = (new URLSearchParams(location.search)).get('charahub') + try { + if(charPath){ + const url = new URL(location.href); + url.searchParams.delete('charahub'); + window.history.pushState(null, '', url.toString()); + const chara = await fetch("https://api.characterhub.org/api/characters/download", { + method: "POST", + body: JSON.stringify({ + "format": "tavern", + "fullPath": charPath, + "version": "main" + }), + headers: { + "content-type": "application/json" + } + }) + const img = new Uint8Array(await chara.arrayBuffer()) + + const readed = (await exifr.parse(img, true)) + { + const charaData:CharacterCardV2 = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8')) + if(await importSpecv2(charaData, img)){ + + return + } + } + { + const imgp = await saveImage(PngMetadata.filter(img)) + let db = get(DataBase) + const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8')) + db.characters.push(convertOldTavernAndJSON(charaData, imgp)) + + DataBase.set(db) + alertNormal(language.importedCharacter) + return + } + } + } catch (error) { + alertError(language.errors.noData) + return null + } +} + + +function convertOldTavernAndJSON(charaData:OldTavernChar, imgp:string|undefined = undefined):character{ + + let desc = charaData.description ?? '' + + if(charaData.personality){ + desc += '\n\n' + charaData.personality + } + + if(charaData.scenario){ + desc += '\n\n' + charaData.scenario + } + + return { + name: charaData.name ?? 'unknown name', + firstMessage: charaData.first_mes ?? 'unknown first message', + desc: desc, + notes: '', + chats: [{ + message: [], + note: '', + name: 'Chat 1', + localLore: [] + }], + chatPage: 0, + image: imgp, + emotionImages: [], + bias: [], + globalLore: [], + viewScreen: 'none', + chaId: uuidv4(), + sdData: defaultSdDataFunc(), + utilityBot: false, + customscript: [], + exampleMessage: charaData.mes_example + } +} export async function exportChar(charaID:number) { const db = get(DataBase) @@ -313,7 +346,7 @@ async function importSpecv2(card:CharacterCardV2, img?:Uint8Array):Promise" + mes_example: string name: string personality: "" scenario: "" diff --git a/src/ts/globalApi.ts b/src/ts/globalApi.ts index ef02e9bf..f38f82ec 100644 --- a/src/ts/globalApi.ts +++ b/src/ts/globalApi.ts @@ -15,6 +15,7 @@ import { loadPlugins } from "./process/plugins"; import { alertError, alertStore } from "./alert"; import { checkDriverInit } from "./drive/drive"; import { hasher } from "./parser"; +import { characterHubImport } from "./characterCards"; //@ts-ignore export const isTauri = !!window.__TAURI__ @@ -266,6 +267,9 @@ export async function loadData() { usingSw = false } checkOldDomain() + if(get(DataBase).didFirstSetup){ + characterHubImport() + } } try { await pargeChunks()