diff --git a/pom.xml b/pom.xml
index f0277e54..11b2fbe5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.egg.papertrail
paper-trail-bot
- 1.0.0
+ 1.1.0
PaperTrail
A simple bot for logging all user actions
diff --git a/src/main/java/org/papertrail/cleanup/BotKickListener.java b/src/main/java/org/papertrail/cleanup/BotKickListener.java
index c34f56b7..aa490b98 100644
--- a/src/main/java/org/papertrail/cleanup/BotKickListener.java
+++ b/src/main/java/org/papertrail/cleanup/BotKickListener.java
@@ -26,6 +26,7 @@ public void onGuildLeave(@NotNull GuildLeaveEvent event) {
Guild leftGuild = event.getGuild();
try {
dc.unregisterGuildAndChannel(leftGuild.getId(), TableNames.AUDIT_LOG_TABLE);
+ dc.unregisterGuildAndChannel(leftGuild.getId(), TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
} catch (SQLException e) {
Logger.error("Could not auto-unregister guild upon guild leave", e);
}
diff --git a/src/main/java/org/papertrail/database/DatabaseConnector.java b/src/main/java/org/papertrail/database/DatabaseConnector.java
index a6e52f2b..a8a285e4 100644
--- a/src/main/java/org/papertrail/database/DatabaseConnector.java
+++ b/src/main/java/org/papertrail/database/DatabaseConnector.java
@@ -5,6 +5,8 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
import org.papertrail.utilities.EnvConfig;
import org.tinylog.Logger;
@@ -12,41 +14,38 @@
public class DatabaseConnector {
private static final String DB_URL = EnvConfig.get("DATABASEURL");
-
+
private Connection connect;
-
+
public DatabaseConnector() throws SQLException {
connect = DriverManager.getConnection(DB_URL);
}
-
+
public void registerGuildAndChannel(String guildId, String channelId, String tableName) throws SQLException {
-
+
String sqlStatement = "INSERT INTO "+tableName+" (guild_id, channel_id) VALUES (?, ?)";
-
+
try(PreparedStatement psmt = connect.prepareStatement(sqlStatement)){
- psmt.setString(1, guildId);
- psmt.setString(2, channelId);
+ psmt.setLong(1, Long.parseLong(guildId));
+ psmt.setLong(2, Long.parseLong(channelId));
psmt.executeUpdate();
}
-
+
}
-
- public String retrieveChannelId(String guildId, String tableName) {
- String sqlStatement = "SELECT (channel_id) FROM " + tableName + " WHERE guild_id = ?";
+ public String retrieveRegisteredChannelId(String guildId, String tableName) {
+
+ String sqlStatement = "SELECT channel_id FROM " + tableName + " WHERE guild_id = ?";
String channelId = "";
try (PreparedStatement psmt = connect.prepareStatement(sqlStatement)) {
- psmt.setString(1, guildId);
+ psmt.setLong(1, Long.parseLong(guildId));
try (ResultSet rs = psmt.executeQuery()) {
- if (!rs.isBeforeFirst()) {
- return null;
- } else {
- while (rs.next()) { // by configuration, there will always be only one channel id row at a time
- // because registering multiple channels is not allowed
- channelId = rs.getString("channel_id");
- }
+
+ while (rs.next()) { // by configuration, there will always be only one channel id row at a time
+ // because registering multiple channels is not allowed
+ channelId = String.valueOf(rs.getLong("channel_id"));
}
}
return channelId;
@@ -55,13 +54,140 @@ public String retrieveChannelId(String guildId, String tableName) {
return null;
}
}
-
+ /*
+ * If a guild of the given id is found, will return that id, otherwise null
+ */
+ public String checkGuildRegistration(String guildId, String tableName) {
+
+ String sqlStatement = "SELECT guild_id FROM " + tableName + " WHERE guild_id = ?";
+
+ try (PreparedStatement psmt = connect.prepareStatement(sqlStatement)) {
+ psmt.setLong(1, Long.parseLong(guildId));
+
+ try (ResultSet rs = psmt.executeQuery()) {
+
+ while (rs.next()) {
+ return String.valueOf(rs.getLong("guild_id"));
+
+ }
+ }
+ return null;
+ } catch (SQLException e) {
+ Logger.error("Could not retrieve registered guild channel id", e);
+ return null;
+ }
+ }
+
+ /*
+ * If a channel of the given id is found, will return that id, otherwise null
+ */
+ public String checkChannelRegistration(String channelId, String tableName) {
+
+ String sqlStatement = "SELECT channel_id FROM " + tableName + " WHERE channel_id = ?";
+
+ try (PreparedStatement psmt = connect.prepareStatement(sqlStatement)) {
+ psmt.setLong(1, Long.parseLong(channelId));
+
+ try (ResultSet rs = psmt.executeQuery()) {
+ while (rs.next()) {
+ return String.valueOf(rs.getLong("guild_id"));
+ }
+ }
+ return null;
+ } catch (SQLException e) {
+ Logger.error("Could not retrieve registered guild channel id", e);
+ return null;
+ }
+ }
+
public void unregisterGuildAndChannel(String guildId, String tableName) throws SQLException {
-
+
String sqlStatement = "DELETE FROM "+tableName+" WHERE guild_id = ?";
-
+
+ try(PreparedStatement psmt = connect.prepareStatement(sqlStatement)){
+ psmt.setLong(1, Long.parseLong(guildId));
+ psmt.executeUpdate();
+ }
+ }
+
+
+ // MESSAGE FUNCTIONS
+ public void logMessage(String messageId, String messageContent, String authorId, String tableName) throws SQLException {
+
+ String sqlStatement = "INSERT INTO "+tableName+" (message_id, message_content, author_id) VALUES (?, ?, ?)";
+
+ try(PreparedStatement psmt = connect.prepareStatement(sqlStatement)){
+ psmt.setLong(1, Long.parseLong(messageId));
+ psmt.setString(2, messageContent);
+ psmt.setLong(3, Long.parseLong(authorId));
+ psmt.executeUpdate();
+ }
+ }
+
+ public List retrieveAuthorAndMessage(String messageId, String tableName) {
+
+ String sqlStatement = "SELECT author_id, message_content FROM " + tableName + " WHERE message_id = ?";
+
+ String messageContent = "";
+ String authorId = "";
+
+ try (PreparedStatement psmt = connect.prepareStatement(sqlStatement)) {
+ psmt.setLong(1, Long.parseLong(messageId));
+
+ try (ResultSet rs = psmt.executeQuery()) {
+ if (rs.next()) { // only one message is logged per row per message id
+ messageContent = rs.getString("message_content");
+ authorId = String.valueOf(rs.getLong("author_id"));
+ return List.of(authorId, messageContent);
+ }
+ }
+ return Collections.emptyList();
+ } catch (SQLException e) {
+ Logger.error("Could not retrieve message", e);
+ e.printStackTrace();
+ return Collections.emptyList();
+ }
+ }
+ /*
+ * Checks if the message id exists in the database and returns the same if found, else null
+ */
+ public String checkMessageId(String messageId, String tableName) {
+
+ String sqlStatement = "SELECT message_id FROM " + tableName + " WHERE message_id = ?";
+
+ try (PreparedStatement psmt = connect.prepareStatement(sqlStatement)) {
+ psmt.setLong(1, Long.parseLong(messageId));
+
+ try (ResultSet rs = psmt.executeQuery()) {
+ if (rs.next()) { // only one message is logged per row per message id
+ return String.valueOf(rs.getLong("message_id"));
+ }
+ }
+ return null;
+ } catch (SQLException e) {
+ Logger.error("Could not retrieve message id", e);
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public void updateMessage(String messageId, String messageContent, String tableName) throws SQLException {
+
+ String sqlStatement = "UPDATE " + tableName + " SET message_content = ? WHERE message_id = ?";
+
+ try(PreparedStatement psmt = connect.prepareStatement(sqlStatement)){
+ psmt.setString(1, messageContent);
+ psmt.setLong(2, Long.parseLong(messageId));
+ psmt.executeUpdate();
+ }
+ }
+
+ public void deleteMessage(String messageId, String tableName) throws SQLException {
+
+ String sqlStatement = "DELETE FROM "+tableName+" WHERE message_id = ?";
+
try(PreparedStatement psmt = connect.prepareStatement(sqlStatement)){
- psmt.setString(1, guildId);
+ psmt.setLong(1, Long.parseLong(messageId));
psmt.executeUpdate();
}
}
diff --git a/src/main/java/org/papertrail/database/TableNames.java b/src/main/java/org/papertrail/database/TableNames.java
index 2a8af971..6bc3e047 100644
--- a/src/main/java/org/papertrail/database/TableNames.java
+++ b/src/main/java/org/papertrail/database/TableNames.java
@@ -5,5 +5,8 @@ public class TableNames {
private TableNames() {
throw new IllegalStateException("Utility Class");
}
+
public static final String AUDIT_LOG_TABLE = "audit_log_table";
+ public static final String MESSAGE_LOG_REGISTRATION_TABLE = "message_log_registration_table";
+ public static final String MESSAGE_LOG_CONTENT_TABLE = "message_log_content_table";
}
diff --git a/src/main/java/org/papertrail/listeners/customlisteners/BotInfoListener.java b/src/main/java/org/papertrail/listeners/customlisteners/BotInfoListener.java
index 2fc513e6..b51a574b 100644
--- a/src/main/java/org/papertrail/listeners/customlisteners/BotInfoListener.java
+++ b/src/main/java/org/papertrail/listeners/customlisteners/BotInfoListener.java
@@ -26,9 +26,11 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
eb.addField("š·ļø App Name", "ā°āā¤"+VersionInfo.APPNAME, false);
eb.addField("āļø App Version", "ā°āā¤"+VersionInfo.VERSION, false);
- eb.addField("šļø App Source Code", VersionInfo.PROJECT_LINK, false);
+ eb.addField("š App Source Code", VersionInfo.PROJECT_LINK, false);
+ eb.addField("š§ App Server", "ā°āā¤"+VersionInfo.SERVER_LOCATION, false);
+ eb.addField("š¢ App Database", "ā°āā¤"+VersionInfo.DATABASE_LOCATION, false);
- eb.setFooter(VersionInfo.APPNAME+" is free and open source ");
+ eb.setFooter(VersionInfo.APPNAME+" "+VersionInfo.VERSION);
eb.setTimestamp(Instant.now());
MessageEmbed mb = eb.build();
diff --git a/src/main/java/org/papertrail/listeners/customlisteners/BotSetupListener.java b/src/main/java/org/papertrail/listeners/customlisteners/BotSetupListener.java
new file mode 100644
index 00000000..ad288933
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/customlisteners/BotSetupListener.java
@@ -0,0 +1,77 @@
+package org.papertrail.listeners.customlisteners;
+
+import java.awt.Color;
+import java.time.Instant;
+
+import org.papertrail.version.VersionInfo;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+public class BotSetupListener extends ListenerAdapter {
+
+ @Override
+ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
+
+ if (event.getName().equals("setup")) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š ļø Setup Guide for " + VersionInfo.APPNAME);
+ eb.setDescription("Welcome to **" + VersionInfo.APPNAME + "**!\nHere's how to get started using the bot in your server.");
+ eb.setColor(Color.decode("#38e8bc"));
+
+ eb.addField("1ļøā£ Register Audit Log Channel",
+ "- Use `/auditlogchannel-set` to **register the current channel** for receiving audit log updates.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addField("2ļøā£ View Registered Audit Log Channel",
+ "- Use `/auditlogchannel-view` to **check which channel** is currently registered for audit logs.\nThis is helpful if you're unsure where logs are going.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addField("3ļøā£ Unregister Audit Log Channel",
+ "- Use `/auditlogchannel-remove` to **unset the audit log channel** if you wish to stop logging or switch to another one.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addBlankField(false);
+
+ eb.addField("4ļøā£ Register Message Log Channel",
+ "- Use `/messagelogchannel-set` to **register the current channel** for receiving audit log updates.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addField("5ļøā£ View Registered Message Log Channel",
+ "- Use `/messagelogchannel-view` to **check which channel** is currently registered for message logs.\nThis is helpful if you're unsure where logs are going.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addField("6ļøā£ Unregister Message Log Channel",
+ "- Use `/messagelogchannel-remove` to **unset the message log channel** if you wish to stop logging or switch to another one.\nā°ā⤠User must have `Manage Server` permission.",
+ false);
+
+ eb.addBlankField(false);
+
+ eb.addField("7ļøā£ View Server Stats",
+ "- Use `/stats` to **get useful server information** like member count, channel count, and more.",
+ false);
+
+ eb.addField("8ļøā£ Bot Information",
+ "- Use `/about` to **view bot details**, including author info and version.",
+ false);
+
+ String tips = """
+ - Make sure the bot has view and message send permissions for the logging channel.
+ - Commands only work in servers (guilds), not in DMs.
+ - The bot will lose its configuration if kicked from the server.
+ - By default, all messages are stored in the database for 30 days, after which the newer ones will replace the older ones.""";
+
+ eb.addField("š” Tips",tips,false);
+ eb.addField("š¬ Need help?", "Create an issue on [GitHub](" + VersionInfo.PROJECT_ISSUE_LINK+")", false);
+ eb.setFooter(VersionInfo.APPNAME+" "+VersionInfo.VERSION);
+ eb.setTimestamp(Instant.now());
+
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+ }
+ }
+}
+
diff --git a/src/main/java/org/papertrail/listeners/customlisteners/SetupListener.java b/src/main/java/org/papertrail/listeners/customlisteners/SetupListener.java
deleted file mode 100644
index 39ead7c6..00000000
--- a/src/main/java/org/papertrail/listeners/customlisteners/SetupListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.papertrail.listeners.customlisteners;
-
-import java.awt.Color;
-import java.time.Instant;
-
-import org.papertrail.version.VersionInfo;
-
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.MessageEmbed;
-import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-public class SetupListener extends ListenerAdapter {
-
- @Override
- public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
-
- if (event.getName().equals("setup")) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("š ļø Setup Guide for " + VersionInfo.APPNAME);
- eb.setDescription("Welcome to **" + VersionInfo.APPNAME + "**!\nHere's how to get started using the bot in your server.");
- eb.setColor(Color.decode("#38e8bc"));
-
- eb.addField("1ļøā£ Register Audit Log Channel",
- "- Use `/ralc` to **register the current channel** for receiving audit log updates.\nā°ā⤠User must have `Manage Server` permission.",
- false);
-
- eb.addField("2ļøā£ View Registered Channel",
- "- Use `/galc` to **check which channel** is currently registered for audit logs.\nThis is helpful if you're unsure where logs are going.\nā°ā⤠User must have `Manage Server` permission.",
- false);
-
- eb.addField("3ļøā£ Unregister Audit Log Channel",
- "- Use `/ualc` to **unset the audit log channel** if you wish to stop logging or switch to another one.\nā°ā⤠User must have `Manage Server` permission.",
- false);
-
- eb.addField("4ļøā£ View Server Stats",
- "- Use `/stats` to **get useful server information** like member count, channel count, and more.",
- false);
-
- eb.addField("5ļøā£ Bot Information",
- "- Use `/about` to **view bot details**, including author info and version.",
- false);
-
- String tips = """
- - Make sure the bot has proper permissions for it to work correctly.
- - Commands only work in servers (guilds), not in DMs.
- - The bot will lose its configuration if kicked from the server.""";
-
- eb.addField("š” Tips",tips,false);
- eb.addField("š¬ Need help?", "Create an issue on [GitHub](" + VersionInfo.PROJECT_ISSUE_LINK+")", false);
- eb.setFooter(VersionInfo.APPNAME+" "+VersionInfo.VERSION);
- eb.setTimestamp(Instant.now());
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).setEphemeral(false).queue();
- }
- }
-}
-
diff --git a/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java b/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
index 12297b6c..2ae0d976 100644
--- a/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
+++ b/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
@@ -26,7 +26,8 @@ public ServerBoostListener(DatabaseConnector dc) {
public void onGuildMemberUpdateBoostTime(GuildMemberUpdateBoostTimeEvent event) {
// this will return a non-null text id if a channel was previously registered in the database
- String registeredChannelId=dc.retrieveChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
+ // server boost logs are mapped to audit log table
+ String registeredChannelId=dc.retrieveRegisteredChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
if(registeredChannelId==null ||registeredChannelId.isBlank()) {
return;
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/AuditLogCommandListener.java b/src/main/java/org/papertrail/listeners/loglisteners/AuditLogCommandListener.java
new file mode 100644
index 00000000..a83c53bb
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/loglisteners/AuditLogCommandListener.java
@@ -0,0 +1,189 @@
+package org.papertrail.listeners.loglisteners;
+
+import java.awt.Color;
+import java.sql.SQLException;
+
+import org.papertrail.database.DatabaseConnector;
+import org.papertrail.database.TableNames;
+import org.tinylog.Logger;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.Permission;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+public class AuditLogCommandListener extends ListenerAdapter {
+
+ private DatabaseConnector dc;
+
+
+ public AuditLogCommandListener(DatabaseConnector dc) {
+ this.dc = dc;
+ }
+
+ @Override
+ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
+
+ // Only members with MANAGE_SERVER permissions should be able to use this command
+ Member member = event.getMember();
+ if (member == null || !member.hasPermission(Permission.MANAGE_SERVER)) {
+ event.reply("ā You don't have the permission required to use this command.").setEphemeral(true).queue();
+ return;
+ }
+
+ switch(event.getName()) {
+
+ case "auditlogchannel-set":
+ setAuditLogging(event);
+ break;
+
+ case "auditlogchannel-view":
+ retrieveAuditLoggingChannel(event);
+ break;
+
+ case "auditlogchannel-remove":
+ unsetAuditLogging(event);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+ private void setAuditLogging(SlashCommandInteractionEvent event) {
+ String guildId = event.getGuild().getId();
+ // retrieve the previously registered channel_id associated with the given
+ // guild_id
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
+
+ // if there is a registered channel_id in the database, send a warning message
+ // in the channel where the command was called from, stating that a channel has
+ // already been registered
+ if (registeredChannelId != null && !registeredChannelId.isBlank()) {
+
+ GuildChannel registeredChannel = event.getGuild().getGuildChannelById(registeredChannelId);
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā ļø Channel Already Registered", "ā°āā¤"+(registeredChannel !=null ? registeredChannel.getAsMention() : registeredChannelId)+ " has already been selected as the audit log channel", false);
+ eb.setColor(Color.YELLOW);
+
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ return;
+ }
+
+ // if there is no channel registered, get the channel id from where the command
+ // was called
+ String channelIdToRegister = event.getChannel().asTextChannel().getId();
+ try {
+ // register the channel_id along with guild_id in the database
+ dc.registerGuildAndChannel(guildId, channelIdToRegister, TableNames.AUDIT_LOG_TABLE);
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā
Channel Registration Success","ā°āā¤"+"All audit log info will be logged here", false);
+ eb.setColor(Color.GREEN);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ } catch (SQLException e) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā Channel Registration Failure","ā°āā¤"+"Channel could not be registered", false);
+ eb.setColor(Color.BLACK);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ Logger.error("Audit Log Channel could not be registered", e);
+ }
+ }
+
+ private void retrieveAuditLoggingChannel(SlashCommandInteractionEvent event) {
+ String guildId = event.getGuild().getId();
+
+ // retrieve the channel_id registered in the database
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
+
+ // if there is no channel_id for the given guild_id in the database, then inform
+ // the user of the same, else link the channel that has been registered
+ if (registeredChannelId == null || registeredChannelId.isBlank()) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+"No channel has been registered for audit logs", false);
+ eb.setColor(Color.YELLOW);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ } else {
+ // check if the channelId actually exists in the guild
+ // this is particularly useful when a channel that was set for logging may have been deleted
+ GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
+ if(registeredChannel==null) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+registeredChannelId+" does not exist. Please remove it using `/auditlogchannel-remove` and re-register using `/auditlogchannel-set`", false);
+ eb.setColor(Color.RED);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ } else {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.setColor(Color.CYAN);
+ eb.addField("ā
Channel Registration Check", "ā°āā¤"+registeredChannel.getAsMention()+ " is found to be registered as the audit log channel", false);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+ }
+ }
+ }
+
+ private void unsetAuditLogging(SlashCommandInteractionEvent event) {
+ String guildId = event.getGuild().getId();
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
+
+ if (registeredChannelId == null || registeredChannelId.isBlank()) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā¹ļø Channel Removal", "ā°āā¤"+"No channel has been registered for audit logs", false);
+ eb.setColor(Color.YELLOW);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+ } else {
+ try {
+
+ dc.unregisterGuildAndChannel(guildId, TableNames.AUDIT_LOG_TABLE);
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā
Channel Removal", "ā°āā¤"+"Channel successfully unset", false);
+ eb.setColor(Color.GREEN);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ } catch (SQLException e) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Audit Log Configuration");
+ eb.addField("ā Channel Removal Failure", "ā°āā¤"+"Channel could not be unset", false);
+ eb.setColor(Color.BLACK);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ Logger.error("Could not un-register audit log channel", e);
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java b/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java
index 0458452b..6c02a65b 100644
--- a/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java
+++ b/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java
@@ -45,7 +45,7 @@ public AuditLogListener(DatabaseConnector dc) {
public void onGuildAuditLogEntryCreate(GuildAuditLogEntryCreateEvent event) {
// this will return a non-null text id if a channel was previously registered in the database
- String registeredChannelId=dc.retrieveChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
+ String registeredChannelId=dc.retrieveRegisteredChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
if(registeredChannelId==null ||registeredChannelId.isBlank()) {
return;
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/LogCommandListener.java b/src/main/java/org/papertrail/listeners/loglisteners/LogCommandListener.java
deleted file mode 100644
index bbbf5651..00000000
--- a/src/main/java/org/papertrail/listeners/loglisteners/LogCommandListener.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package org.papertrail.listeners.loglisteners;
-
-import java.awt.Color;
-import java.sql.SQLException;
-
-import org.papertrail.database.DatabaseConnector;
-import org.papertrail.database.TableNames;
-import org.tinylog.Logger;
-
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.Permission;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.MessageEmbed;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-public class LogCommandListener extends ListenerAdapter {
-
- private DatabaseConnector dc;
- private final EmbedBuilder eb = new EmbedBuilder();
-
- public LogCommandListener(DatabaseConnector dc) {
- this.dc = dc;
- eb.setTitle("š Audit Log Configuration");
- eb.setColor(Color.CYAN);
- }
-
- @Override
- public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
-
- // Command for binding the listener to a channel
- if (event.getName().equals("ralc")) {
-
- // Only members with MANAGE_SERVER permissions should be able to use this command
- Member member = event.getMember();
- if (member == null || !member.hasPermission(Permission.MANAGE_SERVER)) {
- event.reply("ā You don't have the permission required to use this command.")
- .setEphemeral(true)
- .queue();
- return;
- }
-
- String guildId = event.getGuild().getId();
- // retrieve the previously registered channel_id associated with the given
- // guild_id
- String registeredChannelId = dc.retrieveChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
-
- // if there is a registered channel_id in the database, send a warning message
- // in the channel where the command was called from, stating that a channel has
- // already been registered
- if (registeredChannelId != null && !registeredChannelId.isBlank()) {
-
- GuildChannel registeredChannel = event.getGuild().getGuildChannelById(registeredChannelId);
- eb.addField("ā ļø Channel Already Registered", "ā°āā¤"+(registeredChannel !=null ? registeredChannel.getAsMention() : registeredChannelId)+ " has already been selected as the audit log channel", false);
- eb.setColor(Color.YELLOW);
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
- return;
- }
-
- // if there is no channel registered, get the channel id from where the command
- // was called
- String channelIdToRegister = event.getChannel().asTextChannel().getId();
- try {
- // register the channel_id along with guild_id in the database
- dc.registerGuildAndChannel(guildId, channelIdToRegister, TableNames.AUDIT_LOG_TABLE);
-
- eb.addField("ā
Channel Registration Success","ā°āā¤"+"All audit log info will be logged here", false);
- eb.setColor(Color.GREEN);
- MessageEmbed mb = eb.build();
-
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
-
- } catch (SQLException e) {
-
- eb.addField("ā Channel Registration Failure","ā°āā¤"+"Channel could not be registered", false);
- eb.setColor(Color.BLACK);
- MessageEmbed mb = eb.build();
-
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
-
- Logger.error("Audit Log Channel could not be registered", e);
- }
- }
-
- // Command for getting the channel where audit logs are posted
- if (event.getName().equals("galc")) {
-
- // Only members with MANAGE_SERVER permissions should be able to use this command
- Member member = event.getMember();
- if (member == null || !member.hasPermission(Permission.MANAGE_SERVER)) {
- event.reply("ā You don't have the permission required to use this command.")
- .setEphemeral(true)
- .queue();
- return;
- }
-
- String guildId = event.getGuild().getId();
-
- // retrieve the channel_id registered in the database
- String registeredChannelId = dc.retrieveChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
-
- // if there is no channel_id for the given guild_id in the database, then inform
- // the user of the same, else link the channel that has been registered
- if (registeredChannelId == null || registeredChannelId.isBlank()) {
- eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+"No channel has been registered for audit logs", false);
- eb.setColor(Color.YELLOW);
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
- } else {
- // check if the channelId actually exists in the guild
- // this is particularly useful when a channel that was set for logging may have been deleted
- GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
- if(registeredChannel==null) {
- eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+registeredChannelId+" does not exist. Please remove it using `/ualc` and re-register using `/ralc`", false);
- eb.setColor(Color.RED);
- } else {
- eb.setColor(Color.CYAN);
- eb.addField("ā
Channel Registration Check", "ā°āā¤"+registeredChannel.getAsMention()+ " is found to be registered as the audit log channel", false);
- }
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
- }
- }
-
- // Command for un-setting a previously bound listener from a channel
- if (event.getName().equals("ualc")) {
-
- // Only members with MANAGE_SERVER permissions should be able to use this command
- Member member = event.getMember();
- if (member == null || !member.hasPermission(Permission.MANAGE_SERVER)) {
- event.reply("ā You don't have the permission required to use this command.")
- .setEphemeral(true)
- .queue();
- return;
- }
-
- String guildId = event.getGuild().getId();
- String registeredChannelId = dc.retrieveChannelId(guildId, TableNames.AUDIT_LOG_TABLE);
-
- if (registeredChannelId == null || registeredChannelId.isBlank()) {
- eb.addField("ā¹ļø Channel Removal", "ā°āā¤"+"No channel has been registered for audit logs", false);
- eb.setColor(Color.YELLOW);
- MessageEmbed mb = eb.build();
-
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
-
- } else {
- try {
-
- dc.unregisterGuildAndChannel(guildId, TableNames.AUDIT_LOG_TABLE);
-
- eb.addField("ā
Channel Removal", "ā°āā¤"+"Channel successfully unset", false);
- eb.setColor(Color.GREEN);
- MessageEmbed mb = eb.build();
-
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
- } catch (SQLException e) {
- eb.addField("ā Channel Removal Failure", "ā°āā¤"+"Channel could not be unset", false);
- eb.setColor(Color.BLACK);
- MessageEmbed mb = eb.build();
-
- event.replyEmbeds(mb).setEphemeral(false).queue();
-
- eb.clearFields();
- Logger.error("Could not un-register audit log channel", e);
- }
- }
-
- }
- }
-}
diff --git a/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java b/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java
index 8795b257..b34770e9 100644
--- a/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java
+++ b/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java
@@ -28,7 +28,8 @@ public void onGuildMemberJoin(GuildMemberJoinEvent event) {
// this will return a non-null text id if a channel was previously registered in
// the database
- String registeredChannelId = dc.retrieveChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
+ // guild member join and leave events are mapped to audit log table
+ String registeredChannelId = dc.retrieveRegisteredChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
if (registeredChannelId == null || registeredChannelId.isBlank()) {
return;
@@ -61,7 +62,7 @@ public void onGuildMemberRemove(GuildMemberRemoveEvent event) {
// this will return a non-null text id if a channel was previously registered in
// the database
- String registeredChannelId = dc.retrieveChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
+ String registeredChannelId = dc.retrieveRegisteredChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
if (registeredChannelId == null || registeredChannelId.isBlank()) {
return;
diff --git a/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogCommandListener.java b/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogCommandListener.java
new file mode 100644
index 00000000..619fa413
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogCommandListener.java
@@ -0,0 +1,183 @@
+package org.papertrail.listeners.messagelisteners;
+
+import java.awt.Color;
+import java.sql.SQLException;
+
+import org.papertrail.database.DatabaseConnector;
+import org.papertrail.database.TableNames;
+import org.tinylog.Logger;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.Permission;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+public class MessageLogCommandListener extends ListenerAdapter {
+
+ private DatabaseConnector dc;
+ private final EmbedBuilder eb = new EmbedBuilder();
+
+ public MessageLogCommandListener(DatabaseConnector dc) {
+ this.dc = dc;
+ eb.setTitle("š Message Log Configuration");
+ eb.setColor(Color.CYAN);
+ }
+
+ @Override
+ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
+
+ // Only members with MANAGE_SERVER permissions should be able to use this command
+ Member member = event.getMember();
+ if (member == null || !member.hasPermission(Permission.MANAGE_SERVER)) {
+ event.reply("ā You don't have the permission required to use this command.").setEphemeral(true).queue();
+ return;
+ }
+
+ switch(event.getName()) {
+
+ case "messagelogchannel-set":
+ setMessageLogging(event);
+ break;
+
+ case "messagelogchannel-view":
+ retrieveMessageLoggingChannel(event);
+ break;
+
+ case "messagelogchannel-remove":
+ unsetMessageLogging(event);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ private void setMessageLogging(SlashCommandInteractionEvent event) {
+
+ Guild guild = event.getGuild();
+ String guildId = guild.getId();
+
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+
+ if(registeredChannelId!=null && !registeredChannelId.isBlank()) {
+
+ GuildChannel registeredChannel = event.getGuild().getGuildChannelById(registeredChannelId);
+ eb.addField("ā ļø Channel Already Registered", "ā°āā¤"+(registeredChannel !=null ? registeredChannel.getAsMention() : registeredChannelId)+ " has already been selected as the message log channel", false);
+ eb.setColor(Color.YELLOW);
+
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+ return;
+ }
+
+ String channelIdToRegister = event.getChannelId();
+ try {
+ // register the channel_id along with guild_id in the database
+ dc.registerGuildAndChannel(guildId, channelIdToRegister, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+
+ eb.addField("ā
Channel Registration Success","ā°āā¤"+"All edited and deleted messages will be logged here", false);
+ eb.setColor(Color.GREEN);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+
+ } catch (SQLException e) {
+
+ eb.addField("ā Channel Registration Failure","ā°āā¤"+"Channel could not be registered", false);
+ eb.setColor(Color.BLACK);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+
+ Logger.error("Message Log Channel could not be registered", e);
+ }
+
+ }
+
+ private void retrieveMessageLoggingChannel(SlashCommandInteractionEvent event) {
+
+ Guild guild = event.getGuild();
+ String guildId = guild.getId();
+
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+ // if there is no channel_id for the given guild_id in the database, then inform
+ // the user of the same, else link the channel that has been registered
+ if (registeredChannelId == null || registeredChannelId.isBlank()) {
+ eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+"No channel has been registered for message logging", false);
+ eb.setColor(Color.YELLOW);
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+ } else {
+ // check if the channelId actually exists in the guild
+ // this is particularly useful when a channel that was set for logging may have been deleted
+ GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
+ if(registeredChannel==null) {
+ eb.addField("ā ļø Channel Registration Check", "ā°āā¤"+registeredChannelId+" does not exist. Please remove it using `/messagelogchannel-remove` and re-register using `/messagelogchannel-set`", false);
+ eb.setColor(Color.RED);
+ } else {
+ eb.setColor(Color.CYAN);
+ eb.addField("ā
Channel Registration Check", "ā°āā¤"+registeredChannel.getAsMention()+ " is found to be registered as the message log channel", false);
+ }
+
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+ }
+ }
+
+ private void unsetMessageLogging(SlashCommandInteractionEvent event) {
+
+ Guild guild = event.getGuild();
+ String guildId = guild.getId();
+
+ String registeredChannelId = dc.retrieveRegisteredChannelId(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+
+ if (registeredChannelId == null || registeredChannelId.isBlank()) {
+ eb.addField("ā¹ļø Channel Removal", "ā°āā¤"+"No channel has been registered for message logs", false);
+ eb.setColor(Color.YELLOW);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+
+ } else {
+ try {
+
+ dc.unregisterGuildAndChannel(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+
+ eb.addField("ā
Channel Removal", "ā°āā¤"+"Channel successfully unset", false);
+ eb.setColor(Color.GREEN);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+ } catch (SQLException e) {
+ eb.addField("ā Channel Removal Failure", "ā°āā¤"+"Channel could not be unset", false);
+ eb.setColor(Color.BLACK);
+ MessageEmbed mb = eb.build();
+
+ event.replyEmbeds(mb).setEphemeral(false).queue();
+
+ eb.clearFields();
+ Logger.error("Could not un-register message log channel", e);
+ }
+ }
+
+ }
+
+}
diff --git a/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogListener.java b/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogListener.java
new file mode 100644
index 00000000..cad00615
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/messagelisteners/MessageLogListener.java
@@ -0,0 +1,175 @@
+package org.papertrail.listeners.messagelisteners;
+
+import java.awt.Color;
+import java.sql.SQLException;
+import java.time.Instant;
+import java.util.List;
+
+import org.papertrail.database.DatabaseConnector;
+import org.papertrail.database.TableNames;
+import org.tinylog.Logger;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+public class MessageLogListener extends ListenerAdapter {
+
+ private DatabaseConnector dc;
+ public MessageLogListener(DatabaseConnector dc) {
+ this.dc = dc;
+
+ }
+
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+
+ // if the author is a bot or system, don't log
+ if(event.getAuthor().isBot() || event.getAuthor().isSystem()) {
+ return;
+ }
+ // don't register non-textual contents
+ if(event.getMessage().getContentRaw().isEmpty()) {
+ return;
+ }
+
+ // get the guild id for which the event was fired
+ String guildId = event.getGuild().getId();
+ // see if the guild id is registered in the database for logging
+ String registeredGuildId = dc.checkGuildRegistration(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+
+ // if not registered, exit
+ if(registeredGuildId==null) {
+ return;
+ }
+
+ // else if the registered guild id matches with the event fetched guild id, log the message with its ID and author
+ if(registeredGuildId.equals(guildId)) {
+ try {
+ String messageId = event.getMessageId();
+ dc.logMessage(messageId, event.getMessage().getContentRaw(), event.getAuthor().getId(), TableNames.MESSAGE_LOG_CONTENT_TABLE);
+ } catch (SQLException e) {
+ Logger.error("Could not log message", e);
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void onMessageUpdate(MessageUpdateEvent event) {
+
+ if(event.getAuthor().isBot() || event.getAuthor().isSystem()) {
+ return;
+ }
+
+
+ String guildId = event.getGuild().getId();
+
+ String registeredGuildId = dc.checkGuildRegistration(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+ if(registeredGuildId==null) {
+ return;
+ }
+
+ if(registeredGuildId.equals(guildId)) {
+ try {
+ // get the message id of the message which was updated
+ String messageId = event.getMessageId();
+
+ // fetch the old message content and its author from the database
+ List oldAuthorAndMessage = dc.retrieveAuthorAndMessage(messageId, TableNames.MESSAGE_LOG_CONTENT_TABLE);
+
+ // fetch the updated message from the event
+ String updatedMessage = event.getMessage().getContentRaw();
+
+ // Ignore events where the message content wasn't edited (e.g., pin, embed resolve, thread creates and updates)
+ // This is required since MessageUpdateEvent is triggered in case of pins and embed resolves with no change to content
+ if(updatedMessage.equals(oldAuthorAndMessage.getLast())) {
+ return;
+ }
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Message Edit Event");
+ eb.setDescription("A message sent by "+event.getAuthor().getAsMention()+" has been edited in: "+event.getJumpUrl());
+ eb.setThumbnail(event.getAuthor().getEffectiveAvatarUrl());
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Old Message", oldAuthorAndMessage.getLast(), false); // get only the message and not the author
+ eb.addField("New Message", updatedMessage, false);
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+ // update the database with the new message
+ dc.updateMessage(messageId, updatedMessage, TableNames.MESSAGE_LOG_CONTENT_TABLE);
+ // the reason this is above the send queue is because in case where the user did not give sufficient permissions to
+ // the bot, the error responses wouldn't block the update of the message in the database.
+
+ // fetch the channel id from the database
+ // this channel is where the logs will be sent to
+ // wrap the embed and send
+ MessageEmbed mb = eb.build();
+ String channelIdToSendTo = dc.retrieveRegisteredChannelId(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+ event.getGuild().getTextChannelById(channelIdToSendTo).sendMessageEmbeds(mb).queue();
+ } catch (SQLException e) {
+ Logger.error("Could not log updated message", e);
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void onMessageDelete(MessageDeleteEvent event) {
+
+ String guildId = event.getGuild().getId();
+
+ String registeredGuildId = dc.checkGuildRegistration(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+ if(registeredGuildId==null) {
+ return;
+ }
+
+ if(registeredGuildId.equals(guildId)) {
+ try {
+ // get the message id of the message which was deleted
+ String messageId = event.getMessageId();
+ // if the message id does not exist in db, it means the message has not been logged in the first place
+ if(dc.checkMessageId(messageId, TableNames.MESSAGE_LOG_CONTENT_TABLE)==null) {
+ return;
+ }
+
+ // retrieve the channel id where the logs must be sent
+ String channelIdToSendTo = dc.retrieveRegisteredChannelId(guildId, TableNames.MESSAGE_LOG_REGISTRATION_TABLE);
+ // retrieve the stored message in the database which was deleted
+ List oldAuthorAndMessage = dc.retrieveAuthorAndMessage(messageId, TableNames.MESSAGE_LOG_CONTENT_TABLE);
+
+ User author = event.getJDA().getUserById(oldAuthorAndMessage.getFirst());
+ String mentionableAuthor = (author !=null ? author.getAsMention() : oldAuthorAndMessage.getFirst());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("š Message Delete Event");
+ eb.setDescription("A message sent by "+mentionableAuthor+" has been deleted");
+ eb.setColor(Color.RED);
+ eb.addField("Deleted Message", oldAuthorAndMessage.getLast(), false);
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+
+ // delete the message from the database
+ dc.deleteMessage(messageId, TableNames.MESSAGE_LOG_CONTENT_TABLE);
+ // the reason this is above the send queue is because in case where the user did not give sufficient permissions to
+ // the bot, the error responses wouldn't block the deletion in the database.
+
+ // send the fetched deleted message to the logging channel
+ MessageEmbed mb = eb.build();
+ event.getGuild().getTextChannelById(channelIdToSendTo).sendMessageEmbeds(mb).queue();
+
+ } catch (SQLException e) {
+ Logger.error("Could not delete message", e);
+ e.printStackTrace();
+
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/messagelisteners/package-info.java b/src/main/java/org/papertrail/listeners/messagelisteners/package-info.java
new file mode 100644
index 00000000..ff3f1938
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/messagelisteners/package-info.java
@@ -0,0 +1,4 @@
+/*
+ * Groups listeners related to message activities
+ */
+package org.papertrail.listeners.messagelisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java b/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java
index af1a44fa..68faeb85 100644
--- a/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java
+++ b/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java
@@ -26,7 +26,8 @@ public void onGuildVoiceUpdate(GuildVoiceUpdateEvent event) {
// this will return a non-null text id if a channel was previously registered in
// the database
- String registeredChannelId = dc.retrieveChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
+ // guild voice events are mapped to audit log table
+ String registeredChannelId = dc.retrieveRegisteredChannelId(event.getGuild().getId(), TableNames.AUDIT_LOG_TABLE);
if (registeredChannelId == null || registeredChannelId.isBlank()) {
return;
diff --git a/src/main/java/org/papertrail/main/FireRun.java b/src/main/java/org/papertrail/main/FireRun.java
index aba89242..14007a7b 100644
--- a/src/main/java/org/papertrail/main/FireRun.java
+++ b/src/main/java/org/papertrail/main/FireRun.java
@@ -8,11 +8,13 @@
import org.papertrail.database.DatabaseConnector;
import org.papertrail.listeners.customlisteners.BotInfoListener;
import org.papertrail.listeners.customlisteners.ServerStatListener;
-import org.papertrail.listeners.customlisteners.SetupListener;
+import org.papertrail.listeners.customlisteners.BotSetupListener;
import org.papertrail.listeners.guildlisteners.ServerBoostListener;
import org.papertrail.listeners.loglisteners.AuditLogListener;
-import org.papertrail.listeners.loglisteners.LogCommandListener;
+import org.papertrail.listeners.loglisteners.AuditLogCommandListener;
import org.papertrail.listeners.memberlisteners.GuildMemberJoinAndLeaveListener;
+import org.papertrail.listeners.messagelisteners.MessageLogCommandListener;
+import org.papertrail.listeners.messagelisteners.MessageLogListener;
import org.papertrail.listeners.voicelisteners.GuildVoiceListener;
import com.sun.net.httpserver.HttpExchange;
@@ -28,16 +30,18 @@ public static void main(String[] args) throws IOException, SQLException {
DatabaseConnector dc = new DatabaseConnector();
ConnectionInitializer ci = new ConnectionInitializer();
- ci.getManager().addEventListener(new LogCommandListener(dc));
+ ci.getManager().addEventListener(new AuditLogCommandListener(dc));
ci.getManager().addEventListener(new AuditLogListener(dc));
ci.getManager().addEventListener(new GuildVoiceListener(dc));
ci.getManager().addEventListener(new GuildMemberJoinAndLeaveListener(dc));
ci.getManager().addEventListener(new ServerBoostListener(dc));
ci.getManager().addEventListener(new BotKickListener(dc));
+ ci.getManager().addEventListener(new MessageLogCommandListener(dc));
+ ci.getManager().addEventListener(new MessageLogListener(dc));
ci.getManager().addEventListener(new ServerStatListener());
ci.getManager().addEventListener(new BotInfoListener());
- ci.getManager().addEventListener(new SetupListener());
+ ci.getManager().addEventListener(new BotSetupListener());
/*
* This is required only to set up a cron-job to periodically ping this end-point so that
diff --git a/src/main/java/org/papertrail/main/SlashCommandRegistrar.java b/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
index 6aa569bb..cd836c69 100644
--- a/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
+++ b/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
@@ -20,19 +20,35 @@ public void onReady(@NotNull ReadyEvent event) {
private void setAuditLogCommands(JDA jda) {
- CommandData auditLogChannelRegistration = Commands.slash("ralc",
+ CommandData auditLogChannelRegistration = Commands.slash("auditlogchannel-set",
"Registers the channel where audit log updates will be posted (Requires Manage Server Permission)");
- CommandData auditLogChannelFetch = Commands.slash("galc",
+ CommandData auditLogChannelFetch = Commands.slash("auditlogchannel-view",
"Shows the channel where audit log updates gets posted (Requires Manage Server Permission)");
- CommandData auditLogChannelDeletion = Commands.slash("ualc",
+ CommandData auditLogChannelDeletion = Commands.slash("auditlogchannel-remove",
"Unsets the channel where audit log updates used to be posted (Requires Manage Server Permission)");
+
+ CommandData messageLogChannelRegistration = Commands.slash("messagelogchannel-set",
+ "Sets the channel where messages are logged (Requires Manage Server Permission)");
+ CommandData messageLogChannelFetch = Commands.slash("messagelogchannel-view",
+ "Shows the channel messages are logged (Requires Manage Server Permission)");
+ CommandData messageLogChannelDeletion = Commands.slash("messagelogchannel-remove",
+ "Unsets the channel messages are logged (Requires Manage Server Permission)");
+
CommandData serverStats = Commands.slash("stats",
"Provides Server Statistics");
CommandData botInfo = Commands.slash("about",
"Provides Bot Info");
CommandData setup = Commands.slash("setup", "Provides a guide on setting up the bot");
jda.updateCommands()
- .addCommands(auditLogChannelRegistration, auditLogChannelFetch, auditLogChannelDeletion, serverStats, botInfo, setup)
+ .addCommands(auditLogChannelRegistration,
+ auditLogChannelFetch,
+ auditLogChannelDeletion,
+ messageLogChannelRegistration,
+ messageLogChannelFetch,
+ messageLogChannelDeletion,
+ serverStats,
+ botInfo,
+ setup)
.queue();
}
}
diff --git a/src/main/java/org/papertrail/version/VersionInfo.java b/src/main/java/org/papertrail/version/VersionInfo.java
index 1c8c33b4..85cea726 100644
--- a/src/main/java/org/papertrail/version/VersionInfo.java
+++ b/src/main/java/org/papertrail/version/VersionInfo.java
@@ -7,7 +7,10 @@ private VersionInfo() {
}
public static final String APPNAME = "PaperTrail";
- public static final String VERSION = "v1.0.0";
+ public static final String VERSION = "v1.1.0";
public static final String PROJECT_LINK = "https://github.com/Egg-03/PaperTrailBot";
public static final String PROJECT_ISSUE_LINK="https://github.com/Egg-03/PaperTrailBot/issues";
+
+ public static final String SERVER_LOCATION = "Render: Frankfurt(Germany, Europe)";
+ public static final String DATABASE_LOCATION = "Aiven: England(UK, Europe)";
}
diff --git a/src/main/resources/tinylog.properties b/src/main/resources/tinylog.properties
index 26631144..0396c495 100644
--- a/src/main/resources/tinylog.properties
+++ b/src/main/resources/tinylog.properties
@@ -1,5 +1,5 @@
writer1 = console
-writer1.format = {level}: {class}.{method}()\t{message}
+writer1.format = {level}: {class}.{method}()\t{message}\n{exception}
writer1.level = debug
writingthread = true
\ No newline at end of file