Blame Raw
· · · 182 lines (6.0 KB)
0 contributors
1import { lodash } from '../lib.js';
2import { addOneMessage, chat, displayVersion, setSendButtonState, system_avatar, systemUserName } from '../script.js';
3import { t } from './i18n.js';
4import { getMessageTimeStamp } from './RossAscends-mods.js';
5import { getSlashCommandsHelp } from './slash-commands.js';
6import { SlashCommandBrowser } from './slash-commands/SlashCommandBrowser.js';
7import { MacroBrowser, getMacrosHelp } from './macros/engine/MacroBrowser.js';
8import { renderTemplateAsync } from './templates.js';
9
10/** @type {Record<string, ChatMessage>} */
11export const system_messages = {};
12/** @type {ChatMessage[]} */
13export const SAFETY_CHAT = [];
14
15/**
16 * @enum {string} System message types
17 */
18export const system_message_types = {
19 HELP: 'help',
20 WELCOME: 'welcome',
21 EMPTY: 'empty',
22 GENERIC: 'generic',
23 NARRATOR: 'narrator',
24 COMMENT: 'comment',
25 SLASH_COMMANDS: 'slash_commands',
26 FORMATTING: 'formatting',
27 HOTKEYS: 'hotkeys',
28 MACROS: 'macros',
29 WELCOME_PROMPT: 'welcome_prompt',
30 ASSISTANT_NOTE: 'assistant_note',
31 ASSISTANT_MESSAGE: 'assistant_message',
32};
33
34export async function initSystemMessages() {
35 /** @type {ChatMessage} */
36 const defaultMessage = {
37 name: systemUserName,
38 force_avatar: system_avatar,
39 is_user: false,
40 is_system: true,
41 extra: { swipeable: false },
42 };
43 /** @type {Record<string, ChatMessage>} */
44 const result = {
45 /** @type {ChatMessage} */
46 help: lodash.merge(structuredClone(defaultMessage), {
47 mes: await renderTemplateAsync('help'),
48 }),
49 /** @type {ChatMessage} */
50 slash_commands: lodash.merge(structuredClone(defaultMessage), {
51 mes: '',
52 }),
53 /** @type {ChatMessage} */
54 hotkeys: lodash.merge(structuredClone(defaultMessage), {
55 mes: await renderTemplateAsync('hotkeys'),
56 }),
57 /** @type {ChatMessage} */
58 formatting: lodash.merge(structuredClone(defaultMessage), {
59 mes: await renderTemplateAsync('formatting'),
60 }),
61 /** @type {ChatMessage} */
62 macros: lodash.merge(structuredClone(defaultMessage), {
63 mes: '',
64 }),
65 /** @type {ChatMessage} */
66 welcome: lodash.merge(structuredClone(defaultMessage), {
67 mes: await renderTemplateAsync('welcome', { displayVersion }),
68 extra: {
69 uses_system_ui: true,
70 },
71 }),
72 /** @type {ChatMessage} */
73 empty: lodash.merge(structuredClone(defaultMessage), {
74 mes: 'No one hears you. <b>Hint&#58;</b> add more members to the group!',
75 }),
76 /** @type {ChatMessage} */
77 generic: lodash.merge(structuredClone(defaultMessage), {
78 mes: 'Generic system message. User `text` parameter to override the contents',
79 }),
80 /** @type {ChatMessage} */
81 welcome_prompt: lodash.merge(structuredClone(defaultMessage), {
82 mes: await renderTemplateAsync('welcomePrompt'),
83 extra: {
84 uses_system_ui: true,
85 isSmallSys: true,
86 },
87 }),
88 /** @type {ChatMessage} */
89 assistant_note: lodash.merge(structuredClone(defaultMessage), {
90 mes: await renderTemplateAsync('assistantNote'),
91 extra: {
92 uses_system_ui: true,
93 isSmallSys: true,
94 },
95 }),
96 };
97
98 Object.assign(system_messages, result);
99
100 /** @type {ChatMessage} */
101 const safetyMessage = {
102 name: systemUserName,
103 force_avatar: system_avatar,
104 is_system: true,
105 is_user: false,
106 send_date: getMessageTimeStamp(),
107 mes: t`You deleted a character/chat and arrived back here for safety reasons! Pick another character!`,
108 };
109 SAFETY_CHAT.splice(0, SAFETY_CHAT.length, safetyMessage);
110}
111
112
113/**
114 * Gets a system message by type.
115 * By default system messages are not swipeable.
116 * This can be overridden by setting extra.swipeable to true.
117 * @param {string} type Type of system message
118 * @param {string} [text] Text to be sent
119 * @param {ChatMessageExtra} [extra] Additional data to be added to the message
120 * @returns {ChatMessage} System message object
121 */
122export function getSystemMessageByType(type, text, extra = {}) {
123 const systemMessage = system_messages[type];
124
125 if (!systemMessage) {
126 return;
127 }
128
129 const newMessage = { ...systemMessage, send_date: getMessageTimeStamp() };
130
131 if (text) {
132 newMessage.mes = text;
133 }
134
135 if (type === system_message_types.SLASH_COMMANDS) {
136 newMessage.mes = getSlashCommandsHelp();
137 }
138
139 if (type === system_message_types.MACROS) {
140 newMessage.mes = getMacrosHelp();
141 }
142
143 if (!newMessage.extra || typeof newMessage.extra !== 'object') {
144 newMessage.extra = {};
145 }
146
147 newMessage.extra = Object.assign(newMessage.extra, extra);
148 newMessage.extra.type = type;
149 return newMessage;
150}
151
152/**
153 * Sends a system message to the chat.
154 * @param {string} type Type of system message
155 * @param {string} [text] Text to be sent
156 * @param {ChatMessageExtra} [extra] Additional data to be added to the message
157 */
158export function sendSystemMessage(type, text, extra = {}) {
159 const newMessage = getSystemMessageByType(type, text, extra);
160 chat.push(newMessage);
161 addOneMessage(newMessage);
162 setSendButtonState(false);
163 if (type === system_message_types.SLASH_COMMANDS) {
164 const browser = new SlashCommandBrowser();
165 const spinner = document.querySelector('#chat .last_mes .custom-slashHelp');
166 const parent = spinner.parentElement;
167 spinner.remove();
168 browser.renderInto(parent);
169 browser.search.focus();
170 }
171
172 if (type === system_message_types.MACROS) {
173 const browser = new MacroBrowser();
174 const spinner = document.querySelector('#chat .last_mes .custom-macroHelp');
175 if (spinner) {
176 const parent = spinner.parentElement;
177 spinner.remove();
178 browser.renderInto(parent);
179 browser.searchInput?.focus();
180 }
181 }
182}