added configurable warning and success reactions

changed that channels dont actually get deleted, but rather with a deleted flag, so the foreign keys are valid
added more optionals to server/channel/message/member retrieval
added throwing exceptions instead of just returning null
fixed filtering of deleted channels while the bot was offline
fixed channel listener
added message deleted listener structure
moved quartz properties to general application properties, because they were not found in the separate one
added try catch to reminderJob, so that the job is not in an invalid state
we now completely remove the starboard post, in case it falls under the threshold
added code to 'ignore' a staroard post form further stars, in case the post in the starboard gets deleted
now actually setting the reminded flag on a reminder
added handnling in case the channel to remind in does not exist anymore
This commit is contained in:
Sheldan
2020-04-01 23:46:28 +02:00
parent 089862bf15
commit c9557fccc2
45 changed files with 409 additions and 181 deletions

View File

@@ -23,8 +23,12 @@ public class ReminderJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
reminderService.executeReminder(reminderId);
log.info("executing reminder job for reminder {}", reminderId);
try {
reminderService.executeReminder(reminderId);
log.info("executing reminder job for reminder {}", reminderId);
} catch (Exception e) {
log.error("Reminder job failed to execute.", e);
}
}
public Long getReminderId() {

View File

@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
@Slf4j
public class StarboardListener implements ReactedAddedListener, ReactedRemovedListener {
public static final String STAR_EMOTE = "STAR";
public static final String STAR_EMOTE = "star";
@Autowired
private EmoteManagementService emoteManagementService;
@@ -69,8 +69,8 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
if(aEmote.isPresent()) {
AEmote emote = aEmote.get();
MessageReaction.ReactionEmote reactionEmote = addedReaction.getReactionEmote();
Emote emoteInGuild = bot.getEmote(guildId, emote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, Optional.ofNullable(emoteInGuild))) {
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) {
Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, emote);
updateStarboardPost(message, reactionOptional.orElse(null), userAdding, true);
}
@@ -88,6 +88,7 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
AUserInAServer author = userManagementService.loadUser(message.getServerId(), message.getAuthorId());
if(starboardPostOptional.isPresent()) {
StarboardPost starboardPost = starboardPostOptional.get();
starboardPost.setIgnored(false);
starboardService.updateStarboardPost(starboardPost, message, userExceptAuthor);
if(adding) {
starboardPostReactorManagementService.addReactor(starboardPost, userReacting.getUserReference());
@@ -98,19 +99,19 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
starboardService.createStarboardPost(message, userExceptAuthor, userReacting, author);
}
} else {
starboardPostOptional.ifPresent(starboardPost -> {
starboardService.removeStarboardPost(starboardPost);
starboardPostReactorManagementService.removeReactors(starboardPost);
});
starboardPostOptional.ifPresent(this::completelyRemoveStarboardPost);
}
} else {
starboardPostOptional.ifPresent(starboardPost -> {
starboardService.removeStarboardPost(starboardPost);
starboardPostReactorManagementService.removeReactors(starboardPost);
});
starboardPostOptional.ifPresent(this::completelyRemoveStarboardPost);
}
}
private void completelyRemoveStarboardPost(StarboardPost starboardPost) {
starboardPostReactorManagementService.removeReactors(starboardPost);
starboardService.removeStarboardPost(starboardPost);
starboardPostManagementService.removePost(starboardPost);
}
@Override
@Transactional
public void executeReactionRemoved(CachedMessage message, MessageReaction removedReaction, AUserInAServer userRemoving) {
@@ -122,8 +123,8 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
if(aEmote.isPresent()) {
AEmote emote = aEmote.get();
MessageReaction.ReactionEmote reactionEmote = removedReaction.getReactionEmote();
Emote emoteInGuild = bot.getEmote(guildId, emote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, Optional.ofNullable(emoteInGuild))) {
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) {
Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, emote);
updateStarboardPost(message, reactionOptional.orElse(null), userRemoving, false);
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.utility.listener;
import dev.sheldan.abstracto.core.listener.MessageDeletedListener;
import dev.sheldan.abstracto.core.models.CachedMessage;
import dev.sheldan.abstracto.utility.models.StarboardPost;
import dev.sheldan.abstracto.utility.service.management.StarboardPostManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class StarboardPostDeletedListener implements MessageDeletedListener {
@Autowired
private StarboardPostManagementService starboardPostManagementService;
@Override
public void execute(CachedMessage messageBefore) {
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostId(messageBefore.getMessageId());
if(byStarboardPostId.isPresent()) {
starboardPostManagementService.setStarboardPostIgnored(messageBefore.getMessageId(), true);
}
}
}

View File

@@ -7,6 +7,7 @@ import java.util.List;
public interface StarboardPostRepository extends JpaRepository<StarboardPost, Long> {
StarboardPost findByPostMessageId(Long messageId);
StarboardPost findByStarboardMessageId(Long messageId);
List<StarboardPost> findByStarboardChannelServerId(Long serverId);
}

View File

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -92,16 +93,21 @@ public class RemindServiceBean implements ReminderService {
Reminder reminderToRemindFor = reminderManagementService.loadReminder(reminderId);
AServer server = reminderToRemindFor.getServer();
AChannel channel = reminderToRemindFor.getChannel();
AUser userReference = reminderToRemindFor.getToBeReminded().getUserReference();
Member memberInServer = bot.getMemberInServer(server.getId(), userReference.getId());
ExecutedReminderModel build = ExecutedReminderModel
.builder()
.reminder(reminderToRemindFor)
.member(memberInServer)
.build();
MessageToSend messageToSend = templateService.renderEmbedTemplate("remind_reminder", build);
// todo, if channel does not exist anymore
TextChannel channelToAnswerIn = bot.getTextChannelFromServer(server.getId(), channel.getId());
channelToAnswerIn.sendMessage(messageToSend.getMessage()).embed(messageToSend.getEmbed()).queue();
Optional<TextChannel> channelToAnswerIn = bot.getTextChannelFromServer(server.getId(), channel.getId());
// only send the message if the channel still exists, if not, only set the reminder to reminded.
if(channelToAnswerIn.isPresent()) {
AUser userReference = reminderToRemindFor.getToBeReminded().getUserReference();
Member memberInServer = bot.getMemberInServer(server.getId(), userReference.getId());
ExecutedReminderModel build = ExecutedReminderModel
.builder()
.reminder(reminderToRemindFor)
.member(memberInServer)
.build();
MessageToSend messageToSend = templateService.renderEmbedTemplate("remind_reminder", build);
channelToAnswerIn.get().sendMessage(messageToSend.getMessage()).embed(messageToSend.getEmbed()).queue();
} else {
log.warn("Channel {} in server {} to remind user did not exist anymore. Ignoring.", channel.getId(), server.getId());
}
reminderManagementService.setReminded(reminderToRemindFor);
}
}

View File

@@ -92,8 +92,8 @@ public class StarboardServiceBean implements StarboardService {
private StarboardPostModel buildStarboardPostModel(CachedMessage message, Integer starCount) {
Member member = bot.getMemberInServer(message.getServerId(), message.getAuthorId());
TextChannel channel = bot.getTextChannelFromServer(message.getServerId(), message.getChannelId());
Guild guild = bot.getGuildById(message.getServerId());
Optional<TextChannel> channel = bot.getTextChannelFromServer(message.getServerId(), message.getChannelId());
Optional<Guild> guild = bot.getGuildById(message.getServerId());
AChannel aChannel = AChannel.builder().id(message.getChannelId()).build();
AUser user = AUser.builder().id(message.getAuthorId()).build();
AServer server = AServer.builder().id(message.getServerId()).build();
@@ -110,10 +110,10 @@ public class StarboardServiceBean implements StarboardService {
.builder()
.message(message)
.author(member)
.channel(channel)
.channel(channel.orElse(null))
.aChannel(aChannel)
.starCount(starCount)
.guild(guild)
.guild(guild.orElse(null))
.user(user)
.server(server)
.starLevelEmote(emoteText)

View File

@@ -36,4 +36,10 @@ public class ReminderManagementServiceBean implements ReminderManagementService
return reminderRepository.getOne(reminderId);
}
@Override
public void setReminded(Reminder reminder) {
reminder.setReminded(true);
reminderRepository.save(reminder);
}
}

View File

@@ -29,7 +29,6 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme
StarboardPost post = StarboardPost
.builder()
.author(starredUser.getUserReference())
.deleted(false)
.postMessageId(starredMessage.getMessageId())
.starboardMessageId(starboardPost.getMessageId())
.starboardChannel(starboardPost.getChannel())
@@ -68,5 +67,27 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme
return Optional.ofNullable(repository.findByPostMessageId(messageId));
}
@Override
public Optional<StarboardPost> findByStarboardPostId(Long postId) {
return Optional.ofNullable(repository.findByStarboardMessageId(postId));
}
@Override
public void setStarboardPostIgnored(Long messageId, Boolean newValue) {
StarboardPost post = repository.findByStarboardMessageId(messageId);
post.setIgnored(newValue);
repository.save(post);
}
@Override
public boolean isStarboardPost(Long messageId) {
return repository.findByStarboardMessageId(messageId) != null;
}
@Override
public void removePost(StarboardPost starboardPost) {
repository.deleteById(starboardPost.getId());
}
}

View File

@@ -60,7 +60,7 @@ public class SuggestionManagementServiceBean implements SuggestionManagementServ
suggestion.setMessageId(message.getIdLong());
AChannel channel = channelManagementService.loadChannel(message.getTextChannel().getIdLong());
suggestion.setChannel(channel);
AServer server = serverManagementService.loadServer(message.getGuild().getIdLong());
AServer server = serverManagementService.loadOrCreate(message.getGuild().getIdLong());
suggestion.setServer(server);
suggestionRepository.save(suggestion);
}

View File

@@ -52,7 +52,7 @@ public class StarboardPost {
private Instant starredDate;
@Column
private boolean deleted;
private boolean ignored;
public int getReactionCount() {
if(this.reactions == null) {

View File

@@ -8,4 +8,5 @@ import java.time.Instant;
public interface ReminderManagementService {
Reminder createReminder(AServerAChannelAUser userToBeReminded, String text, Instant timeToBeRemindedAt, Long messageId);
Reminder loadReminder(Long reminderId);
void setReminded(Reminder reminder);
}

View File

@@ -15,4 +15,8 @@ public interface StarboardPostManagementService {
List<StarboardPost> retrieveAllPosts(Long serverId);
Integer getPostCount(Long serverId);
Optional<StarboardPost> findByMessageId(Long messageId);
Optional<StarboardPost> findByStarboardPostId(Long postId);
void setStarboardPostIgnored(Long starboardPostId, Boolean newValue);
boolean isStarboardPost(Long starboardPostId);
void removePost(StarboardPost starboardPost);
}