[AB-277] adding report mechanism via reactions

This commit is contained in:
Sheldan
2021-05-30 21:00:49 +02:00
parent d69f597663
commit 55e0879e06
30 changed files with 714 additions and 8 deletions

View File

@@ -10,7 +10,9 @@ public enum ModerationFeatureDefinition implements FeatureDefinition {
MUTING("muting"),
AUTOMATIC_WARN_DECAY("warnDecay"),
USER_NOTES("userNotes"),
INVITE_FILTER("inviteFilter");
INVITE_FILTER("inviteFilter"),
REPORT_REACTIONS("reportReactions")
;
private final String key;

View File

@@ -0,0 +1,36 @@
package dev.sheldan.abstracto.moderation.config.feature;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.moderation.config.posttarget.ReactionReportPostTarget;
import dev.sheldan.abstracto.moderation.service.ReactionReportService;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class ReportReactionFeatureConfig implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return ModerationFeatureDefinition.REPORT_REACTIONS;
}
@Override
public List<PostTargetEnum> getRequiredPostTargets() {
return Arrays.asList(ReactionReportPostTarget.REACTION_REPORTS);
}
@Override
public List<String> getRequiredEmotes() {
return Arrays.asList(ReactionReportService.REACTION_REPORT_EMOTE_KEY);
}
@Override
public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList(ReactionReportService.REACTION_REPORT_COOLDOWN);
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.config.posttarget;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import lombok.Getter;
@Getter
public enum ReactionReportPostTarget implements PostTargetEnum {
REACTION_REPORTS("reactionReports");
private String key;
ReactionReportPostTarget(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,39 @@
package dev.sheldan.abstracto.moderation.model.database;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name="moderation_user")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
public class ModerationUser {
@Id
@Column(name = "id", nullable = false)
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private AUserInAServer user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Column(name = "latest_report")
private Instant lastReportTimeStamp;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
}

View File

@@ -83,7 +83,7 @@ public class Mute implements Serializable {
* The channel in which this mute was cast
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mutingChannel")
@JoinColumn(name = "muting_channel_id")
private AChannel mutingChannel;
/**

View File

@@ -0,0 +1,52 @@
package dev.sheldan.abstracto.moderation.model.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "reaction_report")
@Getter
@Setter
@EqualsAndHashCode
public class ReactionReport {
@Id
@Column(name = "id")
private Long reportMessageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "report_channel_id")
private AChannel reportChannel;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "reported_user_in_server_id", nullable = false)
private AUserInAServer reportedUser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "reported_channel_id")
private AChannel reportedChannel;
@Column(name = "reported_message_id")
private Long reportedMessageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id")
private AServer server;
@Column(name = "report_count")
private Integer reportCount;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class ReportReactionNotificationModel {
private CachedMessage reportedMessage;
private ServerUser reporter;
private Integer reportCount;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import java.util.concurrent.CompletableFuture;
public interface ReactionReportService {
String REACTION_REPORT_EMOTE_KEY = "reactionReport";
String REACTION_REPORT_COOLDOWN = "reactionReportCooldownSeconds";
CompletableFuture<Void> createReactionReport(CachedMessage reportedMessage, ServerUser reporter);
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.model.database.ModerationUser;
import java.time.Instant;
import java.util.Optional;
public interface ModerationUserManagementService {
ModerationUser createModerationUser(AUserInAServer aUserInAServer);
ModerationUser createModerationUserWithReportTimeStamp(AUserInAServer aUserInAServer, Instant reportTime);
Optional<ModerationUser> findModerationUser(AUserInAServer aUserInAServer);
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.model.database.ReactionReport;
import net.dv8tion.jda.api.entities.Message;
import java.time.Duration;
import java.util.Optional;
public interface ReactionReportManagementService {
Optional<ReactionReport> findRecentReactionReportAboutUser(AUserInAServer aUserInAServer, Duration part);
ReactionReport createReactionReport(CachedMessage reportedMessage, Message reportMessage);
}