Skip to content

Commit 16970d4

Browse files
committed
use embed fields for staff activity tracking, extensibility
1 parent 70ee0a7 commit 16970d4

File tree

3 files changed

+121
-41
lines changed

3 files changed

+121
-41
lines changed
Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,22 @@
11
package net.javadiscord.javabot.systems.staff_activity;
22

33
import lombok.RequiredArgsConstructor;
4-
import net.dv8tion.jda.api.EmbedBuilder;
54
import net.dv8tion.jda.api.entities.Member;
6-
import net.dv8tion.jda.api.entities.MessageEmbed;
7-
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
85
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
96
import net.dv8tion.jda.api.hooks.ListenerAdapter;
10-
import net.dv8tion.jda.api.utils.TimeFormat;
117
import net.javadiscord.javabot.data.config.BotConfig;
128
import net.javadiscord.javabot.data.config.guild.ModerationConfig;
13-
import net.javadiscord.javabot.systems.staff_activity.dao.StaffActivityMessageRepository;
14-
import net.javadiscord.javabot.systems.staff_activity.model.StaffActivityMessage;
15-
import net.javadiscord.javabot.util.ExceptionLogger;
169

1710
/**
1811
* Listener for tracking staff activity.
19-
* This class maintains a message for each staff member in each channel.
20-
* Each time the staff member sends a message, the message associated with the staff member is updated.
12+
* Each time the staff member sends a message, the staff activity message is updated.
13+
* @see StaffActivityService
2114
*/
2215
@RequiredArgsConstructor
2316
public class StaffActivityListener extends ListenerAdapter {
2417

2518
private final BotConfig botConfig;
26-
private final StaffActivityMessageRepository repository;
19+
private final StaffActivityService service;
2720

2821
@Override
2922
public void onMessageReceived(MessageReceivedEvent event) {
@@ -34,41 +27,11 @@ public void onMessageReceived(MessageReceivedEvent event) {
3427
return;
3528
}
3629
ModerationConfig moderationConfig = botConfig.get(event.getGuild()).getModerationConfig();
37-
TextChannel staffActivityChannel = moderationConfig.getStaffActivityChannel();
38-
if (staffActivityChannel == null) {
39-
return;
40-
}
4130
Member member = event.getMember();
4231
if (!member.getRoles().contains(moderationConfig.getStaffRole())) {
4332
return;
4433
}
4534

46-
sendStaffActivityEmbed(event, staffActivityChannel, member);
47-
}
48-
49-
private void sendStaffActivityEmbed(MessageReceivedEvent event, TextChannel staffActivityChannel, Member member) {
50-
MessageEmbed embed = new EmbedBuilder()
51-
.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl())
52-
.setDescription("Last sent message: " + TimeFormat.RELATIVE.format(event.getMessage().getTimeCreated()))
53-
.setFooter(member.getId())
54-
.build();
55-
56-
Long msgId = repository.getMessageId(staffActivityChannel.getGuild().getIdLong(), member.getIdLong());
57-
if (msgId != null) {
58-
staffActivityChannel
59-
.retrieveMessageById(msgId)
60-
.queue(
61-
activityMessage -> activityMessage.editMessageEmbeds(embed).queue(),
62-
notFound -> createNewMessage(staffActivityChannel, embed, member));
63-
} else {
64-
createNewMessage(staffActivityChannel, embed, member);
65-
}
66-
}
67-
68-
private void createNewMessage(TextChannel staffActivityChannel, MessageEmbed embed, Member member) {
69-
staffActivityChannel.sendMessageEmbeds(embed).queue(success ->
70-
repository.insertOrReplace(new StaffActivityMessage(member.getGuild().getIdLong(), member.getIdLong(), success.getIdLong())),
71-
error -> ExceptionLogger.capture(error, "Cannot create new staff activity message")
72-
);
35+
service.updateStaffActivity(StaffActivityType.LAST_MESSAGE, event.getMessage().getTimeCreated(), member);
7336
}
7437
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package net.javadiscord.javabot.systems.staff_activity;
2+
3+
import java.time.temporal.TemporalAccessor;
4+
import java.util.Iterator;
5+
import java.util.List;
6+
7+
import org.springframework.stereotype.Service;
8+
9+
import lombok.RequiredArgsConstructor;
10+
import net.dv8tion.jda.api.EmbedBuilder;
11+
import net.dv8tion.jda.api.entities.Member;
12+
import net.dv8tion.jda.api.entities.Message;
13+
import net.dv8tion.jda.api.entities.MessageEmbed;
14+
import net.dv8tion.jda.api.entities.MessageEmbed.Field;
15+
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
16+
import net.dv8tion.jda.api.utils.TimeFormat;
17+
import net.javadiscord.javabot.data.config.BotConfig;
18+
import net.javadiscord.javabot.systems.staff_activity.dao.StaffActivityMessageRepository;
19+
import net.javadiscord.javabot.systems.staff_activity.model.StaffActivityMessage;
20+
import net.javadiscord.javabot.util.ExceptionLogger;
21+
22+
/**
23+
* Responsible for staff activity tracking.
24+
* This class maintains a message for each staff member in each channel.
25+
* This message is updated when a staff activity action occurs.
26+
*/
27+
@Service
28+
@RequiredArgsConstructor
29+
public class StaffActivityService {
30+
private final BotConfig botConfig;
31+
private final StaffActivityMessageRepository repository;
32+
33+
/**
34+
* Updates the staff activity message or creates it if necessary.
35+
* Called when a tracked staff activity is executed.
36+
* If no channel is configured for staff activity, this method doesn't do anything.
37+
* @param type The type of the occured staff activity
38+
* @param timestamp The timestamp when the activity occured
39+
* @param member The saff member
40+
*/
41+
public void updateStaffActivity(StaffActivityType type, TemporalAccessor timestamp, Member member) {
42+
TextChannel staffActivityChannel = botConfig.get(member.getGuild()).getModerationConfig().getStaffActivityChannel();
43+
if (staffActivityChannel == null) {
44+
return;
45+
}
46+
Long msgId = repository.getMessageId(staffActivityChannel.getGuild().getIdLong(), member.getIdLong());
47+
if (msgId != null) {
48+
staffActivityChannel
49+
.retrieveMessageById(msgId)
50+
.queue(
51+
activityMessage -> replaceActivityMessage(type, timestamp, activityMessage, member),
52+
notFound -> createNewMessage(staffActivityChannel, member, type, timestamp));
53+
} else {
54+
createNewMessage(staffActivityChannel, member, type, timestamp);
55+
}
56+
}
57+
58+
private void replaceActivityMessage(StaffActivityType type, TemporalAccessor timestamp, Message activityMessage, Member member) {
59+
List<MessageEmbed> embeds = activityMessage.getEmbeds();
60+
MessageEmbed embed;
61+
if(embeds.isEmpty()) {
62+
embed = createStaffActivityEmbedWithEntry(member, type, timestamp);
63+
}else {
64+
embed = replaceActivityEmbedField(embeds.get(0), type, timestamp);
65+
}
66+
activityMessage.editMessageEmbeds(embed).queue();
67+
}
68+
69+
private MessageEmbed replaceActivityEmbedField(MessageEmbed embed, StaffActivityType type, TemporalAccessor timestamp) {
70+
EmbedBuilder eb = new EmbedBuilder(embed);
71+
for (Iterator<Field> it = eb.getFields().iterator(); it.hasNext();) {
72+
Field field = it.next();
73+
if(type.getTitle().equals(field.getName())) {
74+
it.remove();
75+
}
76+
}
77+
eb.addField(type.getTitle(), TimeFormat.RELATIVE.format(timestamp), false);
78+
return eb.build();
79+
}
80+
81+
void createNewMessage(TextChannel staffActivityChannel, Member member, StaffActivityType type, TemporalAccessor timestamp) {
82+
MessageEmbed embed = createStaffActivityEmbedWithEntry(member, type, timestamp);
83+
staffActivityChannel.sendMessageEmbeds(embed).queue(success ->
84+
repository.insertOrReplace(new StaffActivityMessage(member.getGuild().getIdLong(), member.getIdLong(), success.getIdLong())),
85+
error -> ExceptionLogger.capture(error, "Cannot create new staff activity message")
86+
);
87+
}
88+
89+
private MessageEmbed createStaffActivityEmbedWithEntry(Member member, StaffActivityType type, TemporalAccessor timestamp) {
90+
return replaceActivityEmbedField(createEmptyStaffActivityEmbed(member), type, timestamp);
91+
}
92+
93+
private MessageEmbed createEmptyStaffActivityEmbed(Member member) {
94+
return new EmbedBuilder()
95+
.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl())
96+
.setFooter(member.getId())
97+
.build();
98+
}
99+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package net.javadiscord.javabot.systems.staff_activity;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
/**
7+
* Types of recorded staff activities.
8+
*/
9+
@RequiredArgsConstructor
10+
public enum StaffActivityType {
11+
/**
12+
* The last message sent by the staff member.
13+
*/
14+
LAST_MESSAGE("Last message sent");
15+
16+
@Getter
17+
private final String title;
18+
}

0 commit comments

Comments
 (0)