diff --git a/public/script.js b/public/script.js index 079372274..416a41a50 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', + MESSAGE_EDITED: 'message_edited', IMPERSONATE_READY: 'impersonate_ready', } @@ -4042,39 +4043,8 @@ function setCharacterBlockHeight() { //should be set to an onload for rm_print_characters or windows? } -function messageEditAuto(div) { - let mesBlock = div.closest(".mes_block"); - var text = mesBlock.find(".edit_textarea").val().trim(); - const bias = extractMessageBias(text); - const mes = chat[this_edit_mes_id]; - mes["mes"] = text; - if (mes["swipe_id"] !== undefined) { - mes["swipes"][mes["swipe_id"]] = text; - } - - // editing old messages - if (!mes["extra"]) { - mes["extra"] = {}; - } - - if (mes.is_system || mes.is_user || mes.extra.type === system_message_types.NARRATOR) { - mes.extra.bias = bias ?? null; - } - else { - mes.extra.bias = null; - } - - mesBlock.find(".mes_text").val(''); - mesBlock.find(".mes_text").val(messageFormatting( - text, - this_edit_mes_chname, - mes.is_system, - mes.is_user, - )); - saveChatDebounced(); -} - -function messageEditDone(div) { +// Common code for message editor done and auto-save +function updateMessage(div) { let mesBlock = div.closest(".mes_block"); var text = mesBlock.find(".edit_textarea").val().trim(); const bias = extractMessageBias(text); @@ -4091,11 +4061,29 @@ function messageEditDone(div) { if (mes.is_system || mes.is_user || mes.extra.type === system_message_types.NARRATOR) { mes.extra.bias = bias ?? null; - } - else { + } else { mes.extra.bias = null; } + return { mesBlock, text, mes, bias }; +} + +function messageEditAuto(div) { + const { mesBlock, text, mes } = updateMessage(div); + + mesBlock.find(".mes_text").val(''); + mesBlock.find(".mes_text").val(messageFormatting( + text, + this_edit_mes_chname, + mes.is_system, + mes.is_user, + )); + saveChatDebounced(); +} + +async function messageEditDone(div) { + const { mesBlock, text, mes, bias } = updateMessage(div); + mesBlock.find(".mes_text").empty(); mesBlock.find(".mes_edit_buttons").css("display", "none"); mesBlock.find(".mes_buttons").css("display", ""); @@ -4111,6 +4099,8 @@ function messageEditDone(div) { mesBlock.find(".mes_bias").append(messageFormatting(bias)); appendImageToMessage(mes, div.closest(".mes")); addCopyToCodeBlocks(div.closest(".mes")); + await eventSource.emit(event_types.MESSAGE_EDITED, this_edit_mes_id); + this_edit_mes_id = undefined; saveChatConditional(); } diff --git a/public/scripts/extensions/translate/index.js b/public/scripts/extensions/translate/index.js index 668c6d2e2..f4708ec0d 100644 --- a/public/scripts/extensions/translate/index.js +++ b/public/scripts/extensions/translate/index.js @@ -17,6 +17,9 @@ const autoModeOptions = { BOTH: 'both', }; +const incomingTypes = [autoModeOptions.RESPONSES, autoModeOptions.BOTH]; +const outgoingTypes = [autoModeOptions.INPUT, autoModeOptions.BOTH]; + const defaultSettings = { target_language: 'en', internal_language: 'en', @@ -274,6 +277,25 @@ async function onTranslationsClearClick() { await reloadCurrentChat(); } +async function translateMessageEdit(messageId) { + const context = getContext(); + const chat = context.chat; + const message = chat[messageId]; + + if (message.is_system || extension_settings.translate.auto_mode == autoModeOptions.NONE) { + return; + } + + if ((message.is_user && shouldTranslate(outgoingTypes)) || (!message.is_user && shouldTranslate(incomingTypes))) { + await translateIncomingMessage(messageId); + } +} + +const handleIncomingMessage = createEventHandler(translateIncomingMessage, () => shouldTranslate(incomingTypes)); +const handleOutgoingMessage = createEventHandler(translateOutgoingMessage, () => shouldTranslate(outgoingTypes)); +const handleImpersonateReady = createEventHandler(translateImpersonate, () => shouldTranslate(incomingTypes)); +const handleMessageEdit = createEventHandler(translateMessageEdit, () => true); + jQuery(() => { const html = `
@@ -339,17 +361,11 @@ jQuery(() => { loadSettings(); - const incomingTypes = [autoModeOptions.RESPONSES, autoModeOptions.BOTH]; - const outgoingTypes = [autoModeOptions.INPUT, autoModeOptions.BOTH]; - - const handleIncomingMessage = createEventHandler(translateIncomingMessage, () => shouldTranslate(incomingTypes)); - const handleOutgoingMessage = createEventHandler(translateOutgoingMessage, () => shouldTranslate(outgoingTypes)); - const handleImpersonateReady = createEventHandler(translateImpersonate, () => shouldTranslate(incomingTypes)); - eventSource.on(event_types.MESSAGE_RECEIVED, handleIncomingMessage); eventSource.on(event_types.MESSAGE_SWIPED, handleIncomingMessage); eventSource.on(event_types.MESSAGE_SENT, handleOutgoingMessage); eventSource.on(event_types.IMPERSONATE_READY, handleImpersonateReady); + eventSource.on(event_types.MESSAGE_EDITED, handleMessageEdit); document.body.classList.add('translate'); }); diff --git a/server.js b/server.js index 9d6ade896..03451fb50 100644 --- a/server.js +++ b/server.js @@ -3034,7 +3034,6 @@ app.post('/horde_generateimage', jsonParser, async (request, response) => { app.post('/google_translate', jsonParser, async (request, response) => { const { generateRequestUrl, normaliseResponse } = require('google-translate-api-browser'); - const https = require('https'); const text = request.body.text; const lang = request.body.lang; @@ -3045,24 +3044,21 @@ app.post('/google_translate', jsonParser, async (request, response) => { console.log('Input text: ' + text); - const url = generateRequestUrl(text, { to: lang }); + try { + const url = generateRequestUrl(text, { to: lang }); + const resp = await fetch(url); - https.get(url, (resp) => { - let data = ''; + if (!resp.ok) { + throw new Error(resp.statusText); + } - resp.on('data', (chunk) => { - data += chunk; - }); - - resp.on('end', () => { - const result = normaliseResponse(JSON.parse(data)); - console.log('Translated text: ' + result.text); - return response.send(result.text); - }); - }).on("error", (err) => { + const result = normaliseResponse(await resp.json()); + console.log('Translated text: ' + result.text); + return response.send(result.text); + } catch (err) { console.log("Translation error: " + err.message); return response.sendStatus(500); - }); + } }); function writeSecret(key, value) {