From f47a596828dd606257c35f67e4f44950cc1d4d36 Mon Sep 17 00:00:00 2001 From: Deliasama Date: Thu, 4 Jan 2024 00:20:25 +0100 Subject: [PATCH 01/18] Added RemindMe Command --- .../features/reminder/RemindManager.java | 41 ++++++++++++ .../features/reminder/RemindMeCommand.java | 62 +++++++++++++++++++ .../slimeball/features/reminder/Reminder.java | 50 +++++++++++++++ .../features/reminder/ReminderTable.java | 41 ++++++++++++ .../slimecloud/slimeball/main/SlimeBot.java | 17 +++++ 5 files changed, 211 insertions(+) create mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java create mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java create mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java create mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java new file mode 100644 index 00000000..c042ea51 --- /dev/null +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java @@ -0,0 +1,41 @@ +package de.slimecloud.slimeball.features.reminder; + +import de.slimecloud.slimeball.main.SlimeBot; +import org.jetbrains.annotations.NotNull; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Optional; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class RemindManager { + private ReminderTable table; + private ScheduledFuture scheduledFuture = null; + + public RemindManager(@NotNull SlimeBot bot) { + if(bot.getReminder() != null) { + table = bot.getReminder(); + + scheduleNextReminder(); + } + } + + public void scheduleNextReminder() { + Optional reminderOptional = table.getNext(); + if(reminderOptional.isPresent()) { + if(scheduledFuture != null)scheduledFuture.cancel(true); + Reminder reminder = reminderOptional.get(); + long delay = reminder.getTime() - LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().getEpochSecond(); + scheduledFuture = reminder.getBot().getExecutor().schedule( + () -> { + reminder.getBot().getJda().retrieveUserById(reminder.getUser().getIdLong()).queue(user -> { + user.openPrivateChannel() + .flatMap(channel -> channel.sendMessage(reminder.getMessage())) + .queue(); + + }); + }, delay, TimeUnit.SECONDS); + } + } +} diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java new file mode 100644 index 00000000..332b7195 --- /dev/null +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java @@ -0,0 +1,62 @@ +package de.slimecloud.slimeball.features.reminder; + +import de.mineking.discordutils.commands.ApplicationCommand; +import de.mineking.discordutils.commands.ApplicationCommandMethod; +import de.mineking.discordutils.commands.option.Option; +import de.slimecloud.slimeball.features.level.Level; +import de.slimecloud.slimeball.main.SlimeBot; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +@ApplicationCommand(name = "remindme", description = "Set a reminder") +public class RemindMeCommand { + + @ApplicationCommandMethod + public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, + @Option(description = "Die Sache an die du erinnert werden möchtest") String message + ) { + if(time == null || message == null) { + event.reply("ERROR").setEphemeral(true).queue(); + return; + } + + // convert date + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + LocalDateTime dateTime = LocalDateTime.now(); + try { + dateTime = LocalDateTime.of(LocalDate.now(), LocalTime.parse(time, formatter)); + } catch (DateTimeParseException e1) { + try { + formatter = DateTimeFormatter.ofPattern("HH:mm dd.MM.yyyy"); + dateTime = LocalDateTime.parse(time, formatter); + } catch (DateTimeParseException e2) { + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + return; + } + } + ZonedDateTime zonedDateTime = dateTime.atZone(ZoneOffset.systemDefault()); + + long unixTime = zonedDateTime.toInstant().getEpochSecond(); + + + // Check if the time has already elapsed + long unixTimeNow = LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().getEpochSecond(); + + if(unixTime-unixTimeNow <= 0) { + event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); + return; + } + + bot.getReminder().createReminder(event.getGuild(), event.getUser(), unixTime, message); + bot.getRemindManager().scheduleNextReminder(); + + event.reply(String.valueOf(unixTime)).queue(); + } +} + diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java new file mode 100644 index 00000000..ed9f35eb --- /dev/null +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -0,0 +1,50 @@ +package de.slimecloud.slimeball.features.reminder; + +import de.mineking.javautils.database.Column; +import de.mineking.javautils.database.DataClass; +import de.mineking.javautils.database.Table; +import de.slimecloud.slimeball.main.SlimeBot; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.UserSnowflake; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.PropertyKey; + +@Getter +@AllArgsConstructor +public class Reminder implements DataClass { + private final SlimeBot bot; + + @Column() + private final Guild guild; + @Column() + private final UserSnowflake user; + + @Column(key = true) + private final long time; + + @Column + private final String message; + + public Reminder(@NotNull SlimeBot bot) { + this(bot, null, null, 0, null); + } + @NotNull + @Override + public Table getTable() { + return bot.getReminder(); + } + + @NotNull + @Override + public DataClass update() { + return DataClass.super.update(); + } + + @NotNull + @Override + public DataClass delete() { + return DataClass.super.delete(); + } +} diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java new file mode 100644 index 00000000..b4db5dc9 --- /dev/null +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -0,0 +1,41 @@ +package de.slimecloud.slimeball.features.reminder; + +import de.mineking.javautils.database.Order; +import de.mineking.javautils.database.Table; +import de.mineking.javautils.database.Where; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.UserSnowflake; +import org.jetbrains.annotations.NotNull; + +import java.nio.channels.SelectableChannel; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public interface ReminderTable extends Table { + @NotNull + default Optional getNext() { + return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); + } + + default void createReminder(Guild guild, UserSnowflake user, long time, String message) { + new Reminder(getManager().getData("bot"),guild, user, time, message).update(); + } + + default List getByMember(Member member) { + return selectMany(Where.allOf( + Where.equals("user", member.getUser().getIdLong()), + Where.equals("guild", member.getGuild().getIdLong()) + )); + } + + default List getByGuild(Guild guild) { + return selectMany(Where.equals("guild", guild.getIdLong())); + } + + +} diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index 85725011..d7bc8bd1 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -34,6 +34,10 @@ import de.slimecloud.slimeball.features.poll.PollTable; import de.slimecloud.slimeball.features.quote.QuoteCommand; import de.slimecloud.slimeball.features.quote.QuoteMessageCommand; +import de.slimecloud.slimeball.features.reminder.RemindManager; +import de.slimecloud.slimeball.features.reminder.RemindMeCommand; +import de.slimecloud.slimeball.features.reminder.Reminder; +import de.slimecloud.slimeball.features.reminder.ReminderTable; import de.slimecloud.slimeball.features.report.Report; import de.slimecloud.slimeball.features.report.ReportBlock; import de.slimecloud.slimeball.features.report.ReportBlockTable; @@ -103,6 +107,9 @@ public class SlimeBot extends ListenerAdapter { private final PollTable polls; + private final ReminderTable reminder; + private final RemindManager remindManager; + private final LevelTable level; private final CardDataTable profileData; private final GuildCardTable cardProfiles; @@ -137,6 +144,8 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx polls = (PollTable) database.getTable(PollTable.class, Poll.class, () -> new Poll(this), "polls").createTable(); + reminder = (ReminderTable) database.getTable(ReminderTable.class, Reminder.class, () -> new Reminder(this), "reminders").createTable(); + level = (LevelTable) database.getTable(LevelTable.class, Level.class, () -> new Level(this), "levels").createTable(); profileData = (CardDataTable) database.getTable(CardDataTable.class, CardProfileData.class, () -> new CardProfileData(this), "card_data").createTable(); cardProfiles = (GuildCardTable) database.getTable(GuildCardTable.class, GuildCardProfile.class, () -> new GuildCardProfile(this), "guild_card_profiles").createTable(); @@ -150,6 +159,7 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx reports = null; reportBlocks = null; polls = null; + reminder = null; level = null; profileData = null; cardProfiles = null; @@ -157,6 +167,9 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx wrappedData = null; } + // Initialize RemindMe manger + remindManager = new RemindManager(this); + //Initialize GitHub API if (credentials.get("GITHUB_TOKEN") != null && config.getGithubRepository() != null) github = new GitHubAPI(credentials.get("GITHUB_TOKEN")); else { @@ -218,6 +231,10 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx manager.registerCommand(FdmdsCommand.class); + //Register remind commands + if(reminder != null) { + manager.registerCommand(RemindMeCommand.class); + } //Register report commands if (reports != null) { manager.registerCommand(ReportCommand.class); From 33c0463a3e570b2455ff4a56d37999156e7b4cef Mon Sep 17 00:00:00 2001 From: Deliasama Date: Thu, 4 Jan 2024 16:34:55 +0100 Subject: [PATCH 02/18] Added RemindMe Command --- .../features/reminder/RemindManager.java | 21 +++++++++++-------- .../features/reminder/RemindMeCommand.java | 1 + .../slimeball/features/reminder/Reminder.java | 18 ++++++++++++---- .../features/reminder/ReminderTable.java | 9 +------- .../slimecloud/slimeball/main/SlimeBot.java | 7 +++---- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java index c042ea51..f1aae086 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java @@ -17,6 +17,7 @@ public RemindManager(@NotNull SlimeBot bot) { if(bot.getReminder() != null) { table = bot.getReminder(); + // Schedule the next reminder after the Bot starts scheduleNextReminder(); } } @@ -24,18 +25,20 @@ public RemindManager(@NotNull SlimeBot bot) { public void scheduleNextReminder() { Optional reminderOptional = table.getNext(); if(reminderOptional.isPresent()) { - if(scheduledFuture != null)scheduledFuture.cancel(true); Reminder reminder = reminderOptional.get(); long delay = reminder.getTime() - LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().getEpochSecond(); + + if(delay<= 0) { + System.out.println(reminder.getId()); + reminder.execute(); + return; + } + + if(scheduledFuture != null)scheduledFuture.cancel(true); + + scheduledFuture = reminder.getBot().getExecutor().schedule( - () -> { - reminder.getBot().getJda().retrieveUserById(reminder.getUser().getIdLong()).queue(user -> { - user.openPrivateChannel() - .flatMap(channel -> channel.sendMessage(reminder.getMessage())) - .queue(); - - }); - }, delay, TimeUnit.SECONDS); + reminder::execute, delay, TimeUnit.SECONDS); } } } diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java index 332b7195..057805b9 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java @@ -54,6 +54,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } bot.getReminder().createReminder(event.getGuild(), event.getUser(), unixTime, message); + // Schedule the next reminder bot.getRemindManager().scheduleNextReminder(); event.reply(String.valueOf(unixTime)).queue(); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index ed9f35eb..e9ab65e5 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -9,27 +9,37 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.PropertyKey; @Getter @AllArgsConstructor public class Reminder implements DataClass { private final SlimeBot bot; + @Column(autoincrement = true, key = true) + private final int id; @Column() private final Guild guild; @Column() private final UserSnowflake user; - @Column(key = true) + @Column() private final long time; @Column private final String message; public Reminder(@NotNull SlimeBot bot) { - this(bot, null, null, 0, null); + this(bot, 0, null, null, 0, null); + } + + public void execute() { + bot.getJda().openPrivateChannelById(user.getIdLong()) + .flatMap(channel -> channel.sendMessage(message)) + .queue(); + delete(); + bot.getRemindManager().scheduleNextReminder(); } + @NotNull @Override public Table getTable() { @@ -47,4 +57,4 @@ public DataClass update() { public DataClass delete() { return DataClass.super.delete(); } -} +} \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index b4db5dc9..80ce4fdc 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -8,13 +8,8 @@ import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; -import java.nio.channels.SelectableChannel; -import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.util.List; import java.util.Optional; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; public interface ReminderTable extends Table { @NotNull @@ -23,7 +18,7 @@ default Optional getNext() { } default void createReminder(Guild guild, UserSnowflake user, long time, String message) { - new Reminder(getManager().getData("bot"),guild, user, time, message).update(); + new Reminder(getManager().getData("bot"), 0, guild, user, time, message).update(); } default List getByMember(Member member) { @@ -36,6 +31,4 @@ default List getByMember(Member member) { default List getByGuild(Guild guild) { return selectMany(Where.equals("guild", guild.getIdLong())); } - - } diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index d7bc8bd1..fcd6f687 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -108,7 +108,7 @@ public class SlimeBot extends ListenerAdapter { private final PollTable polls; private final ReminderTable reminder; - private final RemindManager remindManager; + private RemindManager remindManager; private final LevelTable level; private final CardDataTable profileData; @@ -167,9 +167,6 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx wrappedData = null; } - // Initialize RemindMe manger - remindManager = new RemindManager(this); - //Initialize GitHub API if (credentials.get("GITHUB_TOKEN") != null && config.getGithubRepository() != null) github = new GitHubAPI(credentials.get("GITHUB_TOKEN")); else { @@ -301,6 +298,8 @@ public void onReady(@NotNull ReadyEvent event) { else logger.warn("Spotify alerts disabled deu to missing database"); } else logger.warn("Spotify alerts disabled due to missing configuration"); } + // Initialize RemindMe manger + remindManager = new RemindManager(this); new HolidayAlert(this); } From fac4ca4363bd9cc39af091a3b4b7cf0dcddf0e64 Mon Sep 17 00:00:00 2001 From: MineKing Date: Thu, 4 Jan 2024 17:40:30 +0100 Subject: [PATCH 03/18] Reformat code and fix delete problem --- .../features/reminder/RemindManager.java | 32 ++++------ .../features/reminder/RemindMeCommand.java | 60 +++++++------------ .../slimeball/features/reminder/Reminder.java | 26 +++----- .../features/reminder/ReminderTable.java | 17 ++++-- .../features/staff/MeetingConfig.java | 7 +-- .../de/slimecloud/slimeball/main/Main.java | 3 + .../slimecloud/slimeball/main/SlimeBot.java | 6 +- 7 files changed, 64 insertions(+), 87 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java index f1aae086..ccab27b8 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java @@ -3,42 +3,30 @@ import de.slimecloud.slimeball.main.SlimeBot; import org.jetbrains.annotations.NotNull; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.Optional; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class RemindManager { - private ReminderTable table; + private final ReminderTable table; private ScheduledFuture scheduledFuture = null; public RemindManager(@NotNull SlimeBot bot) { - if(bot.getReminder() != null) { - table = bot.getReminder(); - - // Schedule the next reminder after the Bot starts - scheduleNextReminder(); - } + this.table = bot.getReminder(); + scheduleNextReminder(); } public void scheduleNextReminder() { - Optional reminderOptional = table.getNext(); - if(reminderOptional.isPresent()) { - Reminder reminder = reminderOptional.get(); - long delay = reminder.getTime() - LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().getEpochSecond(); + if (scheduledFuture != null) scheduledFuture.cancel(true); + + table.getNext().ifPresent(reminder -> { + long delay = reminder.getTime().toEpochMilli() - System.currentTimeMillis(); - if(delay<= 0) { - System.out.println(reminder.getId()); + if (delay <= 0) { reminder.execute(); return; } - if(scheduledFuture != null)scheduledFuture.cancel(true); - - - scheduledFuture = reminder.getBot().getExecutor().schedule( - reminder::execute, delay, TimeUnit.SECONDS); - } + scheduledFuture = reminder.getBot().getExecutor().schedule(reminder::execute, delay / 1000, TimeUnit.SECONDS); + }); } } diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java index 057805b9..5d5c3c70 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java @@ -3,61 +3,47 @@ import de.mineking.discordutils.commands.ApplicationCommand; import de.mineking.discordutils.commands.ApplicationCommandMethod; import de.mineking.discordutils.commands.option.Option; -import de.slimecloud.slimeball.features.level.Level; +import de.slimecloud.slimeball.main.Main; import de.slimecloud.slimeball.main.SlimeBot; -import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.utils.TimeFormat; import org.jetbrains.annotations.NotNull; -import java.time.*; -import java.time.format.DateTimeFormatter; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoField; -@ApplicationCommand(name = "remindme", description = "Set a reminder") +@ApplicationCommand(name = "remindme", description = "Setzt einen Reminder") public class RemindMeCommand { - @ApplicationCommandMethod public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnert werden möchtest") String message ) { - if(time == null || message == null) { - event.reply("ERROR").setEphemeral(true).queue(); - return; - } - - // convert date - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); - LocalDateTime dateTime = LocalDateTime.now(); try { - dateTime = LocalDateTime.of(LocalDate.now(), LocalTime.parse(time, formatter)); - } catch (DateTimeParseException e1) { - try { - formatter = DateTimeFormatter.ofPattern("HH:mm dd.MM.yyyy"); - dateTime = LocalDateTime.parse(time, formatter); - } catch (DateTimeParseException e2) { - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - return; - } - } - ZonedDateTime zonedDateTime = dateTime.atZone(ZoneOffset.systemDefault()); + LocalDateTime now = LocalDateTime.now(Main.timezone); - long unixTime = zonedDateTime.toInstant().getEpochSecond(); + Instant timestamp = LocalDateTime.parse(time, new DateTimeFormatterBuilder().appendPattern("HH:mm[ dd.MM.yyyy]") + .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth()) + .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue()) + .parseDefaulting(ChronoField.YEAR, now.getYear()) + .toFormatter() + ).toInstant(Main.timezone); + if (timestamp.isBefore(Instant.now())) { + event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); + return; + } - // Check if the time has already elapsed - long unixTimeNow = LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().getEpochSecond(); + bot.getReminder().createReminder(event.getMember(), timestamp, message); - if(unixTime-unixTimeNow <= 0) { - event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); - return; + event.reply("Ich erinnere dich " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); + } catch (DateTimeParseException e) { + e.printStackTrace(); + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); } - - bot.getReminder().createReminder(event.getGuild(), event.getUser(), unixTime, message); - // Schedule the next reminder - bot.getRemindManager().scheduleNextReminder(); - - event.reply(String.valueOf(unixTime)).queue(); } } diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index e9ab65e5..3fba90d8 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -10,6 +10,8 @@ import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; +import java.time.Instant; + @Getter @AllArgsConstructor public class Reminder implements DataClass { @@ -17,25 +19,27 @@ public class Reminder implements DataClass { @Column(autoincrement = true, key = true) private final int id; - @Column() + + @Column private final Guild guild; - @Column() + @Column private final UserSnowflake user; - @Column() - private final long time; + @Column + private final Instant time; @Column private final String message; public Reminder(@NotNull SlimeBot bot) { - this(bot, 0, null, null, 0, null); + this(bot, 0, null, null, null, null); } public void execute() { bot.getJda().openPrivateChannelById(user.getIdLong()) .flatMap(channel -> channel.sendMessage(message)) .queue(); + delete(); bot.getRemindManager().scheduleNextReminder(); } @@ -45,16 +49,4 @@ public void execute() { public Table getTable() { return bot.getReminder(); } - - @NotNull - @Override - public DataClass update() { - return DataClass.super.update(); - } - - @NotNull - @Override - public DataClass delete() { - return DataClass.super.delete(); - } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index 80ce4fdc..41cc6847 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -3,11 +3,12 @@ import de.mineking.javautils.database.Order; import de.mineking.javautils.database.Table; import de.mineking.javautils.database.Where; +import de.slimecloud.slimeball.main.SlimeBot; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; +import java.time.Instant; import java.util.List; import java.util.Optional; @@ -17,18 +18,24 @@ default Optional getNext() { return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); } - default void createReminder(Guild guild, UserSnowflake user, long time, String message) { - new Reminder(getManager().getData("bot"), 0, guild, user, time, message).update(); + default Reminder createReminder(@NotNull Member member, @NotNull Instant time, @NotNull String message) { + SlimeBot bot = getManager().getData("bot"); + + Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, time, message)); + bot.getRemindManager().scheduleNextReminder(); + return result; } - default List getByMember(Member member) { + @NotNull + default List getByMember(@NotNull Member member) { return selectMany(Where.allOf( Where.equals("user", member.getUser().getIdLong()), Where.equals("guild", member.getGuild().getIdLong()) )); } - default List getByGuild(Guild guild) { + @NotNull + default List getByGuild(@NotNull Guild guild) { return selectMany(Where.equals("guild", guild.getIdLong())); } } diff --git a/src/main/java/de/slimecloud/slimeball/features/staff/MeetingConfig.java b/src/main/java/de/slimecloud/slimeball/features/staff/MeetingConfig.java index 91f0615e..75feef42 100644 --- a/src/main/java/de/slimecloud/slimeball/features/staff/MeetingConfig.java +++ b/src/main/java/de/slimecloud/slimeball/features/staff/MeetingConfig.java @@ -3,6 +3,7 @@ import de.slimecloud.slimeball.config.ConfigCategory; import de.slimecloud.slimeball.config.engine.ConfigField; import de.slimecloud.slimeball.config.engine.ConfigFieldType; +import de.slimecloud.slimeball.main.Main; import de.slimecloud.slimeball.main.SlimeEmoji; import lombok.Getter; import net.dv8tion.jda.api.EmbedBuilder; @@ -30,8 +31,6 @@ @Getter public class MeetingConfig extends ConfigCategory { - public final static ZoneOffset offset = ZoneOffset.ofHours(1); - @ConfigField(name = "Kanal", command = "channel", description = "Kanal, in dem Team-Meetings organisiert werden", type = ConfigFieldType.MESSAGE_CHANNEL, required = true) private Long channel; @@ -53,7 +52,7 @@ public class MeetingConfig extends ConfigCategory { @Override public void enable(@NotNull Guild guild) { - createNewMeeting(LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).atTime(20, 0).toInstant(offset)); + createNewMeeting(LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).atTime(20, 0).toInstant(Main.timezone)); } public void setupNotification() { @@ -83,7 +82,7 @@ public void createNewMeeting(@NotNull Instant timestamp) { this.message = message.getIdLong(); //Create event - this.event = channel.getGuild().createScheduledEvent("Teamsitzung", getVoiceChannel().orElseThrow(), timestamp.atOffset(offset)) + this.event = channel.getGuild().createScheduledEvent("Teamsitzung", getVoiceChannel().orElseThrow(), timestamp.atOffset(Main.timezone)) .setDescription("Weitere Informationen: " + message.getJumpUrl()) .complete().getIdLong(); }); diff --git a/src/main/java/de/slimecloud/slimeball/main/Main.java b/src/main/java/de/slimecloud/slimeball/main/Main.java index 0a08f801..31ece6b9 100644 --- a/src/main/java/de/slimecloud/slimeball/main/Main.java +++ b/src/main/java/de/slimecloud/slimeball/main/Main.java @@ -6,10 +6,13 @@ import io.github.cdimascio.dotenv.Dotenv; import lombok.extern.slf4j.Slf4j; +import java.time.ZoneOffset; import java.util.Random; @Slf4j public class Main { + public final static ZoneOffset timezone = ZoneOffset.ofHours(1); + public final static Random random = new Random(); public final static Gson json = new Gson(); diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index fcd6f687..2826dce3 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -231,7 +231,8 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx //Register remind commands if(reminder != null) { manager.registerCommand(RemindMeCommand.class); - } + } else logger.warn("Reminders disabled due to missing database"); + //Register report commands if (reports != null) { manager.registerCommand(ReportCommand.class); @@ -298,8 +299,9 @@ public void onReady(@NotNull ReadyEvent event) { else logger.warn("Spotify alerts disabled deu to missing database"); } else logger.warn("Spotify alerts disabled due to missing configuration"); } + // Initialize RemindMe manger - remindManager = new RemindManager(this); + if(reminder != null) remindManager = new RemindManager(this); new HolidayAlert(this); } From 1ff660ddeb269709b245ac4966f4048db208413e Mon Sep 17 00:00:00 2001 From: Deliasama Date: Thu, 4 Jan 2024 22:07:27 +0100 Subject: [PATCH 04/18] Add List and Delete Function --- .../slimeball/config/GuildConfig.java | 9 ++ .../features/reminder/RemindCommand.java | 152 ++++++++++++++++++ .../features/reminder/RemindMeCommand.java | 49 ------ .../slimeball/features/reminder/Reminder.java | 43 ++++- .../features/reminder/ReminderTable.java | 11 +- .../slimecloud/slimeball/main/SlimeBot.java | 4 +- 6 files changed, 208 insertions(+), 60 deletions(-) create mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java delete mode 100644 src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java diff --git a/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java b/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java index 1f4c7061..5a57d768 100644 --- a/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java +++ b/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java @@ -21,6 +21,7 @@ import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,6 +68,10 @@ public static GuildConfig readFromFile(@NotNull SlimeBot bot, long guild) { @ConfigField(name = "Team", command = "team", description = "Die Team-Rolle", type = ConfigFieldType.ROLE) private Long teamRole; + @Setter + @ConfigField(name = "TeamChannel", command = "teamChannel", description = "Der Team-Channel", type = ConfigFieldType.MESSAGE_CHANNEL) + private Long teamChannel; + @Getter @ConfigField(name = "Beitritts Rollen", command = "autorole", description = "Rollen, die Mitgliedern beim Beitreten gegeben werden", type = ConfigFieldType.ROLE) private final List joinRoles = new ArrayList<>(); @@ -177,6 +182,10 @@ public Optional getTeamRole() { return Optional.ofNullable(teamRole).map(bot.getJda()::getRoleById); } + @NotNull + public Optional getTeamChannel() { + return Optional.ofNullable(teamChannel).map(channel -> getGuild().getChannelById(MessageChannel.class, channel)); + } @NotNull public Optional getGreetingsChannel() { return Optional.ofNullable(greetingsChannel).map(id -> bot.getJda().getChannelById(GuildMessageChannel.class, id)); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java new file mode 100644 index 00000000..de6b247d --- /dev/null +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -0,0 +1,152 @@ +package de.slimecloud.slimeball.features.reminder; + +import de.mineking.discordutils.commands.ApplicationCommand; +import de.mineking.discordutils.commands.ApplicationCommandMethod; +import de.mineking.discordutils.commands.Command; +import de.mineking.discordutils.commands.Setup; +import de.mineking.discordutils.commands.option.Option; +import de.slimecloud.slimeball.main.CommandPermission; +import de.slimecloud.slimeball.main.Main; +import de.slimecloud.slimeball.main.SlimeBot; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.utils.TimeFormat; +import org.jetbrains.annotations.NotNull; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoField; +import java.util.List; + +@ApplicationCommand(name = "remind", description = "Setzt einen Reminder") +public class RemindCommand { + + @ApplicationCommand(name = "me", description = "Setze einen Reminder") + public static class MeCommand { + @ApplicationCommandMethod + public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, + @Option(description = "Die Sache an die du erinnert werden möchtest") String message + ) { + if(message.length()>1024) { + event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!").setEphemeral(true).queue(); + return; + } + try { + Instant timestamp = convertTime(time); + + if (timestamp.isBefore(Instant.now())) { + event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); + return; + } + + bot.getReminder().createReminder(event.getMember(), 0, timestamp, message); + + event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); + } catch (DateTimeParseException e) { + e.printStackTrace(); + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + } + } + } + @ApplicationCommand(name = "role", description = "Setze einen Reminder") + public static class RoleCommand { + public final CommandPermission permission = CommandPermission.TEAM; + + @ApplicationCommandMethod + public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + @Option(description = "Rolle die erwähnt werden soll") Role role, + @Option(description = "Die Zeit an welcher du erinnern möchtest, beispielsweise 13:30") String time, + @Option(description = "Die Sache an die du erinnern möchtest") String message + ) { + if(message.length()>1024) { + event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!").setEphemeral(true).queue(); + return; + } + try { + Instant timestamp = convertTime(time); + + if (timestamp.isBefore(Instant.now())) { + event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); + return; + } + + bot.getReminder().createReminder(event.getMember(), role.getIdLong(), timestamp, message); + + event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); + } catch (DateTimeParseException e) { + e.printStackTrace(); + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + } + } + } + @ApplicationCommand(name = "list", description = "Zeige und deine aktiven Reminder") + public static class ListCommand { + @ApplicationCommandMethod + public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event) { + List reminders = bot.getReminder().getByMember(event.getMember()); + if(reminders.isEmpty()) { + event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); + return; + } + EmbedBuilder builder = new EmbedBuilder() + .setTitle("Reminder") + .setColor(bot.getColor(event.getGuild())) + .setFooter("Lösche einen Reminder mit /remind delete [Nummer]"); + + for(int i = 0; i cmd) { + System.out.println(cmd.getOptions()); + } + + @ApplicationCommandMethod + public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + @Option(description = "Nummer des Reminders") int number + ) { + List reminders = bot.getReminder().getByMember(event.getMember()); + if(reminders.isEmpty()) { + event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); + return; + } + if(number>reminders.size()) { + event.reply("Diesen Reminder gibt es nicht!").setEphemeral(true).queue(); + return; + } + Reminder reminder = reminders.get(number-1); + if(reminder != null) { + reminder.delete(); + bot.getRemindManager().scheduleNextReminder(); + + event.reply("Reminder gelöscht!").setEphemeral(true).queue(); + } + } + } + + + public static Instant convertTime(String time) throws DateTimeParseException { + LocalDateTime now = LocalDateTime.now(Main.timezone); + + return LocalDateTime.parse(time, new DateTimeFormatterBuilder().appendPattern("HH:mm[ dd.MM.yyyy]") + .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth()) + .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue()) + .parseDefaulting(ChronoField.YEAR, now.getYear()) + .toFormatter() + ).toInstant(Main.timezone); + } +} \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java deleted file mode 100644 index 5d5c3c70..00000000 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindMeCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.slimecloud.slimeball.features.reminder; - -import de.mineking.discordutils.commands.ApplicationCommand; -import de.mineking.discordutils.commands.ApplicationCommandMethod; -import de.mineking.discordutils.commands.option.Option; -import de.slimecloud.slimeball.main.Main; -import de.slimecloud.slimeball.main.SlimeBot; -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.utils.TimeFormat; -import org.jetbrains.annotations.NotNull; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoField; - -@ApplicationCommand(name = "remindme", description = "Setzt einen Reminder") -public class RemindMeCommand { - @ApplicationCommandMethod - public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, - @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, - @Option(description = "Die Sache an die du erinnert werden möchtest") String message - ) { - try { - LocalDateTime now = LocalDateTime.now(Main.timezone); - - Instant timestamp = LocalDateTime.parse(time, new DateTimeFormatterBuilder().appendPattern("HH:mm[ dd.MM.yyyy]") - .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth()) - .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue()) - .parseDefaulting(ChronoField.YEAR, now.getYear()) - .toFormatter() - ).toInstant(Main.timezone); - - if (timestamp.isBefore(Instant.now())) { - event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); - return; - } - - bot.getReminder().createReminder(event.getMember(), timestamp, message); - - event.reply("Ich erinnere dich " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); - } catch (DateTimeParseException e) { - e.printStackTrace(); - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - } - } -} - diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 3fba90d8..94f271d3 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -6,15 +6,18 @@ import de.slimecloud.slimeball.main.SlimeBot; import lombok.AllArgsConstructor; import lombok.Getter; +import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.time.Instant; @Getter @AllArgsConstructor -public class Reminder implements DataClass { +public class Reminder implements DataClass, Comparable { private final SlimeBot bot; @Column(autoincrement = true, key = true) @@ -24,6 +27,9 @@ public class Reminder implements DataClass { private final Guild guild; @Column private final UserSnowflake user; + @Column + @Nullable + private final long roleId; @Column private final Instant time; @@ -32,13 +38,35 @@ public class Reminder implements DataClass { private final String message; public Reminder(@NotNull SlimeBot bot) { - this(bot, 0, null, null, null, null); + this(bot, 0, null, null, 0, null, null); } public void execute() { - bot.getJda().openPrivateChannelById(user.getIdLong()) - .flatMap(channel -> channel.sendMessage(message)) - .queue(); + if(roleId == 0) { + // Send Private Reminder + EmbedBuilder embedBuilder = new EmbedBuilder() + .setTitle("Reminder!") + .setColor(bot.getColor(guild)) + .addField("Nachricht:", message, false) + .setFooter("Reminder auf: " + guild.getName()); + + bot.getJda().openPrivateChannelById(user.getIdLong()) + .flatMap(channel -> channel.sendMessageEmbeds(embedBuilder.build())) + .queue(); + }else { + // Send Role Reminder + guild.retrieveMember(user).map(Member::getEffectiveName).queue(name -> { + EmbedBuilder embedBuilder = new EmbedBuilder() + .setTitle("Reminder!") + .setColor(bot.getColor(guild)) + .addField("Nachricht:", message, false) + .setFooter("Reminder von: " + name); + + bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { + channel.sendMessage(bot.getJda().getRoleById(roleId).getAsMention()).setEmbeds(embedBuilder.build()).queue(); + }); + }); + } delete(); bot.getRemindManager().scheduleNextReminder(); @@ -49,4 +77,9 @@ public void execute() { public Table getTable() { return bot.getReminder(); } + + @Override + public int compareTo(@NotNull Reminder o) { + return this.getTime().compareTo(o.getTime()); + } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index 41cc6847..78f639dc 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -6,6 +6,8 @@ import de.slimecloud.slimeball.main.SlimeBot; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.internal.entities.RoleImpl; import org.jetbrains.annotations.NotNull; import java.time.Instant; @@ -18,10 +20,10 @@ default Optional getNext() { return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); } - default Reminder createReminder(@NotNull Member member, @NotNull Instant time, @NotNull String message) { + default Reminder createReminder(@NotNull Member member, long roleId, @NotNull Instant time, @NotNull String message) { SlimeBot bot = getManager().getData("bot"); - Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, time, message)); + Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, roleId, time, message)); bot.getRemindManager().scheduleNextReminder(); return result; } @@ -30,8 +32,9 @@ default Reminder createReminder(@NotNull Member member, @NotNull Instant time, @ default List getByMember(@NotNull Member member) { return selectMany(Where.allOf( Where.equals("user", member.getUser().getIdLong()), - Where.equals("guild", member.getGuild().getIdLong()) - )); + Where.equals("guild", member.getGuild().getIdLong()), + Where.equals("roleid", 0) + ), Order.ascendingBy("time")); } @NotNull diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index 2826dce3..db05c283 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -34,8 +34,8 @@ import de.slimecloud.slimeball.features.poll.PollTable; import de.slimecloud.slimeball.features.quote.QuoteCommand; import de.slimecloud.slimeball.features.quote.QuoteMessageCommand; +import de.slimecloud.slimeball.features.reminder.RemindCommand; import de.slimecloud.slimeball.features.reminder.RemindManager; -import de.slimecloud.slimeball.features.reminder.RemindMeCommand; import de.slimecloud.slimeball.features.reminder.Reminder; import de.slimecloud.slimeball.features.reminder.ReminderTable; import de.slimecloud.slimeball.features.report.Report; @@ -230,7 +230,7 @@ public SlimeBot(@NotNull Config config, @NotNull Dotenv credentials) throws IOEx //Register remind commands if(reminder != null) { - manager.registerCommand(RemindMeCommand.class); + manager.registerCommand(RemindCommand.class); } else logger.warn("Reminders disabled due to missing database"); //Register report commands From 63a1b77a5f7d848354cbff854eb8eed46dfbc8fb Mon Sep 17 00:00:00 2001 From: MineKing Date: Thu, 4 Jan 2024 22:22:33 +0100 Subject: [PATCH 05/18] Add support for null snowflakes --- .../slimeball/main/extensions/SnowflakeTypeMapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/main/extensions/SnowflakeTypeMapper.java b/src/main/java/de/slimecloud/slimeball/main/extensions/SnowflakeTypeMapper.java index e5359b22..64bcdae9 100644 --- a/src/main/java/de/slimecloud/slimeball/main/extensions/SnowflakeTypeMapper.java +++ b/src/main/java/de/slimecloud/slimeball/main/extensions/SnowflakeTypeMapper.java @@ -40,7 +40,7 @@ public Argument createArgument(@NotNull DatabaseManager manager, @NotNull Class< return new Argument() { @Override public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException { - statement.setLong(position, value); + statement.setLong(position, value == null ? 0 : value); } @Override @@ -66,7 +66,7 @@ public Long extract(@NotNull ResultSet set, @NotNull String name, @NotNull Class @Override @SuppressWarnings("unchecked") public ISnowflake parse(@NotNull DatabaseManager manager, @NotNull Class type, @NotNull Field field, @Nullable Long value) { - if (value == null) return null; + if (value == null ||value == 0) return null; JDA jda = manager.getData("bot").getJda(); From a8a8d9db69f922261b32a9a6941587f59331bb3c Mon Sep 17 00:00:00 2001 From: Deliasama Date: Thu, 4 Jan 2024 22:36:14 +0100 Subject: [PATCH 06/18] Use Role instead of RoleId --- .../slimeball/features/reminder/RemindCommand.java | 14 +++----------- .../slimeball/features/reminder/Reminder.java | 9 +++++---- .../slimeball/features/reminder/ReminderTable.java | 7 +++---- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index de6b247d..f5e12c2b 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -43,7 +43,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti return; } - bot.getReminder().createReminder(event.getMember(), 0, timestamp, message); + bot.getReminder().createReminder(event.getMember(), null, timestamp, message); event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); } catch (DateTimeParseException e) { @@ -74,7 +74,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti return; } - bot.getReminder().createReminder(event.getMember(), role.getIdLong(), timestamp, message); + bot.getReminder().createReminder(event.getMember(), role, timestamp, message); event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); } catch (DateTimeParseException e) { @@ -83,6 +83,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } } } + @ApplicationCommand(name = "list", description = "Zeige und deine aktiven Reminder") public static class ListCommand { @ApplicationCommandMethod @@ -107,14 +108,6 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @ApplicationCommand(name = "delete", description = "Lösche einen aktiven Reminder") public static class DeleteCommand { - /* - TODO: Number wird nicht in discord angezeigt - */ - @Setup - public static void setup(Command cmd) { - System.out.println(cmd.getOptions()); - } - @ApplicationCommandMethod public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, @Option(description = "Nummer des Reminders") int number @@ -138,7 +131,6 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } } - public static Instant convertTime(String time) throws DateTimeParseException { LocalDateTime now = LocalDateTime.now(Main.timezone); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 94f271d3..83be75f3 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -9,6 +9,7 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,7 +30,7 @@ public class Reminder implements DataClass, Comparable { private final UserSnowflake user; @Column @Nullable - private final long roleId; + private final Role role; @Column private final Instant time; @@ -38,11 +39,11 @@ public class Reminder implements DataClass, Comparable { private final String message; public Reminder(@NotNull SlimeBot bot) { - this(bot, 0, null, null, 0, null, null); + this(bot, 0, null, null, null, null, null); } public void execute() { - if(roleId == 0) { + if(role == null) { // Send Private Reminder EmbedBuilder embedBuilder = new EmbedBuilder() .setTitle("Reminder!") @@ -63,7 +64,7 @@ public void execute() { .setFooter("Reminder von: " + name); bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { - channel.sendMessage(bot.getJda().getRoleById(roleId).getAsMention()).setEmbeds(embedBuilder.build()).queue(); + channel.sendMessage(role.getAsMention()).setEmbeds(embedBuilder.build()).queue(); }); }); } diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index 78f639dc..bafa37da 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -7,7 +7,6 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.internal.entities.RoleImpl; import org.jetbrains.annotations.NotNull; import java.time.Instant; @@ -20,10 +19,10 @@ default Optional getNext() { return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); } - default Reminder createReminder(@NotNull Member member, long roleId, @NotNull Instant time, @NotNull String message) { + default Reminder createReminder(@NotNull Member member, Role role, @NotNull Instant time, @NotNull String message) { SlimeBot bot = getManager().getData("bot"); - Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, roleId, time, message)); + Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, role, time, message)); bot.getRemindManager().scheduleNextReminder(); return result; } @@ -33,7 +32,7 @@ default List getByMember(@NotNull Member member) { return selectMany(Where.allOf( Where.equals("user", member.getUser().getIdLong()), Where.equals("guild", member.getGuild().getIdLong()), - Where.equals("roleid", 0) + Where.equals("role", 0) ), Order.ascendingBy("time")); } From 732a501e9d5ea6c1e2d47da8674fc4e05fc8c1fb Mon Sep 17 00:00:00 2001 From: MineKing Date: Sun, 7 Jan 2024 13:10:03 +0100 Subject: [PATCH 07/18] Update to new JavaUtils version --- .../slimeball/features/reminder/ReminderTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index bafa37da..214c5f04 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -30,14 +30,14 @@ default Reminder createReminder(@NotNull Member member, Role role, @NotNull Inst @NotNull default List getByMember(@NotNull Member member) { return selectMany(Where.allOf( - Where.equals("user", member.getUser().getIdLong()), - Where.equals("guild", member.getGuild().getIdLong()), + Where.equals("user", member.getUser()), + Where.equals("guild", member.getGuild()), Where.equals("role", 0) ), Order.ascendingBy("time")); } @NotNull default List getByGuild(@NotNull Guild guild) { - return selectMany(Where.equals("guild", guild.getIdLong())); + return selectMany(Where.equals("guild", guild)); } } From b4e6674574a216457a3b7b6a9cc058ceeafd5aac Mon Sep 17 00:00:00 2001 From: Deliasama Date: Wed, 10 Jan 2024 18:52:26 +0100 Subject: [PATCH 08/18] Edit Message and bug fixing --- .../features/reminder/RemindCommand.java | 65 +++++++++---------- .../features/reminder/RemindManager.java | 18 +---- .../slimeball/features/reminder/Reminder.java | 54 +++++++++------ .../slimecloud/slimeball/main/SlimeBot.java | 5 +- .../slimecloud/slimeball/main/SlimeEmoji.java | 1 + 5 files changed, 71 insertions(+), 72 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index f5e12c2b..33c8485b 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -2,8 +2,6 @@ import de.mineking.discordutils.commands.ApplicationCommand; import de.mineking.discordutils.commands.ApplicationCommandMethod; -import de.mineking.discordutils.commands.Command; -import de.mineking.discordutils.commands.Setup; import de.mineking.discordutils.commands.option.Option; import de.slimecloud.slimeball.main.CommandPermission; import de.slimecloud.slimeball.main.Main; @@ -11,6 +9,7 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import net.dv8tion.jda.api.utils.TimeFormat; import org.jetbrains.annotations.NotNull; @@ -31,27 +30,15 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnert werden möchtest") String message ) { - if(message.length()>1024) { - event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!").setEphemeral(true).queue(); - return; - } - try { - Instant timestamp = convertTime(time); - - if (timestamp.isBefore(Instant.now())) { - event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); - return; - } - - bot.getReminder().createReminder(event.getMember(), null, timestamp, message); - - event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); - } catch (DateTimeParseException e) { - e.printStackTrace(); - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - } + try { + createReminder(bot, event, null, time, message).setEphemeral(true).queue(); + }catch (DateTimeParseException e) { + e.printStackTrace(); + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + } } } + @ApplicationCommand(name = "role", description = "Setze einen Reminder") public static class RoleCommand { public final CommandPermission permission = CommandPermission.TEAM; @@ -62,22 +49,9 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @Option(description = "Die Zeit an welcher du erinnern möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnern möchtest") String message ) { - if(message.length()>1024) { - event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!").setEphemeral(true).queue(); - return; - } try { - Instant timestamp = convertTime(time); - - if (timestamp.isBefore(Instant.now())) { - event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); - return; - } - - bot.getReminder().createReminder(event.getMember(), role, timestamp, message); - - event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); - } catch (DateTimeParseException e) { + createReminder(bot, event, role, time, message).setEphemeral(true).queue(); + }catch (DateTimeParseException e) { e.printStackTrace(); event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); } @@ -131,6 +105,25 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } } + public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + Role role, + @NotNull String time, + @NotNull String message + ) throws DateTimeParseException { + if(message.length()>1024) { + return event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!"); + } + Instant timestamp = convertTime(time); + + if (timestamp.isBefore(Instant.now())) { + return event.reply("Deine angegebene Zeit ist schon vergangen!"); + } + + bot.getReminder().createReminder(event.getMember(), role, timestamp, message); + + return event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)); + } + public static Instant convertTime(String time) throws DateTimeParseException { LocalDateTime now = LocalDateTime.now(Main.timezone); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java index ccab27b8..ced7a811 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull; import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; public class RemindManager { private final ReminderTable table; @@ -12,21 +11,10 @@ public class RemindManager { public RemindManager(@NotNull SlimeBot bot) { this.table = bot.getReminder(); - scheduleNextReminder(); } public void scheduleNextReminder() { - if (scheduledFuture != null) scheduledFuture.cancel(true); - - table.getNext().ifPresent(reminder -> { - long delay = reminder.getTime().toEpochMilli() - System.currentTimeMillis(); - - if (delay <= 0) { - reminder.execute(); - return; - } - - scheduledFuture = reminder.getBot().getExecutor().schedule(reminder::execute, delay / 1000, TimeUnit.SECONDS); - }); + if (scheduledFuture != null)scheduledFuture.cancel(true); + table.getNext().flatMap(Reminder::schedule).ifPresent(f -> scheduledFuture = f); } -} +} \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 83be75f3..8b226945 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -4,21 +4,24 @@ import de.mineking.javautils.database.DataClass; import de.mineking.javautils.database.Table; import de.slimecloud.slimeball.main.SlimeBot; +import de.slimecloud.slimeball.main.SlimeEmoji; import lombok.AllArgsConstructor; import lombok.Getter; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.UserSnowflake; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.time.Instant; +import java.util.Optional; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; @Getter @AllArgsConstructor -public class Reminder implements DataClass, Comparable { +public class Reminder implements DataClass, Comparable, Runnable { private final SlimeBot bot; @Column(autoincrement = true, key = true) @@ -42,26 +45,39 @@ public Reminder(@NotNull SlimeBot bot) { this(bot, 0, null, null, null, null, null); } - public void execute() { + @NotNull + @Override + public Table getTable() { + return bot.getReminder(); + } + + @Override + public int compareTo(@NotNull Reminder o) { + return this.getTime().compareTo(o.getTime()); + } + + @Override + public void run() { if(role == null) { // Send Private Reminder EmbedBuilder embedBuilder = new EmbedBuilder() - .setTitle("Reminder!") + .setAuthor(guild.getName(), null, guild.getIconUrl()) + .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .addField("Nachricht:", message, false) - .setFooter("Reminder auf: " + guild.getName()); + .setDescription(message); bot.getJda().openPrivateChannelById(user.getIdLong()) .flatMap(channel -> channel.sendMessageEmbeds(embedBuilder.build())) .queue(); - }else { + } else { // Send Role Reminder - guild.retrieveMember(user).map(Member::getEffectiveName).queue(name -> { + guild.retrieveMember(user).queue(member -> { EmbedBuilder embedBuilder = new EmbedBuilder() - .setTitle("Reminder!") + .setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl()) + .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .addField("Nachricht:", message, false) - .setFooter("Reminder von: " + name); + .setDescription(message); + bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { channel.sendMessage(role.getAsMention()).setEmbeds(embedBuilder.build()).queue(); @@ -73,14 +89,12 @@ public void execute() { bot.getRemindManager().scheduleNextReminder(); } - @NotNull - @Override - public Table getTable() { - return bot.getReminder(); - } - - @Override - public int compareTo(@NotNull Reminder o) { - return this.getTime().compareTo(o.getTime()); + public Optional> schedule() { + long delay = time.toEpochMilli() - System.currentTimeMillis(); + if(delay <= 0) { + run(); + return Optional.empty(); + } + return Optional.of(bot.getExecutor().schedule(this, delay / 1000, TimeUnit.SECONDS)); } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index db05c283..2f347496 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -301,7 +301,10 @@ public void onReady(@NotNull ReadyEvent event) { } // Initialize RemindMe manger - if(reminder != null) remindManager = new RemindManager(this); + if(reminder != null) { + remindManager = new RemindManager(this); + remindManager.scheduleNextReminder(); + } new HolidayAlert(this); } diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeEmoji.java b/src/main/java/de/slimecloud/slimeball/main/SlimeEmoji.java index 37aead2c..8c3505a2 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeEmoji.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeEmoji.java @@ -10,6 +10,7 @@ public enum SlimeEmoji { UP("slimesymvup"), DOWN("slimesymvdw"), + EXCLAMATION("slimesymex"), NUMBER_0("slime0"), NUMBER_1("slime1"), From 25c07a6f53ff23bd752a1dbef0047541355284d3 Mon Sep 17 00:00:00 2001 From: Deliasama Date: Wed, 10 Jan 2024 19:02:42 +0100 Subject: [PATCH 09/18] Reformat code --- .../features/reminder/RemindCommand.java | 88 +++++++++---------- .../features/reminder/RemindManager.java | 2 +- .../slimeball/features/reminder/Reminder.java | 4 +- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index 33c8485b..e18df1cc 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -23,6 +23,36 @@ @ApplicationCommand(name = "remind", description = "Setzt einen Reminder") public class RemindCommand { + public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + Role role, + @NotNull String time, + @NotNull String message + ) throws DateTimeParseException { + if (message.length() > 1024) { + return event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!"); + } + Instant timestamp = convertTime(time); + + if (timestamp.isBefore(Instant.now())) { + return event.reply("Deine angegebene Zeit ist schon vergangen!"); + } + + bot.getReminder().createReminder(event.getMember(), role, timestamp, message); + + return event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)); + } + + public static Instant convertTime(String time) throws DateTimeParseException { + LocalDateTime now = LocalDateTime.now(Main.timezone); + + return LocalDateTime.parse(time, new DateTimeFormatterBuilder().appendPattern("HH:mm[ dd.MM.yyyy]") + .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth()) + .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue()) + .parseDefaulting(ChronoField.YEAR, now.getYear()) + .toFormatter() + ).toInstant(Main.timezone); + } + @ApplicationCommand(name = "me", description = "Setze einen Reminder") public static class MeCommand { @ApplicationCommandMethod @@ -30,12 +60,12 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnert werden möchtest") String message ) { - try { + try { createReminder(bot, event, null, time, message).setEphemeral(true).queue(); - }catch (DateTimeParseException e) { - e.printStackTrace(); - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - } + } catch (DateTimeParseException e) { + e.printStackTrace(); + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + } } } @@ -45,13 +75,13 @@ public static class RoleCommand { @ApplicationCommandMethod public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, - @Option(description = "Rolle die erwähnt werden soll") Role role, + @Option(description = "Rolle die erwähnt werden soll") Role role, @Option(description = "Die Zeit an welcher du erinnern möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnern möchtest") String message ) { try { createReminder(bot, event, role, time, message).setEphemeral(true).queue(); - }catch (DateTimeParseException e) { + } catch (DateTimeParseException e) { e.printStackTrace(); event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); } @@ -63,7 +93,7 @@ public static class ListCommand { @ApplicationCommandMethod public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event) { List reminders = bot.getReminder().getByMember(event.getMember()); - if(reminders.isEmpty()) { + if (reminders.isEmpty()) { event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); return; } @@ -72,9 +102,9 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti .setColor(bot.getColor(event.getGuild())) .setFooter("Lösche einen Reminder mit /remind delete [Nummer]"); - for(int i = 0; i reminders = bot.getReminder().getByMember(event.getMember()); - if(reminders.isEmpty()) { + if (reminders.isEmpty()) { event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); return; } - if(number>reminders.size()) { + if (number > reminders.size()) { event.reply("Diesen Reminder gibt es nicht!").setEphemeral(true).queue(); return; } - Reminder reminder = reminders.get(number-1); - if(reminder != null) { + Reminder reminder = reminders.get(number - 1); + if (reminder != null) { reminder.delete(); bot.getRemindManager().scheduleNextReminder(); @@ -104,34 +134,4 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } } } - - public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, - Role role, - @NotNull String time, - @NotNull String message - ) throws DateTimeParseException { - if(message.length()>1024) { - return event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!"); - } - Instant timestamp = convertTime(time); - - if (timestamp.isBefore(Instant.now())) { - return event.reply("Deine angegebene Zeit ist schon vergangen!"); - } - - bot.getReminder().createReminder(event.getMember(), role, timestamp, message); - - return event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)); - } - - public static Instant convertTime(String time) throws DateTimeParseException { - LocalDateTime now = LocalDateTime.now(Main.timezone); - - return LocalDateTime.parse(time, new DateTimeFormatterBuilder().appendPattern("HH:mm[ dd.MM.yyyy]") - .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth()) - .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue()) - .parseDefaulting(ChronoField.YEAR, now.getYear()) - .toFormatter() - ).toInstant(Main.timezone); - } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java index ced7a811..9ca87d29 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindManager.java @@ -14,7 +14,7 @@ public RemindManager(@NotNull SlimeBot bot) { } public void scheduleNextReminder() { - if (scheduledFuture != null)scheduledFuture.cancel(true); + if (scheduledFuture != null) scheduledFuture.cancel(true); table.getNext().flatMap(Reminder::schedule).ifPresent(f -> scheduledFuture = f); } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 8b226945..d009f401 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -58,7 +58,7 @@ public int compareTo(@NotNull Reminder o) { @Override public void run() { - if(role == null) { + if (role == null) { // Send Private Reminder EmbedBuilder embedBuilder = new EmbedBuilder() .setAuthor(guild.getName(), null, guild.getIconUrl()) @@ -91,7 +91,7 @@ public void run() { public Optional> schedule() { long delay = time.toEpochMilli() - System.currentTimeMillis(); - if(delay <= 0) { + if (delay <= 0) { run(); return Optional.empty(); } From 4788e4508eda1167f1aac3008c036cf4184431bc Mon Sep 17 00:00:00 2001 From: Deliasama Date: Thu, 25 Jan 2024 22:16:45 +0100 Subject: [PATCH 10/18] Save when the timer was set --- .../slimeball/features/reminder/RemindCommand.java | 3 ++- .../slimeball/features/reminder/Reminder.java | 11 ++++++----- .../slimeball/features/reminder/ReminderTable.java | 6 +++--- src/main/java/de/slimecloud/slimeball/main/Main.java | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index e18df1cc..41eaeb06 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -15,6 +15,7 @@ import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; @@ -37,7 +38,7 @@ public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull return event.reply("Deine angegebene Zeit ist schon vergangen!"); } - bot.getReminder().createReminder(event.getMember(), role, timestamp, message); + bot.getReminder().createReminder(event.getMember(), role, timestamp, LocalDateTime.now(Main.timezone).toInstant(ZoneOffset.UTC), message); return event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)); } diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index d009f401..3995421c 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -11,6 +11,7 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.UserSnowflake; +import net.dv8tion.jda.api.utils.TimeFormat; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,15 +35,15 @@ public class Reminder implements DataClass, Comparable, Runn @Column @Nullable private final Role role; - @Column private final Instant time; - + @Column + private final Instant timeSet; @Column private final String message; public Reminder(@NotNull SlimeBot bot) { - this(bot, 0, null, null, null, null, null); + this(bot, 0, null, null, null, null, null, null); } @NotNull @@ -64,7 +65,7 @@ public void run() { .setAuthor(guild.getName(), null, guild.getIconUrl()) .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .setDescription(message); + .setDescription(message + " \n \n" + "(Reminder von " + TimeFormat.RELATIVE.format(timeSet) + ")"); bot.getJda().openPrivateChannelById(user.getIdLong()) .flatMap(channel -> channel.sendMessageEmbeds(embedBuilder.build())) @@ -76,7 +77,7 @@ public void run() { .setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl()) .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .setDescription(message); + .setDescription(message + " \n \n" + "(Reminder von " + TimeFormat.RELATIVE.format(timeSet) + ")"); bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index 214c5f04..3d8c4313 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -19,10 +19,10 @@ default Optional getNext() { return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); } - default Reminder createReminder(@NotNull Member member, Role role, @NotNull Instant time, @NotNull String message) { + default Reminder createReminder(@NotNull Member member, Role role, @NotNull Instant time, @NotNull Instant timeSet, @NotNull String message) { SlimeBot bot = getManager().getData("bot"); - Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, role, time, message)); + Reminder result = insert(new Reminder(bot, 0, member.getGuild(), member, role, time, timeSet, message)); bot.getRemindManager().scheduleNextReminder(); return result; } @@ -32,7 +32,7 @@ default List getByMember(@NotNull Member member) { return selectMany(Where.allOf( Where.equals("user", member.getUser()), Where.equals("guild", member.getGuild()), - Where.equals("role", 0) + Where.equals("role", null) ), Order.ascendingBy("time")); } diff --git a/src/main/java/de/slimecloud/slimeball/main/Main.java b/src/main/java/de/slimecloud/slimeball/main/Main.java index 894c009e..7b3614a5 100644 --- a/src/main/java/de/slimecloud/slimeball/main/Main.java +++ b/src/main/java/de/slimecloud/slimeball/main/Main.java @@ -15,7 +15,7 @@ public class Main { public final static Random random = new Random(); - public final static ZoneOffset timezone = ZoneOffset.ofHours(1); + // public final static ZoneOffset timezone = ZoneOffset.ofHours(1); public final static Gson json = new Gson(); public final static Gson formattedJson = new GsonBuilder() From 74ca2aeb5c45b336c19994728b3991d08f7a15a1 Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 14:54:57 +0100 Subject: [PATCH 11/18] Reformat code --- .../slimecloud/slimeball/config/GuildConfig.java | 1 + .../slimeball/features/reminder/RemindCommand.java | 14 ++++++-------- .../slimeball/features/reminder/Reminder.java | 1 - .../de/slimecloud/slimeball/main/SlimeBot.java | 4 ++-- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java b/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java index ec06b4b2..884a9531 100644 --- a/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java +++ b/src/main/java/de/slimecloud/slimeball/config/GuildConfig.java @@ -208,6 +208,7 @@ public Optional getTeamRole() { public Optional getTeamChannel() { return Optional.ofNullable(teamChannel).map(channel -> getGuild().getChannelById(MessageChannel.class, channel)); } + @NotNull public Optional getGreetingsChannel() { return Optional.ofNullable(greetingsChannel).map(id -> bot.getJda().getChannelById(GuildMessageChannel.class, id)); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index 41eaeb06..2227cb38 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -12,6 +12,7 @@ import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import net.dv8tion.jda.api.utils.TimeFormat; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.time.Instant; import java.time.LocalDateTime; @@ -25,18 +26,14 @@ public class RemindCommand { public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, - Role role, + @Nullable Role role, @NotNull String time, @NotNull String message ) throws DateTimeParseException { - if (message.length() > 1024) { - return event.reply("Deine Message darf maximal nur 1024 Zeichen lang sein!"); - } + if (message.length() > 1024) return event.reply("Deine Nachricht darf maximal nur 1024 Zeichen lang sein!"); Instant timestamp = convertTime(time); - if (timestamp.isBefore(Instant.now())) { - return event.reply("Deine angegebene Zeit ist schon vergangen!"); - } + if (timestamp.isBefore(Instant.now())) return event.reply("Deine angegebene Zeit ist schon vergangen!"); bot.getReminder().createReminder(event.getMember(), role, timestamp, LocalDateTime.now(Main.timezone).toInstant(ZoneOffset.UTC), message); @@ -64,7 +61,6 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti try { createReminder(bot, event, null, time, message).setEphemeral(true).queue(); } catch (DateTimeParseException e) { - e.printStackTrace(); event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); } } @@ -122,10 +118,12 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); return; } + if (number > reminders.size()) { event.reply("Diesen Reminder gibt es nicht!").setEphemeral(true).queue(); return; } + Reminder reminder = reminders.get(number - 1); if (reminder != null) { reminder.delete(); diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 3995421c..37042b7e 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -79,7 +79,6 @@ public void run() { .setColor(bot.getColor(guild)) .setDescription(message + " \n \n" + "(Reminder von " + TimeFormat.RELATIVE.format(timeSet) + ")"); - bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { channel.sendMessage(role.getAsMention()).setEmbeds(embedBuilder.build()).queue(); }); diff --git a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java index 7b9283ac..3c2d73a1 100644 --- a/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java +++ b/src/main/java/de/slimecloud/slimeball/main/SlimeBot.java @@ -255,7 +255,7 @@ public void performCommand(@NotNull ICommandContext context) throws Exception { manager.registerCommand(FdmdsCommand.class); //Register remind commands - if(reminder != null) { + if (reminder != null) { manager.registerCommand(RemindCommand.class); } else logger.warn("Reminders disabled due to missing database"); @@ -330,7 +330,7 @@ public void onReady(@NotNull ReadyEvent event) { } // Initialize RemindMe manger - if(reminder != null) { + if (reminder != null) { remindManager = new RemindManager(this); remindManager.scheduleNextReminder(); } From 1d8318d1307338d872c98110e9d888233f9e868b Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 14:56:36 +0100 Subject: [PATCH 12/18] Fix reminder delete command --- .../slimeball/features/reminder/RemindCommand.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index 2227cb38..4ef5fedd 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -119,18 +119,15 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti return; } - if (number > reminders.size()) { + if (number < 1 || number > reminders.size()) { event.reply("Diesen Reminder gibt es nicht!").setEphemeral(true).queue(); return; } - Reminder reminder = reminders.get(number - 1); - if (reminder != null) { - reminder.delete(); - bot.getRemindManager().scheduleNextReminder(); + reminders.get(number - 1).delete(); + bot.getRemindManager().scheduleNextReminder(); - event.reply("Reminder gelöscht!").setEphemeral(true).queue(); - } + event.reply("Reminder gelöscht!").setEphemeral(true).queue(); } } } \ No newline at end of file From 8e0386cdfe674d1e9a7505684191ede6375cd643 Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 15:00:57 +0100 Subject: [PATCH 13/18] Improve reminder creation --- .../features/reminder/RemindCommand.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index 4ef5fedd..ff84f68e 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -9,14 +9,12 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import net.dv8tion.jda.api.utils.TimeFormat; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.time.Instant; import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; @@ -25,19 +23,22 @@ @ApplicationCommand(name = "remind", description = "Setzt einen Reminder") public class RemindCommand { - public static ReplyCallbackAction createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, - @Nullable Role role, - @NotNull String time, - @NotNull String message + public static void createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, + @Nullable Role role, + @NotNull String time, + @NotNull String message ) throws DateTimeParseException { - if (message.length() > 1024) return event.reply("Deine Nachricht darf maximal nur 1024 Zeichen lang sein!"); + if (message.length() > 1024) event.reply("Deine Nachricht darf maximal nur 1024 Zeichen lang sein!").setEphemeral(true).queue(); Instant timestamp = convertTime(time); - if (timestamp.isBefore(Instant.now())) return event.reply("Deine angegebene Zeit ist schon vergangen!"); + if (timestamp.isBefore(Instant.now())) event.reply("Deine angegebene Zeit ist schon vergangen!").setEphemeral(true).queue(); - bot.getReminder().createReminder(event.getMember(), role, timestamp, LocalDateTime.now(Main.timezone).toInstant(ZoneOffset.UTC), message); - - return event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)); + try { + bot.getReminder().createReminder(event.getMember(), role, timestamp, Instant.now(), message); + event.reply("Reminder wurde gesetzt! Löst aus " + TimeFormat.RELATIVE.format(timestamp)).setEphemeral(true).queue(); + } catch (DateTimeParseException e) { + event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); + } } public static Instant convertTime(String time) throws DateTimeParseException { @@ -58,11 +59,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @Option(description = "Die Zeit an welcher du erinnert werden möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnert werden möchtest") String message ) { - try { - createReminder(bot, event, null, time, message).setEphemeral(true).queue(); - } catch (DateTimeParseException e) { - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - } + createReminder(bot, event, null, time, message); } } @@ -76,12 +73,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti @Option(description = "Die Zeit an welcher du erinnern möchtest, beispielsweise 13:30") String time, @Option(description = "Die Sache an die du erinnern möchtest") String message ) { - try { - createReminder(bot, event, role, time, message).setEphemeral(true).queue(); - } catch (DateTimeParseException e) { - e.printStackTrace(); - event.reply("Falsches Zeitformat! Versuche etwas wie \"14:45\" oder \"09:04 04.05.2024\"").setEphemeral(true).queue(); - } + createReminder(bot, event, role, time, message); } } From 064a8191536149143c7645675ca0acfa38067eb5 Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 15:16:42 +0100 Subject: [PATCH 14/18] Remove unused field --- src/main/java/de/slimecloud/slimeball/main/Main.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/main/Main.java b/src/main/java/de/slimecloud/slimeball/main/Main.java index 7b3614a5..31ece6b9 100644 --- a/src/main/java/de/slimecloud/slimeball/main/Main.java +++ b/src/main/java/de/slimecloud/slimeball/main/Main.java @@ -15,8 +15,6 @@ public class Main { public final static Random random = new Random(); - // public final static ZoneOffset timezone = ZoneOffset.ofHours(1); - public final static Gson json = new Gson(); public final static Gson formattedJson = new GsonBuilder() .setPrettyPrinting() From f3fd7ff7b24736b8950f3da866c7b13096ce9e2e Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 15:26:37 +0100 Subject: [PATCH 15/18] Update DiscordUtils --- build.gradle | 2 +- .../config/commands/EnableCommand.java | 2 +- .../config/commands/MenuCommand.java | 44 +++++++++---------- .../config/engine/ConfigFieldType.java | 6 +-- .../features/birthday/BirthdayTable.java | 2 +- .../slimeball/features/github/GitHubAPI.java | 2 +- .../features/level/card/CardCommand.java | 24 +++++----- .../features/level/card/CardDataTable.java | 2 +- .../features/report/ReportBlockTable.java | 2 +- .../features/report/ReportTable.java | 2 +- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/build.gradle b/build.gradle index 07348067..ea673e12 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ String lombokDependency = 'org.projectlombok:lombok:1.18.30' dependencies { implementation 'net.dv8tion:JDA:5.0.0-beta.19' - implementation('de.mineking:DiscordUtils:3.7.0') + implementation('de.mineking:DiscordUtils:3.8.0') implementation 'de.mineking:JavaUtils:1.3.2' implementation 'de.cyklon:JEvent:1.1.0' diff --git a/src/main/java/de/slimecloud/slimeball/config/commands/EnableCommand.java b/src/main/java/de/slimecloud/slimeball/config/commands/EnableCommand.java index d0957e54..ef315072 100644 --- a/src/main/java/de/slimecloud/slimeball/config/commands/EnableCommand.java +++ b/src/main/java/de/slimecloud/slimeball/config/commands/EnableCommand.java @@ -73,7 +73,7 @@ public void performCommand(@NotNull ICommandContext context) throws Exception { Object instance = this.instance.apply(config); //Basic enable - if (!options.isEmpty()) { + if (!getOptions().isEmpty()) { //Extract values from options Map values = new HashMap<>(); try { diff --git a/src/main/java/de/slimecloud/slimeball/config/commands/MenuCommand.java b/src/main/java/de/slimecloud/slimeball/config/commands/MenuCommand.java index 3082b604..7d70527a 100644 --- a/src/main/java/de/slimecloud/slimeball/config/commands/MenuCommand.java +++ b/src/main/java/de/slimecloud/slimeball/config/commands/MenuCommand.java @@ -60,7 +60,7 @@ public MenuCommand(@NotNull SlimeBot bot, @NotNull UIManager manager) { }, info, f.getType().getDeclaredFields()), ButtonColor.GRAY, info.name()).asDisabled(s -> { try { //Disable if category is null -> use has to use config enable command first - return f.get(bot.loadGuild(s.event.getGuild())) == null; + return f.get(bot.loadGuild(s.getEvent().getGuild())) == null; } catch (IllegalAccessException e) { throw new RuntimeException(e); } @@ -76,9 +76,9 @@ public MenuCommand(@NotNull SlimeBot bot, @NotNull UIManager manager) { menu = manager.createMenu( "config", MessageRenderer.embed(s -> new EmbedBuilder() - .setDescription("## Konfiguration für **" + s.event.getGuild().getName() + "**\n") - .setColor(bot.getColor(s.event.getGuild())) - .setThumbnail(s.event.getGuild().getIconUrl()) + .setDescription("## Konfiguration für **" + s.getEvent().getGuild().getName() + "**\n") + .setColor(bot.getColor(s.getEvent().getGuild())) + .setThumbnail(s.getEvent().getGuild().getIconUrl()) .appendDescription("Verwende die Buttons unter dieser Nachricht, um einzelne Kategorien zu konfigurieren\n") .appendDescription("Bevor die Konfiguration hier angepasst werden kann, muss eine Kategorie mit `/config enable` aktiviert werden") .build() @@ -121,17 +121,17 @@ private static MessageMenu createCategory(@NotNull SlimeBot bot, @NotNull UIMana ); //Add button to go back to main menu. We have to get the menu by name here because the menu doesn't exist yet - components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config").display(s.event))); + components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config").display(s.getEvent()))); //Create menu return manager.createMenu( "config." + category.command(), MessageRenderer.embed(s -> new EmbedBuilder() .setDescription("## " + category.name() + "\n") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .appendDescription(category.description()) .appendDescription("\n### Aktuelle Konfiguration\n") - .appendDescription("```json\n" + Main.formattedJson.toJson(instance.apply(bot.loadGuild(s.event.getGuild()))) + "```") + .appendDescription("```json\n" + Main.formattedJson.toJson(instance.apply(bot.loadGuild(s.getEvent().getGuild()))) + "```") .build() ), components @@ -177,11 +177,11 @@ private static MessageMenu createFieldMenu(@NotNull SlimeBot bot, @NotNull UIMan } private static void set(@NotNull SlimeBot bot, @NotNull DataState state, @NotNull Function category, @NotNull Setter setter, @Nullable Object value) { - GuildConfig config = bot.loadGuild(state.event.getGuild()); + GuildConfig config = bot.loadGuild(state.getEvent().getGuild()); setter.set(state, config, value); //Call update method on category - if (category.apply(config) instanceof ConfigCategory c) c.update(state.event.getGuild()); + if (category.apply(config) instanceof ConfigCategory c) c.update(state.getEvent().getGuild()); //Save changes config.save(); @@ -189,16 +189,16 @@ private static void set(@NotNull SlimeBot bot, @NotNull DataState state, @Not @SuppressWarnings("unchecked") private static T get(@NotNull SlimeBot bot, @NotNull DataState state, @NotNull Getter getter) { - return (T) getter.get(state, bot.loadGuild(state.event.getGuild())); + return (T) getter.get(state, bot.loadGuild(state.getEvent().getGuild())); } @SuppressWarnings("unchecked") private static void handle(@NotNull SlimeBot bot, @NotNull DataState state, @NotNull Function category, @NotNull Getter getter, @NotNull Consumer handler) { - GuildConfig config = bot.loadGuild(state.event.getGuild()); + GuildConfig config = bot.loadGuild(state.getEvent().getGuild()); handler.accept((T) getter.get(state, config)); //Call update method on category - if (category.apply(config) instanceof ConfigCategory c) c.update(state.event.getGuild()); + if (category.apply(config) instanceof ConfigCategory c) c.update(state.getEvent().getGuild()); //Save changes config.save(); @@ -210,7 +210,7 @@ private static MessageMenu createValueMenu(@NotNull SlimeBot bot, @NotNull UIMan List components = new ArrayList<>(); //Add base components - base.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.event))); + base.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.getEvent()))); base.add(new ButtonComponent("reset", ButtonColor.RED, "Zurücksetzten").appendHandler(s -> { //For normal fields the default value is 'null' set(bot, s, categoryInstance, setter, null); @@ -238,7 +238,7 @@ private static MessageMenu createValueMenu(@NotNull SlimeBot bot, @NotNull UIMan return new EmbedBuilder() .setDescription("## " + category.name() + " → " + display.apply(s) + "\n") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .appendDescription(field.description()) .appendDescription("\n### Aktueller Wert\n") .appendDescription(value == null ? "*nicht gesetzt*" : field.type().toString(value)) @@ -258,7 +258,7 @@ private static MessageMenu createListValueMenu(@NotNull SlimeBot bot, @NotNull U List components = new ArrayList<>(); //Add base components - base.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.event))); + base.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.getEvent()))); base.add(new ButtonComponent("reset", ButtonColor.RED, "Zurücksetzten").appendHandler(s -> { //We use empty collections as default here so that we don't have to handle the 'null' case set(bot, s, categoryInstance, setter, createEmptyCollection(type, generic)); @@ -296,7 +296,7 @@ private static MessageMenu createListValueMenu(@NotNull SlimeBot bot, @NotNull U return new EmbedBuilder() .setDescription("## " + category.name() + " → " + display.apply(s) + "\n") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .appendDescription(field.description()) .appendDescription("\n### Aktuelle Einträge\n") .appendDescription(value.isEmpty() ? "*Keine Einträge*" : value.stream().map(e -> "- " + field.type().toString(e)).collect(Collectors.joining("\n"))) @@ -314,7 +314,7 @@ private static MessageMenu createEnumSetValueMenu(@NotNull SlimeBot bot, @NotNul List> components = new ArrayList<>(); //Add base components - components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.event))); + components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.getEvent()))); components.add(new ButtonComponent("reset", ButtonColor.RED, "Zurücksetzten").appendHandler(s -> { set(bot, s, categoryInstance, setter, emptyEnumSet(componentClass)); s.update(); @@ -344,7 +344,7 @@ private static MessageMenu createEnumSetValueMenu(@NotNull SlimeBot bot, @NotNul return new EmbedBuilder() .setDescription("## " + category.name() + " → " + display.apply(s) + "\n") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .appendDescription(field.description()) .appendDescription("\n### Aktuelle Einträge\n") .appendDescription(value.isEmpty() ? "*Keine Einträge*" : value.stream().map(e -> "- " + field.type().toString(e)).collect(Collectors.joining("\n"))) @@ -369,7 +369,7 @@ private static MessageMenu createMapValueMenu(@NotNull SlimeBot bot, @NotNull UI List> components = new ArrayList<>(); //Add base components - components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.event))); + components.add(new ButtonComponent("back", ButtonColor.GRAY, "Zurück").appendHandler(s -> manager.getMenu("config." + category.command()).display(s.getEvent()))); components.add(new ButtonComponent("reset", ButtonColor.RED, "Zurücksetzten").appendHandler(s -> { set(bot, s, categoryInstance, setter, type.isAssignableFrom(HashMap.class) ? new HashMap<>() : new LinkedHashMap<>()); s.update(); @@ -398,7 +398,7 @@ private static MessageMenu createMapValueMenu(@NotNull SlimeBot bot, @NotNull UI //Add components that opens the value menu to add a new entry Component add = keyType.createComponent(manager, keyClass, info, "config." + category.command() + "." + field.command(), "add", "Wert hinzufügen", s -> "", (s, k) -> { - valueMenu.createState(s).setState("key", keyType.toString(k)).display(s.event); + valueMenu.createState(s).setState("key", keyType.toString(k)).display(s.getEvent()); throw new RenderTermination(); }); @@ -415,7 +415,7 @@ private static MessageMenu createMapValueMenu(@NotNull SlimeBot bot, @NotNull UI Component edit = new StringSelectComponent("edit", s -> MenuCommand.>get(bot, s, getter).keySet().stream() .map(e -> keyType.createSelectOption(bot, e)) .toList() - ).setPlaceholder("Wert bearbeiten").appendHandler((s, v) -> valueMenu.createState(s).setState("key", v.get(0).getValue()).display(s.event)); + ).setPlaceholder("Wert bearbeiten").appendHandler((s, v) -> valueMenu.createState(s).setState("key", v.get(0).getValue()).display(s.getEvent())); //Add component to the very top if it is as select menu if (add instanceof EntitySelectComponent || add instanceof StringSelectComponent) { @@ -435,7 +435,7 @@ private static MessageMenu createMapValueMenu(@NotNull SlimeBot bot, @NotNull UI return new EmbedBuilder() .setDescription("## " + category.name() + " → " + display.apply(s) + "\n") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .appendDescription(field.description()) .appendDescription("\n### Aktuelle Einträge\n") .appendDescription(value.isEmpty() ? "*Keine Einträge*" : value.entrySet().stream().map(e -> "- " + keyType.toString(e.getKey()) + " = " + field.type().toString(e.getValue())).collect(Collectors.joining("\n"))) diff --git a/src/main/java/de/slimecloud/slimeball/config/engine/ConfigFieldType.java b/src/main/java/de/slimecloud/slimeball/config/engine/ConfigFieldType.java index 8eb4dbef..d505894f 100644 --- a/src/main/java/de/slimecloud/slimeball/config/engine/ConfigFieldType.java +++ b/src/main/java/de/slimecloud/slimeball/config/engine/ConfigFieldType.java @@ -464,10 +464,10 @@ public ModalMenu getModal(@NotNull UIManager manager, @NotNull Class type, @N (s, m) -> { if (validate(type, m.getString("value"))) { handler.accept(s, parse(type, m.getString("value"))); - manager.getMenu(menu).createState(s).display(s.event); + manager.getMenu(menu).createState(s).display(s.getEvent()); } else { - manager.getMenu(menu).display(s.event); - s.event.getHook().sendMessage(":x: Ungültiger Wert").setEphemeral(true).queue(); + manager.getMenu(menu).display(s.getEvent()); + s.getEvent().getHook().sendMessage(":x: Ungültiger Wert").setEphemeral(true).queue(); } } ); diff --git a/src/main/java/de/slimecloud/slimeball/features/birthday/BirthdayTable.java b/src/main/java/de/slimecloud/slimeball/features/birthday/BirthdayTable.java index ba9d1b3c..0d361a09 100644 --- a/src/main/java/de/slimecloud/slimeball/features/birthday/BirthdayTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/birthday/BirthdayTable.java @@ -61,7 +61,7 @@ default int entriesPerPage() { default EmbedBuilder createEmbed(@NotNull DataState state, @NotNull ListContext context) { EmbedBuilder builder = new EmbedBuilder() .setTitle("Geburtstage") - .setColor(getManager().getData("bot").getColor(state.event.getGuild())) + .setColor(getManager().getData("bot").getColor(state.getEvent().getGuild())) .setTimestamp(Instant.now()); if (context.entries().isEmpty()) builder.setDescription("*Keine Einträge*"); diff --git a/src/main/java/de/slimecloud/slimeball/features/github/GitHubAPI.java b/src/main/java/de/slimecloud/slimeball/features/github/GitHubAPI.java index 1ac7e3dd..2162733c 100644 --- a/src/main/java/de/slimecloud/slimeball/features/github/GitHubAPI.java +++ b/src/main/java/de/slimecloud/slimeball/features/github/GitHubAPI.java @@ -34,7 +34,7 @@ public GitHubAPI(@NotNull String token) throws IOException { public void init(@NotNull CustomRestActionManager manager) { host = manager.createHost("https://api.github.com/"); - host.defaultHeaders.put("Authorization", "Bearer " + token); + host.getDefaultHeaders().put("Authorization", "Bearer " + token); } diff --git a/src/main/java/de/slimecloud/slimeball/features/level/card/CardCommand.java b/src/main/java/de/slimecloud/slimeball/features/level/card/CardCommand.java index 830cece4..74dca971 100644 --- a/src/main/java/de/slimecloud/slimeball/features/level/card/CardCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/level/card/CardCommand.java @@ -107,17 +107,17 @@ public EditCommand(@NotNull SlimeBot bot, @NotNull UIManager manager) { "card.edit.modal", state -> StringUtil.prettifyCamelCase(state.getState("field", String.class)), List.of(new TextComponent("value", "Der neue Wert für diese Eigenschaft", TextInputStyle.SHORT) - .setValue(s -> bot.getCardProfiles().getProfile(s.event.getMember()).getData().get(s.getState("field", String.class))) + .setValue(s -> bot.getCardProfiles().getProfile(s.getEvent().getMember()).getData().get(s.getState("field", String.class))) .setPlaceholder(s -> (s.getState("field", String.class).contains("Color") ? "Hex-Code, z.B. #00ff00. " : "") + "Leer lassen um zurück zusetzten") .setRequired(s -> false) ), (state, response) -> { try { - bot.getCardProfiles().getProfile(state.event.getMember()).getData().set(state.getState("field", String.class), response.getString("value")).update(); - manager.getMenu("card.edit").display(state.event); + bot.getCardProfiles().getProfile(state.getEvent().getMember()).getData().set(state.getState("field", String.class), response.getString("value")).update(); + manager.getMenu("card.edit").display(state.getEvent()); } catch (ValidationException e) { - manager.getMenu("card.edit").display(state.event); - state.event.getHook().sendMessage(":x: Ungültige Eingabe!").setEphemeral(true).queue(); + manager.getMenu("card.edit").display(state.getEvent()); + state.getEvent().getHook().sendMessage(":x: Ungültige Eingabe!").setEphemeral(true).queue(); } } ); @@ -144,7 +144,7 @@ public EditCommand(@NotNull SlimeBot bot, @NotNull UIManager manager) { else temp.add(0, new ButtonComponent(field.getName(), ButtonColor.GRAY, StringUtil.prettifyCamelCase(field.getName())).appendHandler(s -> input.createState() .setState("field", field.getName()) - .display((IModalCallback) s.event) + .display((IModalCallback) s.getEvent()) )); } @@ -155,26 +155,26 @@ public EditCommand(@NotNull SlimeBot bot, @NotNull UIManager manager) { "card.edit", MessageRenderer.embed(s -> new EmbedBuilder() .setTitle("Aktuelle RankCard (ID: **" + s.getCache("profile").getId() + "**)") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .setImage("attachment://image.png") .build() - ).withFile(s -> s.getCache("profile").render(s.event.getMember()).getFile()), + ).withFile(s -> s.getCache("profile").render(s.getEvent().getMember()).getFile()), components - ).cache(state -> state.setCache("profile", bot.getCardProfiles().getProfile(state.event.getMember()).getData())); + ).cache(state -> state.setCache("profile", bot.getCardProfiles().getProfile(state.getEvent().getMember()).getData())); //Build confirmation this.confirmation = manager.createMenu( "card.confirm", MessageRenderer.embed(s -> new EmbedBuilder() .setTitle("Keine Rechte zum Bearbeiten") - .setColor(bot.getColor(s.event.getGuild())) + .setColor(bot.getColor(s.getEvent().getGuild())) .setDescription("Du bist nicht der eigentümer des Profiles, das du aktuell verwendest. Um es zu bearbeiten, musst du eine Kopie des Profils erstellen") .build() ), ComponentRow.of( new ButtonComponent("confirm", ButtonColor.GREEN, "Profil kopieren").appendHandler(s -> { - bot.getCardProfiles().getProfile(s.event.getMember()).getData().createCopy(s.event.getMember()).update(); - menu.display(s.event); + bot.getCardProfiles().getProfile(s.getEvent().getMember()).getData().createCopy(s.getEvent().getMember()).update(); + menu.display(s.getEvent()); }), new ButtonComponent("cancel", ButtonColor.RED, "Abbrechen").appendHandler(UpdateState::close) ) diff --git a/src/main/java/de/slimecloud/slimeball/features/level/card/CardDataTable.java b/src/main/java/de/slimecloud/slimeball/features/level/card/CardDataTable.java index afa1a46f..dd3cb292 100644 --- a/src/main/java/de/slimecloud/slimeball/features/level/card/CardDataTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/level/card/CardDataTable.java @@ -40,7 +40,7 @@ default EmbedBuilder createEmbed(@NotNull DataState state, @NotNull EmbedBuilder builder = new EmbedBuilder() .setTitle("Profile mit Filter '**" + filter.getName() + "**'") - .setColor(getManager().getData("bot").getColor(state.event.getGuild())) + .setColor(getManager().getData("bot").getColor(state.getEvent().getGuild())) .setTimestamp(Instant.now()); if (context.entries().isEmpty()) builder.setDescription("*Keine Einträge*"); diff --git a/src/main/java/de/slimecloud/slimeball/features/report/ReportBlockTable.java b/src/main/java/de/slimecloud/slimeball/features/report/ReportBlockTable.java index 4f359034..cb1be73d 100644 --- a/src/main/java/de/slimecloud/slimeball/features/report/ReportBlockTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/report/ReportBlockTable.java @@ -60,7 +60,7 @@ default Optional isBlocked(@NotNull Member member) { @Override default EmbedBuilder createEmbed(@NotNull DataState state, @NotNull ListContext context) { EmbedBuilder builder = new EmbedBuilder() - .setColor(getManager().getData("bot").getColor(state.event.getGuild())) + .setColor(getManager().getData("bot").getColor(state.getEvent().getGuild())) .setTimestamp(Instant.now()) .setTitle("Vom Report-System ausgeschlossene Nutzer"); diff --git a/src/main/java/de/slimecloud/slimeball/features/report/ReportTable.java b/src/main/java/de/slimecloud/slimeball/features/report/ReportTable.java index 14c8cb63..eb168a9f 100644 --- a/src/main/java/de/slimecloud/slimeball/features/report/ReportTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/report/ReportTable.java @@ -67,7 +67,7 @@ default EmbedBuilder createEmbed(@NotNull DataState state, @NotNull EmbedBuilder builder = new EmbedBuilder() .setTitle("Reports mit Filter '**" + filter.getName() + "**'") - .setColor(getManager().getData("bot").getColor(state.event.getGuild())) + .setColor(getManager().getData("bot").getColor(state.getEvent().getGuild())) .setTimestamp(Instant.now()); if (context.entries().isEmpty()) builder.setDescription("*Keine Einträge*"); From 4904f2492a78760202bf3beb898d7674288b748f Mon Sep 17 00:00:00 2001 From: MineKing Date: Sat, 27 Jan 2024 15:31:24 +0100 Subject: [PATCH 16/18] USe DiscordUtils list feature --- .../features/reminder/RemindCommand.java | 31 +++++----------- .../slimeball/features/reminder/Reminder.java | 13 ++++++- .../features/reminder/ReminderTable.java | 36 ++++++++++++++++++- 3 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index ff84f68e..bf10d206 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -2,11 +2,14 @@ import de.mineking.discordutils.commands.ApplicationCommand; import de.mineking.discordutils.commands.ApplicationCommandMethod; +import de.mineking.discordutils.commands.Command; +import de.mineking.discordutils.commands.Setup; +import de.mineking.discordutils.commands.context.ICommandContext; import de.mineking.discordutils.commands.option.Option; +import de.mineking.discordutils.list.ListManager; import de.slimecloud.slimeball.main.CommandPermission; import de.slimecloud.slimeball.main.Main; import de.slimecloud.slimeball.main.SlimeBot; -import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.utils.TimeFormat; @@ -22,6 +25,10 @@ @ApplicationCommand(name = "remind", description = "Setzt einen Reminder") public class RemindCommand { + @Setup + public static void setup(@NotNull SlimeBot bot, @NotNull ListManager manager, @NotNull Command command) { + command.addSubcommand(manager.createCommand(s -> bot.getReminder()).withDescription("Zeigt alle deine Reminder an")); + } public static void createReminder(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event, @Nullable Role role, @@ -77,28 +84,6 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } } - @ApplicationCommand(name = "list", description = "Zeige und deine aktiven Reminder") - public static class ListCommand { - @ApplicationCommandMethod - public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteractionEvent event) { - List reminders = bot.getReminder().getByMember(event.getMember()); - if (reminders.isEmpty()) { - event.reply("Du hast keine aktiven Reminder auf diesem Server!").setEphemeral(true).queue(); - return; - } - EmbedBuilder builder = new EmbedBuilder() - .setTitle("Reminder") - .setColor(bot.getColor(event.getGuild())) - .setFooter("Lösche einen Reminder mit /remind delete [Nummer]"); - - for (int i = 0; i < reminders.size(); i++) { - Reminder reminder = reminders.get(i); - builder.addField((i + 1) + ": " + TimeFormat.RELATIVE.format(reminder.getTime()), reminder.getMessage(), false); - } - event.replyEmbeds(builder.build()).queue(); - } - } - @ApplicationCommand(name = "delete", description = "Lösche einen aktiven Reminder") public static class DeleteCommand { @ApplicationCommandMethod diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 37042b7e..3df0ab25 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -1,5 +1,7 @@ package de.slimecloud.slimeball.features.reminder; +import de.mineking.discordutils.list.ListContext; +import de.mineking.discordutils.list.ListEntry; import de.mineking.javautils.database.Column; import de.mineking.javautils.database.DataClass; import de.mineking.javautils.database.Table; @@ -22,7 +24,7 @@ @Getter @AllArgsConstructor -public class Reminder implements DataClass, Comparable, Runnable { +public class Reminder implements DataClass, Comparable, Runnable, ListEntry { private final SlimeBot bot; @Column(autoincrement = true, key = true) @@ -32,13 +34,16 @@ public class Reminder implements DataClass, Comparable, Runn private final Guild guild; @Column private final UserSnowflake user; + @Column @Nullable private final Role role; + @Column private final Instant time; @Column private final Instant timeSet; + @Column private final String message; @@ -97,4 +102,10 @@ public Optional> schedule() { } return Optional.of(bot.getExecutor().schedule(this, delay / 1000, TimeUnit.SECONDS)); } + + @NotNull + @Override + public String build(int index, @NotNull ListContext context) { + return (index + 1) + ". " + TimeFormat.RELATIVE.format(time) + ": " + message; + } } \ No newline at end of file diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java index 3d8c4313..42de09a6 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/ReminderTable.java @@ -1,9 +1,14 @@ package de.slimecloud.slimeball.features.reminder; +import de.mineking.discordutils.list.ListContext; +import de.mineking.discordutils.list.Listable; +import de.mineking.discordutils.ui.MessageMenu; +import de.mineking.discordutils.ui.state.DataState; import de.mineking.javautils.database.Order; import de.mineking.javautils.database.Table; import de.mineking.javautils.database.Where; import de.slimecloud.slimeball.main.SlimeBot; +import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; @@ -13,7 +18,7 @@ import java.util.List; import java.util.Optional; -public interface ReminderTable extends Table { +public interface ReminderTable extends Table, Listable { @NotNull default Optional getNext() { return selectAll(Order.ascendingBy("time").limit(1)).stream().findFirst(); @@ -40,4 +45,33 @@ default List getByMember(@NotNull Member member) { default List getByGuild(@NotNull Guild guild) { return selectMany(Where.equals("guild", guild)); } + + /* + * Listable implementation + */ + + @NotNull + @Override + default EmbedBuilder createEmbed(@NotNull DataState state, @NotNull ListContext context) { + EmbedBuilder builder = new EmbedBuilder() + .setTitle("Reminder auf **" + state.getEvent().getGuild().getName() + "**") + .setColor(getManager().getData("bot").getColor(state.getEvent().getGuild())); + + if (context.entries().isEmpty()) builder.setDescription("*Du hast keine aktiven Reminder auf diesem Server*"); + else builder.setFooter("Insgesamt " + context.entries().size() + " Reminder"); + + return builder; + } + + @Override + default void finalizeEmbed(@NotNull EmbedBuilder builder, @NotNull DataState state, @NotNull ListContext context) { + if(context.entries().isEmpty()) return; + builder.appendDescription("\n\nLösche einen Reminder mit " + context.manager().getManager().getCommandManager().getCommand(RemindCommand.DeleteCommand.class).getAsMention()); + } + + @NotNull + @Override + default List getEntries(@NotNull DataState state, @NotNull ListContext context) { + return getByMember(context.event().getMember()); + } } From b8eb339f3926bf46abe3a8a3bf75d7a53be346dd Mon Sep 17 00:00:00 2001 From: Matito Date: Sun, 18 Feb 2024 17:55:22 +0100 Subject: [PATCH 17/18] typo --- .../de/slimecloud/slimeball/features/reminder/Reminder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java index 3df0ab25..ca2de212 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/Reminder.java @@ -70,7 +70,7 @@ public void run() { .setAuthor(guild.getName(), null, guild.getIconUrl()) .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .setDescription(message + " \n \n" + "(Reminder von " + TimeFormat.RELATIVE.format(timeSet) + ")"); + .setDescription(message + " \n \n" + "(Reminder vor " + TimeFormat.RELATIVE.format(timeSet) + ")"); bot.getJda().openPrivateChannelById(user.getIdLong()) .flatMap(channel -> channel.sendMessageEmbeds(embedBuilder.build())) @@ -82,7 +82,7 @@ public void run() { .setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl()) .setTitle(SlimeEmoji.EXCLAMATION.toString(guild) + " Reminder!") .setColor(bot.getColor(guild)) - .setDescription(message + " \n \n" + "(Reminder von " + TimeFormat.RELATIVE.format(timeSet) + ")"); + .setDescription(message + " \n \n" + "(Reminder vor " + TimeFormat.RELATIVE.format(timeSet) + ")"); bot.loadGuild(guild.getIdLong()).getTeamChannel().ifPresent(channel -> { channel.sendMessage(role.getAsMention()).setEmbeds(embedBuilder.build()).queue(); From aa9797cd894b3d850df361c1cb3ff5008758e725 Mon Sep 17 00:00:00 2001 From: Matito Date: Sun, 18 Feb 2024 18:03:59 +0100 Subject: [PATCH 18/18] better ux https://imgur.com/a/JkdVGos --- .../slimecloud/slimeball/features/reminder/RemindCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java index bf10d206..5a8af248 100644 --- a/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java +++ b/src/main/java/de/slimecloud/slimeball/features/reminder/RemindCommand.java @@ -97,7 +97,7 @@ public void performCommand(@NotNull SlimeBot bot, @NotNull SlashCommandInteracti } if (number < 1 || number > reminders.size()) { - event.reply("Diesen Reminder gibt es nicht!").setEphemeral(true).queue(); + event.reply("Diesen Reminder gibt es nicht oder ist bereits ausgelaufen!").setEphemeral(true).queue(); return; }