From bd7d4beab529ca99d856e27756e6ef6c5fa650db Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 11 Jul 2023 12:11:54 -0400 Subject: [PATCH] Regex: Add slash command input hook Slash command output for sys and sendas commands were being formatted, but add the ability for user placement to also apply to slash command invocations. Some slash commands will require an output hook, so add exclusions inside the code itself. Signed-off-by: kingbri --- public/script.js | 33 +++++++++++---------- public/scripts/extensions/regex/editor.html | 8 +---- public/scripts/extensions/regex/engine.js | 3 +- public/scripts/extensions/regex/index.js | 10 +++++++ public/scripts/slash-commands.js | 20 ++++++++++--- 5 files changed, 45 insertions(+), 29 deletions(-) diff --git a/public/script.js b/public/script.js index 1bcc779f8..7e73ae363 100644 --- a/public/script.js +++ b/public/script.js @@ -1146,15 +1146,17 @@ function messageFormatting(mes, ch_name, isSystem, isUser) { let regexPlacement; if (isUser) { regexPlacement = regex_placement.USER_INPUT; - } else if (ch_name === "System") { - regexPlacement = regex_placement.SYSTEM; } else if (ch_name !== name2) { - regexPlacement = regex_placement.SENDAS; + regexPlacement = regex_placement.SLASH_COMMAND; } else { regexPlacement = regex_placement.AI_OUTPUT; } - mes = getRegexedString(mes, regexPlacement, { isMarkdown: true }); + // Always override the character name + mes = getRegexedString(mes, regexPlacement, { + characterOverride: ch_name, + isMarkdown: true + }); } if (power_user.auto_fix_generated_markdown) { @@ -5047,25 +5049,24 @@ function updateMessage(div) { const mesBlock = div.closest(".mes_block"); let text = mesBlock.find(".edit_textarea").val(); const mes = chat[this_edit_mes_id]; + let regexPlacement; - if (mes.is_name && !mes.is_user && mes.name !== name2) { - regexPlacement = regex_placement.SENDAS; - } else if (mes.is_name && !mes.is_user) { - regexPlacement = regex_placement.AI_OUTPUT; - } else if (mes.is_name && mes.is_user) { + if (mes.is_name && mes.is_user) { regexPlacement = regex_placement.USER_INPUT; - } else if (mes.extra?.type === "narrator") { - regexPlacement = regex_placement.SYSTEM; + } else if (mes.is_name && mes.name === name2) { + regexPlacement = regex_placement.AI_OUTPUT; + } else if (mes.is_name && mes.name !== name2 || mes.extra?.type === "narrator") { + regexPlacement = regex_placement.SLASH_COMMAND; } + // Ignore character override if sent as system text = getRegexedString( - text, - regexPlacement, - { - characterOverride: regexPlacement === regex_placement.SENDAS ? mes.name : undefined - } + text, + regexPlacement, + { characterOverride: mes.extra?.type === "narrator" ? undefined : mes.name } ); + if (power_user.trim_spaces) { text = text.trim(); } diff --git a/public/scripts/extensions/regex/editor.html b/public/scripts/extensions/regex/editor.html index f692cf06c..0443790fd 100644 --- a/public/scripts/extensions/regex/editor.html +++ b/public/scripts/extensions/regex/editor.html @@ -72,13 +72,7 @@
-
-
-
diff --git a/public/scripts/extensions/regex/engine.js b/public/scripts/extensions/regex/engine.js index 426f4c0eb..cab687c90 100644 --- a/public/scripts/extensions/regex/engine.js +++ b/public/scripts/extensions/regex/engine.js @@ -11,8 +11,7 @@ const regex_placement = { MD_DISPLAY: 0, USER_INPUT: 1, AI_OUTPUT: 2, - SYSTEM: 3, - SENDAS: 4 + SLASH_COMMAND: 3 } const regex_replace_strategy = { diff --git a/public/scripts/extensions/regex/index.js b/public/scripts/extensions/regex/index.js index 6a5061516..cb84876ae 100644 --- a/public/scripts/extensions/regex/index.js +++ b/public/scripts/extensions/regex/index.js @@ -201,6 +201,16 @@ function migrateSettings() { performSave = true; } + + // Old system and sendas placement migration + // 4 - sendAs + if (script.placement.includes(4)) { + script.placement = script.placement.length === 1 ? + [regex_placement.SLASH_COMMAND] : + script.placement = script.placement.filter((e) => e !== 4); + + performSave = true; + } }); if (performSave) { diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index c4b01bbcc..3e53feb7b 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -61,6 +61,7 @@ class SlashCommandParser { } parse(text) { + const excludedFromRegex = ["sendas"] const firstSpace = text.indexOf(' '); const command = firstSpace !== -1 ? text.substring(1, firstSpace) : text.substring(1); const args = firstSpace !== -1 ? text.substring(firstSpace + 1) : ''; @@ -82,6 +83,14 @@ class SlashCommandParser { } unnamedArg = argsArray.slice(Object.keys(argObj).length).join(' '); + + // Excluded commands format in their own function + if (!excludedFromRegex.includes(command)) { + unnamedArg = getRegexedString( + unnamedArg, + regex_placement.SLASH_COMMAND + ); + } } if (this.commands[command]) { @@ -177,8 +186,11 @@ async function generateSystemMessage(_, prompt) { return; } + // Generate and regex the output if applicable toastr.info('Please wait', 'Generating...'); - const message = await generateQuietPrompt(prompt); + let message = await generateQuietPrompt(prompt); + message = getRegexedString(message, regex_placement.SLASH_COMMAND); + sendNarratorMessage(_, message); } @@ -242,7 +254,9 @@ async function sendMessageAs(_, text) { const name = parts.shift().trim(); let mesText = parts.join('\n').trim(); - mesText = getRegexedString(mesText, regex_placement.SENDAS, { characterOverride: name }); + + // Requires a regex check after the slash command is pushed to output + mesText = getRegexedString(mesText, regex_placement.SLASH_COMMAND, { characterOverride: name }); // Messages that do nothing but set bias will be hidden from the context const bias = extractMessageBias(mesText); @@ -286,8 +300,6 @@ async function sendNarratorMessage(_, text) { return; } - text = getRegexedString(text, regex_placement.SYSTEM); - const name = chat_metadata[NARRATOR_NAME_KEY] || NARRATOR_NAME_DEFAULT; // Messages that do nothing but set bias will be hidden from the context const bias = extractMessageBias(text);