[AB-80] added tracking of emotes used by server members and configuration

updated sonar scanner version
changed some commands to be silent instead of adding a check reaction
This commit is contained in:
Sheldan
2020-11-11 17:11:30 +01:00
parent c60cdb9d98
commit 04f1db2408
202 changed files with 7989 additions and 131 deletions

View File

@@ -1,6 +1,8 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.AChanelParameterHandler;
import dev.sheldan.abstracto.core.command.handler.provided.TextChannelParameterHandler;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.service.ChannelService;
import net.dv8tion.jda.api.entities.Message;
@@ -9,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AChannelParameterHandler implements CommandParameterHandler {
public class AChannelParameterHandlerImpl implements AChanelParameterHandler {
@Autowired
private TextChannelParameterHandler textChannelParameterHandler;

View File

@@ -1,6 +1,8 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.AEmoteParameterHandler;
import dev.sheldan.abstracto.core.command.handler.provided.EmoteParameterHandler;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.service.EmoteService;
import net.dv8tion.jda.api.entities.Emote;
@@ -9,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AEmoteParameterHandler implements CommandParameterHandler {
public class AEmoteParameterHandlerImpl implements AEmoteParameterHandler {
@Autowired
private EmoteParameterHandler emoteParameterHandler;

View File

@@ -1,6 +1,8 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.ARoleParameterHandler;
import dev.sheldan.abstracto.core.command.handler.provided.RoleParameterHandler;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.RoleService;
import net.dv8tion.jda.api.entities.Message;
@@ -9,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ARoleParameterHandler implements CommandParameterHandler {
public class ARoleParameterHandlerImpl implements ARoleParameterHandler {
@Autowired
private RoleParameterHandler roleParameterHandler;

View File

@@ -1,11 +1,12 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.BooleanParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@Component
public class BooleanParameterHandler implements CommandParameterHandler {
public class BooleanParameterHandlerImpl implements BooleanParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Boolean.class);

View File

@@ -2,11 +2,12 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.execution.CommandParameterKey;
import dev.sheldan.abstracto.core.command.handler.provided.CommandKeyParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@Component
public class CommandKeyParameterHandler implements CommandParameterHandler {
public class CommandKeyParameterHandlerImpl implements CommandKeyParameterHandler {
@Override
public boolean handles(Class clazz) {

View File

@@ -1,11 +1,12 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.DoubleParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@Component
public class DoubleParameterHandler implements CommandParameterHandler {
public class DoubleParameterHandlerImpl implements DoubleParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Double.class);

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.DurationParameterHandler;
import dev.sheldan.abstracto.core.utils.ParseUtils;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@@ -8,7 +9,7 @@ import org.springframework.stereotype.Component;
import java.time.Duration;
@Component
public class DurationParameterHandler implements CommandParameterHandler {
public class DurationParameterHandlerImpl implements DurationParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Duration.class);

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.EmoteParameterHandler;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Message;
import org.apache.commons.lang3.StringUtils;
@@ -9,7 +10,7 @@ import org.springframework.stereotype.Component;
import java.util.regex.Matcher;
@Component
public class EmoteParameterHandler implements CommandParameterHandler {
public class EmoteParameterHandlerImpl implements EmoteParameterHandler {
@Override
public boolean handles(Class clazz) {

View File

@@ -1,6 +1,8 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.EmoteParameterHandler;
import dev.sheldan.abstracto.core.command.handler.provided.FullEmoteParameterHandler;
import dev.sheldan.abstracto.core.models.FullEmote;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.service.EmoteService;
@@ -10,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FullEmoteParameterHandler implements CommandParameterHandler {
public class FullEmoteParameterHandlerImpl implements FullEmoteParameterHandler {
@Autowired
private EmoteParameterHandler emoteParameterHandler;

View File

@@ -1,6 +1,8 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.FullRoleParameterHandler;
import dev.sheldan.abstracto.core.command.handler.provided.RoleParameterHandler;
import dev.sheldan.abstracto.core.models.FullRole;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.RoleService;
@@ -10,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FullRoleParameterHandler implements CommandParameterHandler {
public class FullRoleParameterHandlerImpl implements FullRoleParameterHandler {
@Autowired
private RoleParameterHandler roleParameterHandler;

View File

@@ -1,11 +1,12 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.IntegerParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@Component
public class IntegerParameterHandler implements CommandParameterHandler {
public class IntegerParameterHandlerImpl implements IntegerParameterHandler {
@Override
public boolean handles(Class clazz) {

View File

@@ -1,11 +1,12 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.LongParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@Component
public class LongParameterHandler implements CommandParameterHandler {
public class LongParameterHandlerImpl implements LongParameterHandler {
@Override
public boolean handles(Class clazz) {

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.MemberParameterHandler;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.stereotype.Component;
@@ -9,7 +10,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
@Component
public class MemberParameterHandler implements CommandParameterHandler {
public class MemberParameterHandlerImpl implements MemberParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Member.class);

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.RoleParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
import org.springframework.stereotype.Component;
@@ -8,7 +9,7 @@ import org.springframework.stereotype.Component;
import java.util.regex.Matcher;
@Component
public class RoleParameterHandler implements CommandParameterHandler {
public class RoleParameterHandlerImpl implements RoleParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(Role.class);

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.handler.provided.TextChannelParameterHandler;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.stereotype.Component;
@@ -8,7 +9,7 @@ import org.springframework.stereotype.Component;
import java.util.regex.Matcher;
@Component
public class TextChannelParameterHandler implements CommandParameterHandler {
public class TextChannelParameterHandlerImpl implements TextChannelParameterHandler {
@Override
public boolean handles(Class clazz) {
return clazz.equals(TextChannel.class);

View File

@@ -44,7 +44,7 @@ public class ListChannelGroups extends AbstractConditionableCommand {
template.setGroups(convertAChannelGroupToChannelGroupChannel(channelGroups));
MessageToSend response = templateService.renderEmbedTemplate("listChannelGroups_response", template);
channelService.sendMessageToSendToChannel(response, commandContext.getChannel());
return CommandResult.fromSuccess();
return CommandResult.fromIgnored();
}
private List<ChannelGroupModel> convertAChannelGroupToChannelGroupChannel(List<AChannelGroup> channelGroups) {

View File

@@ -49,7 +49,7 @@ public class SetupFeature extends AbstractConditionableCommand {
.userId(commandContext.getAuthor().getIdLong())
.build();
return setupService.performFeatureSetup(feature, initiatingUser, commandContext.getMessage().getIdLong())
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
}
throw new FeatureNotFoundException(name, featureConfigService.getFeaturesAsList());
}

View File

@@ -54,7 +54,7 @@ public class FeatureModes extends AbstractConditionableCommand {
}
FeatureModesModel model = FeatureModesModel.builder().featureModes(featureModes).build();
return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInChannel(FEATURE_MODES_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel()))
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
}
@Override

View File

@@ -45,7 +45,7 @@ public class Features extends AbstractConditionableCommand {
featuresModel.setFeatures(featureFlagConverter.fromFeatureFlags(features));
MessageToSend messageToSend = templateService.renderEmbedTemplate("features_response", featuresModel);
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
}
@Override

View File

@@ -84,7 +84,7 @@ public class Help implements Command {
model.setSubModules(subModules);
MessageToSend messageToSend = templateService.renderEmbedTemplate("help_module_details_response", model);
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
} else if(commandRegistry.commandExists(parameter)) {
Command command = commandRegistry.getCommandByName(parameter);
log.trace("Displaying help for command {}.", command.getConfiguration().getName());
@@ -100,7 +100,7 @@ public class Help implements Command {
model.setCommand(command.getConfiguration());
MessageToSend messageToSend = templateService.renderEmbedTemplate("help_command_details_response", model);
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
} else {
return displayHelpOverview(commandContext);
}
@@ -115,7 +115,7 @@ public class Help implements Command {
model.setModules(subModules);
MessageToSend messageToSend = templateService.renderEmbedTemplate("help_module_overview_response", model);
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
.thenApply(aVoid -> CommandResult.fromSuccess());
.thenApply(aVoid -> CommandResult.fromIgnored());
}
@Override
@@ -134,7 +134,7 @@ public class Help implements Command {
.parameters(Collections.singletonList(moduleOrCommandName))
.help(helpInfo)
.templated(true)
.causesReaction(false)
.causesReaction(true)
.build();
}

View File

@@ -33,7 +33,7 @@ public class Echo extends AbstractConditionableCommand {
);
EchoModel model = EchoModel.builder().text(sb.toString()).build();
commandContext.getChannel().sendMessage(templateService.renderTemplate(TEMPLATE_NAME, model)).queue();
return CommandResult.fromSuccess();
return CommandResult.fromIgnored();
}
@Override

View File

@@ -36,7 +36,7 @@ public class Ping implements Command {
long ping = commandContext.getJda().getGatewayPing();
PingModel model = PingModel.builder().latency(ping).build();
return channelService.sendTextTemplateInChannel(PING_TEMPLATE, model, commandContext.getChannel())
.thenApply(message -> CommandResult.fromSuccess());
.thenApply(message -> CommandResult.fromIgnored());
}
@Override

View File

@@ -0,0 +1,80 @@
package dev.sheldan.abstracto.core.listener;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.events.emote.EmoteAddedEvent;
import net.dv8tion.jda.api.events.emote.EmoteRemovedEvent;
import net.dv8tion.jda.api.events.emote.update.EmoteUpdateNameEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.util.Comparator;
import java.util.List;
@Service
@Slf4j
public class EmoteListener extends ListenerAdapter {
@Autowired
private List<EmoteCreatedListener> createdListeners;
@Autowired
private List<EmoteDeletedListener> deletedListeners;
@Autowired
private List<EmoteUpdatedListener> updatedListeners;
@Autowired
@Lazy
private EmoteListener self;
@Override
@Transactional
public void onEmoteAdded(@NotNull EmoteAddedEvent event) {
createdListeners.forEach(listener ->
self.executeCreatedListener(listener, event.getEmote())
);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeCreatedListener(EmoteCreatedListener listener, Emote createDdEmote) {
listener.emoteCreated(createDdEmote);
}
@Override
public void onEmoteRemoved(@NotNull EmoteRemovedEvent event) {
deletedListeners.forEach(listener ->
self.executeDeletedListener(listener, event.getEmote())
);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeDeletedListener(EmoteDeletedListener listener, Emote createDdEmote) {
listener.emoteDeleted(createDdEmote);
}
@Override
public void onEmoteUpdateName(@NotNull EmoteUpdateNameEvent event) {
updatedListeners.forEach(emoteUpdatedListener ->
self.executeUpdatedListener(emoteUpdatedListener, event.getEmote(), event.getOldName(), event.getNewName())
);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeUpdatedListener(EmoteUpdatedListener listener, Emote updatedEmote, String oldName, String newName) {
listener.emoteUpdated(updatedEmote, oldName, newName);
}
@PostConstruct
public void postConstruct() {
createdListeners.sort(Comparator.comparing(Prioritized::getPriority).reversed());
deletedListeners.sort(Comparator.comparing(Prioritized::getPriority).reversed());
updatedListeners.sort(Comparator.comparing(Prioritized::getPriority).reversed());
}
}

View File

@@ -101,7 +101,12 @@ public class ChannelServiceBean implements ChannelService {
@Override
public CompletableFuture<Message> sendEmbedToChannel(MessageEmbed embed, MessageChannel channel) {
log.trace("Sending embed to channel {}.", channel.getId());
return channel.sendMessage(embed).submit();
return sendEmbedToChannelInComplete(embed, channel).submit();
}
@Override
public MessageAction sendEmbedToChannelInComplete(MessageEmbed embed, MessageChannel channel) {
return channel.sendMessage(embed);
}
@Override
@@ -122,25 +127,30 @@ public class ChannelServiceBean implements ChannelService {
public List<CompletableFuture<Message>> sendMessageToSendToChannel(MessageToSend messageToSend, MessageChannel textChannel) {
String messageText = messageToSend.getMessage();
List<CompletableFuture<Message>> futures = new ArrayList<>();
if(StringUtils.isBlank(messageText)) {
log.trace("Only sending {} embeds to channel {}.", messageToSend.getEmbeds().size(), textChannel.getId());
messageToSend.getEmbeds().forEach(embed ->
futures.add(sendEmbedToChannel(embed, textChannel))
);
} else {
log.trace("Sending mesagte text to channel {}.", textChannel.getId());
MessageAction messageAction = textChannel.sendMessage(messageText);
if(messageToSend.getEmbeds() != null && !messageToSend.getEmbeds().isEmpty()) {
log.trace("Also sending {} embeds to channel {}.", messageToSend.getEmbeds().size(), textChannel.getId());
CompletableFuture<Message> firstMessageFuture = messageAction.embed(messageToSend.getEmbeds().get(0)).submit();
futures.add(firstMessageFuture);
messageToSend.getEmbeds().stream().skip(1).forEach(embed ->
futures.add(sendEmbedToChannel(embed, textChannel))
);
MessageAction firstMessageAction = null;
List<MessageAction> allMessageActions = new ArrayList<>();
if(!StringUtils.isBlank(messageText)) {
firstMessageAction = textChannel.sendMessage(messageText);
}
if(!messageToSend.getEmbeds().isEmpty()) {
if(firstMessageAction != null) {
firstMessageAction.embed(messageToSend.getEmbeds().get(0));
} else {
futures.add(messageAction.submit());
firstMessageAction = textChannel.sendMessage(messageToSend.getEmbeds().get(0));
}
messageToSend.getEmbeds().stream().skip(1).forEach(embed -> allMessageActions.add(sendEmbedToChannelInComplete(embed, textChannel)));
}
if(messageToSend.hasFileToSend()) {
if(firstMessageAction != null) {
firstMessageAction.addFile(messageToSend.getFileToSend());
} else {
firstMessageAction = textChannel.sendFile(messageToSend.getFileToSend());
}
}
allMessageActions.add(0, firstMessageAction);
allMessageActions.forEach(messageAction ->
futures.add(messageAction.submit())
);
return futures;
}

View File

@@ -158,4 +158,9 @@ public class EmoteServiceBean implements EmoteService {
.build();
}
@Override
public boolean emoteIsFromGuild(Emote emote, Guild guild) {
return guild.getEmoteById(emote.getId()) != null;
}
}

View File

@@ -15,7 +15,6 @@
<column name="enabled" type="BOOLEAN">
<constraints nullable="false"/>
</column>
<column name="mode" type="VARCHAR(255)"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="feature_id" type="BIGINT">
<constraints nullable="false"/>