invoke method

  1. @override
Future<void> invoke(
  1. ChatContext context
)
override

Parse arguments, verify checks, call execute and handle call hooks.

This method might throw uncaught CommandsExceptions and should be handled with care. Thrown exceptions will not be added to CommandsPlugin.onCommandError unless called from within a "safe" context where uncaught exceptions are caught anyways.

Implementation

@override
Future<void> invoke(ChatContext context) async {
  List<dynamic> arguments = [];

  if (context is MessageChatContext) {
    StringView argumentsView = StringView(context.rawArguments);

    for (final parameter in _functionData.parametersData.skip(1)) {
      if (argumentsView.eof) {
        break;
      }

      arguments.add(await parse(
        context.commands,
        context,
        argumentsView,
        parameter.type,
        converterOverride: parameter.converterOverride,
      ));
    }

    // Context parameter will be added in first position later
    if (arguments.length < _functionData.requiredParameters - 1) {
      throw NotEnoughArgumentsException(context);
    }
  } else if (context is InteractionChatContext) {
    for (final parameter in _functionData.parametersData.skip(1)) {
      String kebabCaseName = convertToKebabCase(parameter.name);

      if (!context.rawArguments.containsKey(kebabCaseName)) {
        arguments.add(parameter.defaultValue);
        continue;
      }

      dynamic rawArgument = context.rawArguments[kebabCaseName]!;

      arguments.add(await parse(
        context.commands,
        context,
        StringView(rawArgument.toString(), isRestBlock: true),
        parameter.type,
        converterOverride: parameter.converterOverride,
      ));
    }
  }

  context.arguments = arguments;

  for (final check in [...checks, ...singleChecks]) {
    if (!await check.check(context)) {
      throw CheckFailedException(check, context);
    }
  }

  _onPreCallController.add(context);

  try {
    await Function.apply(execute, [context, ...context.arguments]);
  } catch (e, s) {
    Error.throwWithStackTrace(UncaughtException(e, context)..stackTrace = s, s);
  }

  _onPostCallController.add(context);
}