Skip to content

Commit 47880ff

Browse files
Latest HTML
1 parent f3b4a7a commit 47880ff

File tree

7 files changed

+173
-61
lines changed

7 files changed

+173
-61
lines changed

docs/index.html

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5521,10 +5521,12 @@
55215521
}
55225522

55235523
function debounce(func, delay) {
5524-
let timeout;
5524+
let timeout, functionName = func?.prototype?.constructor?.name, debounceVar = `debounce_pending_${functionName || "generic"}`;;
55255525
return function (...args) {
5526+
window[debounceVar] = true
55265527
clearTimeout(timeout);
55275528
timeout = setTimeout(() => {
5529+
window[debounceVar] = false
55285530
func.apply(this, args);
55295531
}, delay);
55305532
};
@@ -5548,22 +5550,36 @@
55485550
{
55495551
try
55505552
{
5551-
bufferToBase64(data).then(async (b64) => {
5552-
let b64Url = `data:image/png;base64,${b64}`
5553-
let charData = !!decoded?.data ? decoded.data : decoded;
5554-
let rawName = !!charData?.name ? charData?.name : (!!filename ? filename : "No character name"), charName = rawName.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5555-
charData.name = charName;
5556-
let dataUrl = await generateThumbnail(b64Url, [256, 256])
5553+
let charData = !!decoded?.data ? decoded.data : decoded;
5554+
let rawName = !!charData?.name ? charData?.name : (!!filename ? filename : "No character name"), charName = rawName.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5555+
charData.name = charName;
5556+
if (!!data)
5557+
{
5558+
bufferToBase64(data).then(async (b64) => {
5559+
let b64Url = `data:image/png;base64,${b64}`
5560+
let dataUrl = await generateThumbnail(b64Url, [256, 256])
5561+
let dataToSave = {
5562+
name: charName,
5563+
data: charData,
5564+
image: b64Url
5565+
}
5566+
indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5567+
allCharacterNames.push({name: charName, thumbnail: dataUrl, type: "Character"})
5568+
updateCharacterListFromAllDe();
5569+
})
5570+
})
5571+
}
5572+
else
5573+
{
55575574
let dataToSave = {
55585575
name: charName,
5559-
data: charData,
5560-
image: b64Url
5576+
data: charData
55615577
}
55625578
indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5563-
allCharacterNames.push({name: charName, thumbnail: dataUrl, type: "Character"})
5579+
allCharacterNames.push({name: charName, type: "Character"})
55645580
updateCharacterListFromAllDe();
55655581
})
5566-
})
5582+
}
55675583
}
55685584
catch (e)
55695585
{

docs/static/css/esoStyling.css

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/static/js/characterManager.js

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,13 @@ let getScenariosAndLegacyServerSaves = async () => {
594594

595595
let maxLengthForSection = 500, halfMaxLengthForSection = Math.floor(maxLengthForSection / 2);
596596
let showCharacterList = async () => {
597+
// Still processing characters
598+
if (!!window?.debounce_pending_updateCharacterListFromAll || !!window?.pending_encrypt)
599+
{
600+
handleError("Please wait - data is still being loaded")
601+
return
602+
}
603+
597604
let containers = []
598605

599606
let createIcon = (name, image) => {
@@ -662,40 +669,47 @@ let showCharacterList = async () => {
662669
saveKLiteSaveToIndexDB(fileName, data)
663670
}
664671
else {
665-
let wiToAdd = data, has_tav_wi_check = has_tavern_wi_check(wiToAdd), wiName = fileName;
666-
if (has_tav_wi_check) {
667-
if (wiToAdd?.name !== undefined && wiToAdd.name.trim().length > 0) {
668-
wiName = wiToAdd.name
669-
}
670-
wiToAdd = load_tavern_wi(wiToAdd);
671-
if (wiToAdd && wiToAdd.length > 0) {
672-
wiToAdd.forEach(wi => wi.wigroup = fileName.replace("'", ""))
673-
}
672+
if (!data.scenarioVersion && (data.name != null || data.description != null ||
673+
data.personality != null || (data.spec == "chara_card_v2" || data.spec == "chara_card_v3") || has_tav_wi_check)) {
674+
saveCharacterDataToIndexDB(undefined, data, fileName)
674675
}
675-
else {
676-
try {
677-
let hasNoGeneralWI = wiToAdd.length === 0 || wiToAdd.find(wi => wi?.wigroup === undefined || wi.wigroup.trim() === null || wi.wigroup === "" || wi.wigroup === "General") === undefined;
678-
if (hasNoGeneralWI) {
679-
let wiAllHaveSameGroup = wiToAdd.find((e, p, a) => a.find(c => c?.wigroup !== e.wigroup)) === undefined
680-
if (wiAllHaveSameGroup) {
681-
wiName = wiToAdd[0].wigroup
676+
else
677+
{
678+
let wiToAdd = data, has_tav_wi_check = has_tavern_wi_check(wiToAdd), wiName = fileName;
679+
if (has_tav_wi_check) {
680+
if (wiToAdd?.name !== undefined && wiToAdd.name.trim().length > 0) {
681+
wiName = wiToAdd.name
682+
}
683+
wiToAdd = load_tavern_wi(wiToAdd);
684+
if (wiToAdd && wiToAdd.length > 0) {
685+
wiToAdd.forEach(wi => wi.wigroup = fileName.replace("'", ""))
686+
}
687+
}
688+
else {
689+
try {
690+
let hasNoGeneralWI = wiToAdd.length === 0 || wiToAdd.find(wi => wi?.wigroup === undefined || wi.wigroup.trim() === null || wi.wigroup === "" || wi.wigroup === "General") === undefined;
691+
if (hasNoGeneralWI) {
692+
let wiAllHaveSameGroup = wiToAdd.find((e, p, a) => a.find(c => c?.wigroup !== e.wigroup)) === undefined
693+
if (wiAllHaveSameGroup) {
694+
wiName = wiToAdd[0].wigroup
695+
}
682696
}
683697
}
698+
catch (e) {
699+
console.error(e)
700+
}
684701
}
685-
catch (e) {
686-
console.error(e)
702+
if (Array.isArray(wiToAdd)) {
703+
wiToAdd = wiToAdd.filter(wi => wi?.key !== undefined)
704+
if (wiToAdd.length > 0) {
705+
saveLorebookToIndexDB(wiName, wiToAdd, JSON.parse(plaintext))
706+
}
687707
}
688-
}
689-
if (Array.isArray(wiToAdd)) {
690-
wiToAdd = wiToAdd.filter(wi => wi?.key !== undefined)
691-
if (wiToAdd.length > 0) {
692-
saveLorebookToIndexDB(wiName, wiToAdd, JSON.parse(plaintext))
708+
else {
709+
waitingToast.hide()
710+
handleError(`${fileName}: JSON does not contain WI or lorebook`)
693711
}
694712
}
695-
else {
696-
waitingToast.hide()
697-
handleError(`${fileName}: JSON does not contain WI or lorebook`)
698-
}
699713
}
700714
}
701715
}
@@ -839,6 +853,13 @@ let showCharacterList = async () => {
839853
a.click();
840854
a.remove();
841855
}
856+
let jsObjToBytes = (data) => {
857+
let bytes = new TextEncoder().encode(JSON.stringify(data)), text = "";
858+
for (var i = 0; i < Math.ceil(bytes.length / 32768.0); i++) {
859+
text += String.fromCharCode.apply(null, bytes.slice(i * 32768, Math.min((i + 1) * 32768, bytes.length)))
860+
}
861+
return text
862+
}
842863
createSearchInput()
843864
for (let i = 0; i < allCharacterNames.length; i++) {
844865
let { name, thumbnail } = allCharacterNames[i], type = getTypeFromAllCharacterData(allCharacterNames[i]);
@@ -889,8 +910,19 @@ let showCharacterList = async () => {
889910
}
890911
}).button("Download character", async () => {
891912
popupUtils.reset()
892-
let charData = await getCharacterData(name), { image } = charData;
893-
downloadB64URL(`${name}.png`, image)
913+
let charData = await getCharacterData(name);
914+
if (!!charData?.image) {
915+
downloadB64URL(`${name}.png`, charData.image)
916+
}
917+
else
918+
{
919+
try {
920+
downloadB64URL(`${name}.json`, `data:application/json;base64,${btoa(jsObjToBytes(charData.data))}`)
921+
}
922+
catch (e) {
923+
handleError(e)
924+
}
925+
}
894926
}).button("Delete character", async () => {
895927
popupUtils.reset()
896928
msgboxYesNo("Are you sure you wish to delete?", "Character manager", async () => {
@@ -924,11 +956,7 @@ let showCharacterList = async () => {
924956
let charData = await getCharacterData(name), { originalData } = charData;
925957
if (!!originalData) {
926958
try {
927-
let bytes = new TextEncoder().encode(JSON.stringify(originalData)), text = "";
928-
for (var i = 0; i < Math.ceil(bytes.length / 32768.0); i++) {
929-
text += String.fromCharCode.apply(null, bytes.slice(i * 32768, Math.min((i + 1) * 32768, bytes.length)))
930-
}
931-
downloadB64URL(`${name}.json`, `data:application/json;base64,${btoa(text)}`)
959+
downloadB64URL(`${name}.json`, `data:application/json;base64,${btoa(jsObjToBytes(originalData))}`)
932960
}
933961
catch (e) {
934962
handleError(e)
@@ -1126,6 +1154,10 @@ let showCharacterList = async () => {
11261154
}
11271155
}, false);
11281156
})
1157+
.button("Download", () => {
1158+
popupUtils.reset()
1159+
save_file_button()
1160+
})
11291161
.button("Share", () => {
11301162
popupUtils.reset()
11311163
share_story_button()

docs/static/js/encryptUtils.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
window.encrypt = (key, data) => {
2+
waitingToast.setText("Encrypting")
3+
waitingToast.show()
4+
window["pending_encrypt"] = true
5+
26
var iv = forge.random.getBytesSync(16)
37
var salt = forge.random.getBytesSync(128)
48
var saltedKey = forge.pkcs5.pbkdf2(key, salt, 10, 16)
@@ -13,10 +17,18 @@ window.encrypt = (key, data) => {
1317
iv: btoa(iv),
1418
text: cipher.output.toHex(),
1519
}
16-
return btoa(JSON.stringify(encryptedObj))
20+
let returnValue = btoa(JSON.stringify(encryptedObj))
21+
22+
window["pending_encrypt"] = false
23+
waitingToast.hide()
24+
return returnValue
1725
}
1826

1927
window.decrypt = (key, data) => {
28+
waitingToast.setText("Decrypting")
29+
waitingToast.show()
30+
window["pending_encrypt"] = true
31+
2032
data = JSON.parse(atob(data))
2133
var encryptedBytes = forge.util.hexToBytes(data.text)
2234
var saltedKey = forge.pkcs5.pbkdf2(key, atob(data.salt), 10, 16)
@@ -34,5 +46,8 @@ window.decrypt = (key, data) => {
3446
} while (index < length)
3547
var result = decipher.finish()
3648
decrypted += decipher.output.getBytes()
49+
50+
window["pending_encrypt"] = false
51+
waitingToast.hide()
3752
return decrypted
3853
}

docs/static/js/newTopMenuButtons.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ window.addEventListener('load', () => {
77
</li>`
88
topButton += `<li class="nav-item" id="topbtn_data_manager">
99
<a class="nav-link mainnav" href="#" onclick="closeTopNav(); showCharacterList();" tabindex="0">Data</a>
10-
<a id="topbtn_save_current" class="nav-link mainnav hidden" href="#" tabindex="0" style="position: absolute;">Save</a>
10+
<span id="additionalSameOptions" class="hidden" style="position: absolute;">
11+
<a id="topbtn_save_current" class="nav-link mainnav" href="#" tabindex="0">Q.Save</a>
12+
<a id="topbtn_download_current" class="nav-link mainnav" href="#" tabindex="0">Download</a>
13+
</span>
1114
</li>`
1215

1316
document.querySelector("#navbarNavDropdown > ul").innerHTML += topButton;
@@ -16,10 +19,10 @@ window.addEventListener('load', () => {
1619

1720
let dataElem = document.querySelector("#topbtn_data_manager")
1821
dataElem.addEventListener("mouseenter", () => {
19-
document.querySelector("#topbtn_save_current").classList.remove("hidden")
22+
document.querySelector("#additionalSameOptions").classList.remove("hidden")
2023
})
2124
dataElem.addEventListener("mouseleave", () => {
22-
document.querySelector("#topbtn_save_current").classList.add("hidden")
25+
document.querySelector("#additionalSameOptions").classList.add("hidden")
2326
})
2427

2528
document.querySelector("#topbtn_save_current").addEventListener("click", () => {
@@ -33,4 +36,8 @@ window.addEventListener('load', () => {
3336
}
3437
}, false);
3538
})
39+
40+
document.querySelector("#topbtn_download_current").addEventListener("click", () => {
41+
save_file_button()
42+
})
3643
})

docs/static/js/waitingToast.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
class WaitingToast {
33
#waitingDiv
44
#waitingText
5+
lock = false
56
constructor() {
67
this.waitingDiv = document.createElement("div")
78
this.waitingDiv.classList.add("waitingToast", "hidden")
@@ -18,10 +19,25 @@ class WaitingToast {
1819
}
1920

2021
show() {
21-
this.waitingDiv.classList.remove("hidden")
22+
if (!this.lock)
23+
{
24+
this.waitingDiv.classList.remove("hidden")
25+
}
2226
}
2327

2428
hide() {
29+
if (!this.lock) {
30+
this.waitingDiv.classList.add("hidden")
31+
}
32+
}
33+
34+
showLock() {
35+
this.lock = true
36+
this.waitingDiv.classList.remove("hidden")
37+
}
38+
39+
hideUnlock() {
40+
this.lock = false
2541
this.waitingDiv.classList.add("hidden")
2642
}
2743

docs/static/klite.embd

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5521,10 +5521,12 @@ Current version indicated by LITEVER below.
55215521
}
55225522

55235523
function debounce(func, delay) {
5524-
let timeout;
5524+
let timeout, functionName = func?.prototype?.constructor?.name, debounceVar = `debounce_pending_${functionName || "generic"}`;;
55255525
return function (...args) {
5526+
window[debounceVar] = true
55265527
clearTimeout(timeout);
55275528
timeout = setTimeout(() => {
5529+
window[debounceVar] = false
55285530
func.apply(this, args);
55295531
}, delay);
55305532
};
@@ -5548,22 +5550,36 @@ Current version indicated by LITEVER below.
55485550
{
55495551
try
55505552
{
5551-
bufferToBase64(data).then(async (b64) => {
5552-
let b64Url = `data:image/png;base64,${b64}`
5553-
let charData = !!decoded?.data ? decoded.data : decoded;
5554-
let rawName = !!charData?.name ? charData?.name : (!!filename ? filename : "No character name"), charName = rawName.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5555-
charData.name = charName;
5556-
let dataUrl = await generateThumbnail(b64Url, [256, 256])
5553+
let charData = !!decoded?.data ? decoded.data : decoded;
5554+
let rawName = !!charData?.name ? charData?.name : (!!filename ? filename : "No character name"), charName = rawName.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5555+
charData.name = charName;
5556+
if (!!data)
5557+
{
5558+
bufferToBase64(data).then(async (b64) => {
5559+
let b64Url = `data:image/png;base64,${b64}`
5560+
let dataUrl = await generateThumbnail(b64Url, [256, 256])
5561+
let dataToSave = {
5562+
name: charName,
5563+
data: charData,
5564+
image: b64Url
5565+
}
5566+
indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5567+
allCharacterNames.push({name: charName, thumbnail: dataUrl, type: "Character"})
5568+
updateCharacterListFromAllDe();
5569+
})
5570+
})
5571+
}
5572+
else
5573+
{
55575574
let dataToSave = {
55585575
name: charName,
5559-
data: charData,
5560-
image: b64Url
5576+
data: charData
55615577
}
55625578
indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5563-
allCharacterNames.push({name: charName, thumbnail: dataUrl, type: "Character"})
5579+
allCharacterNames.push({name: charName, type: "Character"})
55645580
updateCharacterListFromAllDe();
55655581
})
5566-
})
5582+
}
55675583
}
55685584
catch (e)
55695585
{

0 commit comments

Comments
 (0)