Skip to content

Commit de65d66

Browse files
authored
GH-159 Store mentioned members in database instead of cache. (#159)
* Store mentioned members in database instead of cache. * Add null check for guild and member in leaderboard
1 parent 0c3172d commit de65d66

File tree

8 files changed

+100
-94
lines changed

8 files changed

+100
-94
lines changed

src/main/java/com/eternalcode/discordapp/DiscordApp.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import com.eternalcode.discordapp.review.GitHubReviewService;
4141
import com.eternalcode.discordapp.review.GitHubReviewTask;
4242
import com.eternalcode.discordapp.review.command.GitHubReviewCommand;
43+
import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepository;
44+
import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepositoryImpl;
4345
import com.eternalcode.discordapp.user.UserRepositoryImpl;
4446
import com.jagrosh.jdautilities.command.CommandClient;
4547
import com.jagrosh.jdautilities.command.CommandClientBuilder;
@@ -67,6 +69,7 @@ public class DiscordApp {
6769

6870
private static ExperienceService experienceService;
6971
private static LevelService levelService;
72+
private static GitHubReviewService gitHubReviewService;
7073

7174
public static void main(String... args) throws InterruptedException {
7275
ObserverRegistry observerRegistry = new ObserverRegistry();
@@ -96,9 +99,12 @@ public static void main(String... args) throws InterruptedException {
9699
DatabaseManager databaseManager = new DatabaseManager(databaseConfig, new File("database"));
97100
databaseManager.connect();
98101
UserRepositoryImpl.create(databaseManager);
102+
GitHubReviewMentionRepository gitHubReviewMentionRepository =
103+
GitHubReviewMentionRepositoryImpl.create(databaseManager);
99104

100105
experienceService = new ExperienceService(databaseManager, observerRegistry);
101106
levelService = new LevelService(databaseManager);
107+
gitHubReviewService = new GitHubReviewService(config, configManager, gitHubReviewMentionRepository);
102108
}
103109
catch (SQLException exception) {
104110
Sentry.captureException(exception);
@@ -112,8 +118,6 @@ public static void main(String... args) throws InterruptedException {
112118
FilterService filterService = new FilterService()
113119
.registerFilter(new RenovateForcedPushFilter());
114120

115-
GitHubReviewService gitHubReviewService = new GitHubReviewService(config, configManager);
116-
117121
CommandClient commandClient = new CommandClientBuilder()
118122
.setOwnerId(config.topOwnerId)
119123
.setActivity(Activity.playing("IntelliJ IDEA"))

src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.eternalcode.discordapp.leveling.Level;
44
import net.dv8tion.jda.api.EmbedBuilder;
5+
import net.dv8tion.jda.api.entities.Guild;
6+
import net.dv8tion.jda.api.entities.Member;
57
import net.dv8tion.jda.api.entities.emoji.Emoji;
68
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
79
import net.dv8tion.jda.api.hooks.ListenerAdapter;
@@ -70,7 +72,19 @@ private void updateLeaderboard(ButtonInteractionEvent event, int currentPage) {
7072

7173
for (Level level : top) {
7274
int userLevel = level.getCurrentLevel();
73-
String effectiveName = event.getGuild().getMemberById(level.getId()).getEffectiveName();
75+
Guild guild = event.getGuild();
76+
77+
if (guild == null) {
78+
continue;
79+
}
80+
81+
Member member = guild.getMemberById(level.getId());
82+
83+
if (member == null) {
84+
continue;
85+
}
86+
87+
String effectiveName = member.getEffectiveName();
7488

7589
leaderboardContent.append(this.leaderboardService.formatLeaderboardEntry(index, effectiveName, userLevel)).append("\n");
7690
index++;

src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.jagrosh.jdautilities.command.SlashCommand;
55
import com.jagrosh.jdautilities.command.SlashCommandEvent;
66
import net.dv8tion.jda.api.EmbedBuilder;
7+
import net.dv8tion.jda.api.entities.Guild;
8+
import net.dv8tion.jda.api.entities.Member;
79
import net.dv8tion.jda.api.interactions.components.buttons.Button;
810
import net.dv8tion.jda.api.entities.emoji.Emoji;
911

@@ -45,7 +47,19 @@ public void execute(SlashCommandEvent event) {
4547

4648
for (Level level : top) {
4749
int userLevel = level.getCurrentLevel();
48-
String effectiveName = event.getGuild().getMemberById(level.getId()).getEffectiveName();
50+
Guild guild = event.getGuild();
51+
52+
if (guild == null) {
53+
continue;
54+
}
55+
56+
Member member = guild.getMemberById(level.getId());
57+
58+
if (member == null) {
59+
continue;
60+
}
61+
62+
String effectiveName = member.getEffectiveName();
4963

5064
leaderboardContent.append(this.leaderboardService.formatLeaderboardEntry(index, effectiveName, userLevel)).append("\n");
5165
index++;

src/main/java/com/eternalcode/discordapp/review/GitHubPullRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class GitHubPullRequest {
1717
private final String repository;
1818
private final int number;
1919

20-
private GitHubPullRequest(String owner, String repository, int number) {
20+
public GitHubPullRequest(String owner, String repository, int number) {
2121
this.owner = owner;
2222
this.repository = repository;
2323
this.number = number;

src/main/java/com/eternalcode/discordapp/review/GitHubReviewMentionRepository.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/main/java/com/eternalcode/discordapp/review/GitHubReviewMentionRepositoryImpl.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/main/java/com/eternalcode/discordapp/review/GitHubReviewService.java

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import com.eternalcode.discordapp.config.AppConfig;
44
import com.eternalcode.discordapp.config.ConfigManager;
5+
import com.eternalcode.discordapp.review.database.GitHubReviewMentionRepository;
56
import io.sentry.Sentry;
67
import java.io.IOException;
78
import java.util.ArrayList;
89
import java.util.List;
10+
import java.util.concurrent.CompletableFuture;
911
import java.util.logging.Logger;
1012
import net.dv8tion.jda.api.JDA;
1113
import net.dv8tion.jda.api.entities.Guild;
@@ -21,16 +23,20 @@ public class GitHubReviewService {
2123
private final static Logger LOGGER = Logger.getLogger(GitHubReviewService.class.getName());
2224

2325
private static final String DM_REVIEW_MESSAGE = "You have been assigned as a reviewer for this pull request: %s";
24-
private static final String SERVER_REVIEW_MESSAGE =
25-
"%s, you have been assigned as a reviewer for this pull request: %s";
26+
private static final String SERVER_REVIEW_MESSAGE = "%s, you have been assigned as a reviewer for this pull request: %s";
2627

2728
private final AppConfig appConfig;
2829
private final ConfigManager configManager;
29-
private final GitHubReviewMentionRepository mentionRepository = new GitHubReviewMentionRepositoryImpl();
30+
private final GitHubReviewMentionRepository mentionRepository;
3031

31-
public GitHubReviewService(AppConfig appConfig, ConfigManager configManager) {
32+
public GitHubReviewService(
33+
AppConfig appConfig,
34+
ConfigManager configManager,
35+
GitHubReviewMentionRepository mentionRepository
36+
) {
3237
this.appConfig = appConfig;
3338
this.configManager = configManager;
39+
this.mentionRepository = mentionRepository;
3440
}
3541

3642
public String createReview(Guild guild, String url, JDA jda) {
@@ -94,6 +100,7 @@ public void mentionReviewers(JDA jda, GitHubPullRequest pullRequest, long forumI
94100
}
95101

96102
StringBuilder reviewersMention = new StringBuilder();
103+
CompletableFuture<Void> mentionFuture = CompletableFuture.completedFuture(null);
97104

98105
for (String reviewer : assignedReviewers) {
99106
GitHubReviewUser gitHubReviewUser = this.getReviewUserByUsername(reviewer);
@@ -104,44 +111,52 @@ public void mentionReviewers(JDA jda, GitHubPullRequest pullRequest, long forumI
104111

105112
Long discordId = gitHubReviewUser.getDiscordId();
106113

107-
if (discordId != null && !this.mentionRepository.isMentioned(pullRequest, discordId)) {
108-
User user = jda.getUserById(discordId);
109-
GitHubReviewNotificationType notificationType = gitHubReviewUser.getNotificationType();
110-
111-
if (user == null) {
112-
return;
113-
}
114-
115-
String message = String.format(DM_REVIEW_MESSAGE, pullRequest.toUrl());
116-
117-
if (notificationType.isDmNotify()) {
118-
try {
119-
LOGGER.info("Sending message to: " + user.getName());
120-
user.openPrivateChannel().queue(
121-
privateChannel -> privateChannel.sendMessage(message).queue(),
122-
throwable -> LOGGER.warning("Cannot send message to: " + user.getName()));
114+
if (discordId != null) {
115+
mentionFuture = mentionFuture.thenComposeAsync(v ->
116+
this.mentionRepository.isMentioned(pullRequest, discordId)
117+
).thenAcceptAsync(isMentioned -> {
118+
if (!isMentioned) {
119+
User user = jda.getUserById(discordId);
120+
GitHubReviewNotificationType notificationType = gitHubReviewUser.getNotificationType();
121+
122+
if (user == null) {
123+
return;
124+
}
125+
126+
String message = String.format(DM_REVIEW_MESSAGE, pullRequest.toUrl());
127+
128+
if (notificationType.isDmNotify()) {
129+
try {
130+
LOGGER.info("Sending message to: " + user.getName());
131+
user.openPrivateChannel().queue(
132+
privateChannel -> privateChannel.sendMessage(message).queue(),
133+
throwable -> LOGGER.warning("Cannot send message to: " + user.getName()));
134+
}
135+
catch (Exception exception) {
136+
Sentry.captureException(exception);
137+
LOGGER.warning("Cannot send message to: " + user.getName());
138+
}
139+
}
140+
if (notificationType.isServerNotify()) {
141+
reviewersMention.append(user.getAsMention()).append(" ");
142+
}
143+
144+
this.mentionRepository.markReviewerAsMentioned(pullRequest, discordId);
123145
}
124-
catch (Exception exception) {
125-
Sentry.captureException(exception);
126-
LOGGER.warning("Cannot send message to: " + user.getName());
127-
}
128-
}
129-
if (notificationType.isServerNotify()) {
130-
reviewersMention.append(user.getAsMention()).append(" ");
131-
}
132-
133-
this.mentionRepository.markReviewerAsMentioned(pullRequest, discordId);
146+
});
134147
}
135148
}
136149

137-
if (!reviewersMention.isEmpty()) {
138-
String message = String.format(SERVER_REVIEW_MESSAGE, reviewersMention, pullRequest.toUrl());
139-
ThreadChannel threadChannel = jda.getThreadChannelById(forumId);
150+
mentionFuture.thenRunAsync(() -> {
151+
if (!reviewersMention.isEmpty()) {
152+
String message = String.format(SERVER_REVIEW_MESSAGE, reviewersMention, pullRequest.toUrl());
153+
ThreadChannel threadChannel = jda.getThreadChannelById(forumId);
140154

141-
if (threadChannel != null) {
142-
threadChannel.sendMessage(message).queue();
155+
if (threadChannel != null) {
156+
threadChannel.sendMessage(message).queue();
157+
}
143158
}
144-
}
159+
});
145160
}
146161

147162
public void mentionReviewersOnAllReviewChannels(JDA jda) {
@@ -204,17 +219,17 @@ public void archiveMergedPullRequest(JDA jda) {
204219

205220
if (GitHubReviewUtil.isPullRequestMerged(pullRequest, this.appConfig.githubToken)) {
206221
threadChannel.getManager()
222+
.setAppliedTags(ForumTagSnowflake.fromId(reviewSystem.mergedTagId))
207223
.setLocked(true)
208224
.setArchived(true)
209-
.setAppliedTags(ForumTagSnowflake.fromId(reviewSystem.mergedTagId))
210225
.queue();
211226
}
212227

213228
if (GitHubReviewUtil.isPullRequestClosed(pullRequest, this.appConfig.githubToken)) {
214229
threadChannel.getManager()
230+
.setAppliedTags(ForumTagSnowflake.fromId(reviewSystem.closedTagId))
215231
.setLocked(true)
216232
.setArchived(true)
217-
.setAppliedTags(ForumTagSnowflake.fromId(reviewSystem.closedTagId))
218233
.queue();
219234
}
220235
}

src/main/java/com/eternalcode/discordapp/review/GitHubReviewTask.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.eternalcode.discordapp.review;
22

3+
import io.sentry.Sentry;
34
import net.dv8tion.jda.api.JDA;
45

56
import java.util.TimerTask;
@@ -16,7 +17,14 @@ public GitHubReviewTask(GitHubReviewService gitHubReviewService, JDA jda) {
1617

1718
@Override
1819
public void run() {
19-
this.gitHubReviewService.archiveMergedPullRequest(this.jda);
20-
this.gitHubReviewService.mentionReviewersOnAllReviewChannels(this.jda);
20+
try {
21+
this.gitHubReviewService.archiveMergedPullRequest(this.jda);
22+
this.gitHubReviewService.mentionReviewersOnAllReviewChannels(this.jda);
23+
System.out.println("GitHub review task executed");
24+
}
25+
catch (Exception exception) {
26+
Sentry.captureException(exception);
27+
exception.printStackTrace();
28+
}
2129
}
2230
}

0 commit comments

Comments
 (0)