Skip to content

Commit 5872231

Browse files
author
prima
committed
fix: Assorted character manager fixes
1 parent ef1a0cb commit 5872231

File tree

1 file changed

+72
-44
lines changed

1 file changed

+72
-44
lines changed

klite.embd

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)