[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"/>

View File

@@ -14,13 +14,13 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class AChannelParameterHandlerTest {
public class AChannelParameterHandlerImplTest {
@InjectMocks
private AChannelParameterHandler testUnit;
private AChannelParameterHandlerImpl testUnit;
@Mock
private TextChannelParameterHandler textChannelParameterHandler;
private TextChannelParameterHandlerImpl textChannelParameterHandler;
@Mock
private ChannelService channelService;

View File

@@ -14,13 +14,13 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class AEmoteParameterHandlerTest {
public class AEmoteParameterHandlerImplImplTest {
@InjectMocks
private AEmoteParameterHandler testUnit;
private AEmoteParameterHandlerImpl testUnit;
@Mock
private EmoteParameterHandler emoteParameterHandler;
private EmoteParameterHandlerImpl emoteParameterHandler;
@Mock
private EmoteService emoteService;

View File

@@ -15,13 +15,13 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ARoleParameterHandlerTest {
public class ARoleParameterHandlerImplImplTest {
@InjectMocks
private ARoleParameterHandler testUnit;
private ARoleParameterHandlerImpl testUnit;
@Mock
private RoleParameterHandler roleParameterHandler;
private RoleParameterHandlerImpl roleParameterHandler;
@Mock
private RoleService roleService;

View File

@@ -7,10 +7,10 @@ import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class BooleanParameterHandlerTest {
public class BooleanParameterHandlerImplTest {
@InjectMocks
private BooleanParameterHandler testUnit;
private BooleanParameterHandlerImpl testUnit;
@Test
public void testSuccessfulCondition() {

View File

@@ -7,10 +7,10 @@ import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class DoubleParameterHandlerTest {
public class DoubleParameterHandlerImplTest {
@InjectMocks
private DoubleParameterHandler testUnit;
private DoubleParameterHandlerImpl testUnit;
@Test
public void testSuccessfulCondition() {

View File

@@ -11,10 +11,10 @@ import java.time.Duration;
import java.time.temporal.ChronoUnit;
@RunWith(MockitoJUnitRunner.class)
public class DurationParameterHandlerTest {
public class DurationParameterHandlerImplTest {
@InjectMocks
private DurationParameterHandler testUnit;
private DurationParameterHandlerImpl testUnit;
@Test
public void testSuccessfulCondition() {

View File

@@ -16,10 +16,10 @@ import java.util.List;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class EmoteParameterHandlerTest {
public class EmoteParameterHandlerImplTest {
@InjectMocks
private EmoteParameterHandler testUnit;
private EmoteParameterHandlerImpl testUnit;
@Mock
private CommandParameterIterators iterators;

View File

@@ -15,13 +15,13 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FullEmoteParameterHandlerTest {
public class FullEmoteParameterHandlerImplImplTest {
@InjectMocks
private FullEmoteParameterHandler testUnit;
private FullEmoteParameterHandlerImpl testUnit;
@Mock
private EmoteParameterHandler emoteParameterHandler;
private EmoteParameterHandlerImpl emoteParameterHandler;
@Mock
private EmoteService emoteService;

View File

@@ -15,13 +15,13 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FullRoleParameterHandlerTest {
public class FullRoleParameterHandlerImplImplTest {
@InjectMocks
private FullRoleParameterHandler testUnit;
private FullRoleParameterHandlerImpl testUnit;
@Mock
private RoleParameterHandler roleParameterHandler;
private RoleParameterHandlerImpl roleParameterHandler;
@Mock
private RoleService roleService;

View File

@@ -7,10 +7,10 @@ import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class IntegerParameterHandlerTest {
public class IntegerParameterHandlerImplTest {
@InjectMocks
private IntegerParameterHandler testUnit;
private IntegerParameterHandlerImpl testUnit;
@Test
public void testSuccessfulCondition() {

View File

@@ -7,10 +7,10 @@ import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class LongParameterHandlerTest {
public class LongParameterHandlerImplTest {
@InjectMocks
private LongParameterHandler testUnit;
private LongParameterHandlerImpl testUnit;
@Test
public void testSuccessfulCondition() {

View File

@@ -17,10 +17,10 @@ import java.util.concurrent.CompletableFuture;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class MemberParameterHandlerTest {
public class MemberParameterHandlerImplTest {
@InjectMocks
private MemberParameterHandler testUnit;
private MemberParameterHandlerImpl testUnit;
@Mock
private CommandParameterIterators iterators;

View File

@@ -16,10 +16,10 @@ import java.util.List;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class RoleParameterHandlerTest {
public class RoleParameterHandlerImplTest {
@InjectMocks
private RoleParameterHandler testUnit;
private RoleParameterHandlerImpl testUnit;
@Mock
private CommandParameterIterators iterators;

View File

@@ -16,10 +16,10 @@ import java.util.List;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class TextChannelParameterHandlerTest {
public class TextChannelParameterHandlerImplTest {
@InjectMocks
private TextChannelParameterHandler testUnit;
private TextChannelParameterHandlerImpl testUnit;
@Mock
private CommandParameterIterators iterators;

View File

@@ -25,7 +25,7 @@ public class FeatureModeCondition implements CommandCondition {
return ConditionResult.builder().result(true).build();
}
}
throw new IncorrectFeatureModeException(command, feature, command.getFeatureModeLimitations());
throw new IncorrectFeatureModeException(feature, command.getFeatureModeLimitations());
}
}

View File

@@ -35,6 +35,10 @@ public class CommandResult {
return CommandResult.builder().result(ResultState.ERROR).message(message).throwable(throwable).build();
}
public static CommandResult fromIgnored() {
return CommandResult.builder().result(ResultState.IGNORED).build();
}
public static CommandResult fromCondition(ConditionResult result) {
return CommandResult.builder().conditionResult(result).result(ResultState.CONDITION).build();
}

View File

@@ -0,0 +1,6 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface AChanelParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,6 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface AEmoteParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface ARoleParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface BooleanParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface CommandKeyParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface DoubleParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface DurationParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface EmoteParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface FullEmoteParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface FullRoleParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface IntegerParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface LongParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface MemberParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface RoleParameterHandler extends CommandParameterHandler {
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.command.handler.provided;
import dev.sheldan.abstracto.core.command.handler.CommandParameterHandler;
public interface TextChannelParameterHandler extends CommandParameterHandler {
}

View File

@@ -1,7 +1,6 @@
package dev.sheldan.abstracto.core.exception;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.FeatureMode;
import dev.sheldan.abstracto.core.models.exception.IncorrectFeatureModeExceptionModel;
@@ -13,9 +12,9 @@ public class IncorrectFeatureModeException extends AbstractoRunTimeException imp
private final IncorrectFeatureModeExceptionModel model;
public IncorrectFeatureModeException(Command command, FeatureEnum featureEnum, List<FeatureMode> requiredModes) {
public IncorrectFeatureModeException(FeatureEnum featureEnum, List<FeatureMode> requiredModes) {
super("Incorrect feature mode for the command.");
this.model = IncorrectFeatureModeExceptionModel.builder().command(command).featureEnum(featureEnum).requiredModes(requiredModes).build();
this.model = IncorrectFeatureModeExceptionModel.builder().featureEnum(featureEnum).requiredModes(requiredModes).build();
}
@Override

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.listener;
import net.dv8tion.jda.api.entities.Emote;
public interface EmoteCreatedListener extends FeatureAware, Prioritized {
void emoteCreated(Emote createdEmote);
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.listener;
import net.dv8tion.jda.api.entities.Emote;
public interface EmoteDeletedListener extends FeatureAware, Prioritized {
void emoteDeleted(Emote deletedEmote);
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.listener;
import net.dv8tion.jda.api.entities.Emote;
public interface EmoteUpdatedListener extends FeatureAware, Prioritized {
void emoteUpdated(Emote updatedEmote, String oldValue, String newValue);
}

View File

@@ -0,0 +1,5 @@
package dev.sheldan.abstracto.core.models;
public interface Fakeable {
boolean isFake();
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.models.database;
import dev.sheldan.abstracto.core.models.Fakeable;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@@ -16,7 +17,7 @@ import java.time.Instant;
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AEmote implements Serializable {
public class AEmote implements Serializable, Fakeable {
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@@ -33,10 +33,6 @@ public class DefaultFeatureFlag implements Serializable {
@Setter
private boolean enabled;
@Getter
@Setter
private String mode;
@Column(name = "created")
private Instant created;

View File

@@ -1,6 +1,5 @@
package dev.sheldan.abstracto.core.models.exception;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.FeatureMode;
import lombok.Builder;
@@ -15,6 +14,5 @@ import java.util.List;
@Builder
public class IncorrectFeatureModeExceptionModel implements Serializable {
private List<FeatureMode> requiredModes;
private Command command;
private FeatureEnum featureEnum;
}

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.models.database.AChannel;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.requests.restaction.MessageAction;
import java.util.List;
import java.util.Optional;
@@ -18,6 +19,7 @@ public interface ChannelService {
CompletableFuture<Message> sendTextToChannel(String text, MessageChannel channel);
CompletableFuture<Message> sendEmbedToAChannel(MessageEmbed embed, AChannel channel);
CompletableFuture<Message> sendEmbedToChannel(MessageEmbed embed, MessageChannel channel);
MessageAction sendEmbedToChannelInComplete(MessageEmbed embed, MessageChannel channel);
List<CompletableFuture<Message>> sendMessageToSendToAChannel(MessageToSend messageToSend, AChannel channel);
CompletableFuture<Message> sendMessageToSendToAChannel(MessageToSend messageToSend, AChannel channel, Integer embedIndex);
List<CompletableFuture<Message>> sendMessageToSendToChannel(MessageToSend messageToSend, MessageChannel textChannel);

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.cache.CachedReaction;
import dev.sheldan.abstracto.core.models.database.AEmote;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.MessageReaction;
import java.util.Optional;
@@ -22,4 +23,5 @@ public interface EmoteService {
boolean compareAEmote(AEmote a, AEmote b);
AEmote getFakeEmote(Object object);
AEmote getFakeEmoteFromEmote(Emote emote);
boolean emoteIsFromGuild(Emote emote, Guild guild);
}

View File

@@ -0,0 +1,27 @@
package dev.sheldan.abstracto.core.utils;
import com.google.common.io.Files;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
@Component
public class FileUtils {
public void writeContentToFile(File file, String content) throws IOException {
try(FileWriter fw = new FileWriter(file)) {
fw.write(content);
fw.flush();
}
}
public File createTempFile(String fileName) {
return new File(Files.createTempDir(), fileName);
}
public void safeDelete(File file) throws IOException {
java.nio.file.Files.delete(file.toPath());
}
}

View File

@@ -101,11 +101,20 @@ public class CommandTestUtilities {
}
public static void checkSuccessfulCompletion(CommandResult result){
Assert.assertEquals(ResultState.SUCCESSFUL, result.getResult());
ResultState resultState = result.getResult();
checkForSuccessResultState(resultState);
}
private static void checkForSuccessResultState(ResultState resultState) {
boolean canBeConsideredSuccessful = ResultState.SUCCESSFUL.equals(resultState)
|| ResultState.IGNORED.equals(resultState)
|| ResultState.SELF_DESTRUCT.equals(resultState);
Assert.assertTrue(canBeConsideredSuccessful);
}
public static void checkSuccessfulCompletionAsync(CompletableFuture<CommandResult> result){
Assert.assertEquals(ResultState.SUCCESSFUL, result.join().getResult());
ResultState resultState = result.join().getResult();
checkForSuccessResultState(resultState);
}
public static List<CompletableFuture<Message>> messageFutureList() {