Skip to content

Commit

Permalink
Transform rename slot to a slash command
Browse files Browse the repository at this point in the history
  • Loading branch information
Alf-Melmac committed Jul 29, 2023
1 parent 0a22e1a commit f367d5c
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package de.webalf.slotbot.model.bot;

import lombok.Value;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;

Expand All @@ -10,14 +9,8 @@
* @author Alf
* @since 07.01.2023
*/
@Value
public class TranslatableOptionData {
OptionType type;
String name;
String description;
boolean isRequired;

public record TranslatableOptionData(OptionType type, String name, String description, boolean required) {
public OptionData toOptionData(String name, String description) {
return new OptionData(type, name, description, isRequired);
return new OptionData(type, name, description, required);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package de.webalf.slotbot.repository;

import de.webalf.slotbot.model.Event;
import de.webalf.slotbot.model.Slot;
import de.webalf.slotbot.model.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
Expand All @@ -13,4 +17,8 @@
@Repository
public interface SlotRepository extends SuperIdEntityJpaRepository<Slot> {
long countByUserAndSquadEventDateTimeBefore(User user, LocalDateTime dateTime);

@Modifying
@Query("UPDATE Slot s SET s.name = :name WHERE s.number = :number AND s.squad IN (SELECT sq FROM Squad sq WHERE s.squad = sq AND sq.event = :event)")
void updateNameByEventAndNumber(@Param("name") String newSlotName, @Param("event") Event event, @Param("number") int slotNumber);
}
7 changes: 2 additions & 5 deletions src/main/java/de/webalf/slotbot/service/EventService.java
Original file line number Diff line number Diff line change
Expand Up @@ -412,12 +412,9 @@ public Event deleteSlot(@NonNull Event event, int slotNumber) {
* @param event event
* @param slotNumber to edit name of
* @param slotName new name
* @return event in which the slot has been renamed
*/
public Event renameSlot(@NonNull Event event, int slotNumber, String slotName) {
Slot slot = event.findSlot(slotNumber).orElseThrow(ResourceNotFoundException::new);
slotService.renameSlot(slot, slotName);
return event;
public void renameSlot(@NonNull Event event, int slotNumber, String slotName) {
slotService.renameSlot(event, slotNumber, slotName);
}

/**
Expand Down
11 changes: 6 additions & 5 deletions src/main/java/de/webalf/slotbot/service/SlotService.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,14 @@ void unslot(@NonNull Slot slot, User user) {
}

/**
* Renames the given slot
* Renames the slot with the given name for the specified event and slot number.
*
* @param slot to rename
* @param slotName new name
* @param event event to which the slot belongs
* @param slotNumber slot number
* @param slotName new slot name
*/
void renameSlot(@NonNull Slot slot, @NotBlank String slotName) {
slot.setName(slotName);
public void renameSlot(@NonNull Event event, int slotNumber, @NotBlank String slotName) {
slotRepository.updateNameByEventAndNumber(slotName, event, slotNumber);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ private List<OptionData> getOptions(@NonNull Class<?> commandClass, int optionPo
@SuppressWarnings("unchecked") //The class must implement an interface, and thus we can assume the correct return type here
final List<TranslatableOptionData> options = (List<TranslatableOptionData>) commandClass.getMethod("getOptions", int.class).invoke(commandClassHelper.getConstructor(commandClass), optionPosition);
return options.stream().map(option -> {
final String name = option.getName();
final String description = option.getDescription();
final String name = option.name();
final String description = option.description();
final OptionData optionData = option
.toOptionData(DEFAULT_LOCALE.t(name), DEFAULT_LOCALE.t(name));
locales.forEach((language, locale) -> optionData
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,56 @@
package de.webalf.slotbot.service.bot.command.event;

import de.webalf.slotbot.model.annotations.bot.Command;
import de.webalf.slotbot.model.annotations.bot.SlashCommand;
import de.webalf.slotbot.model.bot.TranslatableOptionData;
import de.webalf.slotbot.service.bot.EventBotService;
import de.webalf.slotbot.service.bot.command.DiscordCommand;
import de.webalf.slotbot.service.bot.command.DiscordSlashCommand;
import de.webalf.slotbot.util.bot.DiscordLocaleHelper;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;

import java.util.List;

import static de.webalf.slotbot.util.StringUtils.onlyNumbers;
import static de.webalf.slotbot.util.bot.MessageUtils.deleteMessagesInstant;
import static de.webalf.slotbot.util.bot.MessageUtils.replyAndDelete;
import static de.webalf.slotbot.util.permissions.BotPermissionHelper.Authorization.EVENT_MANAGE;
import static de.webalf.slotbot.util.bot.InteractionUtils.finishedVisibleInteraction;
import static de.webalf.slotbot.util.bot.SlashCommandUtils.getIntegerOption;
import static de.webalf.slotbot.util.bot.SlashCommandUtils.getStringOption;

/**
* @author Alf
* @since 12.01.2021
*/
@RequiredArgsConstructor
@Slf4j
@Command(names = {"renameSlot", "editSlot", "eventRenameSlot"},
description = "Ermöglicht es einen Slot umzubenennen.",
usage = "<Slotnummer> \"<Slotname>\"",
argCount = {2},
authorization = EVENT_MANAGE)
public class RenameSlot implements DiscordCommand {
@SlashCommand(name = "bot.slash.event.renameSlot",
description = "bot.slash.event.renameSlot.description",
authorization = Permission.MANAGE_CHANNEL,
optionPosition = 0)
public class RenameSlot implements DiscordSlashCommand {
private final EventBotService eventBotService;

private static final String OPTION_SLOT_NUMBER = "bot.slash.event.renameSlot.option.slotNumber";
private static final String OPTION_NAME = "bot.slash.event.renameSlot.option.name";
private static final List<List<TranslatableOptionData>> OPTIONS = List.of(
List.of(new TranslatableOptionData(OptionType.INTEGER, OPTION_SLOT_NUMBER, "bot.slash.event.renameSlot.option.slotNumber.description", true),
new TranslatableOptionData(OptionType.STRING, OPTION_NAME, "bot.slash.event.renameSlot.option.name.description", true))
);

@Override
public void execute(Message message, List<String> args) {
log.trace("Command: renameslot");
public void execute(@NonNull SlashCommandInteractionEvent event, @NonNull DiscordLocaleHelper locale) {
log.trace("Slash command: renameSlot");

final int slotNumber = getIntegerOption(event, OPTION_SLOT_NUMBER);
final String name = getStringOption(event, OPTION_NAME);
eventBotService.renameSlot(event.getChannel().getIdLong(), slotNumber, name);

final String slotNumber = args.get(0);
if (!onlyNumbers(slotNumber)) {
replyAndDelete(message, "Die Slotnummer muss eine Zahl sein.");
return;
}
finishedVisibleInteraction(event);
}

eventBotService.renameSlot(message.getChannel().getIdLong(), Integer.parseInt(slotNumber), args.get(1));
deleteMessagesInstant(message);
@Override
public List<TranslatableOptionData> getOptions(int optionPosition) {
return OPTIONS.get(optionPosition);
}
}
6 changes: 6 additions & 0 deletions src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,10 @@ api.events.error.tooManyDays=Request exceeds maximum of 30 days. You have entere
bot.slash.event.unslot.force.user=force_unslot_user
bot.slash.event.unslot.option.user=user
bot.slash.event.unslot.option.user.description=User to unslot.
bot.slash.event.renameSlot=rename_slot
bot.slash.event.renameSlot.description=Renames a slot using the number of the slot.
bot.slash.event.renameSlot.option.slotNumber=slot_number
bot.slash.event.renameSlot.option.name=slot_name
bot.slash.event.renameSlot.option.slotNumber.description=Number of slot to be renamed.
bot.slash.event.renameSlot.option.name.description=New slot name

8 changes: 7 additions & 1 deletion src/main/resources/messages_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,10 @@ bot.select.event.addEventToChannel.response.isArchive=Dem Archivkanal können ke
api.events.error.tooManyDays=Es können maximal 30 Tage auf einmal abgefragt werden. Du hast {0} angegeben.
bot.slash.event.unslot.force.user=unslot_erzwingen_user
bot.slash.event.unslot.option.user=nutzer
bot.slash.event.unslot.option.user.description=Auszuslottende Person.
bot.slash.event.unslot.option.user.description=Auszuslottende Person.
bot.slash.event.renameSlot=slot_umbenennen
bot.slash.event.renameSlot.description=Benennt einen Slot anhand der Slotnummer um.
bot.slash.event.renameSlot.option.slotNumber=slotnummer
bot.slash.event.renameSlot.option.slotNumber.description=Nummer des umzubenennenden Slots.
bot.slash.event.renameSlot.option.name=slot_name
bot.slash.event.renameSlot.option.name.description=Neuer Slotname

0 comments on commit f367d5c

Please sign in to comment.