Fix group VN updates on switching to chat

a7d7b6fb0fc4e35ece5aa056a6c3e0bdaf102160

Cohee <18619528+Cohee1207@users.noreply.github.com>

1 files changed, +28 -2Showing whitespace changes
public/scripts/extensions/expressions/index.js+28 -2
@@ -178,6 +178,7 @@ async function visualNovelRemoveInactive(container) {
178178 * @returns {Promise<Array>} - An array of promises that resolve when the sprites are set
179179 */
180180async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, expression) {
181+ const originalExpression = expression;
181182 const context = getContext();
182183 const group = context.groups.find(x => x.id == context.groupId);
183184
@@ -208,6 +209,10 @@ async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, exp
208209
209210 const prevExpressionSrc = expressionImage.find('img').attr('src') || null;
210211
212+ if (!originalExpression && Array.isArray(spriteCache[memberSpriteFolderName]) && spriteCache[memberSpriteFolderName].length > 0) {
213+ expression = await getLastMessageSprite(avatar);
214+ }
215+
211216 const spriteFile = chooseSpriteForExpression(memberSpriteFolderName, expression, { prevExpressionSrc: prevExpressionSrc });
212217 if (expressionImage.length) {
213218 if (!spriteFolderName || spriteFolderName == memberSpriteFolderName) {
@@ -251,6 +256,23 @@ async function visualNovelSetCharacterSprites(vnContainer, spriteFolderName, exp
251256 return setSpritePromises;
252257}
253258
259+/**
260+ * Classifies the text of the latest message and returns the expression label.
261+ * @param {string} avatar - The avatar of the character to get the last message for
262+ * @returns {Promise<string>} - The expression label
263+ */
264+async function getLastMessageSprite(avatar) {
265+ const context = getContext();
266+ const lastMessage = context.chat.slice().reverse().find(x => x.original_avatar == avatar || (x.force_avatar && x.force_avatar.includes(encodeURIComponent(avatar))));
267+
268+ if (lastMessage) {
269+ const text = lastMessage.mes || '';
270+ return await getExpressionLabel(text);
271+ }
272+
273+ return null;
274+}
275+
254276async function visualNovelUpdateLayers(container) {
255277 const context = getContext();
256278 const group = context.groups.find(x => x.id == context.groupId);
@@ -445,7 +467,7 @@ async function setImage(img, path) {
445467 });
446468}
447469
448470async function moduleWorker({ newChat = false } = {}) {
449471 const context = getContext();
450472
451473 // non-characters not supported
@@ -514,6 +536,10 @@ async function moduleWorker() {
514536 offlineMode.css('display', 'none');
515537 }
516538
539+ if (context.groupId && vnMode && newChat) {
540+ await forceUpdateVisualNovelMode();
541+ }
542+
517543 // Don't bother classifying if current char has no sprites and no default expressions are enabled
518544 if ((!Array.isArray(spriteCache[spriteFolderName]) || spriteCache[spriteFolderName].length === 0) && !extension_settings.expressions.showDefault) {
519545 return;
@@ -2134,7 +2160,7 @@ function migrateSettings() {
21342160 $('#visual-novel-wrapper').empty();
21352161 }
21362162
21372163 updateFunction({ newChat: true });
21382164 });
21392165 eventSource.on(event_types.MOVABLE_PANELS_RESET, updateVisualNovelModeDebounced);
21402166 eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced);