mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-02-10 17:10:45 +01:00
Merge pull request #2351 from Wolfsblvt/rename-char-command
/rename-char slash command
This commit is contained in:
commit
179a099954
@ -5431,11 +5431,28 @@ export function setSendButtonState(value) {
|
|||||||
is_send_press = value;
|
is_send_press = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function renameCharacter() {
|
export async function renameCharacter(name = null, { silent = false, renameChats = null } = {}) {
|
||||||
const oldAvatar = characters[this_chid].avatar;
|
if (!name && silent) {
|
||||||
const newValue = await callPopup('<h3>New name:</h3>', 'input', characters[this_chid].name);
|
toastr.warning('No character name provided.', 'Rename Character');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this_chid === undefined) {
|
||||||
|
toastr.warning('No character selected.', 'Rename Character');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const oldAvatar = characters[this_chid].avatar;
|
||||||
|
const newValue = name || await callPopup('<h3>New name:</h3>', 'input', characters[this_chid].name);
|
||||||
|
|
||||||
|
if (!newValue) {
|
||||||
|
toastr.warning('No character name provided.', 'Rename Character');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (newValue === characters[this_chid].name) {
|
||||||
|
toastr.info('Same character name provided, so name did not change.', 'Rename Character');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (newValue && newValue !== characters[this_chid].name) {
|
|
||||||
const body = JSON.stringify({ avatar_url: oldAvatar, new_name: newValue });
|
const body = JSON.stringify({ avatar_url: oldAvatar, new_name: newValue });
|
||||||
const response = await fetch('/api/characters/rename', {
|
const response = await fetch('/api/characters/rename', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -5471,14 +5488,17 @@ async function renameCharacter() {
|
|||||||
|
|
||||||
// Also rename as a group member
|
// Also rename as a group member
|
||||||
await renameGroupMember(oldAvatar, newAvatar, newValue);
|
await renameGroupMember(oldAvatar, newAvatar, newValue);
|
||||||
const renamePastChatsConfirm = await callPopup(`<h3>Character renamed!</h3>
|
const renamePastChatsConfirm = renameChats !== null ? renameChats
|
||||||
|
: silent ? false : await callPopup(`<h3>Character renamed!</h3>
|
||||||
<p>Past chats will still contain the old character name. Would you like to update the character name in previous chats as well?</p>
|
<p>Past chats will still contain the old character name. Would you like to update the character name in previous chats as well?</p>
|
||||||
<i><b>Sprites folder (if any) should be renamed manually.</b></i>`, 'confirm');
|
<i><b>Sprites folder (if any) should be renamed manually.</b></i>`, 'confirm');
|
||||||
|
|
||||||
if (renamePastChatsConfirm) {
|
if (renamePastChatsConfirm) {
|
||||||
await renamePastChats(newAvatar, newValue);
|
await renamePastChats(newAvatar, newValue);
|
||||||
await reloadCurrentChat();
|
await reloadCurrentChat();
|
||||||
toastr.success('Character renamed and past chats updated!');
|
toastr.success('Character renamed and past chats updated!', 'Rename Character');
|
||||||
|
} else {
|
||||||
|
toastr.success('Character renamed!', 'Rename Character');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -5489,12 +5509,17 @@ async function renameCharacter() {
|
|||||||
throw new Error('Could not rename the character');
|
throw new Error('Could not rename the character');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {
|
catch (error) {
|
||||||
// Reloading to prevent data corruption
|
// Reloading to prevent data corruption
|
||||||
await callPopup('Something went wrong. The page will be reloaded.', 'text');
|
if (!silent) await callPopup('Something went wrong. The page will be reloaded.', 'text');
|
||||||
|
else toastr.error('Something went wrong. The page will be reloaded.', 'Rename Character');
|
||||||
|
|
||||||
|
console.log('Renaming character error:', error);
|
||||||
location.reload();
|
location.reload();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function renamePastChats(newAvatar, newValue) {
|
async function renamePastChats(newAvatar, newValue) {
|
||||||
|
@ -23,6 +23,7 @@ import {
|
|||||||
name2,
|
name2,
|
||||||
reloadCurrentChat,
|
reloadCurrentChat,
|
||||||
removeMacros,
|
removeMacros,
|
||||||
|
renameCharacter,
|
||||||
saveChatConditional,
|
saveChatConditional,
|
||||||
sendMessageAsUser,
|
sendMessageAsUser,
|
||||||
sendSystemMessage,
|
sendSystemMessage,
|
||||||
@ -323,6 +324,29 @@ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
|||||||
helpString: 'Opens up a chat with the character or group by its name',
|
helpString: 'Opens up a chat with the character or group by its name',
|
||||||
aliases: ['char'],
|
aliases: ['char'],
|
||||||
}));
|
}));
|
||||||
|
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
||||||
|
name: 'rename-char',
|
||||||
|
/** @param {{silent: string, chats: string}} options @param {string} name */
|
||||||
|
callback: async ({ silent = 'true', chats = null }, name) => {
|
||||||
|
const renamed = await renameCharacter(name, { silent: isTrueBoolean(silent), renameChats: chats !== null ? isTrueBoolean(chats) : null });
|
||||||
|
return String(renamed);
|
||||||
|
},
|
||||||
|
returns: 'true/false - Whether the rename was successful',
|
||||||
|
namedArgumentList: [
|
||||||
|
new SlashCommandNamedArgument(
|
||||||
|
'silent', 'Hide any blocking popups. (if false, the name is optional. If not supplied, a popup asking for it will appear)', [ARGUMENT_TYPE.BOOLEAN], false, false, 'true',
|
||||||
|
),
|
||||||
|
new SlashCommandNamedArgument(
|
||||||
|
'chats', 'Rename char in all previous chats', [ARGUMENT_TYPE.BOOLEAN], false, false, '<null>',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
unnamedArgumentList: [
|
||||||
|
new SlashCommandArgument(
|
||||||
|
'new char name', [ARGUMENT_TYPE.STRING], true,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
helpString: 'Renames the current character.',
|
||||||
|
}));
|
||||||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
||||||
name: 'sysgen',
|
name: 'sysgen',
|
||||||
callback: generateSystemMessage,
|
callback: generateSystemMessage,
|
||||||
|
@ -17,6 +17,11 @@ import { SlashCommandScope } from './SlashCommandScope.js';
|
|||||||
* }} NamedArguments
|
* }} NamedArguments
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alternative object for local JSDocs, where you don't need existing pipe, scope, etc. arguments
|
||||||
|
* @typedef {{[id:string]:string|SlashCommandClosure}} NamedArgumentsCapture
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {string|SlashCommandClosure|(string|SlashCommandClosure)[]} UnnamedArguments
|
* @typedef {string|SlashCommandClosure|(string|SlashCommandClosure)[]} UnnamedArguments
|
||||||
*/
|
*/
|
||||||
@ -28,7 +33,7 @@ export class SlashCommand {
|
|||||||
* Creates a SlashCommand from a properties object.
|
* Creates a SlashCommand from a properties object.
|
||||||
* @param {Object} props
|
* @param {Object} props
|
||||||
* @param {string} [props.name]
|
* @param {string} [props.name]
|
||||||
* @param {(namedArguments:NamedArguments, unnamedArguments:string|SlashCommandClosure|(string|SlashCommandClosure)[])=>string|SlashCommandClosure|void|Promise<string|SlashCommandClosure|void>} [props.callback]
|
* @param {(namedArguments:NamedArguments|NamedArgumentsCapture, unnamedArguments:string|SlashCommandClosure|(string|SlashCommandClosure)[])=>string|SlashCommandClosure|void|Promise<string|SlashCommandClosure|void>} [props.callback]
|
||||||
* @param {string} [props.helpString]
|
* @param {string} [props.helpString]
|
||||||
* @param {boolean} [props.splitUnnamedArgument]
|
* @param {boolean} [props.splitUnnamedArgument]
|
||||||
* @param {string[]} [props.aliases]
|
* @param {string[]} [props.aliases]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user