Skip to content

Commit eef1005

Browse files
committed
links in message logs
1 parent 40e5aeb commit eef1005

File tree

5 files changed

+99
-46
lines changed

5 files changed

+99
-46
lines changed

src/main/java/net/javadiscord/javabot/data/h2db/message_cache/MessageCache.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.extern.slf4j.Slf4j;
44
import net.dv8tion.jda.api.EmbedBuilder;
55
import net.dv8tion.jda.api.entities.*;
6+
import net.dv8tion.jda.api.entities.Message.Attachment;
67
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
78
import net.dv8tion.jda.api.interactions.components.buttons.Button;
89
import net.javadiscord.javabot.data.config.BotConfig;
@@ -25,6 +26,7 @@
2526
import java.util.ArrayList;
2627
import java.util.List;
2728
import java.util.concurrent.ExecutorService;
29+
import java.util.stream.Collectors;
2830

2931
import org.springframework.dao.DataAccessException;
3032
import org.springframework.stereotype.Service;
@@ -108,7 +110,7 @@ public void cache(Message message) {
108110
public void sendUpdatedMessageToLog(Message updated, CachedMessage before) {
109111
MessageCacheConfig config = botConfig.get(updated.getGuild()).getMessageCacheConfig();
110112
if (config.getMessageCacheLogChannel() == null) return;
111-
if (updated.getContentRaw().trim().equals(before.getMessageContent())) return;
113+
if (updated.getContentRaw().trim().equals(before.getMessageContent()) && updated.getAttachments().size() == before.getAttachments().size()) return;
112114
MessageCreateAction action = config.getMessageCacheLogChannel()
113115
.sendMessageEmbeds(buildMessageEditEmbed(updated.getGuild(), updated.getAuthor(), updated.getChannel(), before, updated))
114116
.setActionRow(Button.link(updated.getJumpUrl(), "Jump to Message"));
@@ -148,26 +150,49 @@ private EmbedBuilder buildMessageCacheEmbed(MessageChannel channel, User author,
148150
}
149151

150152
private MessageEmbed buildMessageEditEmbed(Guild guild, User author, MessageChannel channel, CachedMessage before, Message after) {
151-
return buildMessageCacheEmbed(channel, author, before)
153+
EmbedBuilder eb = buildMessageCacheEmbed(channel, author, before)
152154
.setTitle("Message Edited")
153155
.setColor(Responses.Type.WARN.getColor())
154156
.addField("Before", before.getMessageContent().substring(0, Math.min(
155157
before.getMessageContent().length(),
156158
MessageEmbed.VALUE_MAX_LENGTH)), false)
157159
.addField("After", after.getContentRaw().substring(0, Math.min(
158160
after.getContentRaw().length(),
159-
MessageEmbed.VALUE_MAX_LENGTH)), false)
161+
MessageEmbed.VALUE_MAX_LENGTH)), false);
162+
if(before.getAttachments().size() != after.getAttachments().size()) {
163+
eb.addField("Deleted Attachments",
164+
before
165+
.getAttachments()
166+
.stream()
167+
.filter(attachment -> after//not present in 'after'
168+
.getAttachments()
169+
.stream()
170+
.map(Attachment::getProxyUrl)
171+
.noneMatch(attachment::equals))
172+
.collect(Collectors.joining("\n")),
173+
false);
174+
}
175+
return eb
160176
.build();
161177
}
162178

163179
private MessageEmbed buildMessageDeleteEmbed(Guild guild, User author, MessageChannel channel, CachedMessage message) {
164-
return buildMessageCacheEmbed(channel, author, message)
180+
EmbedBuilder eb = buildMessageCacheEmbed(channel, author, message)
165181
.setTitle("Message Deleted")
166182
.setColor(Responses.Type.ERROR.getColor())
167183
.addField("Message Content",
168184
message.getMessageContent().substring(0, Math.min(
169185
message.getMessageContent().length(),
170-
MessageEmbed.VALUE_MAX_LENGTH)), false)
186+
MessageEmbed.VALUE_MAX_LENGTH)), false);
187+
if (!message.getAttachments().isEmpty()) {
188+
eb.addField("Attachments",
189+
message
190+
.getAttachments()
191+
.stream()
192+
.collect(Collectors.joining("\n")),
193+
false);
194+
}
195+
return eb
171196
.build();
172197
}
173198

src/main/java/net/javadiscord/javabot/data/h2db/message_cache/dao/MessageCacheRepository.java

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
import org.springframework.dao.DataAccessException;
77
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
88
import org.springframework.jdbc.core.JdbcTemplate;
9-
import org.springframework.jdbc.core.RowMapper;
109
import org.springframework.stereotype.Repository;
1110

1211
import java.sql.*;
12+
import java.util.ArrayList;
13+
import java.util.LinkedHashMap;
1314
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Map.Entry;
1417

1518
/**
1619
* Dao class that represents the QOTW_POINTS SQL Table.
@@ -20,20 +23,6 @@
2023
public class MessageCacheRepository {
2124
private final JdbcTemplate jdbcTemplate;
2225

23-
/**
24-
* Inserts a new {@link CachedMessage} object.
25-
*
26-
* @param message The Message to insert.
27-
* @return Whether there were rows affected by this process.
28-
* @throws SQLException If an error occurs.
29-
*/
30-
public boolean insert(CachedMessage message) throws DataAccessException {
31-
int rows = jdbcTemplate.update(
32-
"INSERT INTO message_cache (message_id, author_id, message_content) VALUES (?, ?, ?)",
33-
message.getMessageId(), message.getAuthorId(), message.getMessageContent());
34-
return rows > 0;
35-
}
36-
3726
/**
3827
* Inserts a {@link List} of {@link CachedMessage} objects.
3928
*
@@ -57,31 +46,30 @@ public int getBatchSize() {
5746
return messages.size();
5847
}
5948
});
60-
}
49+
List<Map.Entry<CachedMessage, Integer>> attachments=new ArrayList<>();
50+
for (CachedMessage msg : messages) {
51+
for (int i = 0; i < msg.getAttachments().size(); i++) {
52+
attachments.add(Map.entry(msg, i));
53+
}
54+
}
55+
jdbcTemplate.batchUpdate("MERGE INTO message_cache_attachments (message_id, attachment_index, link) VALUES (?, ?, ?)",
56+
new BatchPreparedStatementSetter() {
6157

62-
/**
63-
* Edit an existing {@link CachedMessage} object.
64-
*
65-
* @param message The new Message object.
66-
* @return Whether there were rows affected by this process.
67-
* @throws SQLException If an error occurs.
68-
*/
69-
public boolean update(@NotNull CachedMessage message) throws DataAccessException {
70-
int rows = jdbcTemplate.update("UPDATE message_cache SET message_content = ? WHERE message_id = ?",
71-
message.getMessageContent(), message.getMessageId());
72-
return rows > 0;
73-
}
58+
@Override
59+
public void setValues(PreparedStatement stmt, int i) throws SQLException {
60+
Entry<CachedMessage, Integer> entry = attachments.get(i);
61+
CachedMessage msg = entry.getKey();
62+
Integer attachmentIndex = entry.getValue();
63+
stmt.setLong(1, msg.getMessageId());
64+
stmt.setInt(2, attachmentIndex);
65+
stmt.setString(3, msg.getAttachments().get(attachmentIndex));
66+
}
7467

75-
/**
76-
* Deletes a single {@link CachedMessage} object from the Message Cache.
77-
*
78-
* @param messageId The message's id.
79-
* @return Whether there were rows affected by this process.
80-
* @throws SQLException If an error occurs.
81-
*/
82-
public boolean delete(long messageId) throws DataAccessException {
83-
int rows = jdbcTemplate.update("DELETE FROM message_cache WHERE message_id = ?", messageId);
84-
return rows > 0;
68+
@Override
69+
public int getBatchSize() {
70+
return attachments.size();
71+
}
72+
});
8573
}
8674

8775
/**
@@ -91,7 +79,17 @@ public boolean delete(long messageId) throws DataAccessException {
9179
* @throws SQLException If anything goes wrong.
9280
*/
9381
public List<CachedMessage> getAll() throws DataAccessException {
94-
return jdbcTemplate.query("SELECT * FROM message_cache",(RowMapper<CachedMessage>) (rs, rowNum) -> this.read(rs));
82+
List<CachedMessage> messagesWithLink = jdbcTemplate.query(
83+
"SELECT * FROM message_cache LEFT JOIN message_cache_attachments ON message_cache.message_id = message_cache_attachments.message_id",
84+
(rs, rowNum) -> this.read(rs));
85+
Map<Long, CachedMessage> messages=new LinkedHashMap<>();
86+
for (CachedMessage msg : messagesWithLink) {
87+
CachedMessage previous = messages.putIfAbsent(msg.getMessageId(), msg);
88+
if(previous!=null) {
89+
previous.getAttachments().addAll(msg.getAttachments());
90+
}
91+
}
92+
return new ArrayList<>(messages.values());
9593
}
9694

9795
/**
@@ -103,14 +101,22 @@ public List<CachedMessage> getAll() throws DataAccessException {
103101
*/
104102
public boolean delete(int amount) throws DataAccessException {
105103
int rows = jdbcTemplate.update("DELETE FROM message_cache LIMIT ?", amount);
106-
return rows > 0;
104+
if(rows > 0){
105+
jdbcTemplate.update("DELETE FROM message_cache_attachments WHERE message_id NOT IN (SELECT message_id FROM message_cache)");
106+
return true;
107+
}
108+
return false;
107109
}
108110

109111
private CachedMessage read(ResultSet rs) throws SQLException {
110112
CachedMessage cachedMessage = new CachedMessage();
111-
cachedMessage.setMessageId(rs.getLong("message_id"));
113+
cachedMessage.setMessageId(rs.getLong("message_cache.message_id"));
112114
cachedMessage.setAuthorId(rs.getLong("author_id"));
113115
cachedMessage.setMessageContent(rs.getString("message_content"));
116+
String attachment = rs.getString("link");
117+
if(attachment!=null) {
118+
cachedMessage.getAttachments().add(attachment);
119+
}
114120
return cachedMessage;
115121
}
116122
}

src/main/java/net/javadiscord/javabot/data/h2db/message_cache/model/CachedMessage.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package net.javadiscord.javabot.data.h2db.message_cache.model;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
5+
36
import lombok.Data;
47
import net.dv8tion.jda.api.entities.Message;
8+
import net.dv8tion.jda.api.entities.Message.Attachment;
59

610
/**
711
* Represents a cached Message.
@@ -11,6 +15,7 @@ public class CachedMessage {
1115
private long messageId;
1216
private long authorId;
1317
private String messageContent;
18+
private List<String> attachments=new ArrayList<>();
1419

1520
/**
1621
* Converts a {@link Message} object to a {@link CachedMessage}.
@@ -23,6 +28,11 @@ public static CachedMessage of(Message message) {
2328
cachedMessage.setMessageId(message.getIdLong());
2429
cachedMessage.setAuthorId(message.getAuthor().getIdLong());
2530
cachedMessage.setMessageContent(message.getContentRaw().trim());
31+
cachedMessage.attachments = message
32+
.getAttachments()
33+
.stream()
34+
.map(Attachment::getProxyUrl)
35+
.toList();
2636
return cachedMessage;
2737
}
2838

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CREATE TABLE message_cache_attachments (
2+
message_id BIGINT NOT NULL,
3+
attachment_index INT NOT NULL,
4+
link VARCHAR(255),
5+
PRIMARY KEY(message_id, attachment_index)
6+
)

src/main/resources/database/schema.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ CREATE TABLE message_cache
9696
author_id BIGINT NOT NULL,
9797
message_content VARCHAR(4000) NOT NULL
9898
);
99+
CREATE TABLE message_cache_attachments (
100+
message_id BIGINT NOT NULL,
101+
attachment_index INT NOT NULL,
102+
link VARCHAR(255),
103+
PRIMARY KEY(message_id, attachment_index)
104+
)
99105

100106
// User Preferences
101107
CREATE TABLE user_preferences

0 commit comments

Comments
 (0)