diff --git a/public/script.js b/public/script.js index 8ac5e73d0..baedcea76 100644 --- a/public/script.js +++ b/public/script.js @@ -417,6 +417,7 @@ export const event_types = { MESSAGE_SWIPED: 'message_swiped', MESSAGE_SENT: 'message_sent', MESSAGE_RECEIVED: 'message_received', + IMPERSONATE_READY: 'impersonate_ready', } export const eventSource = new EventEmitter(); @@ -1667,6 +1668,10 @@ class StreamingProcessor { } } playMessageSound(); + + const eventType = this.type !== 'impersonate' ? event_types.MESSAGE_RECEIVED : event_types.IMPERSONATE_READY; + const eventData = this.type !== 'impersonate' ? this.messageId : text; + eventSource.emit(eventType, eventData); } onErrorStreaming() { @@ -1831,7 +1836,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject, sendSystemMessage(system_message_types.GENERIC, ' ', { bias: messageBias }); } else { - sendMessageAsUser(textareaText, messageBias); + await sendMessageAsUser(textareaText, messageBias); } } //////////////////////////////////// @@ -2384,6 +2389,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject, if (isImpersonate) { $('#send_textarea').val(getMessage).trigger('input'); generatedPromtCache = ""; + eventSource.emit(event_types.IMPERSONATE_READY, getMessage); } else if (type == 'quiet') { resolve(getMessage); @@ -2395,15 +2401,14 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject, else { ({ type, getMessage } = saveReply('appendFinal', getMessage, this_mes_is_name, title)); } + eventSource.emit(event_types.MESSAGE_RECEIVED, (chat.length - 1)); } activateSendButtons(); if (type !== 'quiet') { playMessageSound(); - eventSource.emit(event_types.MESSAGE_RECEIVED, (chat.length - 1)); } - generate_loop_counter = 0; } else { ++generate_loop_counter; @@ -2522,7 +2527,7 @@ export function replaceBiasMarkup(str) { return (str ?? '').replace(/{{(\*?.*\*?)}}/g, ''); } -function sendMessageAsUser(textareaText, messageBias) { +async function sendMessageAsUser(textareaText, messageBias) { chat[chat.length] = {}; chat[chat.length - 1]['name'] = name1; chat[chat.length - 1]['is_user'] = true; @@ -2537,7 +2542,9 @@ function sendMessageAsUser(textareaText, messageBias) { } addOneMessage(chat[chat.length - 1]); - eventSource.emit(event_types.MESSAGE_SENT, (chat.length - 1)); + // Wait for all handlers to finish before continuing with the prompt + await eventSource.emit(event_types.MESSAGE_SENT, (chat.length - 1)); + console.log('message sent as user'); } function getMaxContextSize() { diff --git a/public/scripts/eventemitter.js b/public/scripts/eventemitter.js index eacf7a23b..96c0f64e2 100644 --- a/public/scripts/eventemitter.js +++ b/public/scripts/eventemitter.js @@ -48,7 +48,7 @@ EventEmitter.prototype.removeListener = function (event, listener) { } }; -EventEmitter.prototype.emit = function (event) { +EventEmitter.prototype.emit = async function (event) { var i, listeners, length, args = [].slice.call(arguments, 1); if (typeof this.events[event] === 'object') { @@ -56,7 +56,7 @@ EventEmitter.prototype.emit = function (event) { length = listeners.length; for (i = 0; i < length; i++) { - listeners[i].apply(this, args); + await listeners[i].apply(this, args); } } }; @@ -68,4 +68,4 @@ EventEmitter.prototype.once = function (event, listener) { }); }; -export { EventEmitter } \ No newline at end of file +export { EventEmitter } diff --git a/public/scripts/extensions/translate/index.js b/public/scripts/extensions/translate/index.js index df0fad60d..7116d2c5e 100644 --- a/public/scripts/extensions/translate/index.js +++ b/public/scripts/extensions/translate/index.js @@ -1,10 +1,18 @@ import { eventSource, event_types, getRequestHeaders, messageFormatting, saveSettingsDebounced } from "../../../script.js"; import { extension_settings, getContext } from "../../extensions.js"; +const autoModeOptions = { + NONE: 'none', + RESPONSES: 'responses', + INPUT: 'inputs', + BOTH: 'both', +}; + const defaultSettings = { target_language: 'en', + internal_language: 'en', provider: 'google', - auto: false, + auto_mode: autoModeOptions.NONE, }; const languageCodes = { @@ -115,13 +123,20 @@ const languageCodes = { }; function loadSettings() { - if (Object.keys(extension_settings.translate).length === 0) { - Object.assign(extension_settings.translate, defaultSettings); + for (const key in defaultSettings) { + if (!extension_settings.translate.hasOwnProperty(key)) { + extension_settings.translate[key] = defaultSettings[key]; + } } $(`#translation_provider option[value="${extension_settings.translate.provider}"]`).attr('selected', true); $(`#translation_target_language option[value="${extension_settings.translate.target_language}"]`).attr('selected', true); - $('#translation_auto').prop('checked', extension_settings.translate.auto); + $(`#translation_auto_mode option[value="${extension_settings.translate.auto_mode}"]`).attr('selected', true); +} + +async function translateImpersonate(text) { + const translatedText = await translate(text, extension_settings.translate.target_language); + $("#send_textarea").val(translatedText); } async function translateIncomingMessage(messageId) { @@ -137,7 +152,7 @@ async function translateIncomingMessage(messageId) { return; } - const translation = await translate(message.mes); + const translation = await translate(message.mes, extension_settings.translate.target_language); message.extra.display_text = translation; $(`#chat .mes[mesid="${messageId}"] .mes_text`).html(messageFormatting(translation, message.name, message.is_system, message.is_user)); @@ -145,11 +160,11 @@ async function translateIncomingMessage(messageId) { context.saveChat(); } -async function translateProviderGoogle(text) { +async function translateProviderGoogle(text, lang) { const response = await fetch('/google_translate', { method: 'POST', headers: getRequestHeaders(), - body: JSON.stringify({ text: text, lang: extension_settings.translate.target_language }), + body: JSON.stringify({ text: text, lang: lang }), }); if (response.ok) { @@ -160,11 +175,11 @@ async function translateProviderGoogle(text) { throw new Error(response.statusText); } -async function translate(text) { +async function translate(text, lang) { try { switch (extension_settings.translate.provider) { case 'google': - return await translateProviderGoogle(text); + return await translateProviderGoogle(text, lang); default: console.error('Unknown translation provider', extension_settings.translate.provider); return text; @@ -176,7 +191,31 @@ async function translate(text) { } async function translateOutgoingMessage(messageId) { - alert('translateOutgoingMessage', messageId); + const context = getContext(); + const message = context.chat[messageId]; + + if (typeof message.extra !== 'object') { + message.extra = {}; + } + + const originalText = message.mes; + message.extra.display_text = originalText; + $(`#chat .mes[mesid="${messageId}"] .mes_text`).html(messageFormatting(originalText, message.name, message.is_system, message.is_user)); + message.mes = await translate(originalText, extension_settings.translate.internal_language); + + console.log('translateOutgoingMessage', messageId); +} + +function shouldTranslate(types) { + return types.includes(extension_settings.translate.auto_mode); +} + +function createEventHandler(translateFunction, shouldTranslateFunction) { + return async (data) => { + if (shouldTranslateFunction()) { + await translateFunction(data); + } + }; } jQuery(() => { @@ -188,10 +227,13 @@ jQuery(() => {