mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-05 17:07:03 +00:00
[AB-68] adding message context menu and slash command for mock
This commit is contained in:
@@ -6,17 +6,21 @@ import dev.sheldan.abstracto.core.command.config.HelpInfo;
|
|||||||
import dev.sheldan.abstracto.core.command.config.Parameter;
|
import dev.sheldan.abstracto.core.command.config.Parameter;
|
||||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||||
import dev.sheldan.abstracto.core.command.execution.ContextConverter;
|
|
||||||
import dev.sheldan.abstracto.core.command.handler.parameter.CombinedParameter;
|
import dev.sheldan.abstracto.core.command.handler.parameter.CombinedParameter;
|
||||||
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.InteractionService;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
|
||||||
import dev.sheldan.abstracto.core.service.ChannelService;
|
import dev.sheldan.abstracto.core.service.ChannelService;
|
||||||
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
||||||
import dev.sheldan.abstracto.entertainment.config.EntertainmentFeatureDefinition;
|
import dev.sheldan.abstracto.entertainment.config.EntertainmentFeatureDefinition;
|
||||||
import dev.sheldan.abstracto.entertainment.config.EntertainmentModuleDefinition;
|
import dev.sheldan.abstracto.entertainment.config.EntertainmentModuleDefinition;
|
||||||
|
import dev.sheldan.abstracto.entertainment.config.EntertainmentSlashCommandNames;
|
||||||
import dev.sheldan.abstracto.entertainment.model.command.MockResponseModel;
|
import dev.sheldan.abstracto.entertainment.model.command.MockResponseModel;
|
||||||
import dev.sheldan.abstracto.entertainment.service.EntertainmentService;
|
import dev.sheldan.abstracto.entertainment.service.EntertainmentService;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -29,12 +33,20 @@ import static dev.sheldan.abstracto.core.command.config.Parameter.ADDITIONAL_TYP
|
|||||||
public class Mock extends AbstractConditionableCommand {
|
public class Mock extends AbstractConditionableCommand {
|
||||||
|
|
||||||
public static final String MOCK_RESPONSE_TEMPLATE_KEY = "mock_response";
|
public static final String MOCK_RESPONSE_TEMPLATE_KEY = "mock_response";
|
||||||
|
public static final String MOCK_COMMAND = "mock";
|
||||||
|
public static final String MESSAGE_PARAMETER = "message";
|
||||||
@Autowired
|
@Autowired
|
||||||
private EntertainmentService entertainmentService;
|
private EntertainmentService entertainmentService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ChannelService channelService;
|
private ChannelService channelService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SlashCommandParameterService slashCommandParameterService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private InteractionService interactionService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
||||||
Object givenParameter = commandContext.getParameters().getParameters().get(0);
|
Object givenParameter = commandContext.getParameters().getParameters().get(0);
|
||||||
@@ -48,26 +60,63 @@ public class Mock extends AbstractConditionableCommand {
|
|||||||
messageText = givenParameter.toString();
|
messageText = givenParameter.toString();
|
||||||
}
|
}
|
||||||
String mockingText = entertainmentService.createMockText(messageText, commandContext.getAuthor(), mockedMember);
|
String mockingText = entertainmentService.createMockText(messageText, commandContext.getAuthor(), mockedMember);
|
||||||
MockResponseModel model = (MockResponseModel) ContextConverter.slimFromCommandContext(commandContext, MockResponseModel.class);
|
MockResponseModel model = MockResponseModel
|
||||||
model.setOriginalText(messageText);
|
.builder()
|
||||||
model.setMockingText(mockingText);
|
.originalText(messageText)
|
||||||
|
.mockingText(mockingText)
|
||||||
|
.build();
|
||||||
return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInTextChannelList(MOCK_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel()))
|
return FutureUtils.toSingleFutureGeneric(channelService.sendEmbedTemplateInTextChannelList(MOCK_RESPONSE_TEMPLATE_KEY, model, commandContext.getChannel()))
|
||||||
.thenApply(unused -> CommandResult.fromSuccess());
|
.thenApply(unused -> CommandResult.fromSuccess());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
|
||||||
|
String text = slashCommandParameterService.getCommandOption(MESSAGE_PARAMETER, event, String.class);
|
||||||
|
String mockingText = entertainmentService.createMockText(text, event.getMember(), null);
|
||||||
|
MockResponseModel model = MockResponseModel
|
||||||
|
.builder()
|
||||||
|
.originalText(text)
|
||||||
|
.mockingText(mockingText)
|
||||||
|
.build();
|
||||||
|
return interactionService.replyEmbed(MOCK_RESPONSE_TEMPLATE_KEY, model, event.getInteraction())
|
||||||
|
.thenApply(interactionHook -> CommandResult.fromSuccess());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandConfiguration getConfiguration() {
|
public CommandConfiguration getConfiguration() {
|
||||||
List<Parameter> parameters = new ArrayList<>();
|
List<Parameter> parameters = new ArrayList<>();
|
||||||
Map<String, Object> parameterAlternatives = new HashMap<>();
|
Map<String, Object> parameterAlternatives = new HashMap<>();
|
||||||
parameterAlternatives.put(ADDITIONAL_TYPES_KEY, Arrays.asList(Message.class, String.class));
|
parameterAlternatives.put(ADDITIONAL_TYPES_KEY, Arrays.asList(Message.class, String.class));
|
||||||
parameters.add(Parameter.builder().name("message").type(CombinedParameter.class).remainder(true)
|
|
||||||
.additionalInfo(parameterAlternatives).templated(true).build());
|
Parameter messageParameter = Parameter
|
||||||
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
|
.builder()
|
||||||
|
.name(MESSAGE_PARAMETER)
|
||||||
|
.type(CombinedParameter.class)
|
||||||
|
.remainder(true)
|
||||||
|
.additionalInfo(parameterAlternatives)
|
||||||
|
.templated(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
parameters.add(messageParameter);
|
||||||
|
|
||||||
|
HelpInfo helpInfo = HelpInfo
|
||||||
|
.builder()
|
||||||
|
.templated(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
SlashCommandConfig slashCommandConfig = SlashCommandConfig
|
||||||
|
.builder()
|
||||||
|
.enabled(true)
|
||||||
|
.rootCommandName(EntertainmentSlashCommandNames.ENTERTAINMENT)
|
||||||
|
.commandName(MOCK_COMMAND)
|
||||||
|
.build();
|
||||||
|
|
||||||
return CommandConfiguration.builder()
|
return CommandConfiguration.builder()
|
||||||
.name("mock")
|
.name(MOCK_COMMAND)
|
||||||
.module(EntertainmentModuleDefinition.ENTERTAINMENT)
|
.module(EntertainmentModuleDefinition.ENTERTAINMENT)
|
||||||
.templated(true)
|
.templated(true)
|
||||||
.async(true)
|
.async(true)
|
||||||
|
.slashCommandConfig(slashCommandConfig)
|
||||||
.supportsEmbedException(true)
|
.supportsEmbedException(true)
|
||||||
.parameters(parameters)
|
.parameters(parameters)
|
||||||
.help(helpInfo)
|
.help(helpInfo)
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package dev.sheldan.abstracto.entertainment.listener.interaction;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.config.FeatureDefinition;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.InteractionService;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.MessageContextConfig;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.context.ContextCommandService;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.context.message.listener.MessageContextCommandListener;
|
||||||
|
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||||
|
import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
|
||||||
|
import dev.sheldan.abstracto.entertainment.config.EntertainmentFeatureDefinition;
|
||||||
|
import dev.sheldan.abstracto.entertainment.model.command.MockResponseModel;
|
||||||
|
import dev.sheldan.abstracto.entertainment.service.EntertainmentService;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import static dev.sheldan.abstracto.entertainment.command.Mock.MOCK_RESPONSE_TEMPLATE_KEY;
|
||||||
|
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MockMessageContextCommandListener implements MessageContextCommandListener {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ContextCommandService contextCommandService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EntertainmentService entertainmentService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private InteractionService interactionService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DefaultListenerResult execute(MessageContextInteractionModel eventModel) {
|
||||||
|
Message targetMessage = eventModel.getEvent().getTarget();
|
||||||
|
String mockText = entertainmentService.createMockText(targetMessage.getContentRaw(), eventModel.getEvent().getMember(), targetMessage.getMember());
|
||||||
|
MockResponseModel model = MockResponseModel
|
||||||
|
.builder()
|
||||||
|
.originalText(targetMessage.getContentRaw())
|
||||||
|
.mockingText(mockText)
|
||||||
|
.build();
|
||||||
|
interactionService.replyEmbed(MOCK_RESPONSE_TEMPLATE_KEY, model, eventModel.getEvent());
|
||||||
|
return DefaultListenerResult.PROCESSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeatureDefinition getFeature() {
|
||||||
|
return EntertainmentFeatureDefinition.ENTERTAINMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MessageContextConfig getConfig() {
|
||||||
|
return MessageContextConfig
|
||||||
|
.builder()
|
||||||
|
.isTemplated(true)
|
||||||
|
.name("mock")
|
||||||
|
.templateKey("mock_message_context_menu_label")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean handlesEvent(MessageContextInteractionModel model) {
|
||||||
|
return contextCommandService.matchesGuildContextName(model, getConfig(), model.getServerId());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<include file="seedData/data.xml" relativeToChangelogFile="true"/>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<property name="entertainmentFeature" value="(SELECT id FROM feature WHERE key = 'entertainment')"/>
|
||||||
|
|
||||||
|
<changeSet author="Sheldan" id="mock_context_command">
|
||||||
|
<insert tableName="context_command">
|
||||||
|
<column name="name" value="mock"/>
|
||||||
|
<column name="type" value="MESSAGE"/>
|
||||||
|
<column name="feature_id" valueComputed="${entertainmentFeature}"/>
|
||||||
|
</insert>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
||||||
|
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
|
||||||
|
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
|
||||||
|
<include file="context_command.xml" relativeToChangelogFile="true"/>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -10,4 +10,5 @@
|
|||||||
<include file="1.2.8-entertainment/collection.xml" relativeToChangelogFile="true"/>
|
<include file="1.2.8-entertainment/collection.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="1.2.9-entertainment/collection.xml" relativeToChangelogFile="true"/>
|
<include file="1.2.9-entertainment/collection.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="1.4.0/collection.xml" relativeToChangelogFile="true"/>
|
<include file="1.4.0/collection.xml" relativeToChangelogFile="true"/>
|
||||||
|
<include file="1.4.3/collection.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
package dev.sheldan.abstracto.entertainment.model.command;
|
package dev.sheldan.abstracto.entertainment.model.command;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.experimental.SuperBuilder;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@SuperBuilder
|
@Builder
|
||||||
public class MockResponseModel extends SlimUserInitiatedServerContext {
|
public class MockResponseModel {
|
||||||
private String originalText;
|
private String originalText;
|
||||||
private String mockingText;
|
private String mockingText;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package dev.sheldan.abstracto.core.interaction.slash.parameter.provider.provided;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.command.handler.parameter.CombinedParameter;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandOptionTypeMapping;
|
||||||
|
import dev.sheldan.abstracto.core.interaction.slash.parameter.provider.SlashCommandParameterProvider;
|
||||||
|
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CombinedSlashCommandParameterProvider implements SlashCommandParameterProvider {
|
||||||
|
@Override
|
||||||
|
public SlashCommandOptionTypeMapping getOptionMapping() {
|
||||||
|
return SlashCommandOptionTypeMapping
|
||||||
|
.builder()
|
||||||
|
.type(CombinedParameter.class)
|
||||||
|
.optionTypes(Arrays.asList(OptionType.STRING))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user