diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js
index 64210a415..0c642479b 100644
--- a/public/scripts/extensions/expressions/index.js
+++ b/public/scripts/extensions/expressions/index.js
@@ -45,8 +45,6 @@ let lastCharacter = undefined;
let lastMessage = null;
let spriteCache = {};
let inApiCall = false;
-let previousSrc = null;
-
function isVisualNovelMode() {
return Boolean(!isMobile() && power_user.waifuMode && getContext().groupId);
@@ -395,6 +393,21 @@ function onExpressionsShowDefaultInput() {
}
}
+async function unloadLiveChar() {
+ try {
+ const url = new URL(getApiUrl());
+ url.pathname = '/api/live2d/unload';
+ const loadResponse = await doExtrasFetch(url);
+ if (!loadResponse.ok) {
+ throw new Error(loadResponse.statusText);
+ }
+ const loadResponseText = await loadResponse.text();
+ //console.log(`Response: ${loadResponseText}`);
+ } catch (error) {
+ //console.error(`Error unloading - ${error}`);
+ }
+}
+
async function loadLiveChar() {
if (!modules.includes('live2d')) {
console.debug('live2d module is disabled');
@@ -456,7 +469,6 @@ function handleImageChange() {
}
if (extension_settings.expressions.live2d) {
- previousSrc = imgElement.src;
// Method get IP of endpoint
const live2dResultFeedSrc = `${getApiUrl()}/api/live2d/result_feed`;
$('#expression-holder').css({ display: '' });
@@ -496,7 +508,6 @@ async function moduleWorker() {
if (context.groupId !== lastCharacter && context.characterId !== lastCharacter) {
removeExpression();
spriteCache = {};
- previousSrc = null;
//clear expression
let imgElement = document.getElementById('expression-image');
@@ -611,12 +622,62 @@ async function moduleWorker() {
}
}
+async function live2dcheck() {
+ const context = getContext();
+ let spriteFolderName = context.name2;
+ const message = getLastCharacterMessage();
+ const avatarFileName = getSpriteFolderName(message);
+ const expressionOverride = extension_settings.expressionOverrides.find((e) =>
+ e.name == avatarFileName
+ );
+
+ if (expressionOverride && expressionOverride.path) {
+ spriteFolderName = expressionOverride.path;
+ }
+
+ try {
+ await validateImages(spriteFolderName);
+
+ let live2dObj = spriteCache[spriteFolderName].find(obj => obj.label === 'live2d');
+ let live2dPath_f = live2dObj ? live2dObj.path : null;
+
+ if(live2dPath_f != null){
+ //console.log("live2dPath_f " + live2dPath_f);
+ return true;
+ } else {
+ //console.log("live2dPath_f is null");
+ unloadLiveChar();
+ return false;
+ }
+ } catch (err) {
+ return err;
+ }
+}
+
function setLive2dState(switch_var){
extension_settings.expressions.live2d = switch_var; // Store setting
saveSettingsDebounced();
- if (extension_settings.expressions.live2d) { loadLiveChar(); } // load char as needed
- handleImageChange(switch_var); // Change image as needed
+ live2dcheck().then(result => {
+ if (result) {
+ //console.log("Live2d exists!");
+
+ if (extension_settings.expressions.live2d) {
+ loadLiveChar();
+ } else {
+ unloadLiveChar();
+ }
+ handleImageChange(switch_var); // Change image as needed
+
+
+ } else {
+ //console.log("Live2d does not exist.");
+ }
+ });
+
+
+
+
}
function getSpriteFolderName(message) {
@@ -917,13 +978,25 @@ async function setExpression(character, expression, force) {
document.getElementById("expression-holder").style.display = '';
} else {
- // Find the
element with id="expression-image" and class="expression"
- const imgElement = document.querySelector('img#expression-image.expression');
- //console.log("searching");
- if (imgElement) {
- console.log("setting value");
- imgElement.src = getApiUrl() + '/api/live2d/result_feed';
+
+
+ live2dcheck().then(result => {
+ if (result) {
+ // Find the
element with id="expression-image" and class="expression"
+ const imgElement = document.querySelector('img#expression-image.expression');
+ //console.log("searching");
+ if (imgElement) {
+ //console.log("setting value");
+ imgElement.src = getApiUrl() + '/api/live2d/result_feed';
+ }
+
+ } else {
+ //console.log("The fetch failed!");
}
+ });
+
+
+
}
}