Split the logging of mod mail threads to a separate feature

fixed the default values of features in properties files
This commit is contained in:
Sheldan
2020-05-11 16:15:02 +02:00
parent af15becf84
commit b13309a026
22 changed files with 129 additions and 66 deletions

View File

@@ -8,7 +8,7 @@ abstracto.scheduling.jobs.experienceJob.recovery=false
abstracto.features.experience=true
abstracto.features.experience=false
abstracto.experience.minExp=10
abstracto.experience.maxExp=25

View File

@@ -1,8 +1,9 @@
abstracto.postTargets.moderation=joinLog,leaveLog,warnLog,kickLog,banLog,editLog,deleteLog,muteLog,decayLog
abstracto.features.moderation=false
abstracto.features.warning=false
abstracto.features.logging=true
abstracto.features.mutes=true
abstracto.features.warnings=false
abstracto.features.warnDecay=false
abstracto.features.logging=false
abstracto.features.muting=false
abstracto.warnings.warnDecay.days=90
abstracto.scheduling.jobs.unMuteJob.name=unMuteJob

View File

@@ -57,7 +57,7 @@ public class AnonReply extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -64,7 +64,7 @@ public class Close extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -60,7 +60,7 @@ public class CloseSilently extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -82,7 +82,7 @@ public class Contact extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
}

View File

@@ -48,6 +48,6 @@ public class RemoveModMailRole extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
}

View File

@@ -57,7 +57,7 @@ public class Reply extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -47,6 +47,6 @@ public class SetModMailCategory extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
}

View File

@@ -48,6 +48,6 @@ public class SetModMailRole extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
}

View File

@@ -52,7 +52,7 @@ public class Subscribe extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -52,7 +52,7 @@ public class UnSubscribe extends AbstractConditionableCommand {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override

View File

@@ -2,12 +2,25 @@ package dev.sheldan.abstracto.modmail.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class ModMailFeature implements FeatureConfig {
@Autowired
private ModMailLoggingFeature modMailLoggingFeature;
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
@Override
public List<FeatureConfig> getDependantFeatures() {
return Arrays.asList(modMailLoggingFeature);
}
}

View File

@@ -3,7 +3,7 @@ package dev.sheldan.abstracto.modmail.config;
import dev.sheldan.abstracto.core.config.FeatureEnum;
public enum ModMailFeatures implements FeatureEnum {
MODMAIL("modmail");
MOD_MAIL("modmail"), MOD_MAIL_LOGGING("modmail_logging");
private String key;

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.modmail.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class ModMailLoggingFeature implements FeatureConfig {
@Autowired
private ModMailFeature modMailFeature;
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MOD_MAIL_LOGGING;
}
@Override
public List<FeatureConfig> getRequiredFeatures() {
return Arrays.asList(modMailFeature);
}
}

View File

@@ -41,6 +41,6 @@ public class ModMailMessageListener implements PrivateMessageReceivedListener {
@Override
public FeatureEnum getFeature() {
return ModMailFeatures.MODMAIL;
return ModMailFeatures.MOD_MAIL;
}
}

View File

@@ -26,12 +26,12 @@ public class ModMailRoleServiceBean implements ModMailRoleService {
if(!modMailRoleManagementService.isRoleAlreadyAssigned(role, server)) {
modMailRoleManagementService.addRoleToModMailRoles(role, server);
}
commandService.allowFeatureForRole(ModMailFeatures.MODMAIL, role);
commandService.allowFeatureForRole(ModMailFeatures.MOD_MAIL, role);
}
@Override
public void removeRoleFromModMailRoles(ARole role, AServer server) {
modMailRoleManagementService.removeRoleFromModMailRoles(role, server);
commandService.disAllowFeatureForRole(ModMailFeatures.MODMAIL, role);
commandService.disAllowFeatureForRole(ModMailFeatures.MOD_MAIL, role);
}
}

View File

@@ -13,6 +13,7 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi
import dev.sheldan.abstracto.core.service.management.UserInServerService;
import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import dev.sheldan.abstracto.modmail.config.ModMailFeature;
import dev.sheldan.abstracto.modmail.config.ModMailLoggingFeature;
import dev.sheldan.abstracto.modmail.models.database.*;
import dev.sheldan.abstracto.modmail.models.dto.ServerChoice;
import dev.sheldan.abstracto.modmail.models.template.*;
@@ -94,6 +95,10 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
@Autowired
private EventWaiter eventWaiter;
@Autowired
private ModMailLoggingFeature modMailLoggingFeature;
@Autowired
private ModMailThreadServiceBean self;
@@ -336,51 +341,56 @@ public class ModMailThreadServiceBean implements ModMailThreadService {
Long modMailThreadId = modMailThread.getId();
log.info("Starting closing procedure for thread {}", modMailThread.getId());
List<ModMailMessage> modMailMessages = modMailThread.getMessages();
List<CompletableFuture<Message>> messages = modMailMessageService.loadModMailMessages(modMailMessages);
log.trace("Loading {} mod mail thread messages.", messages.size());
for (int i = 0; i < messages.size(); i++) {
CompletableFuture<Message> messageCompletableFuture = messages.get(i);
Long messageId = modMailMessages.get(i).getMessageId();
messageCompletableFuture.exceptionally(throwable -> {
log.warn("Failed to load message {} in mod mail thread {}", messageId, modMailThreadId);
return null;
});
}
CompletableFuture.allOf(messages.toArray(new CompletableFuture[0])).whenComplete((avoid, throwable) -> {
ModMailThread innerModMailThread = modMailThreadManagementService.getById(modMailThreadId);
log.trace("Loaded {} mod mail thread messages", messages.size());
if(throwable != null) {
log.warn("Failed to load some mod mail messages for mod mail thread {}. Still trying to post the ones we got.", modMailThreadId, throwable);
}
try {
List<UndoActionInstance> undoActions = new ArrayList<>();
CompletableFutureList<Message> list = self.logModMailThread(modMailThreadId, messages, note);
list.getMainFuture().thenRun(() -> {
list.getFutures().forEach(messageCompletableFuture -> {
try {
Message message = messageCompletableFuture.get();
undoActions.add(UndoActionInstance.getMessageDeleteAction(message.getChannel().getIdLong(), message.getIdLong()));
} catch (InterruptedException | ExecutionException e) {
log.error("Failed to post logging messages.", e);
} catch (Exception e) {
log.error("Failed to handle the mod mail log messages.", e);
}
});
self.afterSuccessfulLog(modMailThreadId, feedBack, notifyUser, undoActions);
});
list.getMainFuture().exceptionally(innerThrowable -> {
sendModMailFailure("modmail_exception_generic", innerModMailThread.getUser(), modMailThreadId, feedBack, innerThrowable);
log.error("Failed to log messages for mod mail thread {}.", modMailThreadId, innerThrowable);
boolean loggingEnabled = featureFlagService.isFeatureEnabled(modMailLoggingFeature, modMailThread.getServer());
List<UndoActionInstance> undoActions = new ArrayList<>();
if(loggingEnabled) {
List<CompletableFuture<Message>> messages = modMailMessageService.loadModMailMessages(modMailMessages);
log.trace("Loading {} mod mail thread messages.", messages.size());
for (int i = 0; i < messages.size(); i++) {
CompletableFuture<Message> messageCompletableFuture = messages.get(i);
Long messageId = modMailMessages.get(i).getMessageId();
messageCompletableFuture.exceptionally(throwable -> {
log.warn("Failed to load message {} in mod mail thread {}", messageId, modMailThreadId);
return null;
});
} catch (PostTargetException po) {
log.error("Failed to log mod mail messages", po);
sendModMailFailure("modmail_exception_post_target_not_defined", innerModMailThread.getUser(), modMailThreadId, feedBack, po);
} catch (Exception e) {
log.error("Failed to log mod mail messages", e);
sendModMailFailure("modmail_exception_generic", innerModMailThread.getUser(), modMailThreadId, feedBack, e);
}
});
CompletableFuture.allOf(messages.toArray(new CompletableFuture[0])).whenComplete((avoid, throwable) -> {
ModMailThread innerModMailThread = modMailThreadManagementService.getById(modMailThreadId);
log.trace("Loaded {} mod mail thread messages", messages.size());
if(throwable != null) {
log.warn("Failed to load some mod mail messages for mod mail thread {}. Still trying to post the ones we got.", modMailThreadId, throwable);
}
try {
CompletableFutureList<Message> list = self.logModMailThread(modMailThreadId, messages, note);
list.getMainFuture().thenRun(() -> {
list.getFutures().forEach(messageCompletableFuture -> {
try {
Message message = messageCompletableFuture.get();
undoActions.add(UndoActionInstance.getMessageDeleteAction(message.getChannel().getIdLong(), message.getIdLong()));
} catch (InterruptedException | ExecutionException e) {
log.error("Failed to post logging messages.", e);
} catch (Exception e) {
log.error("Failed to handle the mod mail log messages.", e);
}
});
self.afterSuccessfulLog(modMailThreadId, feedBack, notifyUser, undoActions);
});
list.getMainFuture().exceptionally(innerThrowable -> {
sendModMailFailure("modmail_exception_generic", innerModMailThread.getUser(), modMailThreadId, feedBack, innerThrowable);
log.error("Failed to log messages for mod mail thread {}.", modMailThreadId, innerThrowable);
return null;
});
} catch (PostTargetException po) {
log.error("Failed to log mod mail messages", po);
sendModMailFailure("modmail_exception_post_target_not_defined", innerModMailThread.getUser(), modMailThreadId, feedBack, po);
} catch (Exception e) {
log.error("Failed to log mod mail messages", e);
sendModMailFailure("modmail_exception_generic", innerModMailThread.getUser(), modMailThreadId, feedBack, e);
}
});
} else {
self.afterSuccessfulLog(modMailThreadId, feedBack, notifyUser, undoActions);
}
}

View File

@@ -1,3 +1,5 @@
abstracto.postTargets.modmail=modmailLog,modmailPing
abstracto.emoteNames.readReaction=readReaction
abstracto.defaultEmotes.readReaction=\uD83D\uDC40
abstracto.defaultEmotes.readReaction=\uD83D\uDC40
abstracto.features.modmail=false
abstracto.features.modmail_logging=false

View File

@@ -25,8 +25,8 @@ abstracto.scheduling.jobs.reminderJob.standAlone=false
abstracto.scheduling.jobs.reminderJob.active=true
abstracto.scheduling.jobs.reminderJob.recovery=false
abstracto.features.starboard=true
abstracto.features.remind=true
abstracto.features.starboard=false
abstracto.features.remind=false
abstracto.features.suggestion=false
abstracto.features.utility=false
abstracto.features.embeds=true
abstracto.features.link_embeds=false

View File

@@ -15,7 +15,6 @@ This feature enables users to contact the moderation of the server in a private
Feature key: `modmail`
.Post targets
`modmailLog`:: Will be used to log the interactions when a thread is closed.
`modmailPing`:: Will be used to send the notification when a new thread is opened.
@@ -56,3 +55,14 @@ Removing a role from the roles responsible for managing mod mail threads::
Changing the category in which the text channels are created::
* Usage: `setModMailCategory <categoryId>`
* Description: Sets the category which Abstracto uses to create the text channels containing the mod mail threads. The existing threads will not be migrated automatically.
[.lead]
Mod mail thread logging
This feature enables the logging of mod mail threads into a channel when they are closed. The individual log messages will have a mod mail header which contains some information about the thread.
Feature key: `modmail_logging`
.Post targets
`modmailLog`:: Will be used to log the interactions when a thread is closed.