From 0a03793d7b59d5e9e306422c4a7bf110483a6efc Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:10:12 +0200 Subject: [PATCH] Add /chat-render and /chat-reload commands --- public/script.js | 12 ++++++++---- public/scripts/slash-commands.js | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/public/script.js b/public/script.js index 13b938f31..7a32c65dd 100644 --- a/public/script.js +++ b/public/script.js @@ -167,6 +167,7 @@ import { flashHighlight, isTrueBoolean, toggleDrawer, + isElementInViewport, } from './scripts/utils.js'; import { debounce_timeout } from './scripts/constants.js'; @@ -1827,10 +1828,10 @@ export async function replaceCurrentChat() { } } -export function showMoreMessages() { +export function showMoreMessages(messagesToLoad = null) { const firstDisplayedMesId = $('#chat').children('.mes').first().attr('mesid'); let messageId = Number(firstDisplayedMesId); - let count = power_user.chat_truncation || Number.MAX_SAFE_INTEGER; + let count = messagesToLoad || power_user.chat_truncation || Number.MAX_SAFE_INTEGER; // If there are no messages displayed, or the message somehow has no mesid, we default to one higher than last message id, // so the first "new" message being shown will be the last available message @@ -1840,6 +1841,7 @@ export function showMoreMessages() { console.debug('Inserting messages before', messageId, 'count', count, 'chat length', chat.length); const prevHeight = $('#chat').prop('scrollHeight'); + const isButtonInView = isElementInViewport($('#show_more_messages')[0]); while (messageId > 0 && count > 0) { let newMessageId = messageId - 1; @@ -1852,8 +1854,10 @@ export function showMoreMessages() { $('#show_more_messages').remove(); } - const newHeight = $('#chat').prop('scrollHeight'); - $('#chat').scrollTop(newHeight - prevHeight); + if (isButtonInView) { + const newHeight = $('#chat').prop('scrollHeight'); + $('#chat').scrollTop(newHeight - prevHeight); + } } export async function printMessages() { diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index f10e89d0c..ed7e6088d 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -39,6 +39,7 @@ import { setCharacterName, setExtensionPrompt, setUserName, + showMoreMessages, stopGeneration, substituteParams, system_avatar, @@ -1964,6 +1965,27 @@ export function initDefaultSlashCommands() { returns: ARGUMENT_TYPE.BOOLEAN, helpString: 'Returns true if the current device is a mobile device, false otherwise. Equivalent to {{isMobile}} macro.', })); + SlashCommandParser.addCommandObject(SlashCommand.fromProps({ + name: 'chat-render', + helpString: 'Renders a specified number of messages into the chat window. Displays all messages if no argument is provided.', + callback: (_, number) => { + showMoreMessages(number && !isNaN(Number(number)) ? Number(number) : Number.MAX_SAFE_INTEGER); + return ''; + }, + unnamedArgumentList: [ + new SlashCommandArgument( + 'number of messages', [ARGUMENT_TYPE.NUMBER], false, + ), + ], + })); + SlashCommandParser.addCommandObject(SlashCommand.fromProps({ + name: 'chat-reload', + helpString: 'Reloads the current chat.', + callback: async () => { + await reloadCurrentChat(); + return ''; + }, + })); registerVariableCommands(); }