diff --git a/public/scripts/slash-commands/SlashCommandArgument.js b/public/scripts/slash-commands/SlashCommandArgument.js index 324d5b9d6..bdccbe714 100644 --- a/public/scripts/slash-commands/SlashCommandArgument.js +++ b/public/scripts/slash-commands/SlashCommandArgument.js @@ -1,6 +1,7 @@ import { SlashCommandClosure } from './SlashCommandClosure.js'; import { SlashCommandEnumValue } from './SlashCommandEnumValue.js'; import { SlashCommandExecutor } from './SlashCommandExecutor.js'; +import { SlashCommandScope } from './SlashCommandScope.js'; @@ -30,7 +31,7 @@ export class SlashCommandArgument { * @param {boolean} [props.acceptsMultiple] default: false - whether argument accepts multiple values * @param {string|SlashCommandClosure} [props.defaultValue] default value if no value is provided * @param {string|SlashCommandEnumValue|(string|SlashCommandEnumValue)[]} [props.enumList] list of accepted values - * @param {(executor:SlashCommandExecutor)=>SlashCommandEnumValue[]} [props.enumProvider] function that returns auto complete options + * @param {(executor:SlashCommandExecutor, scope:SlashCommandScope)=>SlashCommandEnumValue[]} [props.enumProvider] function that returns auto complete options * @param {boolean} [props.forceEnum] default: true - whether the input must match one of the enum values */ static fromProps(props) { @@ -55,7 +56,7 @@ export class SlashCommandArgument { /**@type {boolean}*/ acceptsMultiple = false; /**@type {string|SlashCommandClosure}*/ defaultValue; /**@type {SlashCommandEnumValue[]}*/ enumList = []; - /**@type {(executor:SlashCommandExecutor)=>SlashCommandEnumValue[]}*/ enumProvider = null; + /**@type {(executor:SlashCommandExecutor, scope:SlashCommandScope)=>SlashCommandEnumValue[]}*/ enumProvider = null; /**@type {boolean}*/ forceEnum = true; @@ -64,7 +65,7 @@ export class SlashCommandArgument { * @param {ARGUMENT_TYPE|ARGUMENT_TYPE[]} types * @param {string|SlashCommandClosure} defaultValue * @param {string|SlashCommandEnumValue|(string|SlashCommandEnumValue)[]} enums - * @param {(executor:SlashCommandExecutor)=>SlashCommandEnumValue[]} enumProvider function that returns auto complete options + * @param {(executor:SlashCommandExecutor, scope:SlashCommandScope)=>SlashCommandEnumValue[]} enumProvider function that returns auto complete options */ constructor(description, types, isRequired = false, acceptsMultiple = false, defaultValue = null, enums = [], enumProvider = null, forceEnum = true) { this.description = description; @@ -95,7 +96,7 @@ export class SlashCommandNamedArgument extends SlashCommandArgument { * @param {boolean} [props.acceptsMultiple] default: false - whether argument accepts multiple values * @param {string|SlashCommandClosure} [props.defaultValue] default value if no value is provided * @param {string|SlashCommandEnumValue|(string|SlashCommandEnumValue)[]} [props.enumList] list of accepted values - * @param {(executor:SlashCommandExecutor)=>SlashCommandEnumValue[]} [props.enumProvider] function that returns auto complete options + * @param {(executor:SlashCommandExecutor, scope:SlashCommandScope)=>SlashCommandEnumValue[]} [props.enumProvider] function that returns auto complete options * @param {boolean} [props.forceEnum] default: true - whether the input must match one of the enum values */ static fromProps(props) { @@ -126,7 +127,7 @@ export class SlashCommandNamedArgument extends SlashCommandArgument { * @param {ARGUMENT_TYPE|ARGUMENT_TYPE[]} types * @param {string|SlashCommandClosure} defaultValue * @param {string|SlashCommandEnumValue|(string|SlashCommandEnumValue)[]} enums - * @param {(executor:SlashCommandExecutor)=>SlashCommandEnumValue[]} enumProvider function that returns auto complete options + * @param {(executor:SlashCommandExecutor, scope:SlashCommandScope)=>SlashCommandEnumValue[]} enumProvider function that returns auto complete options * @param {boolean} forceEnum */ constructor(name, description, types, isRequired = false, acceptsMultiple = false, defaultValue = null, enums = [], aliases = [], enumProvider = null, forceEnum = true) { diff --git a/public/scripts/slash-commands/SlashCommandAutoCompleteNameResult.js b/public/scripts/slash-commands/SlashCommandAutoCompleteNameResult.js index d12750491..cdd7f1a77 100644 --- a/public/scripts/slash-commands/SlashCommandAutoCompleteNameResult.js +++ b/public/scripts/slash-commands/SlashCommandAutoCompleteNameResult.js @@ -8,15 +8,18 @@ import { SlashCommandCommandAutoCompleteOption } from './SlashCommandCommandAuto import { SlashCommandEnumAutoCompleteOption } from './SlashCommandEnumAutoCompleteOption.js'; import { SlashCommandExecutor } from './SlashCommandExecutor.js'; import { SlashCommandNamedArgumentAutoCompleteOption } from './SlashCommandNamedArgumentAutoCompleteOption.js'; +import { SlashCommandScope } from './SlashCommandScope.js'; export class SlashCommandAutoCompleteNameResult extends AutoCompleteNameResult { /**@type {SlashCommandExecutor}*/ executor; + /**@type {SlashCommandScope}*/ scope; /** * @param {SlashCommandExecutor} executor + * @param {SlashCommandScope} scope * @param {Object.} commands */ - constructor(executor, commands) { + constructor(executor, scope, commands) { super( executor.name, executor.start, @@ -29,6 +32,7 @@ export class SlashCommandAutoCompleteNameResult extends AutoCompleteNameResult { ()=>'No slash commands found!', ); this.executor = executor; + this.scope = scope; } getSecondaryNameAt(text, index, isSelect) { @@ -103,7 +107,7 @@ export class SlashCommandAutoCompleteNameResult extends AutoCompleteNameResult { if (name.includes('=') && cmdArg) { // if cursor is already behind "=" check for enums - const enumList = cmdArg?.enumProvider?.(this.executor) ?? cmdArg?.enumList; + const enumList = cmdArg?.enumProvider?.(this.executor, this.scope) ?? cmdArg?.enumList; if (cmdArg && enumList?.length) { if (isSelect && enumList.find(it=>it.value == value) && argAssign && argAssign.end == index) { return null; @@ -150,7 +154,7 @@ export class SlashCommandAutoCompleteNameResult extends AutoCompleteNameResult { if (idx > -1) { argAssign = this.executor.unnamedArgumentList[idx]; cmdArg = this.executor.command.unnamedArgumentList[idx]; - const enumList = cmdArg?.enumProvider?.(this.executor) ?? cmdArg?.enumList; + const enumList = cmdArg?.enumProvider?.(this.executor, this.scope) ?? cmdArg?.enumList; if (cmdArg && enumList.length > 0) { value = argAssign.value.toString().slice(0, index - argAssign.start); start = argAssign.start; @@ -166,7 +170,7 @@ export class SlashCommandAutoCompleteNameResult extends AutoCompleteNameResult { return null; } - const enumList = cmdArg?.enumProvider?.(this.executor) ?? cmdArg?.enumList; + const enumList = cmdArg?.enumProvider?.(this.executor, this.scope) ?? cmdArg?.enumList; if (cmdArg == null || enumList.length == 0) return null; const result = new AutoCompleteSecondaryNameResult( diff --git a/public/scripts/slash-commands/SlashCommandParser.js b/public/scripts/slash-commands/SlashCommandParser.js index 8dffa666e..52796e063 100644 --- a/public/scripts/slash-commands/SlashCommandParser.js +++ b/public/scripts/slash-commands/SlashCommandParser.js @@ -411,7 +411,7 @@ export class SlashCommandParser { ); return result; } - const result = new SlashCommandAutoCompleteNameResult(executor, this.commands); + const result = new SlashCommandAutoCompleteNameResult(executor, this.scopeIndex[this.commandIndex.indexOf(executor)], this.commands); return result; } return null;