mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-27 14:23:56 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -57,7 +57,7 @@ public class AnonReply extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Close extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -60,7 +60,7 @@ public class CloseSilently extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -82,7 +82,7 @@ public class Contact extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -48,6 +48,6 @@ public class RemoveModMailRole extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Reply extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,6 +47,6 @@ public class SetModMailCategory extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,6 @@ public class SetModMailRole extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class Subscribe extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -52,7 +52,7 @@ public class UnSubscribe extends AbstractConditionableCommand {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,6 @@ public class ModMailMessageListener implements PrivateMessageReceivedListener {
|
||||
|
||||
@Override
|
||||
public FeatureEnum getFeature() {
|
||||
return ModMailFeatures.MODMAIL;
|
||||
return ModMailFeatures.MOD_MAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -0,0 +1 @@
|
||||
Mod mail logging
|
||||
Reference in New Issue
Block a user