Skip to content

Commit

Permalink
More work on moderation commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Aizistral committed Sep 24, 2024
1 parent 286fcb1 commit 16fb3ed
Show file tree
Hide file tree
Showing 21 changed files with 284 additions and 132 deletions.
29 changes: 27 additions & 2 deletions src/main/java/com/aizistral/infmachine/InfiniteMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import javax.management.RuntimeErrorException;

Expand All @@ -20,6 +21,7 @@
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildMessageChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

Expand Down Expand Up @@ -52,12 +54,35 @@ public GuildConfig getConfig() {
return this.configLoader.getData();
}

public Optional<StandardGuildMessageChannel> getModerationLogChannel() {
StandardGuildMessageChannel channel = this.guild.getChannelById(StandardGuildMessageChannel.class,
this.getConfig().getModerationLogChannel());

return Optional.ofNullable(channel);
}

public boolean represents(Guild guild) {
return this.guild.getIdLong() == guild.getIdLong();
return this.represents(guild.getIdLong());
}

public static boolean instanceExistsFor(Guild guild) {
return INSTANCES.stream().anyMatch(machine -> machine.represents(guild));
return instanceExistsFor(guild.getIdLong());
}

public static Optional<InfiniteMachine> getInstanceFor(Guild guild) {
return getInstanceFor(guild.getIdLong());
}

public boolean represents(long guildId) {
return this.guild.getIdLong() == guildId;
}

public static boolean instanceExistsFor(long guildId) {
return getInstanceFor(guildId).isPresent();
}

public static Optional<InfiniteMachine> getInstanceFor(long guildId) {
return INSTANCES.stream().filter(machine -> machine.represents(guildId)).findAny();
}

public static List<InfiniteMachine> getInstances() {
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/aizistral/infmachine/MachineBootstrap.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

import com.aizistral.infmachine.commands.CommandRegistry;
import com.aizistral.infmachine.config.InfiniteConfig;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;
import com.aizistral.infmachine.database.InfiniteDatabase;
import com.aizistral.infmachine.handlers.RoutineHandler;
import com.aizistral.infmachine.routines.RoutineHandler;
import com.aizistral.infmachine.utils.SimpleLogger;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
Expand Down Expand Up @@ -38,7 +38,7 @@ public static void main(String... args) throws Exception {

try {
InfiniteConfig.load();
Localization.load();
Lang.load();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
Expand All @@ -60,7 +60,7 @@ else if (mongoURI.isEmpty())
GatewayIntent.DIRECT_MESSAGES, GatewayIntent.MESSAGE_CONTENT, GatewayIntent.GUILD_MEMBERS
);

builder.setActivity(Activity.watching(Localization.get("activity.watching")));
builder.setActivity(Activity.watching(Lang.get("activity.watching")));

jda = builder.build();

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/aizistral/infmachine/commands/Command.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.aizistral.infmachine.commands;

import java.util.List;
import java.util.Optional;

import com.aizistral.infmachine.InfiniteMachine;
import com.aizistral.infmachine.config.GuildConfig;
import com.aizistral.infmachine.utils.SimpleLogger;

import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildMessageChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData;

Expand All @@ -30,6 +32,10 @@ public default GuildConfig getConfig() {
return this.getMachine().getConfig();
}

public default Optional<StandardGuildMessageChannel> getModerationLogChannel() {
return this.getMachine().getModerationLogChannel();
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import com.aizistral.infmachine.commands.impl.MuteCommand;
import com.aizistral.infmachine.commands.impl.PingCommand;
import com.aizistral.infmachine.commands.impl.WarnCommand;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;
import com.aizistral.infmachine.utils.SimpleLogger;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
Expand Down Expand Up @@ -74,11 +74,11 @@ public void onEvent(GenericEvent event) {
slashEvent.getFullCommandName());

if (!slashEvent.isAcknowledged()) {
slashEvent.reply(Localization.get("msg.commandError")).queue();
slashEvent.reply(Lang.get("msg.commandError")).queue();
}
}
} else {
slashEvent.reply(Localization.get("msg.commandNotFound")).queue();
slashEvent.reply(Lang.get("msg.commandNotFound")).queue();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import java.util.concurrent.TimeUnit;

import com.aizistral.infmachine.commands.Command.Context;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;
import com.aizistral.infmachine.database.InfiniteDatabase;
import com.aizistral.infmachine.database.model.ModerationAction;
import com.aizistral.infmachine.database.model.ModerationAction.Type;
import com.aizistral.infmachine.utils.SimpleDuration;

import net.dv8tion.jda.api.EmbedBuilder;
Expand Down Expand Up @@ -34,14 +35,19 @@ protected SlashCommandData setDefaultPermissions(SlashCommandData data, String n
@Override
protected SlashCommandData addOptionalOptions(SlashCommandData data, String name) {
return super.addOptionalOptions(data, name)
.addOption(OptionType.STRING, "clear_time", Localization.get("cmd."+ name +".clear_time.desc"), false);
.addOption(OptionType.STRING, "clear_time", Lang.get("cmd."+ name +".clear_time.desc"), false);
}

@Override
protected String getCommandName() {
return "ban";
}

@Override
public Type getActionType() {
return Type.BAN;
}

@Override
protected boolean checkPreconditions(SlashCommandInteractionEvent event, Context context) {
if (!super.checkPreconditions(event, context))
Expand All @@ -52,7 +58,7 @@ protected boolean checkPreconditions(SlashCommandInteractionEvent event, Context
try {
SimpleDuration.fromString(clearStr);
} catch (IllegalArgumentException ex) {
this.handleValidationError(Localization.get("msg.actionError.invalidDuration", clearStr), event, context);
this.handleValidationError(Lang.get("msg.actionError.invalidDuration", clearStr), event, context);
return false;
}

Expand All @@ -74,7 +80,7 @@ else if (duration.greaterThan(maxClear))
protected void handleSuccess(SlashCommandInteractionEvent event, Context context, User subject, User moderator,
SimpleDuration duration, ModerationAction action, EmbedBuilder builder, InteractionHook hook) {
super.handleSuccess(event, context, subject, moderator, duration, action, builder, hook);
InfiniteDatabase.registerBan(action, subject.getIdLong(), context.getGuild().getIdLong());
InfiniteDatabase.registerPunishment(action, subject.getIdLong(), context.getGuild().getIdLong());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.aizistral.infmachine.InfiniteMachine;
import com.aizistral.infmachine.MachineBootstrap;
import com.aizistral.infmachine.commands.Command;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;

import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
Expand All @@ -14,7 +14,7 @@ public class KillCommand implements Command {

@Override
public SlashCommandData getData(Context context) {
return Commands.slash("terminate", Localization.get("cmd.terminate.desc"))
return Commands.slash("terminate", Lang.get("cmd.terminate.desc"))
.setDefaultPermissions(DefaultMemberPermissions.DISABLED);
}

Expand All @@ -23,7 +23,7 @@ public void onEvent(SlashCommandInteractionEvent event, Context context) {
if (!context.getConfig().isTrusted())
return;

event.reply(Localization.get("msg.termination")).queue(hook -> {
event.reply(Lang.get("msg.termination")).queue(hook -> {
MachineBootstrap.terminate();
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import com.aizistral.infmachine.commands.Command;
import com.aizistral.infmachine.commands.Command.Context;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;
import com.aizistral.infmachine.database.InfiniteDatabase;
import com.aizistral.infmachine.database.model.ModerationAction;
import com.aizistral.infmachine.database.model.ModerationAction.Type;
Expand Down Expand Up @@ -39,6 +39,11 @@ protected String getCommandName() {
return "mute";
}

@Override
public Type getActionType() {
return Type.MUTE;
}

@Override
protected SimpleDuration applyConstraints(SimpleDuration duration) {
SimpleDuration maxDuration = new SimpleDuration(27, TimeUnit.DAYS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.aizistral.infmachine.commands.Command;
import com.aizistral.infmachine.commands.Command.Context;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;

import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
Expand All @@ -12,7 +12,7 @@ public class PingCommand implements Command {

@Override
public SlashCommandData getData(Context context) {
return Commands.slash("ping", Localization.get("cmd.ping.desc"));
return Commands.slash("ping", Lang.get("cmd.ping.desc"));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import com.aizistral.infmachine.commands.Command;
import com.aizistral.infmachine.commands.Command.Context;
import com.aizistral.infmachine.config.Localization;
import com.aizistral.infmachine.config.Lang;
import com.aizistral.infmachine.database.InfiniteDatabase;
import com.aizistral.infmachine.database.model.ModerationAction;
import com.aizistral.infmachine.database.model.ModerationAction.Type;
Expand All @@ -33,25 +33,27 @@ public abstract class PunishCommand implements Command {

protected abstract String getCommandName();

public abstract ModerationAction.Type getActionType();

protected abstract Optional<AuditableRestAction<Void>> getModerationAction(Guild guild, User subject,
SimpleDuration duration, String reason, SlashCommandInteractionEvent event, Context context);

protected String getActionFailDesc(String subjectName) {
return Localization.get("msg." + this.getCommandName() + "Desc.fail", subjectName);
return Lang.get("msg." + this.getCommandName() + "Desc.fail", subjectName);
}

protected String getActionSuccessDesc(String subjectName) {
return Localization.get("msg." + this.getCommandName() + "Desc.success", subjectName);
return Lang.get("msg." + this.getCommandName() + "Desc.success", subjectName);
}

protected String getActionLogDesc(String subjectName) {
return Localization.get("msg." + this.getCommandName() + "Desc.log", subjectName);
return Lang.get("msg." + this.getCommandName() + "Desc.log", subjectName);
}

@Override
public SlashCommandData getData(Context context) {
String name = this.getCommandName();
SlashCommandData data = Commands.slash(name, Localization.get("cmd." + name + ".desc"));
SlashCommandData data = Commands.slash(name, Lang.get("cmd." + name + ".desc"));

data = this.addRequiredOptions(data, name);
data = this.addOptionalOptions(data, name);
Expand All @@ -61,12 +63,12 @@ public SlashCommandData getData(Context context) {
}

protected SlashCommandData addRequiredOptions(SlashCommandData data, String name) {
return data.addOption(OptionType.USER, "subject", Localization.get("cmd." + name + ".subject.desc"), true)
.addOption(OptionType.STRING, "reason", Localization.get("cmd."+ name +".reason.desc"), true);
return data.addOption(OptionType.USER, "subject", Lang.get("cmd." + name + ".subject.desc"), true)
.addOption(OptionType.STRING, "reason", Lang.get("cmd."+ name +".reason.desc"), true);
}

protected SlashCommandData addOptionalOptions(SlashCommandData data, String name) {
return data.addOption(OptionType.STRING, "duration", Localization.get("cmd."+ name +".duration.desc"), false);
return data.addOption(OptionType.STRING, "duration", Lang.get("cmd."+ name +".duration.desc"), false);
}

protected SlashCommandData setDefaultPermissions(SlashCommandData data, String name) {
Expand Down Expand Up @@ -100,10 +102,10 @@ protected SimpleDuration applyConstraints(SimpleDuration duration) {

protected boolean checkPreconditions(SlashCommandInteractionEvent event, Context context) {
if (event.getOption("subject", OptionMapping::getAsUser) == null) {
this.handleValidationError(Localization.get("msg.actionError.noMember"), event, context);
this.handleValidationError(Lang.get("msg.actionError.noMember"), event, context);
return false;
} else if (event.getOption("reason", OptionMapping::getAsString) == null) {
this.handleValidationError(Localization.get("msg.actionError.noReason"), event, context);
this.handleValidationError(Lang.get("msg.actionError.noReason"), event, context);
return false;
}

Expand All @@ -112,7 +114,7 @@ protected boolean checkPreconditions(SlashCommandInteractionEvent event, Context
try {
SimpleDuration.fromString(durationStr);
} catch (IllegalArgumentException ex) {
this.handleValidationError(Localization.get("msg.actionError.invalidDuration", durationStr), event, context);
this.handleValidationError(Lang.get("msg.actionError.invalidDuration", durationStr), event, context);
return false;
}

Expand All @@ -122,12 +124,12 @@ protected boolean checkPreconditions(SlashCommandInteractionEvent event, Context
private EmbedBuilder getReplyTemplate(User moderator, User subject, SimpleDuration duration, String reason) {
EmbedBuilder builder = new EmbedBuilder();

builder.addField(Localization.get("msg.moderationAuthority"), "<@" + moderator.getId() + ">", true);
builder.addField(Lang.get("msg.moderationAuthority"), "<@" + moderator.getId() + ">", true);
builder.addBlankField(true);
builder.addField(Localization.get("msg.moderationSubject"), "<@" + subject.getId() + ">", true);
builder.addField(Localization.get("msg.moderationDuration"), duration.getLocalized(), true);
builder.addField(Lang.get("msg.moderationSubject"), "<@" + subject.getId() + ">", true);
builder.addField(Lang.get("msg.moderationDuration"), duration.getLocalized(), true);
builder.addBlankField(true);
builder.addField(Localization.get("msg.moderationReason"), reason, true);
builder.addField(Lang.get("msg.moderationReason"), reason, true);

return builder;
}
Expand All @@ -138,20 +140,20 @@ private MessageEmbed getLogEmbed(User moderator, User subject, SimpleDuration du
String moderatorName = this.getModeratorDisplayName(event);
EmbedBuilder builder = new EmbedBuilder();

builder.setTitle(context.getConfig().getJusticeEmoji() + " " + Localization.get("msg.moderationActionTitle"));
builder.setTitle(context.getConfig().getJusticeEmoji() + " " + Lang.get("msg.moderationActionTitle"));

builder.setColor(context.getConfig().getEmbedNormalColor());
builder.setDescription(this.getActionLogDesc(subjectName));

moderatorName = "**" + moderatorName + "** (<@" + moderator.getId() + ">)";
subjectName = "**" + subjectName + "** (<@" + subject.getId() + ">)";

builder.addField(Localization.get("msg.moderationAuthority"), moderatorName, true);
builder.addField(Lang.get("msg.moderationAuthority"), moderatorName, true);
builder.addBlankField(true);
builder.addField(Localization.get("msg.moderationSubject"), subjectName, true);
builder.addField(Localization.get("msg.moderationDuration"), duration.getLocalized(), true);
builder.addField(Lang.get("msg.moderationSubject"), subjectName, true);
builder.addField(Lang.get("msg.moderationDuration"), duration.getLocalized(), true);
builder.addBlankField(true);
builder.addField(Localization.get("msg.moderationReason"), reason, true);
builder.addField(Lang.get("msg.moderationReason"), reason, true);

return builder.build();
}
Expand All @@ -170,7 +172,7 @@ public void onEvent(SlashCommandInteractionEvent event, Context context) {
long timestamp = System.currentTimeMillis();

EmbedBuilder builder = this.getReplyTemplate(moderator, subject, duration, reason);
ModerationAction action = new ModerationAction(Type.MUTE, guild.getIdLong(), moderator.getIdLong(),
ModerationAction action = new ModerationAction(this.getActionType(), guild.getIdLong(), moderator.getIdLong(),
subject.getIdLong(), reason, duration.toMillis(), timestamp, false);

event.deferReply().queue(hook -> {
Expand Down Expand Up @@ -219,13 +221,10 @@ protected void handleSuccess(SlashCommandInteractionEvent event, Context context
hook.sendMessageEmbeds(builder.build()).queue();
InfiniteDatabase.logAction(action);

StandardGuildMessageChannel channel = context.getGuild().getChannelById(StandardGuildMessageChannel.class,
context.getConfig().getModerationLogChannel());

if (channel != null) {
context.getModerationLogChannel().ifPresent(channel -> {
channel.sendMessageEmbeds(this.getLogEmbed(moderator, subject, duration, action.getReason(), event,
context)).queue();
}
});
}

protected void handleError(SlashCommandInteractionEvent event, Context context, User subject, ModerationAction action,
Expand Down
Loading

0 comments on commit 16fb3ed

Please sign in to comment.