mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-02 16:05:00 +00:00
[AB-138] improving logging at various places fixing various issues regarding async commands and exception handling, fixing role role calculation being done twice
This commit is contained in:
@@ -18,6 +18,7 @@ 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 lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -32,6 +33,7 @@ import java.util.concurrent.CompletableFuture;
|
||||
* the {@link net.dv8tion.jda.api.entities.MessageChannel}
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class Contact extends AbstractConditionableCommand {
|
||||
|
||||
@Autowired
|
||||
@@ -53,6 +55,7 @@ public class Contact extends AbstractConditionableCommand {
|
||||
// if this AUserInAServer already has an open thread, we should instead post a message
|
||||
// containing a link to the channel, instead of opening a new one
|
||||
if(modMailThreadManagementService.hasOpenModMailThreadForUser(user)) {
|
||||
log.info("Modmail thread for user {} in server {} already exists. Notifying user {}.", commandContext.getAuthor().getId(), commandContext.getGuild().getId(), user.getUserReference().getId());
|
||||
ModMailThreadExistsModel model = (ModMailThreadExistsModel) ContextConverter.fromCommandContext(commandContext, ModMailThreadExistsModel.class);
|
||||
ModMailThread existingThread = modMailThreadManagementService.getOpenModMailThreadForUser(user);
|
||||
model.setExistingModMailThread(existingThread);
|
||||
|
||||
@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
|
||||
import dev.sheldan.abstracto.modmail.service.ModMailThreadServiceBean;
|
||||
import dev.sheldan.abstracto.templating.service.TemplateService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -16,6 +17,7 @@ import static dev.sheldan.abstracto.modmail.service.ModMailThreadServiceBean.MOD
|
||||
* makes things easier
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailConfigListener implements ServerConfigListener {
|
||||
|
||||
|
||||
@@ -27,6 +29,7 @@ public class ModMailConfigListener implements ServerConfigListener {
|
||||
|
||||
@Override
|
||||
public void updateServerConfig(AServer server) {
|
||||
log.info("Updating modmail related configuration for server {}.", server.getId());
|
||||
configService.createIfNotExists(server.getId(), ModMailThreadServiceBean.MODMAIL_CATEGORY, 0L);
|
||||
configService.createIfNotExists(server.getId(), MODMAIL_CLOSING_MESSAGE_TEXT, templateService.renderSimpleTemplate("modmail_closing_user_message_description"));
|
||||
}
|
||||
|
||||
@@ -43,11 +43,13 @@ public class ModMailMessageListener implements PrivateMessageReceivedListener {
|
||||
public void execute(Message message) {
|
||||
AUser user = userManagementService.loadUser(message.getAuthor().getIdLong());
|
||||
if(modMailThreadManagementService.hasOpenModMailThread(user)) {
|
||||
log.trace("User {} has an open modmail thread. Forwarding message {}.", user.getId(), message.getId());
|
||||
// there is only one open mod mail thread for a user at a time, so we can select the first one
|
||||
// we cannot use the AUserInAServer directly, because a message in a private channel does not have a Member
|
||||
ModMailThread existingThread = modMailThreadManagementService.getOpenModMailThreadsForUser(user).get(0);
|
||||
modMailThreadService.relayMessageToModMailThread(existingThread, message, new ArrayList<>());
|
||||
} else {
|
||||
log.info("User {} does not have an open modmail thread. Crating prompt.", user.getId());
|
||||
modMailThreadService.createModMailPrompt(user, message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ public class ModMailMessageServiceBean implements ModMailMessageService {
|
||||
}
|
||||
// all message must be from the same thread
|
||||
ModMailThread thread = modMailMessages.get(0).getThreadReference();
|
||||
log.trace("Loading {} mod mail messages from thread {} in server {}.", modMailMessages.size(), thread.getId(), thread.getServer().getId());
|
||||
List<ServerChannelMessage> messageIds = new ArrayList<>();
|
||||
modMailMessages.forEach(modMailMessage -> {
|
||||
ServerChannelMessage.ServerChannelMessageBuilder serverChannelMessageBuilder = ServerChannelMessage
|
||||
@@ -37,6 +38,7 @@ public class ModMailMessageServiceBean implements ModMailMessageService {
|
||||
.messageId(modMailMessage.getMessageId());
|
||||
// if its not from a private chat, we need to set the server and channel ID in order to fetch the data
|
||||
if(Boolean.FALSE.equals(modMailMessage.getDmChannel())) {
|
||||
log.trace("Message {} was from DM.", modMailMessage.getMessageId());
|
||||
serverChannelMessageBuilder
|
||||
.channelId(modMailMessage.getThreadReference().getChannel().getId())
|
||||
.serverId(modMailMessage.getThreadReference().getServer().getId());
|
||||
@@ -55,6 +57,7 @@ public class ModMailMessageServiceBean implements ModMailMessageService {
|
||||
botService.getInstance().openPrivateChannelById(thread.getUser().getUserReference().getId()).queue(privateChannel -> {
|
||||
Iterator<CompletableFuture<Message>> iterator = messageFutures.iterator();
|
||||
messageIds.forEach(serverChannelMessage -> {
|
||||
log.trace("Loading message {}.", serverChannelMessage.getMessageId());
|
||||
// TODO fix out of order promises
|
||||
// depending what the source of the message is, we need to fetch the message from the correct channel
|
||||
if(serverChannelMessage.getChannelId() == null){
|
||||
|
||||
@@ -5,10 +5,12 @@ import dev.sheldan.abstracto.core.command.service.management.FeatureManagementSe
|
||||
import dev.sheldan.abstracto.core.models.database.ARole;
|
||||
import dev.sheldan.abstracto.modmail.config.ModMailFeatures;
|
||||
import dev.sheldan.abstracto.modmail.service.management.ModMailRoleManagementService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailRoleServiceBean implements ModMailRoleService {
|
||||
|
||||
@Autowired
|
||||
@@ -22,15 +24,17 @@ public class ModMailRoleServiceBean implements ModMailRoleService {
|
||||
|
||||
@Override
|
||||
public void addRoleToModMailRoles(ARole role) {
|
||||
if(!modMailRoleManagementService.isRoleAlreadyAssigned(role, role.getServer())) {
|
||||
modMailRoleManagementService.addRoleToModMailRoles(role, role.getServer());
|
||||
log.info("Adding role {} to modmail roles in server {}.", role.getId(), role.getServer().getId());
|
||||
if(!modMailRoleManagementService.isRoleAlreadyAssigned(role)) {
|
||||
modMailRoleManagementService.addRoleToModMailRoles(role);
|
||||
}
|
||||
commandService.allowFeatureForRole(ModMailFeatures.MOD_MAIL, role);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeRoleFromModMailRoles(ARole role) {
|
||||
modMailRoleManagementService.removeRoleFromModMailRoles(role, role.getServer());
|
||||
log.info("Remove role {} from modmail roles in server {}.", role.getId(), role.getServer().getId());
|
||||
modMailRoleManagementService.removeRoleFromModMailRoles(role);
|
||||
commandService.disAllowFeatureForRole(ModMailFeatures.MOD_MAIL, role);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@@ -134,6 +133,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
Long serverId = aUserInAServer.getAUserInAServer().getServerReference().getId();
|
||||
Long categoryId = configService.getLongValue(MODMAIL_CATEGORY, serverId);
|
||||
User user = aUserInAServer.getMember().getUser();
|
||||
log.info("Creating modmail channel for user {} in category {} on server {}.", user.getId(), categoryId, serverId);
|
||||
CompletableFuture<TextChannel> textChannelFuture = channelService.createTextChannel(user.getName() + user.getDiscriminator(), aUserInAServer.getAUserInAServer().getServerReference(), categoryId);
|
||||
|
||||
return textChannelFuture.thenCompose(channel -> {
|
||||
@@ -153,12 +153,15 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
*/
|
||||
@Transactional
|
||||
public CompletableFuture<Void> performModMailThreadSetup(FullUserInServer aUserInAServer, Message initialMessage, TextChannel channel, boolean userInitiated, List<UndoActionInstance> undoActions) {
|
||||
log.info("Performing modmail thread setup for channel {} for user {} in server {}. It was initiated by a user: {}.", channel.getIdLong(), aUserInAServer.getMember().getId(), channel.getGuild().getId(), userInitiated);
|
||||
Long userInServerId = aUserInAServer.getAUserInAServer().getUserInServerId();
|
||||
CompletableFuture<Void> headerFuture = sendModMailHeader(channel, aUserInAServer);
|
||||
CompletableFuture<Void> userReplyMessage;
|
||||
if(initialMessage != null){
|
||||
log.trace("Sending initial message {} of user {} to modmail thread {}.", initialMessage.getId(), aUserInAServer.getMember().getId(), channel.getId());
|
||||
userReplyMessage = self.sendUserReply(channel, null, initialMessage, aUserInAServer.getAUserInAServer());
|
||||
} else {
|
||||
log.trace("No initial message to send.");
|
||||
userReplyMessage = CompletableFuture.completedFuture(null);
|
||||
}
|
||||
CompletableFuture notificationFuture;
|
||||
@@ -175,9 +178,11 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
|
||||
@Transactional
|
||||
public void setupModMailThreadInDB(Message initialMessage, TextChannel channel, Long userInServerId) {
|
||||
log.info("Persisting info about modmail thread {} in database.", channel.getIdLong());
|
||||
AUserInAServer aUserInAServer = userInServerManagementService.loadUser(userInServerId);
|
||||
ModMailThread thread = createThreadObject(channel, aUserInAServer);
|
||||
if(initialMessage != null) {
|
||||
log.trace("Adding initial message {} to modmail thread in channel {}.", initialMessage.getId(), channel.getId());
|
||||
modMailMessageManagementService.addMessageToThread(thread, initialMessage, aUserInAServer, false, false);
|
||||
}
|
||||
}
|
||||
@@ -188,7 +193,9 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
*/
|
||||
@Transactional
|
||||
public CompletableFuture<Void> sendModMailNotification(FullUserInServer aUserInAServer) {
|
||||
log.info("Sending modmail notification for new modmail thread about user {} in server {}.", aUserInAServer.getMember().getId(), aUserInAServer.getMember().getGuild().getId());
|
||||
List<ModMailRole> rolesToPing = modMailRoleManagementService.getRolesForServer(aUserInAServer.getAUserInAServer().getServerReference());
|
||||
log.trace("Pinging {} roles to notify about modmail thread about user {} in server {}.", rolesToPing.size(), aUserInAServer.getMember().getId(), aUserInAServer.getMember().getGuild().getId());
|
||||
ModMailNotificationModel modMailNotificationModel = ModMailNotificationModel
|
||||
.builder()
|
||||
.threadUser(aUserInAServer)
|
||||
@@ -206,6 +213,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
* @return The created instance of {@link ModMailThread}
|
||||
*/
|
||||
public ModMailThread createThreadObject(TextChannel channel, AUserInAServer user) {
|
||||
log.info("Creating database objects related to modmail thread in channel {} and about user {} in server {}.", channel.getIdLong(), user.getUserReference().getId(), channel.getGuild().getId());
|
||||
AChannel channel2 = channelManagementService.createChannel(channel.getIdLong(), AChannelType.TEXT, user.getServerReference());
|
||||
log.info("Creating mod mail thread in channel {} with db channel {}", channel.getIdLong(), channel2.getId());
|
||||
return modMailThreadManagementService.createModMailThread(user, channel2);
|
||||
@@ -213,6 +221,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
|
||||
@Override
|
||||
public void setModMailCategoryTo(Guild guild, Long categoryId) {
|
||||
log.info("Trying to set modmail category to {} in guild {}.", categoryId, guild.getId());
|
||||
FeatureValidationResult result = FeatureValidationResult.builder().build();
|
||||
modMailFeatureValidator.validateModMailCategory(result, guild, categoryId);
|
||||
if(result.getValidationResult()) {
|
||||
@@ -226,6 +235,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
List<AUserInAServer> knownServers = userInServerManagementService.getUserInAllServers(user.getId());
|
||||
// do nothing if we don't know the user
|
||||
if(!knownServers.isEmpty()) {
|
||||
log.info("There are {} shared servers between user and abstracto.", knownServers.size());
|
||||
List<ServerChoice> availableGuilds = new ArrayList<>();
|
||||
HashMap<String, AUserInAServer> choices = new HashMap<>();
|
||||
for (int i = 0; i < knownServers.size(); i++) {
|
||||
@@ -246,6 +256,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
availableGuilds.add(serverChoice);
|
||||
}
|
||||
}
|
||||
log.info("There were {} shared servers found which have modmailenabled.", availableGuilds.size());
|
||||
// if more than 1 server is available, show a choice dialog
|
||||
if(availableGuilds.size() > 1) {
|
||||
ModMailServerChooserModel modMailServerChooserModel = ModMailServerChooserModel
|
||||
@@ -259,6 +270,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
.setDescription(text)
|
||||
.setAction(reactionEmote -> {
|
||||
AUserInAServer chosenServer = choices.get(reactionEmote.getEmoji());
|
||||
log.trace("Executing action for creationg a modmail thread in server {} for user {}.", chosenServer.getServerReference().getId(), chosenServer.getUserReference().getId());
|
||||
Member memberInServer = botService.getMemberInServer(chosenServer);
|
||||
FullUserInServer fullUser = FullUserInServer.builder().member(memberInServer).aUserInAServer(chosenServer).build();
|
||||
self.createModMailThreadForUser(fullUser, initialMessage, initialMessage.getChannel(), true, new ArrayList<>()).exceptionally(throwable -> {
|
||||
@@ -267,10 +279,12 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
});
|
||||
})
|
||||
.build();
|
||||
log.trace("Displaying server choice message for user {} in channel {}.", user.getId(), initialMessage.getChannel().getId());
|
||||
menu.display(initialMessage.getChannel());
|
||||
} else if(availableGuilds.size() == 1) {
|
||||
// if exactly one server is available, open the thread directly
|
||||
AUserInAServer chosenServer = choices.get(availableGuilds.get(0).getReactionEmote());
|
||||
log.info("Only one server available to modmail. Directly opening modmail thread for user {} in server {}.", chosenServer.getUserReference().getId(), chosenServer.getServerReference().getId());
|
||||
Member memberInServer = botService.getMemberInServer(chosenServer);
|
||||
FullUserInServer fullUser = FullUserInServer.builder().member(memberInServer).aUserInAServer(chosenServer).build();
|
||||
self.createModMailThreadForUser(fullUser, initialMessage, initialMessage.getChannel(), true, new ArrayList<>()).exceptionally(throwable -> {
|
||||
@@ -278,6 +292,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
return null;
|
||||
});
|
||||
} else {
|
||||
log.info("No server available to open a modmail thread in.");
|
||||
// in case there is no server available, send an error message
|
||||
channelService.sendEmbedTemplateInChannel("modmail_no_server_available", new Object(), initialMessage.getChannel());
|
||||
}
|
||||
@@ -294,6 +309,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
* @param aUserInAServer The {@link AUserInAServer} which the {@link ModMailThread} is about
|
||||
*/
|
||||
private CompletableFuture<Void> sendModMailHeader(TextChannel channel, FullUserInServer aUserInAServer) {
|
||||
log.trace("Sending modmail thread header for tread in channel {} on server {}.", channel.getIdLong(), channel.getGuild().getId());
|
||||
ModMailThread latestThread = modMailThreadManagementService.getLatestModMailThread(aUserInAServer.getAUserInAServer());
|
||||
List<ModMailThread> oldThreads = modMailThreadManagementService.getModMailThreadForUser(aUserInAServer.getAUserInAServer());
|
||||
ModMailThreaderHeader header = ModMailThreaderHeader
|
||||
@@ -308,11 +324,13 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> relayMessageToModMailThread(ModMailThread modMailThread, Message message, List<UndoActionInstance> undoActions) {
|
||||
log.trace("Relaying message {} to modmail thread {} for user {} to server {}.", message.getId(), modMailThread.getId(), message.getAuthor().getIdLong(), modMailThread.getServer().getId());
|
||||
Optional<TextChannel> textChannelFromServer = botService.getTextChannelFromServerOptional(modMailThread.getServer().getId(), modMailThread.getChannel().getId());
|
||||
if(textChannelFromServer.isPresent()) {
|
||||
TextChannel textChannel = textChannelFromServer.get();
|
||||
return self.sendUserReply(textChannel, modMailThread, message, modMailThread.getUser());
|
||||
} else {
|
||||
log.warn("Closing modmail thread {}, because it seems the channel {} in server {} got deleted.", modMailThread.getId(), modMailThread.getChannel().getId(), modMailThread.getServer().getId());
|
||||
// in this case there was no text channel on the server associated with the mod mail thread
|
||||
// close the existing one, so the user can start a new one
|
||||
self.closeModMailThreadInDb(modMailThread.getId());
|
||||
@@ -348,6 +366,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
.build();
|
||||
subscribers.add(subscriber);
|
||||
});
|
||||
log.trace("Pinging {} subscribers for modmail thread {}.", subscriberList.size(), modMailThread.getId());
|
||||
}
|
||||
ModMailUserReplyModel modMailUserReplyModel = ModMailUserReplyModel
|
||||
.builder()
|
||||
@@ -359,7 +378,10 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_user_message", modMailUserReplyModel);
|
||||
List<CompletableFuture<Message>> completableFutures = channelService.sendMessageToSendToChannel(messageToSend, textChannel);
|
||||
return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0]))
|
||||
.thenCompose(aVoid -> messageService.addReactionToMessageWithFuture("readReaction", textChannel.getGuild().getIdLong(), message))
|
||||
.thenCompose(aVoid -> {
|
||||
log.trace("Adding read reaction to initial message for mod mail thread in channel {}.", textChannel.getGuild().getId());
|
||||
return messageService.addReactionToMessageWithFuture("readReaction", textChannel.getGuild().getIdLong(), message);
|
||||
})
|
||||
.thenAccept(aVoid -> {
|
||||
if(modMailThreadExists) {
|
||||
self.postProcessSendMessages(textChannel, completableFutures.get(0).join());
|
||||
@@ -378,6 +400,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
Optional<ModMailThread> modMailThreadOpt = modMailThreadManagementService.getById(textChannel.getIdLong());
|
||||
if(modMailThreadOpt.isPresent()) {
|
||||
ModMailThread modMailThread = modMailThreadOpt.get();
|
||||
log.trace("Adding message {} sent from user to modmail thread {} and setting status to {}.", message.getId(), modMailThread.getId(), ModMailThreadState.USER_REPLIED);
|
||||
modMailMessageManagementService.addMessageToThread(modMailThread, message, modMailThread.getUser(), false, false);
|
||||
// update the state of the thread
|
||||
modMailThreadManagementService.setModMailThreadState(modMailThread, ModMailThreadState.USER_REPLIED);
|
||||
@@ -389,6 +412,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
@Override
|
||||
public CompletableFuture<Void> relayMessageToDm(ModMailThread modMailThread, String text, Message message, boolean anonymous, MessageChannel feedBack, List<UndoActionInstance> undoActions) {
|
||||
Long modMailThreadId = modMailThread.getId();
|
||||
log.info("Relaying message {} to user {} in modmail thread {} on server {}.", message.getId(), modMailThread.getUser().getUserReference().getId(), modMailThread.getId(), modMailThread.getServer().getId());
|
||||
User userById = botService.getInstance().getUserById(modMailThread.getUser().getUserReference().getId());
|
||||
if(userById != null) {
|
||||
AUserInAServer moderator = userInServerManagementService.loadUser(message.getMember());
|
||||
@@ -406,6 +430,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
.anonymous(anonymous)
|
||||
.threadUser(fullThreadUser);
|
||||
if(anonymous) {
|
||||
log.trace("Message is sent anonymous.");
|
||||
modMailModeratorReplyModelBuilder.moderator(botService.getBotInGuild(modMailThread.getServer()));
|
||||
} else {
|
||||
Member moderatorMember = botService.getMemberInServer(moderator);
|
||||
@@ -441,6 +466,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
).toCompletableFuture().thenCompose(o -> o);
|
||||
|
||||
} else {
|
||||
log.trace("Not logging modmail thread {}.", modMailThreadId);
|
||||
return self.afterSuccessfulLog(modMailThreadId, notifyUser, undoActions);
|
||||
}
|
||||
}
|
||||
@@ -456,6 +482,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
*/
|
||||
@Transactional
|
||||
public CompletableFuture<Void> logMessagesToModMailLog(String note, Boolean notifyUser, Long modMailThreadId, List<UndoActionInstance> undoActions, List<CompletableFuture<Message>> messages) {
|
||||
log.trace("Logging {} modmail messages for modmail thread {}.", messages.size(), modMailThreadId);
|
||||
try {
|
||||
CompletableFutureList<Message> list = self.logModMailThread(modMailThreadId, messages, note, undoActions);
|
||||
return list.getMainFuture().thenCompose(avoid -> {
|
||||
@@ -485,6 +512,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
Optional<ModMailThread> modMailThreadOpt = modMailThreadManagementService.getById(modMailThreadId);
|
||||
if(modMailThreadOpt.isPresent()) {
|
||||
if(notifyUser) {
|
||||
log.trace("Notifying user about the closed modmail thread {}.", modMailThreadId);
|
||||
ModMailThread modMailThread = modMailThreadOpt.get();
|
||||
User user = botService.getMemberInServer(modMailThread.getUser()).getUser();
|
||||
HashMap<String, String> closingMessage = new HashMap<>();
|
||||
@@ -494,6 +522,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
self.deleteChannelAndClose(modMailThreadId, undoActions)
|
||||
);
|
||||
} else {
|
||||
log.trace("NOT Notifying user about the closed modmail thread {}.", modMailThreadId);
|
||||
return deleteChannelAndClose(modMailThreadId, undoActions);
|
||||
}
|
||||
} else {
|
||||
@@ -515,6 +544,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
ModMailThread modMailThread = modMailThreadOpt.get();
|
||||
String failureMessage = "Failed to delete text channel containing mod mail thread {}";
|
||||
try {
|
||||
log.trace("Deleting channel {} which contained the modmail thread {}.", modMailThread.getChannel().getId(), modMailThreadId);
|
||||
return channelService.deleteTextChannel(modMailThread.getChannel()).thenAccept(avoid -> {
|
||||
undoActions.clear();
|
||||
self.closeModMailThreadInDb(modMailThreadId);
|
||||
@@ -546,7 +576,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
*/
|
||||
@Transactional
|
||||
public CompletableFutureList<Message> logModMailThread(Long modMailThreadId, List<CompletableFuture<Message>> messages, String note, List<UndoActionInstance> undoActions) {
|
||||
log.info("Logging mod mail thread {}.", modMailThreadId);
|
||||
log.info("Logging mod mail thread {} with {} messages.", modMailThreadId, messages.size());
|
||||
Optional<ModMailThread> modMailThreadOpt = modMailThreadManagementService.getById(modMailThreadId);
|
||||
if(modMailThreadOpt.isPresent()) {
|
||||
ModMailThread modMailThread = modMailThreadOpt.get();
|
||||
@@ -554,8 +584,9 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
messages.forEach(future -> {
|
||||
try {
|
||||
if(!future.isCompletedExceptionally()) {
|
||||
Message loadedMessage = future.get();
|
||||
Message loadedMessage = future.join();
|
||||
if(loadedMessage != null) {
|
||||
log.info("Logging message {} in modmail thread {}.", loadedMessage.getId(), modMailThreadId);
|
||||
ModMailMessage modmailMessage = modMailThread.getMessages()
|
||||
.stream()
|
||||
.filter(modMailMessage -> modMailMessage.getMessageId().equals(loadedMessage.getIdLong()))
|
||||
@@ -569,10 +600,9 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
.build();
|
||||
loggedMessages.add(modMailLoggedMessageModel);
|
||||
}
|
||||
} else {
|
||||
log.warn("One future failed to load. Will not log a message in modmail thread {}.", modMailThreadId);
|
||||
}
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
log.error("Error while executing future to retrieve reaction.", e);
|
||||
Thread.currentThread().interrupt();
|
||||
} catch (Exception e) {
|
||||
log.error("Failed handle the loaded messages.", e);
|
||||
}
|
||||
@@ -585,10 +615,10 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
.closedThread(modMailThread)
|
||||
.note(note)
|
||||
.build();
|
||||
log.trace("Sending close header and individual mod mail messages to mod mail log target.");
|
||||
log.trace("Sending close header and individual mod mail messages to mod mail log target for thread {}.", modMailThreadId);
|
||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_header", headerModel);
|
||||
List<CompletableFuture<Message>> closeHeaderFutures = postTargetService.sendEmbedInPostTarget(messageToSend, ModMailPostTargets.MOD_MAIL_LOG, modMailThread.getServer().getId());
|
||||
// TODO in case the rendering fails, the already sent messages are not send
|
||||
// TODO in case the rendering fails, the already sent messages are not deleted
|
||||
completableFutures.addAll(closeHeaderFutures);
|
||||
completableFutures.addAll(self.sendMessagesToPostTarget(modMailThread, loggedMessages));
|
||||
return new CompletableFutureList<>(completableFutures);
|
||||
@@ -625,6 +655,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
public List<CompletableFuture<Message>> sendMessagesToPostTarget(ModMailThread modMailThread, List<ModMailLoggedMessageModel> loadedMessages) {
|
||||
List<CompletableFuture<Message>> messageFutures = new ArrayList<>();
|
||||
loadedMessages.forEach(message -> {
|
||||
log.trace("Sending message {} of modmail thread {} to modmail log post target.", modMailThread.getId(), message.getMessage().getId());
|
||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_logged_message", message);
|
||||
List<CompletableFuture<Message>> logFuture = postTargetService.sendEmbedInPostTarget(messageToSend, ModMailPostTargets.MOD_MAIL_LOG, modMailThread.getServer().getId());
|
||||
messageFutures.addAll(logFuture);
|
||||
@@ -645,6 +676,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
|
||||
Optional<ModMailThread> modMailThreadOpt = modMailThreadManagementService.getById(modMailThreadId);
|
||||
if(modMailThreadOpt.isPresent()) {
|
||||
ModMailThread modMailThread = modMailThreadOpt.get();
|
||||
log.trace("Adding (anonymous: {}) message {} of moderator to modmail thread {} and setting state to {}.", anonymous, message.getId(), modMailThreadId, ModMailThreadState.MOD_REPLIED);
|
||||
modMailMessageManagementService.addMessageToThread(modMailThread, message, moderator, anonymous, true);
|
||||
modMailThreadManagementService.setModMailThreadState(modMailThread, ModMailThreadState.MOD_REPLIED);
|
||||
} else {
|
||||
|
||||
@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailMessage;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
|
||||
import dev.sheldan.abstracto.modmail.repository.ModMailMessageRepository;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -11,6 +12,7 @@ import org.springframework.stereotype.Component;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailMessageManagementServiceBean implements ModMailMessageManagementService {
|
||||
|
||||
@Autowired
|
||||
@@ -26,6 +28,8 @@ public class ModMailMessageManagementServiceBean implements ModMailMessageManage
|
||||
.threadReference(modMailThread)
|
||||
.anonymous(anonymous)
|
||||
.build();
|
||||
log.info("Storing modmail thread message {} to modmail thread {} of user {} in server {}.",
|
||||
message.getId(), modMailThread.getId(), author.getUserReference().getId(), author.getServerReference().getId());
|
||||
|
||||
modMailMessageRepository.save(modMailMessage);
|
||||
return modMailMessage;
|
||||
|
||||
@@ -4,30 +4,33 @@ import dev.sheldan.abstracto.core.models.database.ARole;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailRole;
|
||||
import dev.sheldan.abstracto.modmail.repository.ModMailRoleRepository;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailRoleManagementServiceBean implements ModMailRoleManagementService {
|
||||
|
||||
@Autowired
|
||||
private ModMailRoleRepository modMailRoleRepository;
|
||||
|
||||
@Override
|
||||
public void addRoleToModMailRoles(ARole role, AServer server) {
|
||||
public void addRoleToModMailRoles(ARole role) {
|
||||
ModMailRole roleToAdd = ModMailRole
|
||||
.builder()
|
||||
.role(role)
|
||||
.server(server)
|
||||
.server(role.getServer())
|
||||
.build();
|
||||
log.info("Adding role {} in server {} to modmail roles.", role.getId(), role.getServer());
|
||||
modMailRoleRepository.save(roleToAdd);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeRoleFromModMailRoles(ARole role, AServer server) {
|
||||
modMailRoleRepository.deleteByServerAndRole(server, role);
|
||||
public void removeRoleFromModMailRoles(ARole role) {
|
||||
modMailRoleRepository.deleteByServerAndRole(role.getServer(), role);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -36,7 +39,7 @@ public class ModMailRoleManagementServiceBean implements ModMailRoleManagementSe
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRoleAlreadyAssigned(ARole role, AServer server) {
|
||||
return modMailRoleRepository.existsByServerAndRole(server, role);
|
||||
public boolean isRoleAlreadyAssigned(ARole role) {
|
||||
return modMailRoleRepository.existsByServerAndRole(role.getServer(), role);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,14 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThreadSubscriber;
|
||||
import dev.sheldan.abstracto.modmail.repository.ModMailSubscriberRepository;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailSubscriberManagementServiceBean implements ModMailSubscriberManagementService {
|
||||
|
||||
@Autowired
|
||||
@@ -34,12 +36,16 @@ public class ModMailSubscriberManagementServiceBean implements ModMailSubscriber
|
||||
.threadReference(modMailThread)
|
||||
.build();
|
||||
|
||||
log.info("Creating subscription for user {} in server {} for modmail thread {}.",
|
||||
aUserInAServer.getUserReference().getId(), aUserInAServer.getServerReference().getId(), modMailThread.getId());
|
||||
modMailSubscriberRepository.save(subscriber);
|
||||
return subscriber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeSubscriber(AUserInAServer aUserInAServer, ModMailThread modMailThread) {
|
||||
log.info("Un-subscribing user {} in server {} from modmail thread {}.",
|
||||
aUserInAServer.getUserReference().getId(), aUserInAServer.getServerReference().getId(), modMailThread.getId());
|
||||
modMailSubscriberRepository.deleteBySubscriberAndThreadReference(aUserInAServer, modMailThread);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThreadState;
|
||||
import dev.sheldan.abstracto.modmail.repository.ModMailThreadRepository;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -15,6 +16,7 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailThreadManagementServiceBean implements ModMailThreadManagementService {
|
||||
|
||||
@Autowired
|
||||
@@ -92,6 +94,9 @@ public class ModMailThreadManagementServiceBean implements ModMailThreadManageme
|
||||
.updated(Instant.now())
|
||||
.build();
|
||||
|
||||
log.info("Create modmail thread in channel {} for user {} in server {}.",
|
||||
channel.getId(), userInAServer.getUserReference().getId(), userInAServer.getServerReference().getId());
|
||||
|
||||
modMailThreadRepository.save(thread);
|
||||
return thread;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.interactive.DelayedAction;
|
||||
import dev.sheldan.abstracto.core.interactive.DelayedActionConfig;
|
||||
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||
import dev.sheldan.abstracto.modmail.service.ModMailThreadServiceBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -11,6 +12,7 @@ import org.springframework.stereotype.Component;
|
||||
* This delayed action is responsible for setting the system configuration of the mod mail category for a given server
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailCategoryDelayedAction implements DelayedAction {
|
||||
|
||||
@Autowired
|
||||
@@ -25,6 +27,7 @@ public class ModMailCategoryDelayedAction implements DelayedAction {
|
||||
@Override
|
||||
public void execute(DelayedActionConfig delayedActionConfig) {
|
||||
ModMailCategoryDelayedActionConfig concrete = (ModMailCategoryDelayedActionConfig) delayedActionConfig;
|
||||
log.info("Executing delayed action for configuration the mdomail category to {} in server {}.", concrete.getCategoryId(), concrete.getServerId());
|
||||
configService.setLongValue(ModMailThreadServiceBean.MODMAIL_CATEGORY, concrete.getServerId(), concrete.getCategoryId());
|
||||
}
|
||||
|
||||
|
||||
@@ -80,9 +80,11 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
|
||||
if(configManagementService.configExists(user.getGuildId(), ModMailThreadServiceBean.MODMAIL_CATEGORY)) {
|
||||
Guild guild = botService.getGuildByIdNullable(user.getGuildId());
|
||||
Long categoryId = configService.getLongValue(ModMailThreadServiceBean.MODMAIL_CATEGORY, user.getGuildId());
|
||||
log.trace("Previous modmail category exists for server {}. Loading value {}.", guild.getId(), categoryId);
|
||||
Category category = guild.getCategoryById(categoryId);
|
||||
model.setCategory(category);
|
||||
}
|
||||
log.info("Executing mod mail category setup for server {}.", user.getGuildId());
|
||||
String messageText = templateService.renderTemplate(messageTemplateKey, model);
|
||||
AChannel channel = channelManagementService.loadChannel(user.getChannelId());
|
||||
CompletableFuture<SetupStepResult> future = new CompletableFuture<>();
|
||||
@@ -96,6 +98,7 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
|
||||
Message message = event.getMessage();
|
||||
// this checks whether or not the user wanted to cancel the setup
|
||||
if(checkForExit(message)) {
|
||||
log.info("User {} wants to exit modmail category setup for server {}.", user.getUserId(), user.getGuildId());
|
||||
result = SetupStepResult.fromCancelled();
|
||||
} else {
|
||||
String messageContent = event.getMessage().getContentRaw();
|
||||
@@ -106,6 +109,7 @@ public class ModMailCategorySetupBean implements ModMailCategorySetup {
|
||||
// directly validate whether or not the given category ID is a valid value
|
||||
modMailFeatureValidator.validateModMailCategory(featureValidationResult, guild, categoryId);
|
||||
if(Boolean.TRUE.equals(featureValidationResult.getValidationResult())) {
|
||||
log.trace("Given category {} maps to a valid category in server {}.", categoryId, guild.getId());
|
||||
ModMailCategoryDelayedActionConfig build = ModMailCategoryDelayedActionConfig
|
||||
.builder()
|
||||
.serverId(user.getGuildId())
|
||||
|
||||
@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.service.ConfigService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureValidatorService;
|
||||
import dev.sheldan.abstracto.modmail.models.template.ModMailCategoryValidationErrorModel;
|
||||
import dev.sheldan.abstracto.modmail.service.ModMailThreadServiceBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.Category;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -21,6 +22,7 @@ import java.util.Optional;
|
||||
* are used to fully validate the mod mail feature.
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ModMailFeatureValidatorBean implements ModMailFeatureValidator {
|
||||
|
||||
@Autowired
|
||||
@@ -44,7 +46,9 @@ public class ModMailFeatureValidatorBean implements ModMailFeatureValidator {
|
||||
if(guildById.isPresent()) {
|
||||
Guild guild = guildById.get();
|
||||
boolean checkSucceeded = featureValidatorService.checkSystemConfig(ModMailThreadServiceBean.MODMAIL_CATEGORY, server, validationResult);
|
||||
log.trace("Validating the modmail category for server {}.", server.getId());
|
||||
if(checkSucceeded) {
|
||||
log.trace("Modmail category has been set for server {}. Lets see if the category exists.", server.getId());
|
||||
Long modMailCategory = configService.getLongValue(ModMailThreadServiceBean.MODMAIL_CATEGORY, server.getId());
|
||||
validateModMailCategory(validationResult, guild, modMailCategory);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user