@@ -5187,6 +5187,7 @@ Current version indicated by LITEVER below.
51875187
51885188 function updateCharacterListFromAll()
51895189 {
5190+ allCharacterNames = allCharacterNames.filter((elem, pos, arr) => arr.findIndex(searchElem => searchElem.name === elem.name) === pos).sort((a, b) => a.name > b.name ? 1 : -1)
51905191 indexeddb_save("characterList", JSON.stringify(allCharacterNames)).then(() => {
51915192 waitingToast.hide()
51925193 })
@@ -5203,7 +5204,47 @@ Current version indicated by LITEVER below.
52035204 }
52045205 let updateCharacterListFromAllDe = debounce(updateCharacterListFromAll, 5000);
52055206
5206- function convertTavernPng(data) //import tavern png data. adapted from png-chunks-extract under MIT license
5207+
5208+ // https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string
5209+ async function bufferToBase64(buffer) {
5210+ // use a FileReader to generate a base64 data URI:
5211+ const base64url = await new Promise(r => {
5212+ const reader = new FileReader()
5213+ reader.onload = () => r(reader.result)
5214+ reader.readAsDataURL(new Blob([buffer]))
5215+ });
5216+ // remove the `data:...;base64,` part from the start
5217+ return base64url.slice(base64url.indexOf(',') + 1);
5218+ }
5219+
5220+ function saveCharacterDataToIndexDB(data, decoded, filename)
5221+ {
5222+ try
5223+ {
5224+ bufferToBase64(data).then(async (b64) => {
5225+ b64Url = `data:image/png;base64,${b64}`
5226+ let charData = !!decoded?.data ? decoded.data : decoded;
5227+ let rawName = !!charData?.name ? charData?.name : (!!filename ? filename : "No character name"), charName = rawName.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5228+ charData.name = charName;
5229+ let dataUrl = await generateThumbnail(b64Url, [256, 256])
5230+ let dataToSave = {
5231+ name: charName,
5232+ data: charData,
5233+ image: b64Url
5234+ }
5235+ indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5236+ allCharacterNames.push({name: charName, thumbnail: dataUrl})
5237+ updateCharacterListFromAllDe();
5238+ })
5239+ })
5240+ }
5241+ catch (e)
5242+ {
5243+ console.error(e)
5244+ }
5245+ }
5246+
5247+ function convertTavernPng(data, filename) //import tavern png data. adapted from png-chunks-extract under MIT license
52075248 {
52085249 //accepts png input data, and returns the extracted JSON
52095250 console.log("Attempting PNG import...");
@@ -5316,48 +5357,15 @@ Current version indicated by LITEVER below.
53165357 }
53175358 var decoded = JSON.parse(b64_decode_unicode(b64buf));
53185359 console.log(decoded);
5319- try
5320- {
5321- // https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string
5322- async function bufferToBase64(buffer) {
5323- // use a FileReader to generate a base64 data URI:
5324- const base64url = await new Promise(r => {
5325- const reader = new FileReader()
5326- reader.onload = () => r(reader.result)
5327- reader.readAsDataURL(new Blob([buffer]))
5328- });
5329- // remove the `data:...;base64,` part from the start
5330- return base64url.slice(base64url.indexOf(',') + 1);
5331- }
5332-
5333- bufferToBase64(data).then(async (b64) => {
5334- b64Url = `data:image/png;base64,${b64}`
5335- let charData = !!decoded?.data ? decoded.data : decoded, charName = charData.name;
5336- let dataUrl = await generateThumbnail(b64Url, [256, 256])
5337- let dataToSave = {
5338- name: charName,
5339- data: charData,
5340- image: b64Url
5341- }
5342- indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5343- allCharacterNames.push({name: charName, thumbnail: dataUrl})
5344- updateCharacterListFromAllDe();
5345- })
5346- })
5347-
5348- }
5349- catch (e)
5350- {
5351- console.error(e)
5352- }
5360+ saveCharacterDataToIndexDB(data, decoded, filename)
53535361 return decoded;
53545362 } catch (e) {
53555363 console.log("Error decoding b64 in image: " + e);
53565364 return null;
53575365 }
53585366 }
53595367 }
5360- function getTavernExifJSON(data) //a hacky exif reader for new tavernai format
5368+ function getTavernExifJSON(data, filename ) //a hacky exif reader for new tavernai format
53615369 {
53625370 console.log("Attempting WEBP import...");
53635371 var uint8 = new Uint8Array(4);
@@ -5421,6 +5429,7 @@ Current version indicated by LITEVER below.
54215429 try {
54225430 var decoded = JSON.parse(readtxt);
54235431 console.log(decoded);
5432+ saveCharacterDataToIndexDB(data, decoded, filename)
54245433 return decoded;
54255434 } catch (e) {
54265435 console.log("Error decoding webp txt: " + e);
@@ -8159,15 +8168,15 @@ Current version indicated by LITEVER below.
81598168 }
81608169
81618170 // 1. Try Tavern PNG
8162- let result = convertTavernPng(arr);
8171+ let result = convertTavernPng(arr, selectedFile.name );
81638172 if (result) {
81648173 load_tavern_obj(result);
81658174 setImgAsAvatar(data);
81668175 return;
81678176 }
81688177
81698178 // 2. Try Tavern EXIF
8170- result = getTavernExifJSON(arr);
8179+ result = getTavernExifJSON(arr, selectedFile.name );
81718180 if (result) {
81728181 load_tavern_obj(result);
81738182 setImgAsAvatar(data);
@@ -23433,10 +23442,10 @@ Current version indicated by LITEVER below.
2343323442 saveFileGeneric('world_info', fdata, 'application/json');
2343423443 }
2343523444
23436- function importCharacterCardAsWI(data) {
23445+ function importCharacterCardAsWI(data, fileName ) {
2343723446 let arr = new Uint8Array(data)
2343823447
23439- let tavernData = convertTavernPng(arr)
23448+ let tavernData = convertTavernPng(arr, fileName )
2344023449 return importCharacterCardAsWIInternal(tavernData)
2344123450 }
2344223451
@@ -23494,7 +23503,7 @@ Current version indicated by LITEVER below.
2349423503 let wiToAdd = []
2349523504 if (ext === ".png")
2349623505 {
23497- wiToAdd = importCharacterCardAsWI(dataArr)
23506+ wiToAdd = importCharacterCardAsWI(dataArr, fileName )
2349823507 }
2349923508 else
2350023509 {
@@ -24191,8 +24200,15 @@ Current version indicated by LITEVER below.
2419124200
2419224201 function getImageForSource(source, name)
2419324202 {
24194- if (name === undefined)
24203+ if (name === "User")
24204+ {
24205+ name = localsettings?.chatname
24206+ }
24207+ if (name === "KoboldAI")
2419524208 {
24209+ name = localsettings?.chatopponent?.split("||$||")[0]
24210+ }
24211+ if (name === undefined) {
2419624212 return undefined;
2419724213 }
2419824214 let imageFromIndexDB = getImageUrlFromCharacter(name)
@@ -37421,9 +37437,21 @@ flowchart TD\n${treeToViewOutput.outputText.trim()}`
3742137437 if (ext === ".png")
3742237438 {
3742337439 let arr = new Uint8Array(dataArr)
37424- convertTavernPng(arr)
37440+ let res = convertTavernPng(arr)
37441+ if (!res)
37442+ {
37443+ getTavernExifJSON(arr)
37444+ }
3742537445 }
37426- }, [".png"], true)
37446+ }, [".png", ".webp"], true)
37447+ }).button("Delete all characters", async () => {
37448+ popupUtils.reset()
37449+ waitingToast.show()
37450+ waitingToast.setText(`Deleting all characters`)
37451+ await Promise.all(allCharacterNames.map(elem => indexeddb_save(`character_${elem.name}`, {})))
37452+ allCharacterNames = []
37453+ await updateCharacterListFromAll()
37454+ waitingToast.hide()
3742737455 }).button("Close", () => popupUtils.reset()).show();
3742837456 }
3742937457</script>
0 commit comments