Skip to content

Commit

Permalink
Added utility functions to get slash command options
Browse files Browse the repository at this point in the history
Added blockSlot slash command
Removed unnecessary methods
  • Loading branch information
Alf-Melmac committed Jul 28, 2021
1 parent 87421c0 commit 0327975
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
package de.webalf.slotbot.service.bot.command.event;

import de.webalf.slotbot.model.annotations.Command;
import de.webalf.slotbot.model.annotations.SlashCommand;
import de.webalf.slotbot.service.bot.EventBotService;
import de.webalf.slotbot.service.bot.command.DiscordCommand;
import de.webalf.slotbot.service.bot.command.DiscordSlashCommand;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

import static de.webalf.slotbot.util.ListUtils.twoArguments;
import static de.webalf.slotbot.util.StringUtils.onlyNumbers;
import static de.webalf.slotbot.util.bot.InteractionUtils.finishedSlashCommandAction;
import static de.webalf.slotbot.util.bot.MessageUtils.deleteMessagesInstant;
import static de.webalf.slotbot.util.bot.MessageUtils.replyAndDelete;
import static de.webalf.slotbot.util.bot.SlashCommandUtils.getIntegerOption;
import static de.webalf.slotbot.util.bot.SlashCommandUtils.getOptionalStringOption;
import static de.webalf.slotbot.util.permissions.BotPermissionHelper.Authorization.EVENT_MANAGE;

/**
Expand All @@ -27,7 +35,11 @@
usage = "<Slotnummer> (\"<Ersatzname>\")",
argCount = {1, 2},
authorization = EVENT_MANAGE)
public class BlockSlot implements DiscordCommand {
@SlashCommand(name = "blockSlot",
description = "Sperrt einen Slot und setzt, falls angegeben, den Text an dessen Stelle.",
authorization = EVENT_MANAGE,
optionPosition = 0)
public class BlockSlot implements DiscordCommand, DiscordSlashCommand {
private final EventBotService eventBotService;

@Override
Expand All @@ -40,12 +52,33 @@ public void execute(Message message, List<String> args) {
return;
}

String replacementText = null;
if (twoArguments(args)) {
replacementText = args.get(1);
}
final String replacementText = !twoArguments(args) ? null : args.get(1);

eventBotService.blockSlot(message.getChannel().getIdLong(), Integer.parseInt(slotNumber), replacementText);
deleteMessagesInstant(message);
}

private static final String OPTION_SLOT_NUMBER = "slotnummer";
private static final String OPTION_REPLACEMENT = "ersatzname";
private static final List<List<OptionData>> OPTIONS = List.of(
List.of(new OptionData(OptionType.INTEGER, OPTION_SLOT_NUMBER, "Nummer des zu blockierenden Slots.", true),
new OptionData(OptionType.STRING, OPTION_REPLACEMENT, "Ersatzname", false))
);

@Override
public void execute(SlashCommandEvent event) {
log.trace("Slash command: blockSlot");

@SuppressWarnings("ConstantConditions") //Required option
final int slotNumber = getIntegerOption(event.getOption(OPTION_SLOT_NUMBER));
final String replacementText = getOptionalStringOption(event.getOption(OPTION_REPLACEMENT));
eventBotService.blockSlot(event.getChannel().getIdLong(), slotNumber, replacementText);

finishedSlashCommandAction(event);
}

@Override
public List<OptionData> getOptions(int optionPosition) {
return OPTIONS.get(optionPosition);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import static de.webalf.slotbot.util.bot.MentionUtils.isUserMention;
import static de.webalf.slotbot.util.bot.MessageUtils.deleteMessagesInstant;
import static de.webalf.slotbot.util.bot.MessageUtils.replyAndDelete;
import static de.webalf.slotbot.util.bot.SlashCommandUtils.getIntegerOption;
import static de.webalf.slotbot.util.permissions.BotPermissionHelper.Authorization.EVENT_MANAGE;
import static de.webalf.slotbot.util.permissions.BotPermissionHelper.Authorization.NONE;
import static de.webalf.slotbot.util.permissions.BotPermissionHelper.isAuthorized;
Expand Down Expand Up @@ -90,8 +91,8 @@ private void selfSlot(@NonNull Message message, @NotBlank String slot) {
slot(message, slot, message.getAuthor().getId());
}

static final String OPTION_SLOT_NUMBER = "slotnummer";
static final List<List<OptionData>> SLOT_OPTIONS = List.of(
private static final String OPTION_SLOT_NUMBER = "slotnummer";
private static final List<List<OptionData>> OPTIONS = List.of(
List.of(new OptionData(OptionType.INTEGER, OPTION_SLOT_NUMBER, "Nummer des erwünschten Slots.", true))
);

Expand All @@ -100,18 +101,14 @@ public void execute(SlashCommandEvent event) {
log.trace("Slash command: slot");

@SuppressWarnings("ConstantConditions") //Required option
final int slotNumber = Math.toIntExact(event.getOption(OPTION_SLOT_NUMBER).getAsLong());
selfSlot(event, slotNumber);
final int slotNumber = getIntegerOption(event.getOption(OPTION_SLOT_NUMBER));
eventBotService.slot(event.getChannel().getIdLong(), slotNumber, event.getUser().getId());

finishedSlashCommandAction(event);
}

@Override
public List<OptionData> getOptions(int optionPosition) {
return SLOT_OPTIONS.get(optionPosition);
}

private void selfSlot(SlashCommandEvent event, int slotNumber) {
eventBotService.slot(event.getChannel().getIdLong(), slotNumber, event.getUser().getId());
return OPTIONS.get(optionPosition);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,8 @@ private void selfUnslot(@NonNull Message message) {
public void execute(SlashCommandEvent event) {
log.trace("Slash command: unslot");

unslot(event);
eventBotService.unslot(event.getChannel().getIdLong(), event.getUser().getId());

finishedSlashCommandAction(event);
}

private void unslot(SlashCommandEvent event) {
eventBotService.unslot(event.getChannel().getIdLong(), event.getUser().getId());
}
}
31 changes: 31 additions & 0 deletions src/main/java/de/webalf/slotbot/util/bot/SlashCommandUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.privileges.CommandPrivilege;
import org.atteo.classindex.ClassIndex;

Expand Down Expand Up @@ -62,4 +63,34 @@ public static Set<CommandPrivilege> getCommandPrivileges(@NonNull Guild guild, S
private static Set<String> getAllowedRoles(@NonNull SlashCommand command) {
return Arrays.stream(command.authorization().getRoles()).map(ApplicationPermissionHelper.Role::getDiscordRole).collect(Collectors.toUnmodifiableSet());
}

/**
* Returns the string value of the given not null {@link OptionMapping}
*
* @param option to get text from
* @return string
*/
public static String getStringOption(@NonNull OptionMapping option) {
return option.getAsString();
}

/**
* Returns the string value of the given nullable {@link OptionMapping}
*
* @param option to get text from
* @return string or null
*/
public static String getOptionalStringOption(OptionMapping option) {
return option == null ? null : getStringOption(option);
}

/**
* Returns the integer value of the given not null {@link OptionMapping}
*
* @param option to get int from
* @return int
*/
public static int getIntegerOption(@NonNull OptionMapping option) {
return Math.toIntExact(option.getAsLong());
}
}

0 comments on commit 0327975

Please sign in to comment.