diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index c0d7f39e9..8ba133eca 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -292,10 +292,11 @@ export function getGroupNames() { /** * Finds the character ID for a group member. - * @param {string} arg 0-based member index or character name - * @returns {number} 0-based character ID + * @param {number|string} arg 0-based member index or character name + * @param {Boolean} full Whether to return a key-value object containing extra data + * @returns {number|Object} 0-based character ID or key-value object if full is true */ -export function findGroupMemberId(arg) { +export function findGroupMemberId(arg, full = false) { arg = arg?.trim(); if (!arg) { @@ -311,15 +312,19 @@ export function findGroupMemberId(arg) { } const index = parseInt(arg); - const searchByName = isNaN(index); + const searchByString = isNaN(index); - if (searchByName) { - const memberNames = group.members.map(x => ({ name: characters.find(y => y.avatar === x)?.name, index: characters.findIndex(y => y.avatar === x) })); - const fuse = new Fuse(memberNames, { keys: ['name'] }); + if (searchByString) { + const memberNames = group.members.map(x => ({ + avatar: x, + name: characters.find(y => y.avatar === x)?.name, + index: characters.findIndex(y => y.avatar === x), + })); + const fuse = new Fuse(memberNames, { keys: ['avatar', 'name'] }); const result = fuse.search(arg); if (!result.length) { - console.warn(`WARN: No group member found with name ${arg}`); + console.warn(`WARN: No group member found using string ${arg}`); return; } @@ -330,9 +335,11 @@ export function findGroupMemberId(arg) { return; } - console.log(`Triggering group member ${chid} (${arg}) from search result`, result[0]); - return chid; - } else { + console.log(`Targeting group member ${chid} (${arg}) from search result`, result[0]); + + return !full ? chid : { ...{ id: chid }, ...result[0].item }; + } + else { const memberAvatar = group.members[index]; if (memberAvatar === undefined) { @@ -347,8 +354,14 @@ export function findGroupMemberId(arg) { return; } - console.log(`Triggering group member ${memberAvatar} at index ${index}`); - return chid; + console.log(`Targeting group member ${memberAvatar} at index ${index}`); + + return !full ? chid : { + id: chid, + avatar: memberAvatar, + name: characters.find(y => y.avatar === memberAvatar)?.name, + index: index, + }; } } diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index 42f9c40d0..21a79875e 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -733,6 +733,57 @@ export function initDefaultSlashCommands() { ], helpString: 'Unhides a message from the prompt.', })); + SlashCommandParser.addCommandObject(SlashCommand.fromProps({ + name: 'member-get', + aliases: ['getmember', 'memberget'], + callback: (async ({ field = 'name' }, arg) => { + if (!selected_group) { + toastr.warning('Cannot run /member-get command outside of a group chat.'); + return ''; + } + if (field === '') { + toastr.warning('\'/member-get field=\' argument required!'); + return ''; + } + field = field.toString(); + arg = arg.toString(); + if (!['name', 'index', 'id', 'avatar'].includes(field)) { + toastr.warning('\'/member-get field=\' argument required!'); + return ''; + } + const isId = !isNaN(parseInt(arg)); + const groupMember = findGroupMemberId(arg, true); + if (!groupMember) { + toastr.warn(`No group member found using ${isId ? 'id' : 'string'} ${arg}`); + return ''; + } + return groupMember[field]; + }), + namedArgumentList: [ + SlashCommandNamedArgument.fromProps({ + name: 'field', + description: 'Whether to retrieve the name, index, id, or avatar.', + typeList: [ARGUMENT_TYPE.STRING], + isRequired: true, + defaultValue: 'name', + enumList: [ + new SlashCommandEnumValue('name', 'Character name'), + new SlashCommandEnumValue('index', 'Group member index'), + new SlashCommandEnumValue('avatar', 'Character avatar'), + new SlashCommandEnumValue('id', 'Character index'), + ], + }), + ], + unnamedArgumentList: [ + SlashCommandArgument.fromProps({ + description: 'member index (starts with 0), name, or avatar', + typeList: [ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.STRING], + isRequired: true, + enumProvider: commonEnumProviders.groupMembers(), + }), + ], + helpString: 'Retrieves a group member\'s name, index, id, or avatar.', + })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'member-disable', callback: disableGroupMemberCallback, @@ -843,7 +894,8 @@ export function initDefaultSlashCommands() { helpString: 'Moves a group member down in the group chat list.', })); SlashCommandParser.addCommandObject(SlashCommand.fromProps({ - name: 'peek', + name: 'member-peek', + aliases: ['peek', 'memberpeek', 'peekmember'], callback: peekCallback, unnamedArgumentList: [ SlashCommandArgument.fromProps({ @@ -3047,7 +3099,7 @@ function performGroupMemberAction(chid, action) { async function disableGroupMemberCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /disable command outside of a group chat.'); + toastr.warning('Cannot run /member-disable command outside of a group chat.'); return ''; } @@ -3064,7 +3116,7 @@ async function disableGroupMemberCallback(_, arg) { async function enableGroupMemberCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /enable command outside of a group chat.'); + toastr.warning('Cannot run /member-enable command outside of a group chat.'); return ''; } @@ -3081,7 +3133,7 @@ async function enableGroupMemberCallback(_, arg) { async function moveGroupMemberUpCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /memberup command outside of a group chat.'); + toastr.warning('Cannot run /member-up command outside of a group chat.'); return ''; } @@ -3098,7 +3150,7 @@ async function moveGroupMemberUpCallback(_, arg) { async function moveGroupMemberDownCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /memberdown command outside of a group chat.'); + toastr.warning('Cannot run /member-down command outside of a group chat.'); return ''; } @@ -3115,12 +3167,12 @@ async function moveGroupMemberDownCallback(_, arg) { async function peekCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /peek command outside of a group chat.'); + toastr.warning('Cannot run /member-peek command outside of a group chat.'); return ''; } if (is_group_generating) { - toastr.warning('Cannot run /peek command while the group reply is generating.'); + toastr.warning('Cannot run /member-peek command while the group reply is generating.'); return ''; } @@ -3137,7 +3189,7 @@ async function peekCallback(_, arg) { async function removeGroupMemberCallback(_, arg) { if (!selected_group) { - toastr.warning('Cannot run /memberremove command outside of a group chat.'); + toastr.warning('Cannot run /member-remove command outside of a group chat.'); return ''; }