Merge pull request #3409 from Succubyss/member-get Adds /member-get via enhancing findGroupMemberId

890c0c47230ea5b893306d621afcd23e1011f888

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
2 files changed, +87 -22Ignore whitespace
public/scripts/group-chats.js+27 -14
@@ -292,10 +292,11 @@ export function getGroupNames() {
292292
293293/**
294294 * Finds the character ID for a group member.
295295 * @param {number|string} arg 0-based member index or character name
296- * @returns {number} 0-based character ID
296+ * @param {Boolean} full Whether to return a key-value object containing extra data
297+ * @returns {number|Object} 0-based character ID or key-value object if full is true
297298 */
298299export function findGroupMemberId(arg, full = false) {
299300 arg = arg?.trim();
300301
301302 if (!arg) {
@@ -311,15 +312,19 @@ export function findGroupMemberId(arg) {
311312 }
312313
313314 const index = parseInt(arg);
314315 const searchByNamesearchByString = isNaN(index);
315316
316317 if (searchByNamesearchByString) {
317- const memberNames = group.members.map(x => ({ name: characters.find(y => y.avatar === x)?.name, index: characters.findIndex(y => y.avatar === x) }));
318+ const memberNames = group.members.map(x => ({
318- const fuse = new Fuse(memberNames, { keys: ['name'] });
319+ avatar: x,
320+ name: characters.find(y => y.avatar === x)?.name,
321+ index: characters.findIndex(y => y.avatar === x),
322+ }));
323+ const fuse = new Fuse(memberNames, { keys: ['avatar', 'name'] });
319324 const result = fuse.search(arg);
320325
321326 if (!result.length) {
322327 console.warn(`WARN: No group member found withusing namestring ${arg}`);
323328 return;
324329 }
325330
@@ -330,9 +335,11 @@ export function findGroupMemberId(arg) {
330335 return;
331336 }
332337
333338 console.log(`TriggeringTargeting group member ${chid} (${arg}) from search result`, result[0]);
334- return chid;
339+
335- } else {
340+ return !full ? chid : { ...{ id: chid }, ...result[0].item };
341+ }
342+ else {
336343 const memberAvatar = group.members[index];
337344
338345 if (memberAvatar === undefined) {
@@ -347,8 +354,14 @@ export function findGroupMemberId(arg) {
347354 return;
348355 }
349356
350357 console.log(`TriggeringTargeting group member ${memberAvatar} at index ${index}`);
351- return chid;
358+
359+ return !full ? chid : {
360+ id: chid,
361+ avatar: memberAvatar,
362+ name: characters.find(y => y.avatar === memberAvatar)?.name,
363+ index: index,
364+ };
352365 }
353366}
354367
public/scripts/slash-commands.js+60 -8
@@ -734,6 +734,57 @@ export function initDefaultSlashCommands() {
734734 helpString: 'Unhides a message from the prompt.',
735735 }));
736736 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
737+ name: 'member-get',
738+ aliases: ['getmember', 'memberget'],
739+ callback: (async ({ field = 'name' }, arg) => {
740+ if (!selected_group) {
741+ toastr.warning('Cannot run /member-get command outside of a group chat.');
742+ return '';
743+ }
744+ if (field === '') {
745+ toastr.warning('\'/member-get field=\' argument required!');
746+ return '';
747+ }
748+ field = field.toString();
749+ arg = arg.toString();
750+ if (!['name', 'index', 'id', 'avatar'].includes(field)) {
751+ toastr.warning('\'/member-get field=\' argument required!');
752+ return '';
753+ }
754+ const isId = !isNaN(parseInt(arg));
755+ const groupMember = findGroupMemberId(arg, true);
756+ if (!groupMember) {
757+ toastr.warn(`No group member found using ${isId ? 'id' : 'string'} ${arg}`);
758+ return '';
759+ }
760+ return groupMember[field];
761+ }),
762+ namedArgumentList: [
763+ SlashCommandNamedArgument.fromProps({
764+ name: 'field',
765+ description: 'Whether to retrieve the name, index, id, or avatar.',
766+ typeList: [ARGUMENT_TYPE.STRING],
767+ isRequired: true,
768+ defaultValue: 'name',
769+ enumList: [
770+ new SlashCommandEnumValue('name', 'Character name'),
771+ new SlashCommandEnumValue('index', 'Group member index'),
772+ new SlashCommandEnumValue('avatar', 'Character avatar'),
773+ new SlashCommandEnumValue('id', 'Character index'),
774+ ],
775+ }),
776+ ],
777+ unnamedArgumentList: [
778+ SlashCommandArgument.fromProps({
779+ description: 'member index (starts with 0), name, or avatar',
780+ typeList: [ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.STRING],
781+ isRequired: true,
782+ enumProvider: commonEnumProviders.groupMembers(),
783+ }),
784+ ],
785+ helpString: 'Retrieves a group member\'s name, index, id, or avatar.',
786+ }));
787+ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
737788 name: 'member-disable',
738789 callback: disableGroupMemberCallback,
739790 aliases: ['disable', 'disablemember', 'memberdisable'],
@@ -843,7 +894,8 @@ export function initDefaultSlashCommands() {
843894 helpString: 'Moves a group member down in the group chat list.',
844895 }));
845896 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
846897 name: 'member-peek',
898+ aliases: ['peek', 'memberpeek', 'peekmember'],
847899 callback: peekCallback,
848900 unnamedArgumentList: [
849901 SlashCommandArgument.fromProps({
@@ -3047,7 +3099,7 @@ function performGroupMemberAction(chid, action) {
30473099
30483100async function disableGroupMemberCallback(_, arg) {
30493101 if (!selected_group) {
30503102 toastr.warning('Cannot run /member-disable command outside of a group chat.');
30513103 return '';
30523104 }
30533105
@@ -3064,7 +3116,7 @@ async function disableGroupMemberCallback(_, arg) {
30643116
30653117async function enableGroupMemberCallback(_, arg) {
30663118 if (!selected_group) {
30673119 toastr.warning('Cannot run /member-enable command outside of a group chat.');
30683120 return '';
30693121 }
30703122
@@ -3081,7 +3133,7 @@ async function enableGroupMemberCallback(_, arg) {
30813133
30823134async function moveGroupMemberUpCallback(_, arg) {
30833135 if (!selected_group) {
30843136 toastr.warning('Cannot run /memberupmember-up command outside of a group chat.');
30853137 return '';
30863138 }
30873139
@@ -3098,7 +3150,7 @@ async function moveGroupMemberUpCallback(_, arg) {
30983150
30993151async function moveGroupMemberDownCallback(_, arg) {
31003152 if (!selected_group) {
31013153 toastr.warning('Cannot run /memberdownmember-down command outside of a group chat.');
31023154 return '';
31033155 }
31043156
@@ -3115,12 +3167,12 @@ async function moveGroupMemberDownCallback(_, arg) {
31153167
31163168async function peekCallback(_, arg) {
31173169 if (!selected_group) {
31183170 toastr.warning('Cannot run /member-peek command outside of a group chat.');
31193171 return '';
31203172 }
31213173
31223174 if (is_group_generating) {
31233175 toastr.warning('Cannot run /member-peek command while the group reply is generating.');
31243176 return '';
31253177 }
31263178
@@ -3137,7 +3189,7 @@ async function peekCallback(_, arg) {
31373189
31383190async function removeGroupMemberCallback(_, arg) {
31393191 if (!selected_group) {
31403192 toastr.warning('Cannot run /memberremovemember-remove command outside of a group chat.');
31413193 return '';
31423194 }
31433195