respond method

  1. @override
Future<Message> respond(
  1. MessageBuilder builder,
  2. {ResponseLevel? level}
)
inherited

Send a response to the command.

level can be set to change how the response is set. If is is not passed, CommandOptions.defaultResponseLevel is used instead.

You might also be interested in:

Implementation

@override
Future<Message> respond(MessageBuilder builder, {ResponseLevel? level}) async {
  builder = MessageCreateUpdateBuilder.fromMessageBuilder(builder);

  await _acknowledgeLock;

  if (_delegate != null) {
    return _delegate!.respond(builder, level: level);
  }

  level ??= _nearestCommandContext.command.resolvedOptions.defaultResponseLevel!;

  if (_hasResponded) {
    // We've already responded, just send a followup.
    return interaction.createFollowup(builder, isEphemeral: level.hideInteraction);
  }

  _hasResponded = true;

  if (_responseLevel != null && _responseLevel!.hideInteraction != level.hideInteraction) {
    // We acknowledged the interaction but our original acknowledgement doesn't correspond to
    // what's being requested here.
    // It's a bit ugly, but send an empty response and delete it to match [level].

    await interaction.respond(MessageBuilder(content: '‎'));
    await interaction.deleteOriginalResponse();

    return interaction.createFollowup(builder, isEphemeral: level.hideInteraction);
  }

  // Only update the message if we don't want to preserve it and the message's ephemerality
  // matches whether we want the response to be ephemeral or not.
  if (interaction is MessageComponentInteraction &&
      !level.preserveComponentMessages &&
      interaction.message?.flags.isEphemeral == level.hideInteraction) {
    // Using interactionEvent.respond is actually the same as editing a message in the case where
    // the interaction is a message component. In those cases, leaving `componentRows` as `null`
    // would leave the existing components on the message - which likely isn't what our users
    // expect. Instead, we override them and set the builder to have no components.
    builder.components ??= [];

    await (interaction as MessageComponentInteraction).respond(builder, updateMessage: true);
    return interaction.fetchOriginalResponse();
  }

  await interaction.respond(builder, isEphemeral: level.hideInteraction);
  return interaction.fetchOriginalResponse();
}