137 lines
4.6 KiB
JavaScript
137 lines
4.6 KiB
JavaScript
import { MacroRegistry, MacroCategory, MacroValueType } from '../engine/MacroRegistry.js';
|
|
import { chat, chat_metadata } from '../../../script.js';
|
|
|
|
/**
|
|
* Registers macros that inspect the current chat log and swipe state
|
|
* (message texts, indices, swipes, and context boundaries).
|
|
*/
|
|
export function registerChatMacros() {
|
|
MacroRegistry.registerMacro('lastMessage', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Last message in the chat.',
|
|
returns: 'Last message in the chat.',
|
|
handler: () => String(getLastMessage() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('lastMessageId', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Index of the last message in the chat.',
|
|
returns: 'Index of the last message in the chat.',
|
|
returnType: MacroValueType.INTEGER,
|
|
handler: () => String(getLastMessageId() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('lastUserMessage', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Last user message in the chat.',
|
|
returns: 'Last user message in the chat.',
|
|
handler: () => String(getLastUserMessage() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('lastCharMessage', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Last character/bot message in the chat.',
|
|
returns: 'Last character/bot message in the chat.',
|
|
handler: () => String(getLastCharMessage() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('firstIncludedMessageId', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Index of the first message included in the current context.',
|
|
returns: 'Index of the first message included in the context.',
|
|
returnType: MacroValueType.INTEGER,
|
|
handler: () => String(getFirstIncludedMessageId() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('firstDisplayedMessageId', {
|
|
category: MacroCategory.CHAT,
|
|
description: 'Index of the first displayed message in the chat.',
|
|
returns: 'Index of the first displayed message in the chat.',
|
|
returnType: MacroValueType.INTEGER,
|
|
handler: () => String(getFirstDisplayedMessageId() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('lastSwipeId', {
|
|
category: MacroCategory.CHAT,
|
|
description: '1-based index of the last swipe for the last message.',
|
|
returns: '1-based index of the last swipe.',
|
|
returnType: MacroValueType.INTEGER,
|
|
handler: () => String(getLastSwipeId() ?? ''),
|
|
});
|
|
|
|
MacroRegistry.registerMacro('currentSwipeId', {
|
|
category: MacroCategory.CHAT,
|
|
description: '1-based index of the current swipe.',
|
|
returns: '1-based index of the current swipe.',
|
|
returnType: MacroValueType.INTEGER,
|
|
handler: () => String(getCurrentSwipeId() ?? ''),
|
|
});
|
|
}
|
|
|
|
function getLastMessageId({ exclude_swipe_in_propress = true, filter = null } = {}) {
|
|
if (!Array.isArray(chat) || chat.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
for (let i = chat.length - 1; i >= 0; i--) {
|
|
const message = chat[i];
|
|
|
|
if (exclude_swipe_in_propress && message.swipes && message.swipe_id >= message.swipes.length) {
|
|
continue;
|
|
}
|
|
|
|
if (!filter || filter(message)) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
function getLastMessage() {
|
|
const mid = getLastMessageId();
|
|
return typeof mid === 'number' ? (chat[mid]?.mes ?? '') : '';
|
|
}
|
|
|
|
function getLastUserMessage() {
|
|
const mid = getLastMessageId({ filter: m => m.is_user && !m.is_system });
|
|
return typeof mid === 'number' ? (chat[mid]?.mes ?? '') : '';
|
|
}
|
|
|
|
function getLastCharMessage() {
|
|
const mid = getLastMessageId({ filter: m => !m.is_user && !m.is_system });
|
|
return typeof mid === 'number' ? (chat[mid]?.mes ?? '') : '';
|
|
}
|
|
|
|
function getFirstIncludedMessageId() {
|
|
const value = chat_metadata['lastInContextMessageId'];
|
|
return typeof value === 'number' ? value : null;
|
|
}
|
|
|
|
function getFirstDisplayedMessageId() {
|
|
const mesElement = document.querySelector('#chat .mes');
|
|
const mesId = Number(mesElement?.getAttribute('mesid'));
|
|
if (!Number.isNaN(mesId) && mesId >= 0) {
|
|
return mesId;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getLastSwipeId() {
|
|
const mid = getLastMessageId({ exclude_swipe_in_propress: false });
|
|
if (typeof mid !== 'number') {
|
|
return null;
|
|
}
|
|
const swipes = chat[mid]?.swipes;
|
|
return Array.isArray(swipes) ? swipes.length : null;
|
|
}
|
|
|
|
function getCurrentSwipeId() {
|
|
const mid = getLastMessageId({ exclude_swipe_in_propress: false });
|
|
if (typeof mid !== 'number') {
|
|
return null;
|
|
}
|
|
const swipeId = chat[mid]?.swipe_id;
|
|
return typeof swipeId === 'number' ? swipeId + 1 : null;
|
|
}
|