added ability to define and use default emotes (introduced them in starboard/embed deletion/command reactions/suggestions)

fixed post target validation for suggestions
This commit is contained in:
Sheldan
2020-04-10 11:24:16 +02:00
parent ef8dcb61d9
commit e84e384706
13 changed files with 99 additions and 79 deletions

View File

@@ -14,5 +14,4 @@ import java.util.List;
@ConfigurationProperties(prefix = "abstracto.starboard") @ConfigurationProperties(prefix = "abstracto.starboard")
public class StarboardConfig { public class StarboardConfig {
private List<Integer> lvl = new ArrayList<>(); private List<Integer> lvl = new ArrayList<>();
private List<String> badge = new ArrayList<>();
} }

View File

@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AEmote; import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.Bot;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.MessageService; import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.management.EmoteManagementService; import dev.sheldan.abstracto.core.service.management.EmoteManagementService;
import dev.sheldan.abstracto.core.utils.EmoteUtils; import dev.sheldan.abstracto.core.utils.EmoteUtils;
@@ -37,30 +38,29 @@ public class MessageEmbedRemovalReactionListener implements ReactedAddedListener
@Autowired @Autowired
private MessageService messageService; private MessageService messageService;
@Autowired
private EmoteService emoteService;
@Override @Override
public void executeReactionAdded(CachedMessage message, MessageReaction reaction, AUserInAServer userAdding) { public void executeReactionAdded(CachedMessage message, MessageReaction reaction, AUserInAServer userAdding) {
Long guildId = message.getServerId(); Long guildId = message.getServerId();
Optional<AEmote> aEmote = emoteManagementService.loadEmoteByName(REMOVAL_EMOTE, guildId); AEmote aEmote = emoteService.getEmoteOrFakeEmote(REMOVAL_EMOTE, guildId);
if(aEmote.isPresent()) { MessageReaction.ReactionEmote reactionEmote = reaction.getReactionEmote();
AEmote emote = aEmote.get(); Optional<Emote> emoteInGuild = bot.getEmote(guildId, aEmote);
MessageReaction.ReactionEmote reactionEmote = reaction.getReactionEmote(); if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, aEmote, emoteInGuild.orElse(null))) {
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote); Optional<EmbeddedMessage> embeddedMessageOptional = messageEmbedPostManagementService.findEmbeddedPostByMessageId(message.getMessageId());
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) { if(embeddedMessageOptional.isPresent()) {
Optional<EmbeddedMessage> embeddedMessageOptional = messageEmbedPostManagementService.findEmbeddedPostByMessageId(message.getMessageId()); EmbeddedMessage embeddedMessage = embeddedMessageOptional.get();
if(embeddedMessageOptional.isPresent()) { if(embeddedMessage.getEmbeddedUser().getUserReference().getId().equals(userAdding.getUserReference().getId())
EmbeddedMessage embeddedMessage = embeddedMessageOptional.get(); || embeddedMessage.getEmbeddingUser().getUserReference().getId().equals(userAdding.getUserReference().getId())
if(embeddedMessage.getEmbeddedUser().getUserReference().getId().equals(userAdding.getUserReference().getId()) ) {
|| embeddedMessage.getEmbeddingUser().getUserReference().getId().equals(userAdding.getUserReference().getId()) messageService.deleteMessageInChannelInServer(message.getServerId(), message.getChannelId(), message.getMessageId()).thenAccept(aVoid -> {
) { messageEmbedPostManagementService.deleteEmbeddedMessageTransactional(embeddedMessage);
messageService.deleteMessageInChannelInServer(message.getServerId(), message.getChannelId(), message.getMessageId()).thenAccept(aVoid -> { });
messageEmbedPostManagementService.deleteEmbeddedMessageTransactional(embeddedMessage);
});
}
} }
} }
} else {
log.warn("Emote {} is not defined for guild {}. Embed link deletion not functional.", REMOVAL_EMOTE, guildId);
} }
} }

View File

@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AUser; import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.Bot; import dev.sheldan.abstracto.core.service.Bot;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.MessageCache; import dev.sheldan.abstracto.core.service.MessageCache;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService; import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.EmoteManagementService; import dev.sheldan.abstracto.core.service.management.EmoteManagementService;
@@ -59,6 +60,9 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
@Autowired @Autowired
private UserManagementService userManagementService; private UserManagementService userManagementService;
@Autowired
private EmoteService emoteService;
@Override @Override
@Transactional @Transactional
public void executeReactionAdded(CachedMessage message, MessageReaction addedReaction, AUserInAServer userAdding) { public void executeReactionAdded(CachedMessage message, MessageReaction addedReaction, AUserInAServer userAdding) {
@@ -66,17 +70,12 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
return; return;
} }
Long guildId = message.getServerId(); Long guildId = message.getServerId();
Optional<AEmote> aEmote = emoteManagementService.loadEmoteByName(STAR_EMOTE, guildId); AEmote aEmote = emoteService.getEmoteOrFakeEmote(STAR_EMOTE, guildId);
if(aEmote.isPresent()) { MessageReaction.ReactionEmote reactionEmote = addedReaction.getReactionEmote();
AEmote emote = aEmote.get(); Optional<Emote> emoteInGuild = bot.getEmote(guildId, aEmote);
MessageReaction.ReactionEmote reactionEmote = addedReaction.getReactionEmote(); if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, aEmote, emoteInGuild.orElse(null))) {
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote); Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, aEmote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) { updateStarboardPost(message, reactionOptional.orElse(null), userAdding, true);
Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, emote);
updateStarboardPost(message, reactionOptional.orElse(null), userAdding, true);
}
} else {
log.warn("Emote {} is not defined for guild {}. Starboard not functional.", STAR_EMOTE, guildId);
} }
} }
@@ -124,17 +123,12 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
return; return;
} }
Long guildId = message.getServerId(); Long guildId = message.getServerId();
Optional<AEmote> aEmote = emoteManagementService.loadEmoteByName(STAR_EMOTE, guildId); AEmote aEmote = emoteService.getEmoteOrFakeEmote(STAR_EMOTE, guildId);
if(aEmote.isPresent()) { MessageReaction.ReactionEmote reactionEmote = removedReaction.getReactionEmote();
AEmote emote = aEmote.get(); Optional<Emote> emoteInGuild = bot.getEmote(guildId, aEmote);
MessageReaction.ReactionEmote reactionEmote = removedReaction.getReactionEmote(); if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, aEmote, emoteInGuild.orElse(null))) {
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote); Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, aEmote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) { updateStarboardPost(message, reactionOptional.orElse(null), userRemoving, false);
Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, emote);
updateStarboardPost(message, reactionOptional.orElse(null), userRemoving, false);
}
} else {
log.warn("Emote {} is not defined for guild {}. Starboard not functional.", STAR_EMOTE, guildId);
} }
} }

View File

@@ -106,15 +106,7 @@ public class StarboardServiceBean implements StarboardService {
AChannel aChannel = AChannel.builder().id(message.getChannelId()).build(); AChannel aChannel = AChannel.builder().id(message.getChannelId()).build();
AUser user = AUser.builder().id(message.getAuthorId()).build(); AUser user = AUser.builder().id(message.getAuthorId()).build();
AServer server = AServer.builder().id(message.getServerId()).build(); AServer server = AServer.builder().id(message.getServerId()).build();
Optional<AEmote> appropriateEmoteOptional = getAppropriateEmote(message.getServerId(), starCount); String starLevelEmote = getAppropriateEmote(message.getServerId(), starCount);
String emoteText;
if(appropriateEmoteOptional.isPresent()) {
AEmote emote = appropriateEmoteOptional.get();
emoteText = emoteService.getEmoteAsMention(emote, message.getServerId(), "");
} else {
log.warn("No emote defined to be used for starboard post. Falling back to default.");
emoteText = "";
}
return StarboardPostModel return StarboardPostModel
.builder() .builder()
.message(message) .message(message)
@@ -125,7 +117,7 @@ public class StarboardServiceBean implements StarboardService {
.guild(guild.orElse(null)) .guild(guild.orElse(null))
.user(user) .user(user)
.server(server) .server(server)
.starLevelEmote(emoteText) .starLevelEmote(starLevelEmote)
.build(); .build();
} }
@@ -161,10 +153,7 @@ public class StarboardServiceBean implements StarboardService {
Integer reactionCount = starboardPostReactorManagementService.getStarCount(serverId); Integer reactionCount = starboardPostReactorManagementService.getStarCount(serverId);
List<String> emotes = new ArrayList<>(); List<String> emotes = new ArrayList<>();
for (int i = 1; i < count + 1; i++) { for (int i = 1; i < count + 1; i++) {
Optional<AEmote> starboardRankingEmote = getStarboardRankingEmote(serverId, i); emotes.add(getStarboardRankingEmote(serverId, i));
AEmote emote = starboardRankingEmote.orElse(null);
String defaultEmoji = starboardConfig.getBadge().get(i - 1);
emotes.add(emoteService.getEmoteAsMention(emote, serverId, defaultEmoji));
} }
return StarStatsModel return StarStatsModel
@@ -178,17 +167,21 @@ public class StarboardServiceBean implements StarboardService {
.build(); .build();
} }
private Optional<AEmote> getStarboardRankingEmote(Long serverId, Integer position) { private String getStarboardRankingEmote(Long serverId, Integer position) {
return emoteManagementService.loadEmoteByName("starboardBadge" + position, serverId); return emoteService.getUsableEmoteOrDefault(serverId, buildBadgeName(position));
} }
private Optional<AEmote> getAppropriateEmote(Long serverId, Integer starCount) { private String buildBadgeName(Integer position) {
return "starboardBadge" + position;
}
private String getAppropriateEmote(Long serverId, Integer starCount) {
for(int i = starboardConfig.getLvl().size(); i > 0; i--) { for(int i = starboardConfig.getLvl().size(); i > 0; i--) {
Double starMinimum = configService.getDoubleValue("starLvl" + i, serverId); Double starMinimum = configService.getDoubleValue("starLvl" + i, serverId);
if(starCount >= starMinimum) { if(starCount >= starMinimum) {
return emoteManagementService.loadEmoteByName("star" + i, serverId); return emoteService.getUsableEmoteOrDefault(serverId, "star" + i);
} }
} }
return emoteManagementService.loadEmoteByName("star0", serverId); return emoteService.getUsableEmoteOrDefault(serverId, "star0");
} }
} }

View File

@@ -138,8 +138,6 @@ public class SuggestionServiceBean implements SuggestionService {
@Override @Override
public void validateSetup(Long serverId) { public void validateSetup(Long serverId) {
emoteService.throwIfEmoteDoesNotExist(SUGGESTION_YES_EMOTE, serverId); postTargetService.throwIfPostTargetIsNotDefined(SUGGESTIONS_TARGET, serverId);
emoteService.throwIfEmoteDoesNotExist(SUGGESTION_NO_EMOTE, serverId);
postTargetService.throwIfPostTargetIsNotDefined(SUGGESTION_YES_EMOTE, serverId);
} }
} }

View File

@@ -2,13 +2,21 @@ abstracto.postTargets.utility=suggestions,starboard
abstracto.emoteNames.suggestion=suggestionYes,suggestionNo abstracto.emoteNames.suggestion=suggestionYes,suggestionNo
abstracto.emoteNames.starboard=star,star1,star2,star3,star4,starboardBadge1,starboardBadge2,starboardBadge3 abstracto.emoteNames.starboard=star,star1,star2,star3,star4,starboardBadge1,starboardBadge2,starboardBadge3
abstracto.emoteNames.embed=removeEmbed abstracto.emoteNames.embed=removeEmbed
abstracto.defaultEmotes.suggestionYes=\u2B06\uFE0F
abstracto.defaultEmotes.suggestionNo=\u2B07\uFE0F
abstracto.defaultEmotes.star=\u2B50
abstracto.defaultEmotes.star1=\u2B50
abstracto.defaultEmotes.star2=\uD83C\uDF1F
abstracto.defaultEmotes.star3=\uD83D\uDCAB
abstracto.defaultEmotes.star4=\uD83C\uDF20
abstracto.defaultEmotes.starboardBadge1=\ud83e\udd47
abstracto.defaultEmotes.starboardBadge2=\ud83e\udd48
abstracto.defaultEmotes.starboardBadge3=\ud83e\udd49
abstracto.defaultEmotes.removeEmbed=\uD83D\uDDD1\uFE0F
abstracto.starboard.lvl[0]=5 abstracto.starboard.lvl[0]=5
abstracto.starboard.lvl[1]=8 abstracto.starboard.lvl[1]=8
abstracto.starboard.lvl[2]=13 abstracto.starboard.lvl[2]=13
abstracto.starboard.lvl[3]=17 abstracto.starboard.lvl[3]=17
abstracto.starboard.badge[0]=\ud83e\udd47
abstracto.starboard.badge[1]=\ud83e\udd48
abstracto.starboard.badge[2]=\ud83e\udd49
abstracto.scheduling.jobs.reminderJob.name=reminderJob abstracto.scheduling.jobs.reminderJob.name=reminderJob
abstracto.scheduling.jobs.reminderJob.group=utility abstracto.scheduling.jobs.reminderJob.group=utility
@@ -16,8 +24,8 @@ abstracto.scheduling.jobs.reminderJob.clazz=dev.sheldan.abstracto.utility.jobs.R
abstracto.scheduling.jobs.reminderJob.standAlone=false abstracto.scheduling.jobs.reminderJob.standAlone=false
abstracto.scheduling.jobs.reminderJob.active=true abstracto.scheduling.jobs.reminderJob.active=true
abstracto.features.starboard=false abstracto.features.starboard=true
abstracto.features.reminder=false abstracto.features.remind=true
abstracto.features.suggestion=false abstracto.features.suggestion=false
abstracto.features.utility=false abstracto.features.utility=false
abstracto.features.embeds=true abstracto.features.embeds=true

View File

@@ -19,6 +19,7 @@ public class DynamicKeyLoader {
private HashMap<String, String> postTargets = new HashMap<>(); private HashMap<String, String> postTargets = new HashMap<>();
private HashMap<String, String> emoteNames = new HashMap<>(); private HashMap<String, String> emoteNames = new HashMap<>();
private HashMap<String, String> defaultEmotes = new HashMap<>();
public List<String> getPostTargetsAsList() { public List<String> getPostTargetsAsList() {
return getHashMapAsList(postTargets); return getHashMapAsList(postTargets);

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.service; package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.DynamicKeyLoader;
import dev.sheldan.abstracto.core.exception.EmoteException; import dev.sheldan.abstracto.core.exception.EmoteException;
import dev.sheldan.abstracto.core.models.database.AEmote; import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.service.management.EmoteManagementService; import dev.sheldan.abstracto.core.service.management.EmoteManagementService;
@@ -22,6 +23,9 @@ public class EmoteServiceBean implements EmoteService {
@Autowired @Autowired
private EmoteManagementService emoteManagementService; private EmoteManagementService emoteManagementService;
@Autowired
private DynamicKeyLoader keyLoader;
@Override @Override
public boolean isEmoteUsableByBot(Emote emote) { public boolean isEmoteUsableByBot(Emote emote) {
for (Guild guild : botService.getInstance().getGuilds()) { for (Guild guild : botService.getInstance().getGuilds()) {
@@ -65,10 +69,28 @@ public class EmoteServiceBean implements EmoteService {
return this.getEmoteAsMention(emote, serverId, " "); return this.getEmoteAsMention(emote, serverId, " ");
} }
@Override
public String getUsableEmoteOrDefault(Long serverId, String name) {
Optional<AEmote> aEmote = emoteManagementService.loadEmoteByName(name, serverId);
String defaultEmote = getDefaultEmote(name);
return getEmoteAsMention(aEmote.orElse(null), serverId, defaultEmote);
}
@Override @Override
public void throwIfEmoteDoesNotExist(String emoteKey, Long serverId) { public void throwIfEmoteDoesNotExist(String emoteKey, Long serverId) {
if(!emoteManagementService.loadEmoteByName(emoteKey, serverId).isPresent()) { if(!emoteManagementService.loadEmoteByName(emoteKey, serverId).isPresent()) {
throw new EmoteException(String.format("Emote %s not defined.", emoteKey)); throw new EmoteException(String.format("Emote %s not defined.", emoteKey));
} }
} }
@Override
public AEmote getEmoteOrFakeEmote(String emoteKey, Long serverId) {
Optional<AEmote> emoteOptional = emoteManagementService.loadEmoteByName(emoteKey, serverId);
return emoteOptional.orElseGet(() -> AEmote.builder().emoteKey(getDefaultEmote(emoteKey)).custom(false).name(emoteKey).build());
}
@Override
public String getDefaultEmote(String emoteKey) {
return keyLoader.getDefaultEmotes().get(emoteKey);
}
} }

View File

@@ -24,6 +24,9 @@ public class MessageServiceBean implements MessageService {
@Autowired @Autowired
private EmoteManagementService emoteManagementService; private EmoteManagementService emoteManagementService;
@Autowired
private EmoteService emoteService;
@Override @Override
public void addReactionToMessage(String emoteKey, Long serverId, Message message) { public void addReactionToMessage(String emoteKey, Long serverId, Message message) {
Optional<Guild> guildByIdOptional = bot.getGuildById(serverId); Optional<Guild> guildByIdOptional = bot.getGuildById(serverId);
@@ -44,9 +47,8 @@ public class MessageServiceBean implements MessageService {
message.addReaction(emote.getEmoteKey()).queue(); message.addReaction(emote.getEmoteKey()).queue();
} }
} else { } else {
log.error("Cannot add reaction, emote {} not defined for server {}.", emoteKey, serverId); String defaultEmote = emoteService.getDefaultEmote(emoteKey);
throw new EmoteException(String.format("Cannot add reaction. Emote `%s` not defined in server %s. Define the emote via the setEmote command.", emoteKey, serverId)); message.addReaction(defaultEmote).queue();}
}
} else { } else {
log.error("Cannot add reaction, guild not found {}", serverId); log.error("Cannot add reaction, guild not found {}", serverId);
throw new GuildException(String.format("Cannot add reaction, guild %s not found.", serverId)); throw new GuildException(String.format("Cannot add reaction, guild %s not found.", serverId));

View File

@@ -1 +1,3 @@
abstracto.emoteNames.postReaction=warnReaction,successReaction abstracto.emoteNames.postReaction=warnReaction,successReaction
abstracto.defaultEmotes.warnReaction=\u26A0\uFE0F
abstracto.defaultEmotes.successReaction=\u2705

View File

@@ -7,7 +7,10 @@ import net.dv8tion.jda.api.entities.MessageReaction;
public interface EmoteService { public interface EmoteService {
boolean isEmoteUsableByBot(Emote emote); boolean isEmoteUsableByBot(Emote emote);
AEmote buildAEmoteFromReaction(MessageReaction.ReactionEmote reaction); AEmote buildAEmoteFromReaction(MessageReaction.ReactionEmote reaction);
String getEmoteAsMention(AEmote emote, Long serverId, String defaultText) ; String getEmoteAsMention(AEmote emote, Long serverId, String defaultText);
String getEmoteAsMention(AEmote emote, Long serverId) ; String getEmoteAsMention(AEmote emote, Long serverId);
void throwIfEmoteDoesNotExist(String emoteKey, Long serverId) ; String getUsableEmoteOrDefault(Long serverId, String name);
void throwIfEmoteDoesNotExist(String emoteKey, Long serverId);
AEmote getEmoteOrFakeEmote(String emoteKey, Long serverId);
String getDefaultEmote(String emoteKey);
} }

View File

@@ -1,7 +1,5 @@
package dev.sheldan.abstracto.core.service.management; package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.exception.ConfigurationException;
import dev.sheldan.abstracto.core.exception.EmoteException;
import dev.sheldan.abstracto.core.models.database.AEmote; import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AServer;
import net.dv8tion.jda.api.entities.Emote; import net.dv8tion.jda.api.entities.Emote;

View File

@@ -1,5 +1,5 @@
spring.quartz.job-store-type=jdbc spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always spring.quartz.jdbc.initialize-schema=never
spring.quartz.properties.org.quartz.scheduler.instanceName=quartz-abstracto-app spring.quartz.properties.org.quartz.scheduler.instanceName=quartz-abstracto-app