[AB-52] upgrading to alpha 12

adding anonymous reporting
reworking message context commands
refactoring interaction packages
adding post execution handling for message context commands and modals
reworking feature mode response
fixing setup using component ids
storing infraction parameters, for example mute duration, with every infraction
adding infractions for more moderation actions
creating general method to format a duration string
adding infractions command
reworking muting to use built-in functionality of discord
enabling chunking of members
removing manual unmuting feature mode
adding ability to update infractions with a command
implemented infraction listeners for ban and warn
refactored infraction notifications
storing log messages to the infraction for editing said log messages
This commit is contained in:
Sheldan
2022-06-25 12:00:20 +02:00
parent 1a1fde0800
commit 68cae74819
363 changed files with 4306 additions and 3388 deletions

View File

@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.command.condition.detail.ImmuneUserConditionDe
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.EffectConfig;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandParameterService;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
import dev.sheldan.abstracto.core.models.database.RoleImmunity;
import dev.sheldan.abstracto.core.service.RoleImmunityService;
import dev.sheldan.abstracto.core.service.RoleService;

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.command.config;
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;

View File

@@ -3,17 +3,12 @@ package dev.sheldan.abstracto.core.command.service;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.listener.async.jda.ButtonClickedListener;
import dev.sheldan.abstracto.core.models.listener.ButtonClickedListenerModel;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public interface ExceptionService {
CommandResult reportExceptionToContext(Throwable exception, CommandContext context, Command command);
void reportExceptionToInteraction(Throwable exception, ButtonClickedListenerModel interActionContext, ButtonClickedListener executedListener);
void reportSlashException(Throwable exception, SlashCommandInteractionEvent event, Command command);
void reportExceptionToGuildMessageReceivedContext(Throwable exception, MessageReceivedEvent event);
void reportExceptionToPrivateMessageReceivedContext(Throwable exception, MessageReceivedEvent event);
void reportExceptionToChannel(Throwable exception, MessageChannel channel, Member member);

View File

@@ -1,7 +0,0 @@
package dev.sheldan.abstracto.core.command.slash.parameter.provider;
import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandOptionTypeMapping;
public interface SlashCommandParameterProvider {
SlashCommandOptionTypeMapping getOptionMapping();
}

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.service;
package dev.sheldan.abstracto.core.interaction;
import net.dv8tion.jda.api.entities.Guild;

View File

@@ -1,17 +1,19 @@
package dev.sheldan.abstracto.core.service.management;
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.interaction.modal.ModalConfigPayload;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.ComponentPayload;
import dev.sheldan.abstracto.core.models.database.ComponentType;
import dev.sheldan.abstracto.core.models.template.button.ButtonConfigModel;
import dev.sheldan.abstracto.core.interaction.button.ButtonConfigModel;
import java.util.List;
import java.util.Optional;
public interface ComponentPayloadManagementService {
ComponentPayload createPayload(String id, String payload, Class payloadType, String buttonOrigin, AServer server, ComponentType type);
ComponentPayload createPayload(ButtonConfigModel buttonConfigModel, AServer server);
ComponentPayload createPayload(ButtonConfigModel buttonConfigModel, Long serverId);
ComponentPayload createButtonPayload(ButtonConfigModel buttonConfigModel, AServer server);
ComponentPayload createButtonPayload(ButtonConfigModel buttonConfigModel, Long serverId);
ComponentPayload createModalPayload(ModalConfigPayload payloadConfig, Long serverId);
Optional<ComponentPayload> findPayload(String id);
List<ComponentPayload> findPayloadsOfOriginInServer(String buttonOrigin, AServer server);
void deletePayload(String id);

View File

@@ -1,8 +1,8 @@
package dev.sheldan.abstracto.core.service;
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.ComponentPayload;
import dev.sheldan.abstracto.core.models.template.button.ButtonPayload;
import dev.sheldan.abstracto.core.interaction.button.ButtonPayload;
public interface ComponentPayloadService {
ComponentPayload createButtonPayload(String componentId, ButtonPayload payload, String origin, AServer server);

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.core.service;
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.models.template.button.ButtonConfigModel;
import dev.sheldan.abstracto.core.interaction.button.ButtonConfigModel;
import net.dv8tion.jda.api.entities.GuildMessageChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.interactions.components.ActionComponent;

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.core.interaction;
import lombok.Builder;
import lombok.Getter;
import net.dv8tion.jda.api.interactions.commands.Command;
@Builder
@Getter
public class ContextCommandConfig {
private Command.Type type;
private String name;
private MessageContextConfig messageContextConfig;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.interactions.commands.Command;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData;
import org.springframework.data.util.Pair;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public interface InteractionCommandService {
CompletableFuture<List<Command>> updateGuildCommands(Guild guild, List<Pair<List<CommandConfiguration>, SlashCommandData>> slashCommands, List<ContextCommandConfig> contextCommands);
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.interaction.button.listener.ButtonClickedListener;
import dev.sheldan.abstracto.core.interaction.button.listener.ButtonClickedListenerModel;
import dev.sheldan.abstracto.core.interaction.context.message.listener.MessageContextCommandListener;
import dev.sheldan.abstracto.core.interaction.modal.listener.ModalInteractionListener;
import dev.sheldan.abstracto.core.interaction.modal.listener.ModalInteractionListenerModel;
import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
public interface InteractionExceptionService {
void reportExceptionToInteraction(Throwable exception, ButtonClickedListenerModel interActionContext, ButtonClickedListener executedListener);
void reportExceptionToInteraction(Throwable exception, MessageContextInteractionModel interActionContext, MessageContextCommandListener executedListener);
void reportExceptionToInteraction(Throwable exception, ModalInteractionListenerModel interActionContext, ModalInteractionListener executedListener);
void reportExceptionToInteraction(Throwable exception, IReplyCallback callback, InteractionListener executedListener);
void reportSlashException(Throwable exception, SlashCommandInteractionEvent event, Command command);
}

View File

@@ -0,0 +1,4 @@
package dev.sheldan.abstracto.core.interaction;
public interface InteractionListener {
}

View File

@@ -12,6 +12,7 @@ public interface InteractionService {
List<CompletableFuture<Message>> sendMessageToInteraction(MessageToSend messageToSend, InteractionHook interactionHook);
List<CompletableFuture<Message>> sendMessageToInteraction(String templateKey, Object model, InteractionHook interactionHook);
CompletableFuture<InteractionHook> replyEmbed(String templateKey, Object model, IReplyCallback callback);
CompletableFuture<InteractionHook> replyString(String text, IReplyCallback callback);
CompletableFuture<InteractionHook> replyEmbed(String templateKey, IReplyCallback callback);
CompletableFuture<Message> editOriginal(MessageToSend messageToSend, InteractionHook interactionHook);
CompletableFuture<InteractionHook> replyMessageToSend(MessageToSend messageToSend, IReplyCallback callback);

View File

@@ -6,5 +6,7 @@ import lombok.Getter;
@Getter
@Builder
public class MessageContextConfig {
private String templateKey;
private String name;
private Boolean isTemplated;
}

View File

@@ -1,8 +0,0 @@
package dev.sheldan.abstracto.core.interaction;
import dev.sheldan.abstracto.core.listener.async.jda.ButtonClickedListener;
import dev.sheldan.abstracto.core.models.listener.ButtonClickedListenerModel;
public interface PostInteractionExecution {
void execute(ButtonClickedListenerModel interActionContext, InteractionResult interactionResult, ButtonClickedListener executedListener);
}

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.models.template.button;
package dev.sheldan.abstracto.core.interaction.button;
import lombok.Builder;
import lombok.Getter;

View File

@@ -0,0 +1,4 @@
package dev.sheldan.abstracto.core.interaction.button;
public interface ButtonPayload {
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.core.interaction.button;
import dev.sheldan.abstracto.core.interaction.InteractionResult;
import dev.sheldan.abstracto.core.interaction.button.listener.ButtonClickedListener;
import dev.sheldan.abstracto.core.interaction.button.listener.ButtonClickedListenerModel;
public interface ButtonPostInteractionExecution {
void execute(ButtonClickedListenerModel interActionContext, InteractionResult interactionResult, ButtonClickedListener executedListener);
}

View File

@@ -1,10 +1,9 @@
package dev.sheldan.abstracto.core.listener.async.jda;
package dev.sheldan.abstracto.core.interaction.button.listener;
import dev.sheldan.abstracto.core.Prioritized;
import dev.sheldan.abstracto.core.listener.ButtonClickedListenerResult;
import dev.sheldan.abstracto.core.interaction.InteractionListener;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.core.models.listener.ButtonClickedListenerModel;
public interface ButtonClickedListener extends FeatureAwareListener<ButtonClickedListenerModel, ButtonClickedListenerResult>, Prioritized {
public interface ButtonClickedListener extends FeatureAwareListener<ButtonClickedListenerModel, ButtonClickedListenerResult>, Prioritized, InteractionListener {
Boolean handlesEvent(ButtonClickedListenerModel model);
}

View File

@@ -1,7 +1,7 @@
package dev.sheldan.abstracto.core.models.listener;
package dev.sheldan.abstracto.core.interaction.button.listener;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import dev.sheldan.abstracto.core.models.template.button.ButtonPayload;
import dev.sheldan.abstracto.core.interaction.button.ButtonPayload;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.interaction.button.listener;
import dev.sheldan.abstracto.core.listener.ListenerExecutionResult;
public enum ButtonClickedListenerResult implements ListenerExecutionResult {
ACKNOWLEDGED, IGNORED
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.core.interaction.context;
import dev.sheldan.abstracto.core.interaction.ContextCommandConfig;
import dev.sheldan.abstracto.core.interaction.MessageContextConfig;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.interactions.commands.Command;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public interface ContextCommandService {
CompletableFuture<Void> upsertGuildMessageContextCommand(Guild guild, String name, MessageContextConfig config);
CompletableFuture<Void> deleteGuildContextCommand(Guild guild, Long commandId);
CompletableFuture<Void> deleteGuildContextCommandByName(Guild guild, MessageContextConfig contextConfig);
String getCommandContextName(MessageContextConfig contextConfig, Long guildId);
boolean matchesGuildContextName(MessageContextInteractionModel model, MessageContextConfig contextConfig, Long guidId);
void storeCreatedCommands(Command command, AServer server, List<ContextCommandConfig> contextCommands);
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.core.interaction.context.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.ContextCommand;
import dev.sheldan.abstracto.core.models.database.ContextCommandInServer;
import java.util.Optional;
public interface ContextCommandInServerManagementService {
ContextCommandInServer createOrUpdateContextCommandInServer(ContextCommand contextCommand, AServer server, Long discordContextId);
Optional<ContextCommandInServer> loadContextCommandInServer(ContextCommand contextCommand, AServer server);
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.core.interaction.context.management;
import dev.sheldan.abstracto.core.models.database.AFeature;
import dev.sheldan.abstracto.core.models.database.ContextCommand;
import dev.sheldan.abstracto.core.models.database.ContextType;
public interface ContextCommandManagementService {
ContextCommand createContextCommand(String name, ContextType contextType, AFeature feature);
ContextCommand findContextCommand(String name);
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.core.interaction.context.message;
import dev.sheldan.abstracto.core.interaction.InteractionResult;
import dev.sheldan.abstracto.core.interaction.context.message.listener.MessageContextCommandListener;
import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
public interface MessageContextPostInteractionExecution {
void execute(MessageContextInteractionModel interActionContext, InteractionResult interactionResult, MessageContextCommandListener executedListener);
}

View File

@@ -1,11 +1,12 @@
package dev.sheldan.abstracto.core.listener.async;
package dev.sheldan.abstracto.core.interaction.context.message.listener;
import dev.sheldan.abstracto.core.interaction.InteractionListener;
import dev.sheldan.abstracto.core.interaction.MessageContextConfig;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.core.models.listener.interaction.MessageContextInteractionModel;
public interface MessageContextCommandListener extends FeatureAwareListener<MessageContextInteractionModel, DefaultListenerResult> {
public interface MessageContextCommandListener extends FeatureAwareListener<MessageContextInteractionModel, DefaultListenerResult>, InteractionListener {
MessageContextConfig getConfig();
Boolean handlesEvent(MessageContextInteractionModel model);
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.core.interaction.modal;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModalConfigPayload {
private String modalId;
private ModalPayload modalPayload;
private Class payloadType;
private String origin;
}

View File

@@ -0,0 +1,4 @@
package dev.sheldan.abstracto.core.interaction.modal;
public interface ModalPayload {
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.core.interaction.modal;
import dev.sheldan.abstracto.core.interaction.InteractionResult;
import dev.sheldan.abstracto.core.interaction.modal.listener.ModalInteractionListener;
import dev.sheldan.abstracto.core.interaction.modal.listener.ModalInteractionListenerModel;
public interface ModalPostInteractionExecution {
void execute(ModalInteractionListenerModel interActionContext, InteractionResult interactionResult, ModalInteractionListener executedListener);
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.core.interaction.modal;
import net.dv8tion.jda.api.events.interaction.command.GenericCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.components.Modal;
import java.util.concurrent.CompletableFuture;
public interface ModalService {
CompletableFuture<Void> replyModal(GenericCommandInteractionEvent event, String templateKey, Object model);
Modal createModalFromTemplate(String templateKey, Object model, Long serverId);
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.core.interaction.modal.listener;
import dev.sheldan.abstracto.core.Prioritized;
import dev.sheldan.abstracto.core.interaction.InteractionListener;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
public interface ModalInteractionListener extends FeatureAwareListener<ModalInteractionListenerModel, ModalInteractionListenerResult>, Prioritized, InteractionListener {
Boolean handlesEvent(ModalInteractionListenerModel model);
}

View File

@@ -0,0 +1,23 @@
package dev.sheldan.abstracto.core.interaction.modal.listener;
import dev.sheldan.abstracto.core.interaction.modal.ModalPayload;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
@Getter
@Setter
@Builder
public class ModalInteractionListenerModel implements FeatureAwareListenerModel {
private ModalInteractionEvent event;
private String payload;
private String origin;
private ModalPayload deserializedPayload;
@Override
public Long getServerId() {
return event.isFromGuild() ? event.getGuild().getIdLong() : null;
}
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.interaction.modal.listener;
import dev.sheldan.abstracto.core.listener.ListenerExecutionResult;
public enum ModalInteractionListenerResult implements ListenerExecutionResult {
ACKNOWLEDGED, IGNORED
}

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.command;
package dev.sheldan.abstracto.core.interaction.slash;
public class CoreSlashCommandNames {
public static final String UTILITY = "utility";

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.command.config;
package dev.sheldan.abstracto.core.interaction.slash;
import lombok.Builder;
import lombok.EqualsAndHashCode;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.command.slash;
package dev.sheldan.abstracto.core.interaction.slash;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import net.dv8tion.jda.api.entities.Guild;
@@ -14,4 +14,5 @@ public interface SlashCommandService {
CompletableFuture<List<Command>> updateGuildSlashCommand(Guild guild, List<Pair<List<CommandConfiguration>, SlashCommandData>> commandData);
CompletableFuture<Void> deleteGuildSlashCommands(Guild guild, List<Long> slashCommandId, List<Long> commandInServerIdsToUnset);
CompletableFuture<Void> addGuildSlashCommands(Guild guild, List<Pair<List<CommandConfiguration>, SlashCommandData>> commandData);
void storeCreatedSlashCommands(Guild guild, List<Pair<List<CommandConfiguration>, SlashCommandData>> commandData, List<Command> createdCommands);
}

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.command.slash.parameter;
package dev.sheldan.abstracto.core.interaction.slash.parameter;
import lombok.Builder;
import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.core.command.slash.parameter;
package dev.sheldan.abstracto.core.interaction.slash.parameter;
import dev.sheldan.abstracto.core.models.database.AEmote;

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.interaction.slash.parameter.provider;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandOptionTypeMapping;
public interface SlashCommandParameterProvider {
SlashCommandOptionTypeMapping getOptionMapping();
}

View File

@@ -0,0 +1,7 @@
package dev.sheldan.abstracto.core.listener;
import java.util.concurrent.CompletableFuture;
public interface AsyncAbstractoListener<M extends ListenerModel, R extends ListenerExecutionResult> {
CompletableFuture<R> execute(M model);
}

View File

@@ -0,0 +1,6 @@
package dev.sheldan.abstracto.core.listener;
import dev.sheldan.abstracto.core.FeatureAware;
public interface AsyncFeatureAwareListener<T extends FeatureAwareListenerModel, R extends ListenerExecutionResult> extends AsyncAbstractoListener<T, R>, FeatureAware {
}

View File

@@ -1,5 +0,0 @@
package dev.sheldan.abstracto.core.listener;
public enum ButtonClickedListenerResult implements ListenerExecutionResult {
ACKNOWLEDGED, IGNORED
}

View File

@@ -2,8 +2,11 @@ package dev.sheldan.abstracto.core.listener;
import org.springframework.core.task.TaskExecutor;
import java.util.concurrent.CompletableFuture;
public interface ListenerService {
<T extends FeatureAwareListenerModel, R extends ListenerExecutionResult> void executeFeatureAwareListener(FeatureAwareListener<T, R> listener, T model);
<T extends FeatureAwareListenerModel, R extends ListenerExecutionResult> CompletableFuture<R> executeAsyncFeatureAwareListener(AsyncFeatureAwareListener<T, R> listener, T model);
<T extends FeatureAwareListenerModel, R extends ListenerExecutionResult> void executeFeatureAwareListener(FeatureAwareListener<T, R> listener, T model, TaskExecutor executor);
<T extends ListenerModel, R extends ListenerExecutionResult> void executeListener(AbstractoListener<T, R> listener, T model);
<T extends ListenerModel, R extends ListenerExecutionResult> void executeListener(AbstractoListener<T, R> listener, T model, TaskExecutor executor);

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.core.listener.async.jda;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.core.models.listener.MemberTimeoutUpdatedModel;
public interface AsyncMemberTimeoutUpdatedListener extends FeatureAwareListener<MemberTimeoutUpdatedModel, DefaultListenerResult> {
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.models.cache;
import dev.sheldan.abstracto.core.utils.MemberUtils;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -12,4 +13,8 @@ import java.io.Serializable;
public class CachedAuthor implements Serializable {
private Long authorId;
private Boolean isBot;
public String getAsMention() {
return MemberUtils.getUserAsMention(authorId);
}
}

View File

@@ -1,5 +1,5 @@
package dev.sheldan.abstracto.core.models.database;
public enum ComponentType {
BUTTON, SELECTION
BUTTON, SELECTION, MODAL
}

View File

@@ -0,0 +1,38 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "context_command")
@Getter
@Builder
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class ContextCommand {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "name", length = 32)
private String commandName;
@Enumerated(EnumType.STRING)
@Column(name = "type")
private ContextType type;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "feature_id", nullable = false)
private AFeature feature;
@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,39 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "context_command_in_server")
@Getter
@Builder
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class ContextCommandInServer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "command_in_server_id", nullable = false)
private Long commandInServerId;
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "command_id", nullable = false)
private ContextCommand commandReference;
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "server_id", nullable = false)
private AServer serverReference;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
@Column(name = "context_command_id")
private Long contextCommandId;
}

View File

@@ -0,0 +1,5 @@
package dev.sheldan.abstracto.core.models.database;
public enum ContextType {
MESSAGE, MEMBER
}

View File

@@ -0,0 +1,30 @@
package dev.sheldan.abstracto.core.models.listener;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import dev.sheldan.abstracto.core.models.ServerUser;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateTimeOutEvent;
import java.time.OffsetDateTime;
@Getter
@Setter
@Builder
public class MemberTimeoutUpdatedModel implements FeatureAwareListenerModel {
private ServerUser timeoutUser;
private User user;
private Guild guild;
private OffsetDateTime oldTimeout;
private OffsetDateTime newTimeout;
private Member member;
private GuildMemberUpdateTimeOutEvent event;
@Override
public Long getServerId() {
return guild.getIdLong();
}
}

View File

@@ -1,4 +0,0 @@
package dev.sheldan.abstracto.core.models.template.button;
public interface ButtonPayload {
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.core.models.template.commands;
import dev.sheldan.abstracto.core.models.database.AFeatureMode;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class AFeatureModeDisplay {
private String featureMode;
private Boolean enabled;
public static AFeatureModeDisplay fromFeatureMode(AFeatureMode aFeatureMode) {
return AFeatureModeDisplay
.builder()
.featureMode(aFeatureMode.getFeatureMode())
.enabled(aFeatureMode.getEnabled())
.build();
}
}

View File

@@ -10,7 +10,7 @@ import lombok.Setter;
@Setter
@Builder
public class FeatureModeDisplay {
private AFeatureMode featureMode;
private AFeatureModeDisplay featureMode;
private FeatureConfig featureConfig;
private Boolean isDefaultValue;
}

View File

@@ -1,12 +0,0 @@
package dev.sheldan.abstracto.core.service;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.interactions.commands.Command;
import java.util.concurrent.CompletableFuture;
public interface ContextCommandService {
CompletableFuture<Command> upsertGuildMessageContextCommand(Guild guild, String name);
CompletableFuture<Void> deleteGuildContextCommand(Guild guild, Long commandId);
CompletableFuture<Void> deleteGuildContextCommandByName(Guild guild, String commandName);
}

View File

@@ -4,4 +4,5 @@ import dev.sheldan.abstracto.core.models.database.AServer;
public interface CounterService {
Long getNextCounterValue(AServer server, String key);
Long getNextCounterValue(Long serverId, String key);
}

View File

@@ -9,6 +9,8 @@ import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -28,4 +30,10 @@ public interface MemberService {
CompletableFuture<Member> forceReloadMember(Member member);
Member getBotInGuild(AServer server);
CompletableFuture<User> getUserViaId(Long userId);
CompletableFuture<Void> timeoutUser(Member member, Duration duration);
CompletableFuture<Void> timeoutUser(Member member, Duration duration, String reason);
CompletableFuture<Void> timeoutUserMaxDuration(Member member);
CompletableFuture<Void> timeoutUser(Member member, Instant target);
CompletableFuture<Void> timeoutUser(Member member, Instant target, String reason);
CompletableFuture<Void> removeTimeout(Member member);
}

View File

@@ -11,6 +11,7 @@ import java.util.Optional;
public interface UserInServerManagementService {
AUserInAServer loadOrCreateUser(Long serverId, Long userId);
AUserInAServer loadOrCreateUser(AServer server, Long userId);
AUserInAServer onlyLoadUser(Long serverId, Long userId);
AUserInAServer loadOrCreateUser(ServerUser serverUser);
Optional<AUserInAServer> loadUserOptional(Long serverId, Long userId);
@@ -20,6 +21,7 @@ public interface UserInServerManagementService {
AUserInAServer loadOrCreateUser(Long userInServerId);
AUserInAServer createUserInServer(Member member);
AUserInAServer createUserInServer(Long guildId, Long userId);
AUserInAServer createUserInServer(AServer server, Long userId);
List<AUserInAServer> getUserInAllServers(Long userId);
Optional<AUserInAServer> loadAUserInAServerOptional(Long serverId, Long userId);
}

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.templating.service;
import dev.sheldan.abstracto.core.templating.Templatable;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import java.time.Duration;
import java.util.HashMap;
/**
@@ -62,6 +63,7 @@ public interface TemplateService {
*/
String renderTemplatable(Templatable templatable);
String renderTemplatable(Templatable templatable, Long serverId);
String renderDuration(Duration duration, Long serverId);
String renderDuration(Duration duration);
void clearCache();
}

View File

@@ -4,6 +4,10 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer;
public class MemberUtils {
public static String getAUserInAServerAsMention(AUserInAServer aUserInAServer) {
return "<@" + aUserInAServer.getUserReference().getId() + ">";
return getUserAsMention(aUserInAServer.getUserReference().getId());
}
public static String getUserAsMention(Long userId) {
return "<@" + userId + ">";
}
}