diff --git a/public/script.js b/public/script.js index d8e59ae02..982f54f11 100644 --- a/public/script.js +++ b/public/script.js @@ -818,7 +818,7 @@ async function printCharacters() { template.find('.avatar').attr('title', item.avatar); template.find('.ch_name').text(item.name); template.find('.ch_fav_icon').css("display", 'none'); - template.addClass(item.fav == "true" ? 'is_fav' : ''); + template.toggleClass('is_fav', item.fav || item.fav == 'true'); template.find('.ch_fav').val(item.fav); // Display inline tags @@ -4348,7 +4348,7 @@ export function select_selected_character(chid) { this_avatar = getThumbnailUrl('avatar', characters[chid].avatar); } - updateFavButtonState(characters[chid].fav == "true"); + updateFavButtonState(characters[chid].fav || characters[chid].fav == "true"); $("#avatar_load_preview").attr("src", this_avatar); $("#name_div").removeClass('displayBlock'); diff --git a/public/scripts/bookmarks.js b/public/scripts/bookmarks.js index 1af3b963b..b69dbc1ff 100644 --- a/public/scripts/bookmarks.js +++ b/public/scripts/bookmarks.js @@ -201,7 +201,7 @@ async function convertSoloToGroupChat() { const members = [character.avatar]; const activationStrategy = group_activation_strategy.NATURAL; const allowSelfResponses = false; - const favChecked = character.fav == 'true'; + const favChecked = character.fav || character.fav == 'true'; const metadata = Object.assign({}, chat_metadata); delete metadata.main_chat; diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index ac920e7df..48ec3f252 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -954,7 +954,7 @@ function select_group_chats(groupId, skipAnimation) { template.find(".avatar img").attr("title", character.avatar); template.find(".ch_name").text(character.name); template.attr("chid", characters.indexOf(character)); - template.addClass(character.fav == 'true' ? 'is_fav' : ''); + template.toggleClass('is_fav', character.fav || character.fav == 'true'); if (!group) { template.find('[data-action="speak"]').hide(); diff --git a/server.js b/server.js index c39dcae08..79c8bfc86 100644 --- a/server.js +++ b/server.js @@ -3,6 +3,11 @@ const process = require('process') const yargs = require('yargs/yargs'); const { hideBin } = require('yargs/helpers'); +const net = require("net"); +// work around a node v20 bug: https://github.com/nodejs/node/issues/47822#issuecomment-1564708870 +if (net.setDefaultAutoSelectFamily) { + net.setDefaultAutoSelectFamily(false); +} const cliArguments = yargs(hideBin(process.argv)) .option('ssl', { @@ -716,7 +721,7 @@ function readFromV2(char) { return; } if (!_.isUndefined(char[charField]) && !_.isUndefined(v2Value) && char[charField] !== v2Value) { - console.debug(`Spec v2 data mismatch with Spec v1 for field: ${charField}`); + console.debug(`Spec v2 data mismatch with Spec v1 for field: ${charField}`, char[charField], v2Value); } char[charField] = v2Value; }); @@ -743,7 +748,7 @@ function charaFormatData(data) { _.set(char, 'avatar', 'none'); _.set(char, 'chat', data.ch_name + ' - ' + humanizedISO8601DateTime()); _.set(char, 'talkativeness', data.talkativeness); - _.set(char, 'fav', data.fav); + _.set(char, 'fav', data.fav == 'true'); _.set(char, 'create_date', humanizedISO8601DateTime()); // Spec V2 fields @@ -767,13 +772,13 @@ function charaFormatData(data) { // ST extension fields to V2 object _.set(char, 'data.extensions.talkativeness', data.talkativeness); - _.set(char, 'data.extensions.fav', data.fav); + _.set(char, 'data.extensions.fav', data.fav == 'true'); //_.set(char, 'data.extensions.create_date', humanizedISO8601DateTime()); //_.set(char, 'data.extensions.avatar', 'none'); //_.set(char, 'data.extensions.chat', data.ch_name + ' - ' + humanizedISO8601DateTime()); // TODO: Character book - _.set(char, 'data.character_book', undefined); + _//.set(char, 'data.character_book', undefined); return char; } @@ -840,10 +845,12 @@ app.post("/renamecharacter", jsonParser, async function (request, response) { const newChatsPath = path.join(chatsPath, newInternalName); try { + const _ = require('lodash'); // Read old file, replace name int it const rawOldData = await charaRead(oldAvatarPath); - const oldData = json5.parse(rawOldData); - oldData['name'] = newName; + const oldData = getCharaCardV2(json5.parse(rawOldData)); + _.set(oldData, 'data.name', newName); + _.set(oldData, 'name', newName); const newData = JSON.stringify(oldData); // Write data to new location @@ -1002,14 +1009,7 @@ app.post("/getcharacters", jsonParser, function (request, response) { for (const item of pngFiles) { try { var img_data = await charaRead(charactersPath + item); - let jsonObject = json5.parse(img_data); - - if (jsonObject.spec === undefined) { - jsonObject = convertToV2(jsonObject); - } else { - jsonObject = readFromV2(jsonObject); - } - + let jsonObject = getCharaCardV2(json5.parse(img_data)); jsonObject.avatar = item; characters[i] = {}; characters[i] = jsonObject; @@ -1183,6 +1183,15 @@ app.post("/savesettings", jsonParser, function (request, response) { }); }); +function getCharaCardV2(jsonObject) { + if (jsonObject.spec === undefined) { + jsonObject = convertToV2(jsonObject); + } else { + jsonObject = readFromV2(jsonObject); + } + return jsonObject; +} + function readAndParseFromDirectory(directoryPath, fileExtension = '.json') { const files = fs .readdirSync(directoryPath) @@ -1759,7 +1768,7 @@ app.post("/exportcharacter", jsonParser, async function (request, response) { case 'json': { try { let json = await charaRead(filename); - let jsonObject = json5.parse(json); + let jsonObject = getCharaCardV2(json5.parse(json)); return response.type('json').send(jsonObject) } catch {