implemented contact command and added check if the thread already exists

added anon reply command
This commit is contained in:
Sheldan
2020-05-06 15:36:13 +02:00
parent a06006d763
commit 54327c3e58
12 changed files with 147 additions and 12 deletions

View File

@@ -3,14 +3,20 @@ package dev.sheldan.abstracto.modmail.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.condition.CommandCondition; import dev.sheldan.abstracto.core.command.condition.CommandCondition;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
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.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.modmail.commands.condition.RequiresModMailCondition; import dev.sheldan.abstracto.modmail.commands.condition.RequiresModMailCondition;
import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.config.ModMailFeatures;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import dev.sheldan.abstracto.modmail.service.ModMailThreadService;
import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List; import java.util.List;
@Component @Component
@@ -19,14 +25,32 @@ public class AnonReply extends AbstractConditionableCommand {
@Autowired @Autowired
private RequiresModMailCondition requiresModMailCondition; private RequiresModMailCondition requiresModMailCondition;
@Autowired
private ModMailThreadService modMailThreadService;
@Autowired
private ModMailThreadManagementService modMailThreadManagementService;
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
return null; ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel());
modMailThreadService.relayMessageToDm(thread, commandContext.getMessage(), true);
return CommandResult.fromSuccess();
} }
@Override @Override
public CommandConfiguration getConfiguration() { public CommandConfiguration getConfiguration() {
return null; Parameter responseText = Parameter.builder().name("text").type(String.class).description("The text to reply with").build();
List<Parameter> parameters = Arrays.asList(responseText);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("anonReply")
.module(ModMailModuleInterface.MODMAIL)
.parameters(parameters)
.help(helpInfo)
.templated(true)
.causesReaction(true)
.build();
} }
@Override @Override

View File

@@ -2,22 +2,82 @@ package dev.sheldan.abstracto.modmail.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
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.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.modmail.config.ModMailFeatures; import dev.sheldan.abstracto.modmail.config.ModMailFeatures;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import dev.sheldan.abstracto.modmail.models.template.ModMailThreadExistsModel;
import dev.sheldan.abstracto.modmail.service.ModMailThreadService;
import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component @Component
public class Contact extends AbstractConditionableCommand { public class Contact extends AbstractConditionableCommand {
@Autowired
private ModMailThreadService modMailThreadService;
@Autowired
private ModMailThreadManagementService modMailThreadManagementService;
@Autowired
private UserInServerManagementService userManagementService;
@Autowired
private TemplateService templateService;
@Autowired
private ChannelService channelService;
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
return null; Member targetUser = (Member) commandContext.getParameters().getParameters().get(0);
AUserInAServer user = userManagementService.loadUser(targetUser);
ModMailThread existingThread = modMailThreadManagementService.getOpenModmailThreadForUser(user);
if(existingThread != null) {
ModMailThreadExistsModel model = (ModMailThreadExistsModel) ContextConverter.fromCommandContext(commandContext, ModMailThreadExistsModel.class);
model.setExistingModMailThread(existingThread);
MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_thread_already_exists", model);
channelService.sendMessageToEndInTextChannel(messageToSend, commandContext.getChannel());
} else {
FullUser fullUser = FullUser
.builder()
.aUserInAServer(user)
.member(targetUser)
.build();
modMailThreadService.createModMailThreadForUser(fullUser);
}
return CommandResult.fromSuccess();
} }
@Override @Override
public CommandConfiguration getConfiguration() { public CommandConfiguration getConfiguration() {
return null; Parameter responseText = Parameter.builder().name("user").type(Member.class).description("The user to contact").build();
List<Parameter> parameters = Arrays.asList(responseText);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("contact")
.module(ModMailModuleInterface.MODMAIL)
.parameters(parameters)
.help(helpInfo)
.templated(true)
.causesReaction(true)
.build();
} }
@Override @Override

View File

@@ -34,7 +34,7 @@ public class Reply extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel()); ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel());
modMailThreadService.relayMessageToDm(thread, commandContext.getMessage()); modMailThreadService.relayMessageToDm(thread, commandContext.getMessage(), false);
return CommandResult.fromSuccess(); return CommandResult.fromSuccess();
} }

View File

@@ -4,7 +4,6 @@ import com.jagrosh.jdautilities.commons.waiter.EventWaiter;
import com.jagrosh.jdautilities.menu.ButtonMenu; import com.jagrosh.jdautilities.menu.ButtonMenu;
import dev.sheldan.abstracto.core.models.FullGuild; import dev.sheldan.abstracto.core.models.FullGuild;
import dev.sheldan.abstracto.core.models.FullUser; import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.cache.CachedReaction;
import dev.sheldan.abstracto.core.models.database.*; import dev.sheldan.abstracto.core.models.database.*;
import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.ChannelService;
@@ -173,7 +172,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
.postedMessage(message) .postedMessage(message)
.threadUser(fullUser) .threadUser(fullUser)
.build(); .build();
MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_moderator_message", modMailUserReplyModel); MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_user_message_embed", modMailUserReplyModel);
List<CompletableFuture<Message>> completableFutures = channelService.sendMessageToEndInTextChannel(messageToSend, textChannel); List<CompletableFuture<Message>> completableFutures = channelService.sendMessageToEndInTextChannel(messageToSend, textChannel);
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
completableFutures.forEach(messageCompletableFuture -> { completableFutures.forEach(messageCompletableFuture -> {
@@ -188,17 +187,17 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
} }
@Override @Override
public void relayMessageToDm(ModMailThread modMailThread, Message message) { public void relayMessageToDm(ModMailThread modMailThread, Message message, Boolean anonymous) {
User userById = botService.getInstance().getUserById(modMailThread.getUser().getUserReference().getId()); User userById = botService.getInstance().getUserById(modMailThread.getUser().getUserReference().getId());
if(userById != null) { if(userById != null) {
userById.openPrivateChannel().queue(privateChannel -> { userById.openPrivateChannel().queue(privateChannel -> {
self.sendReply(modMailThread, message, privateChannel); self.sendReply(modMailThread, message, privateChannel, anonymous);
}); });
} }
} }
@Transactional @Transactional
public void sendReply(ModMailThread modMailThread, Message message, PrivateChannel privateChannel) { public void sendReply(ModMailThread modMailThread, Message message, PrivateChannel privateChannel, Boolean anonymous) {
AUserInAServer moderator = userInServerManagementService.loadUser(message.getMember()); AUserInAServer moderator = userInServerManagementService.loadUser(message.getMember());
Member userInGuild = botService.getMemberInServer(modMailThread.getUser()); Member userInGuild = botService.getMemberInServer(modMailThread.getUser());
FullUser moderatorUser = FullUser FullUser moderatorUser = FullUser
@@ -230,7 +229,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
log.error("Error while executing send message to reply to user.", e); log.error("Error while executing send message to reply to user.", e);
} }
}); });
self.saveMessageIds(messages, modMailThread, moderator, false); self.saveMessageIds(messages, modMailThread, moderator, anonymous);
}); });
} }

View File

@@ -0,0 +1,18 @@
{
"author": {
"name": "${member.effectiveName}",
"avatar": "${member.user.effectiveAvatarUrl}"
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"description": "<#include "modmail_thread_already_exists">",
"fields": [
{
"name": "<#include "modmail_existing_thread_link_field_title">",
"value": "[<#include "modmail_existing_thread_link_content_display_text">](${threadUrl})"
}
]
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.modmail.models.template;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import dev.sheldan.abstracto.core.utils.ChannelUtils;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
@Getter
@Setter
@SuperBuilder
public class ModMailThreadExistsModel extends UserInitiatedServerContext {
private ModMailThread existingModMailThread;
public String getThreadUrl() {
return ChannelUtils.buildChannelUrl(existingModMailThread.getServer().getId(), existingModMailThread.getChannel().getId());
}
}

View File

@@ -18,5 +18,5 @@ public interface ModMailThreadService {
void createModMailPrompt(AUser user, MessageChannel messageChannel); void createModMailPrompt(AUser user, MessageChannel messageChannel);
void sendWelcomeMessage(TextChannel channel, FullUser aUserInAServer); void sendWelcomeMessage(TextChannel channel, FullUser aUserInAServer);
void relayMessageToModMailThread(ModMailThread modMailThread, Message message); void relayMessageToModMailThread(ModMailThread modMailThread, Message message);
void relayMessageToDm(ModMailThread modMailThread, Message message); void relayMessageToDm(ModMailThread modMailThread, Message message, Boolean anonymous);
} }

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.core.utils;
public class ChannelUtils {
private ChannelUtils() {
}
public static String buildChannelUrl(Long serverId, Long channelId) {
return String.format("https://discordapp.com/channels/%s/%s/", serverId, channelId);
}
}