Account overrides for group chats and VN mode

This commit is contained in:
Cohee
2023-06-04 17:27:09 +03:00
parent d5e75d7c7b
commit 446b3a4f05

View File

@ -121,13 +121,22 @@ async function visualNovelSetCharacterSprites(container, name, expression) {
} }
const character = context.characters.find(x => x.avatar == avatar); const character = context.characters.find(x => x.avatar == avatar);
let spriteFolderName = character.name;
const avatarFileName = getSpriteFolderName({ original_avatar: character.avatar });
const expressionOverride = extension_settings.expressionOverrides.find((e) =>
e.name == avatarFileName
);
// download images if not downloaded yet if (expressionOverride && expressionOverride.path) {
if (spriteCache[character.name] === undefined) { spriteFolderName = expressionOverride.path;
spriteCache[character.name] = await getSpritesList(character.name, character);
} }
const sprites = spriteCache[character.name]; // download images if not downloaded yet
if (spriteCache[spriteFolderName] === undefined) {
spriteCache[spriteFolderName] = await getSpritesList(spriteFolderName);
}
const sprites = spriteCache[spriteFolderName];
const expressionImage = container.find(`.expression-holder[data-avatar="${avatar}"]`); const expressionImage = container.find(`.expression-holder[data-avatar="${avatar}"]`);
const defaultSpritePath = sprites.find(x => x.label === FALLBACK_EXPRESSION)?.path; const defaultSpritePath = sprites.find(x => x.label === FALLBACK_EXPRESSION)?.path;
const noSprites = sprites.length === 0; const noSprites = sprites.length === 0;
@ -236,7 +245,17 @@ async function setLastMessageSprite(img, avatar, labels) {
if (lastMessage) { if (lastMessage) {
const text = lastMessage.mes || ''; const text = lastMessage.mes || '';
const sprites = spriteCache[lastMessage.name] || []; let spriteFolderName = lastMessage.name;
const avatarFileName = getSpriteFolderName(lastMessage);
const expressionOverride = extension_settings.expressionOverrides.find((e) =>
e.name == avatarFileName
);
if (expressionOverride && expressionOverride.path) {
spriteFolderName = expressionOverride.path;
}
const sprites = spriteCache[spriteFolderName] || [];
const label = await getExpressionLabel(text); const label = await getExpressionLabel(text);
const path = labels.includes(label) ? sprites.find(x => x.label === label)?.path : ''; const path = labels.includes(label) ? sprites.find(x => x.label === label)?.path : '';
@ -303,18 +322,12 @@ async function moduleWorker() {
if (vnStateChanged) { if (vnStateChanged) {
lastMessage = null; lastMessage = null;
$('#visual-novel-wrapper').empty(); $('#visual-novel-wrapper').empty();
$("#expression-holder").css({ top: '', left: '', right: '', bottom: '', height: '', width: '', margin: '' });
} }
const currentLastMessage = getLastCharacterMessage(); const currentLastMessage = getLastCharacterMessage();
// character has no expressions or it is not loaded
if (Object.keys(spriteCache).length === 0) {
await validateImages(currentLastMessage.name);
lastCharacter = context.groupId || context.characterId;
}
let spriteFolderName = currentLastMessage.name; let spriteFolderName = currentLastMessage.name;
const avatarFileName = context.characters[context.characterId].avatar.split(".")[0]; const avatarFileName = getSpriteFolderName(currentLastMessage);
const expressionOverride = extension_settings.expressionOverrides.find((e) => const expressionOverride = extension_settings.expressionOverrides.find((e) =>
e.name == avatarFileName e.name == avatarFileName
); );
@ -323,6 +336,12 @@ async function moduleWorker() {
spriteFolderName = expressionOverride.path; spriteFolderName = expressionOverride.path;
} }
// character has no expressions or it is not loaded
if (Object.keys(spriteCache).length === 0) {
await validateImages(spriteFolderName);
lastCharacter = context.groupId || context.characterId;
}
const offlineMode = $('.expression_settings .offline_mode'); const offlineMode = $('.expression_settings .offline_mode');
if (!modules.includes('classify')) { if (!modules.includes('classify')) {
$('.expression_settings').show(); $('.expression_settings').show();
@ -348,7 +367,6 @@ async function moduleWorker() {
offlineMode.css('display', 'none'); offlineMode.css('display', 'none');
} }
// check if last message changed // check if last message changed
if ((lastCharacter === context.characterId || lastCharacter === context.groupId) if ((lastCharacter === context.characterId || lastCharacter === context.groupId)
&& lastMessage === currentLastMessage.mes) { && lastMessage === currentLastMessage.mes) {
@ -389,6 +407,26 @@ async function moduleWorker() {
} }
} }
function getSpriteFolderName(message) {
const context = getContext();
let avatarPath = '';
if (context.groupId) {
avatarPath = message.original_avatar || context.characters.find(x => message.force_avatar && message.force_avatar.includes(encodeURIComponent(x.avatar)))?.avatar;
}
else if (context.characterId) {
avatarPath = context.characters[context.characterId].avatar;
}
if (!avatarPath) {
return '';
}
const folderName = avatarPath.replace(/\.[^/.]+$/, "");
console.debug(`Folder for ${message.name}:`, folderName);
return folderName;
}
async function sendExpressionCall(name, expression, force, vnMode) { async function sendExpressionCall(name, expression, force, vnMode) {
if (!vnMode) { if (!vnMode) {
vnMode = isVisualNovelMode(); vnMode = isVisualNovelMode();
@ -434,10 +472,10 @@ function getLastCharacterMessage() {
continue; continue;
} }
return { mes: mes.mes, name: mes.name }; return { mes: mes.mes, name: mes.name, original_avatar: mes.original_avatar, force_avatar: mes.force_avatar };
} }
return { mes: '', name: null }; return { mes: '', name: null, original_avatar: null, force_avatar: null };
} }
function removeExpression() { function removeExpression() {
@ -675,7 +713,7 @@ async function onClickExpressionUpload(event) {
async function onClickExpressionOverrideButton() { async function onClickExpressionOverrideButton() {
const context = getContext(); const context = getContext();
const currentLastMessage = getLastCharacterMessage(); const currentLastMessage = getLastCharacterMessage();
const avatarFileName = context.characters[context.characterId].avatar.split(".")[0]; const avatarFileName = getSpriteFolderName(currentLastMessage);
// If the avatar name couldn't be found, abort. // If the avatar name couldn't be found, abort.
if (!avatarFileName) { if (!avatarFileName) {
@ -716,10 +754,12 @@ async function onClickExpressionOverrideButton() {
// Refresh sprites list. Assume the override path has been properly handled. // Refresh sprites list. Assume the override path has been properly handled.
try { try {
$('#visual-novel-wrapper').empty();
await validateImages(overridePath.length === 0 ? currentLastMessage.name : overridePath, true); await validateImages(overridePath.length === 0 ? currentLastMessage.name : overridePath, true);
const expression = await getExpressionLabel(currentLastMessage.mes); const expression = await getExpressionLabel(currentLastMessage.mes);
await sendExpressionCall(overridePath.length === 0 ? currentLastMessage.name : overridePath, expression, true); await sendExpressionCall(overridePath.length === 0 ? currentLastMessage.name : overridePath, expression, true);
} catch(error) { forceUpdateVisualNovelMode();
} catch (error) {
console.debug(`Setting expression override for ${avatarFileName} failed with error: ${error}`); console.debug(`Setting expression override for ${avatarFileName} failed with error: ${error}`);
} }
} }
@ -737,13 +777,15 @@ async function onClickExpressionOverrideRemoveAllButton() {
// Refresh sprites list to use the default name if applicable // Refresh sprites list to use the default name if applicable
try { try {
$('#visual-novel-wrapper').empty();
const currentLastMessage = getLastCharacterMessage(); const currentLastMessage = getLastCharacterMessage();
await validateImages(currentLastMessage.name, true); await validateImages(currentLastMessage.name, true);
const expression = await getExpressionLabel(currentLastMessage.mes); const expression = await getExpressionLabel(currentLastMessage.mes);
await sendExpressionCall(currentLastMessage.name, expression, true); await sendExpressionCall(currentLastMessage.name, expression, true);
forceUpdateVisualNovelMode();
console.debug(extension_settings.expressionOverrides); console.debug(extension_settings.expressionOverrides);
} catch(error) { } catch (error) {
console.debug(`The current expression could not be set because of error: ${error}`); console.debug(`The current expression could not be set because of error: ${error}`);
} }
} }
@ -804,8 +846,8 @@ async function onClickExpressionDelete(event) {
} }
function setExpressionOverrideHtml() { function setExpressionOverrideHtml() {
const context = getContext(); const currentLastMessage = getLastCharacterMessage();
const avatarFileName = context.characters[context.characterId].avatar.split(".")[0]; const avatarFileName = getSpriteFolderName(currentLastMessage);
if (!avatarFileName) { if (!avatarFileName) {
return; return;
} }