Skip to content

Commit

Permalink
Fix error handling for subscribed events so they do not stop processing
Browse files Browse the repository at this point in the history
if an error condition is encountered

Instead they will gracefully log the error condition and continue to
process events.

Added better error handling to the Clan compare interaction
  • Loading branch information
SoAJeff committed Oct 31, 2023
1 parent 36480eb commit ab66cf3
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.soa.rs.discordbot.v3.usertrack.UserTrackGuildCreate;

import discord4j.core.event.domain.guild.GuildCreateEvent;
import reactor.core.publisher.Mono;

public class GuildCreateHandler {

Expand All @@ -22,19 +23,19 @@ public GuildCreateHandler() {
this.guildCreate.setRecentActionUtility(new RecentActionUtility());
}

public void handleGuildCreate(GuildCreateEvent event) {
public Mono<Void> handleGuildCreate(GuildCreateEvent event) {
if (DiscordCfgFactory.getConfig().getUserTrackingEvent() != null && DiscordCfgFactory.getConfig()
.getUserTrackingEvent().isEnabled()) {
guildCreate.handleJoinedGuild(event);
return Mono.fromRunnable(()->guildCreate.handleJoinedGuild(event)).then();
}
return Mono.empty();
}

public void setLastSeenCache(RecentCache cache) {
this.guildCreate.setLastSeenCache(cache);
}

public void setLastActiveCache(RecentCache cache)
{
public void setLastActiveCache(RecentCache cache) {
this.guildCreate.setLastActiveCache(cache);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.soa.rs.discordbot.v3.usertrack.UserTrackMemberJoin;

import discord4j.core.event.domain.guild.MemberJoinEvent;
import reactor.core.publisher.Mono;

public class MemberJoinHandler {

Expand All @@ -19,9 +20,10 @@ public MemberJoinHandler() {
this.userTrackMemberJoin.setRecentActionUtility(new RecentActionUtility());
}

public void handle(MemberJoinEvent event) {
public Mono<Void> handle(MemberJoinEvent event) {
if (DiscordCfgFactory.getInstance().isUserTrackingEnabled() && !event.getMember().isBot()) {
userTrackMemberJoin.handleAddUser(event.getMember());
return Mono.fromRunnable(()->userTrackMemberJoin.handleAddUser(event.getMember()));
}
return Mono.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import discord4j.core.event.domain.guild.BanEvent;
import discord4j.core.event.domain.guild.MemberLeaveEvent;
import discord4j.core.object.entity.channel.MessageChannel;
import reactor.core.publisher.Mono;

public class MemberLeftHandler {

Expand All @@ -21,34 +22,36 @@ public MemberLeftHandler() {
this.memberLeft.setRecentActionUtility(new RecentActionUtility());
}

public void handle(MemberLeaveEvent memberLeaveEvent) {
public Mono<Void> handle(MemberLeaveEvent memberLeaveEvent) {
if (DiscordCfgFactory.getInstance().isUserTrackingEnabled() && memberLeaveEvent.getMember().isPresent()) {
if (!memberLeaveEvent.getMember().get().isBot()) {
this.memberLeft.handleMemberLeft(memberLeaveEvent.getMember().get());
}
}
if(memberLeaveEvent.getGuildId().asLong() == 133922153010692096L)
{
memberLeaveEvent.getGuild().flatMap(guild -> guild.getChannelById(Snowflake.of(974413726063132793L)))
return memberLeaveEvent.getGuild().flatMap(guild -> guild.getChannelById(Snowflake.of(974413726063132793L)))
.flatMap(guildChannel -> ((MessageChannel) guildChannel).createMessage(
memberLeaveEvent.getUser().getUsername() + "#" + memberLeaveEvent.getUser()
.getDiscriminator() + " has left the server.")).subscribe();
.getDiscriminator() + " has left the server.")).then();
}
return Mono.empty();
}

public void handle(BanEvent banEvent) {
public Mono<Void> handle(BanEvent banEvent) {
if (DiscordCfgFactory.getInstance().isUserTrackingEnabled()) {
SoaLogging.getLogger(this)
.debug("Member [@" + banEvent.getUser().getUsername() + "#" + banEvent.getUser().getDiscriminator()
+ ", " + banEvent.getUser().getId().asLong() + ", " + banEvent.getGuildId().asLong()
+ "] was banned, marking as left server");
this.memberLeft.handleUserBanned(banEvent.getUser().getId().asLong(), banEvent.getGuildId().asLong());
if (banEvent.getGuildId().asLong() == 133922153010692096L) {
banEvent.getGuild().flatMap(guild -> guild.getChannelById(Snowflake.of(974413726063132793L))).flatMap(
return banEvent.getGuild().flatMap(guild -> guild.getChannelById(Snowflake.of(974413726063132793L))).flatMap(
guildChannel -> ((MessageChannel) guildChannel).createMessage(
banEvent.getUser().getUsername() + "#" + banEvent.getUser().getDiscriminator()
+ " was banned from the server.")).subscribe();
+ " was banned from the server.")).then();
}
}
return Mono.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ public Mono<Void> handle(MemberUpdateEvent event) {
.flatMap(member -> Mono.fromRunnable(() -> userTrackMemberUpdated.handleMemberUpdate(member))).then();
}

public void handle(UserUpdateEvent event) {
public Mono<Void> handle(UserUpdateEvent event) {
if (DiscordCfgFactory.getInstance().isUserTrackingEnabled() && !event.getCurrent().isBot()) {
userTrackMemberUpdated.handleUserUpdate(event.getCurrent());
return Mono.fromRunnable(()->userTrackMemberUpdated.handleUserUpdate(event.getCurrent())).then();
}
return Mono.empty();
}

public Mono<Void> handle(PresenceUpdateEvent event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,47 +144,56 @@ private void registerEvents(GatewayDiscordClient gatewayDiscordClient) {

gatewayDiscordClient.on(MessageCreateEvent.class).flatMap(event -> messageCreateHandler.handle(event)
.onErrorResume(err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during message create event.", err)
))).subscribe();
.error("Unexpected error occurred during message create event.", err)))).subscribe();

gatewayDiscordClient.on(ChatInputInteractionEvent.class).flatMap(interactionProcessor::processInteraction).subscribe(null,
err -> SoaLogging.getLogger(this)
.error("Unexpected error occurred while processing interaction.", err));
gatewayDiscordClient.on(ChatInputInteractionEvent.class).flatMap(interactionProcessor::processInteraction)
.onErrorResume(err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred while processing interaction.", err))).subscribe();

gatewayDiscordClient.on(ModalSubmitInteractionEvent.class).flatMap(interactionProcessor::processModal).subscribe(null,
err -> SoaLogging.getLogger(this)
.error("Unexpected error occurred while processing interaction.", err));
gatewayDiscordClient.on(ModalSubmitInteractionEvent.class).flatMap(interactionProcessor::processModal)
.onErrorResume(err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred while processing interaction.", err))).subscribe();

gatewayDiscordClient.on(GuildCreateEvent.class).subscribe(guildCreateHandler::handleGuildCreate,
err -> SoaLogging.getLogger(this).error("Unexpected error occurred during guild create event.", err));
gatewayDiscordClient.on(GuildCreateEvent.class).flatMap(guildCreateHandler::handleGuildCreate).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during guild create event.", err))).subscribe();

gatewayDiscordClient.on(MemberJoinEvent.class).subscribe(memberJoinHandler::handle,
err -> SoaLogging.getLogger(this).error("Unexpected error occurred during member join event.", err));
gatewayDiscordClient.on(MemberJoinEvent.class).flatMap(memberJoinHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during member join event.", err))).subscribe();

gatewayDiscordClient.on(MemberLeaveEvent.class).subscribe(memberLeftHandler::handle,
err -> SoaLogging.getLogger(this).error("Unexpected error occurred during member leave event.", err));
gatewayDiscordClient.on(MemberLeaveEvent.class).flatMap(memberLeftHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during member leave event.", err))).subscribe();

gatewayDiscordClient.on(BanEvent.class).subscribe(memberLeftHandler::handle,
err -> SoaLogging.getLogger(this).error("Unexpected error occurred during member leave event.", err));
gatewayDiscordClient.on(BanEvent.class).flatMap(memberLeftHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during member leave event.", err))).subscribe();

gatewayDiscordClient.on(MemberUpdateEvent.class).flatMap(memberUpdateHandler::handle).subscribe(null,
err -> SoaLogging.getLogger(this).error("Unexpected error during member update event.", err));
gatewayDiscordClient.on(MemberUpdateEvent.class).flatMap(memberUpdateHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during member update event.", err))).subscribe();

gatewayDiscordClient.on(UserUpdateEvent.class).subscribe(memberUpdateHandler::handle,
err -> SoaLogging.getLogger(this).error("Unexpected error during user update event.", err));
gatewayDiscordClient.on(UserUpdateEvent.class).flatMap(memberUpdateHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during user update event.", err))).subscribe();

gatewayDiscordClient.on(PresenceUpdateEvent.class).flatMap(memberUpdateHandler::handle).subscribe(null,
err -> SoaLogging.getLogger(this).error("Unexpected error during presence update event.", err));
gatewayDiscordClient.on(PresenceUpdateEvent.class).flatMap(memberUpdateHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during presence update event.", err))).subscribe();

gatewayDiscordClient.on(VoiceStateUpdateEvent.class).flatMap(voiceStateUpdateHandler::handle).subscribe(null,
err -> SoaLogging.getLogger(this).error("Unexpected error during voice state update event.", err));
gatewayDiscordClient.on(VoiceStateUpdateEvent.class).flatMap(voiceStateUpdateHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during voice state update event.", err))).subscribe();

gatewayDiscordClient.on(ReactionAddEvent.class).flatMap(reactionAddEventHandler::handle).subscribe(null,
err -> SoaLogging.getLogger(this).error("Unexpected error during reaction add event.", err));
gatewayDiscordClient.on(ReactionAddEvent.class).flatMap(reactionAddEventHandler::handle).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during reaction add event.", err))).subscribe();

if (DiscordCfgFactory.getInstance().isUserTrackingEnabled()) {
gatewayDiscordClient.on(TypingStartEvent.class).flatMap(typingStartHandler::handleTypingStart)
.subscribe(null, err -> SoaLogging.getLogger(this).error("Error processing typing event", err));
.onErrorResume(err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during Typing Start event.", err))).subscribe();
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.soa.rs.discordbot.v3.api.command.AbstractCommand;
import com.soa.rs.discordbot.v3.cfg.DiscordCfgFactory;
import com.soa.rs.discordbot.v3.jdbi.SettingsUtility;
import com.soa.rs.discordbot.v3.util.SoaLogging;

import discord4j.core.event.domain.interaction.ChatInputInteractionEvent;
import discord4j.core.event.domain.interaction.ModalSubmitInteractionEvent;
Expand Down Expand Up @@ -45,12 +46,17 @@ public Mono<Void> execute(MessageCreateEvent event) {

@Override
public Mono<Void> execute(ChatInputInteractionEvent event) {
return event.deferReply().withEphemeral(true).then(Mono.fromCallable(() -> settingsUtility.getValueForKey("clancompare.altId"))
.map(Integer::parseInt)
.flatMap(i -> Mono.fromCallable(() -> processClanCompare(i)))
.flatMapMany(Flux::fromIterable)
.flatMapSequential(s -> event.createFollowup(s).withEphemeral(true)).then())
.then();
return event.deferReply().withEphemeral(true)
.then(Mono.fromCallable(() -> settingsUtility.getValueForKey("clancompare.altId"))
.map(Integer::parseInt).flatMap(i -> Mono.fromCallable(() -> processClanCompare(i)))
.onErrorResume(err -> {
String error = "Error encountered during clan compare operation.";
List<String> e = new ArrayList<>();
e.add(error);
SoaLogging.getLogger(this).error(error, err);
return Mono.just(e);
}).flatMapMany(Flux::fromIterable)
.flatMapSequential(s -> event.createFollowup(s).withEphemeral(true)).then()).then();
}

@Override
Expand All @@ -65,7 +71,7 @@ public List<String> processClanCompare(int altId)

List<String> response = new ArrayList<>();

if(processResult.size() == 0)
if(processResult.isEmpty())
{
response.add("Clan Compare found no deltas between the forums and the in-game clan.");
return response;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

import discord4j.core.event.domain.guild.GuildCreateEvent;
import discord4j.core.object.entity.Guild;
import reactor.core.publisher.Mono;

public class UserTrackGuildCreate {

Expand Down Expand Up @@ -63,8 +64,9 @@ public void handleJoinedGuild(GuildCreateEvent event) {
reviewer.setAllUsers(userUtility.getUsersCurrentlyInGuildForGuildId(guild.getId().asLong()));
reviewer.setLeftUsers(userUtility.getLeftUsersInGuildForGuildId(guild.getId().asLong()));
guild.getMembers().filter(member -> !member.isBot()).flatMap(reviewer::reviewMember)
.doOnComplete(reviewer::submitUsers).doOnComplete(reviewer::removeRemainingUsers).subscribe(null,
err -> SoaLogging.getLogger(this).error("Unexpected error occurred during guild create event.", err));
.doOnComplete(reviewer::submitUsers).doOnComplete(reviewer::removeRemainingUsers).onErrorResume(
err -> Mono.fromRunnable(() -> SoaLogging.getLogger(this)
.error("Unexpected error occurred during guild create event.", err))).subscribe();

}

Expand Down

0 comments on commit ab66cf3

Please sign in to comment.