Added the ability for reminders to mention a user and specified what type of reminder a reminder is

This commit is contained in:
Teriuihi 2023-03-12 01:42:50 +01:00
parent a80d1952da
commit 11d2e2bac8
8 changed files with 176 additions and 34 deletions

View File

@ -53,17 +53,7 @@ public class ButtonRemindMeConfirm extends DiscordButton {
return false; return false;
} }
reminder = new Reminder( reminder = Reminder.reCreateReminder(id, reminder);
id,
reminder.title(),
reminder.description(),
reminder.userId(),
reminder.guildId(),
reminder.channelId(),
reminder.messageId(),
reminder.shouldRepeat(),
reminder.creationDate(),
reminder.remindDate());
ReminderScheduler instance = ReminderScheduler.getInstance(event.getJDA()); ReminderScheduler instance = ReminderScheduler.getInstance(event.getJDA());
if (instance == null) { if (instance == null) {

View File

@ -111,6 +111,8 @@ public class DatabaseTables {
"should_repeat TINYINT(1) NOT NULL, " + "should_repeat TINYINT(1) NOT NULL, " +
"creation_date LONG NOT NULL, " + "creation_date LONG NOT NULL, " +
"remind_date LONG NOT NULL, " + "remind_date LONG NOT NULL, " +
"reminder_type INT NOT NULL default (-1), " +
"data BLOB NULL default NULL, " +
"PRIMARY KEY (id)" + "PRIMARY KEY (id)" +
")"; ")";
try { try {

View File

@ -3,18 +3,16 @@ package com.alttd.database.queries.QueriesReminders;
import com.alttd.database.Database; import com.alttd.database.Database;
import com.alttd.util.Logger; import com.alttd.util.Logger;
import java.sql.PreparedStatement; import java.io.IOException;
import java.sql.ResultSet; import java.sql.*;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
public class QueriesReminders { public class QueriesReminders {
public static int storeReminder(Reminder reminder) { public static int storeReminder(Reminder reminder) {
String sql = "INSERT INTO new_reminders " + String sql = "INSERT INTO new_reminders " +
"(title, description, user_id, guild_id, channel_id, message_id, should_repeat, creation_date, remind_date) " + "(title, description, user_id, guild_id, channel_id, message_id, should_repeat, creation_date, remind_date, reminder_type, data) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try { try {
PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
@ -27,6 +25,8 @@ public class QueriesReminders {
preparedStatement.setInt(7, reminder.shouldRepeat() ? 1 : 0); preparedStatement.setInt(7, reminder.shouldRepeat() ? 1 : 0);
preparedStatement.setLong(8, reminder.creationDate()); preparedStatement.setLong(8, reminder.creationDate());
preparedStatement.setLong(9, reminder.remindDate()); preparedStatement.setLong(9, reminder.remindDate());
preparedStatement.setInt(10, reminder.reminderType().getId());
preparedStatement.setBytes(11, reminder.data());
if (preparedStatement.executeUpdate() == 1) { if (preparedStatement.executeUpdate() == 1) {
ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
@ -42,13 +42,13 @@ public class QueriesReminders {
return -1; return -1;
} }
public static int updateReminderDate(Reminder reminder) { public static int updateReminderDate(long reminderDate, int reminderId) {
String sql = "UPDATE new_reminders SET remind_date = ? WHERE id = ?"; String sql = "UPDATE new_reminders SET remind_date = ? WHERE id = ?";
try { try {
PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setLong(1, reminder.remindDate()); preparedStatement.setLong(1, reminderDate);
preparedStatement.setInt(2, reminder.id()); preparedStatement.setInt(2, reminderId);
if (preparedStatement.executeUpdate() == 1) { if (preparedStatement.executeUpdate() == 1) {
ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
@ -106,7 +106,16 @@ public class QueriesReminders {
boolean shouldRepeat = resultSet.getInt("should_repeat") == 1; boolean shouldRepeat = resultSet.getInt("should_repeat") == 1;
long creationDate = resultSet.getLong("creation_date"); long creationDate = resultSet.getLong("creation_date");
long remindDate = resultSet.getLong("remind_date"); long remindDate = resultSet.getLong("remind_date");
return new Reminder(id, title, desc, userId, guildId, channelId, messageId, shouldRepeat, creationDate, remindDate); ReminderType reminderType = ReminderType.getReminder(resultSet.getInt("reminder_type"));
byte[] data = null;
try {
data = resultSet.getBlob("data").getBinaryStream().readAllBytes();
} catch (IOException e) {
Logger.warning("Unable to read data for reminder with id: " + id);
}
return new Reminder(id, title, desc, userId, guildId, channelId, messageId, shouldRepeat, creationDate, remindDate, reminderType, data);
} }
} }

View File

@ -6,7 +6,24 @@ import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
public record Reminder (int id, String title, String description, long userId, long guildId, long channelId, public record Reminder (int id, String title, String description, long userId, long guildId, long channelId,
long messageId, boolean shouldRepeat, long creationDate, long remindDate) { long messageId, boolean shouldRepeat, long creationDate, long remindDate, ReminderType reminderType, byte[] data) {
public static Reminder reCreateReminder(int id, Reminder reminder) {
return new Reminder(
id,
reminder.title(),
reminder.description(),
reminder.userId(),
reminder.guildId(),
reminder.channelId(),
reminder.messageId(),
reminder.shouldRepeat(),
reminder.creationDate(),
reminder.remindDate(),
reminder.reminderType(),
reminder.data());
}
public TextChannel getChannel(JDA jda) { public TextChannel getChannel(JDA jda) {
Guild guildById = getGuild(jda); Guild guildById = getGuild(jda);
if (guildById == null) if (guildById == null)

View File

@ -0,0 +1,24 @@
package com.alttd.database.queries.QueriesReminders;
public enum ReminderType {
NONE(-1),
MANUAL(0),
APPEAL(1);
private final int id;
ReminderType(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static ReminderType getReminder(int id) {
ReminderType[] values = ReminderType.values();
if (values.length < id) {
return NONE;
}
return values[id];
}
}

View File

@ -1,20 +1,30 @@
package com.alttd.listeners; package com.alttd.listeners;
import com.alttd.AltitudeBot;
import com.alttd.buttonManager.ButtonManager; import com.alttd.buttonManager.ButtonManager;
import com.alttd.database.queries.QueriesAssignAppeal; import com.alttd.database.queries.QueriesAssignAppeal;
import com.alttd.database.queries.QueriesReminders.QueriesReminders;
import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.database.queries.QueriesReminders.ReminderType;
import com.alttd.schedulers.ReminderScheduler;
import com.alttd.util.Logger; import com.alttd.util.Logger;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.components.buttons.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
public class AppealRepost extends ListenerAdapter { public class AppealRepost extends ListenerAdapter {
@ -89,11 +99,63 @@ public class AppealRepost extends ListenerAdapter {
Logger.warning("Unable to get a button for appeals"); Logger.warning("Unable to get a button for appeals");
return; return;
} }
message.getChannel().sendMessageEmbeds(embed).queue(res -> { MessageCreateAction messageCreateAction = message.getChannel().sendMessageEmbeds(embed);
if (member != null)
messageCreateAction = messageCreateAction.mentionUsers(member.getIdLong());
messageCreateAction.queue(res -> {
res.editMessageComponents().setActionRow(reminderAccepted, reminderInProgress, reminderDenied).queue(); res.editMessageComponents().setActionRow(reminderAccepted, reminderInProgress, reminderDenied).queue();
res.createThreadChannel("Appeal").queue(); res.createThreadChannel("Appeal").queue((
threadChannel -> scheduleReminder(res, member, threadChannel)),
failure -> Logger.warning("Unable to create thread channel so won't schedule reminder..."));
}); });
message.delete().queue(); message.delete().queue();
}
private void scheduleReminder(Message message, @Nullable Member member, ThreadChannel threadChannel) {
String memberMention = member == null ? "the appeals team" : member.getAsMention();
ByteArrayOutputStream outputStream = null;
if (member != null) {
outputStream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(outputStream);
try {
out.writeLong(member.getIdLong());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Reminder reminder = new Reminder(
-1,
"Reminder",
"I am reminding " + memberMention + " that we aim to resolve appeals within 24h or in more complex circumstances 48 hours!",
member == null ? 0 : member.getIdLong(),
message.getGuild().getIdLong(),
threadChannel.getIdLong(),
message.getIdLong(),
true,
System.currentTimeMillis(),
System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),
ReminderType.APPEAL,
outputStream == null ? null : outputStream.toByteArray()
);
int id = QueriesReminders.storeReminder(reminder);
if (id == 0) {
Logger.warning("Unable to store reminder for appeal with message id: " + message.getId());
return;
}
reminder = Reminder.reCreateReminder(id, reminder);
ReminderScheduler instance = ReminderScheduler.getInstance(message.getJDA());
if (instance == null) {
QueriesReminders.removeReminder(reminder.id());
Logger.warning("Unable to start reminder, removing it from the database...");
return;
}
instance.addReminder(reminder);
} }
} }

View File

@ -3,6 +3,7 @@ package com.alttd.modalManager.modals;
import com.alttd.buttonManager.ButtonManager; import com.alttd.buttonManager.ButtonManager;
import com.alttd.buttonManager.buttons.remindMeConfirm.ButtonRemindMeConfirm; import com.alttd.buttonManager.buttons.remindMeConfirm.ButtonRemindMeConfirm;
import com.alttd.database.queries.QueriesReminders.Reminder; import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.database.queries.QueriesReminders.ReminderType;
import com.alttd.modalManager.DiscordModal; import com.alttd.modalManager.DiscordModal;
import com.alttd.util.Util; import com.alttd.util.Util;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
@ -73,7 +74,9 @@ public class ModalRemindMe extends DiscordModal {
0, 0,
false, false,
new Date().getTime(), new Date().getTime(),
remindMeData.timestamp); remindMeData.timestamp,
ReminderType.MANUAL,
null);
Button remindMeConfirm = buttonManager.getButtonFor("remind_me_confirm"); Button remindMeConfirm = buttonManager.getButtonFor("remind_me_confirm");
Button remindMeCancel = buttonManager.getButtonFor("remind_me_cancel"); Button remindMeCancel = buttonManager.getButtonFor("remind_me_cancel");

View File

@ -10,7 +10,12 @@ import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
@ -56,20 +61,21 @@ public class ReminderScheduler {
nextReminder = reminders.get(0); nextReminder = reminders.get(0);
} }
public synchronized void removeReminder(Reminder reminder) { public synchronized void removeReminder(Reminder reminder, boolean removeFromDatabase) {
reminders.remove(reminder); reminders.remove(reminder);
if (reminders.size() == 0) if (reminders.size() == 0)
nextReminder = null; nextReminder = null;
else else
nextReminder = reminders.get(0); nextReminder = reminders.get(0);
QueriesReminders.removeReminder(reminder.id()); if (removeFromDatabase)
QueriesReminders.removeReminder(reminder.id());
} }
public synchronized void removeReminder(long messageId) { public synchronized void removeReminder(long messageId) {
reminders.stream() reminders.stream()
.filter(reminder -> reminder.messageId() == messageId) .filter(reminder -> reminder.messageId() == messageId)
.findAny() .findAny()
.ifPresent(this::removeReminder); .ifPresent(reminder -> removeReminder(reminder, true));
} }
private class ReminderRun implements Runnable { private class ReminderRun implements Runnable {
@ -95,14 +101,17 @@ public class ReminderScheduler {
nextReminder.guildId(), nextReminder.guildId(),
nextReminder.channelId(), nextReminder.channelId(),
nextReminder.messageId(), nextReminder.messageId(),
nextReminder.shouldRepeat(), true,
nextReminder.creationDate(), nextReminder.creationDate(),
nextReminder.remindDate() + TimeUnit.DAYS.toMillis(1)); nextReminder.remindDate() + TimeUnit.DAYS.toMillis(1),
nextReminder.reminderType(),
nextReminder.data());
removeReminder(nextReminder, false);
addReminder(repeatedReminder); addReminder(repeatedReminder);
QueriesReminders.updateReminderDate(repeatedReminder); QueriesReminders.updateReminderDate(nextReminder.remindDate() + TimeUnit.DAYS.toMillis(1), nextReminder.id());
} }
else else
removeReminder(nextReminder); removeReminder(nextReminder, true);
} }
} }
@ -123,7 +132,33 @@ public class ReminderScheduler {
private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder, Member member) { private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder, Member member) {
embedBuilder.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl()); embedBuilder.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl());
channel.sendMessageEmbeds(embedBuilder.build()).queue(RestAction.getDefaultSuccess(), Util::handleFailure); switch (reminder.reminderType()) {
case NONE, MANUAL -> {
channel.sendMessageEmbeds(embedBuilder.build()).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
}
case APPEAL -> {
if (reminder.data() == null)
break;
InputStream inputStream = new ByteArrayInputStream(reminder.data());
DataInputStream dataInputStream = new DataInputStream(inputStream);
long userId = 0;
try {
userId = dataInputStream.readLong();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
MessageCreateAction messageCreateAction = channel.sendMessageEmbeds(embedBuilder.build());
if (userId != 0)
messageCreateAction = messageCreateAction.mentionUsers(userId);
messageCreateAction.queue(RestAction.getDefaultSuccess(), Util::handleFailure);
}
}
} }
private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder) { private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder) {