added assignable role place module including: setting up, configuring, deleting commands and documentation

upgraded JDA version to 4.2.0
refactored multiple interfaces to be more convenient/contain more information (reaction added/removed now gets the actual event)
added generic way to check for conditions. these conditions are provided by modules and are loosely connected via condition context and a condition name
added changeable flag to emotes to indicate that they can be updated via setEmote
refactored emote parsing in command parameters, the command parameters will now contain a fake emote
added feature to embed templates for fields to force a new message regardless of the discord limit
added some more functionality to message and channel service regarding field edit/embed sending
introduced the full emote parameter, to have both the emote (if custom) and a fake aemote at hand
refactored some methods to already throw exceptions within the retrieval methods, instead of optionals which need to be dealt outside
changed getEmotes to getEmotesBag to have duplicates of emotes
fixed setEmote to behave correctly with new parameter types
fixed creation of emotes, which previously created additional instances
fixed templating multiple fields handling
refactored command handling to allow async commands, they are the same interface, but configuration dicates whether or not it is async
added generic exception reporting for async commands
refactored a bunch of service methods to be named optional, and the non optional methods throw exceptions in case nothing is found
added a few more customized exceptions
added clearing freemarker internal template cache to clear cache
added feature to skip, not use, embeds if they look to be empty (no fields, no description, no attachment)
added virtual env to gitignore
fixed initial sync of roles un-marking roles as deleted
added some convenience methods to remove reactions from users directly
fixed post command handling in case it is not a templatable instance
fixed exceptions without cause in generic exception model
This commit is contained in:
Sheldan
2020-07-23 02:22:58 +02:00
parent 5317199bf4
commit fd4d784081
201 changed files with 6547 additions and 527 deletions

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>assignable-roles</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>assignable-roles-int</artifactId>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.templating</groupId>
<artifactId>templating-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.assignableroles.config;
import dev.sheldan.abstracto.core.command.execution.CommandParameterKey;
import lombok.Getter;
@Getter
public enum AssignableRolePlaceParameterKey implements CommandParameterKey {
INLINE, UNIQUE, AUTOREMOVE, ACTIVE
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.assignableroles.config.features;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import org.springframework.stereotype.Component;
@Component
public class AssignableFeatureConfig implements FeatureConfig {
@Override
public FeatureEnum getFeature() {
return AssignableRoleFeature.ASSIGNABLE_ROLES;
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.assignableroles.config.features;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import lombok.Getter;
@Getter
public enum AssignableRoleFeature implements FeatureEnum {
ASSIGNABLE_ROLES("assignableRole");
private String key;
AssignableRoleFeature(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRolePlacePostNotFoundModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignablePlacePostNotFoundException extends AbstractoRunTimeException implements Templatable {
private final AssignableRolePlacePostNotFoundModel model;
public AssignablePlacePostNotFoundException(Long messageId) {
super("Assignable place post not found.");
this.model = AssignableRolePlacePostNotFoundModel.builder().messageId(messageId).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_post_not_found_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRoleAlreadyDefinedModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.FullEmote;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignableRoleAlreadyDefinedException extends AbstractoRunTimeException implements Templatable {
private final AssignableRoleAlreadyDefinedModel model;
public AssignableRoleAlreadyDefinedException(FullEmote emote, String placeName) {
super("Assignable role already assigned");
this.model = AssignableRoleAlreadyDefinedModel.builder().emote(emote).placeName(placeName).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_emote_already_defined_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRoleNotUsableModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.FullRole;
import dev.sheldan.abstracto.templating.Templatable;
import net.dv8tion.jda.api.entities.Guild;
public class AssignableRoleNotUsableException extends AbstractoRunTimeException implements Templatable {
private final AssignableRoleNotUsableModel model;
public AssignableRoleNotUsableException(FullRole role, Guild guild) {
super("Role is not usable as assignable role");
this.model = AssignableRoleNotUsableModel.builder().role(role).guild(guild).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_role_not_usable_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRolePlaceAlreadyExistsModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignableRolePlaceAlreadyExistsException extends AbstractoRunTimeException implements Templatable {
private final AssignableRolePlaceAlreadyExistsModel model;
public AssignableRolePlaceAlreadyExistsException(String name) {
super("Assignable role place already exists");
this.model = AssignableRolePlaceAlreadyExistsModel.builder().name(name).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_exists_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRolePlaceChannelDoesNotExistModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignableRolePlaceChannelDoesNotExist extends AbstractoRunTimeException implements Templatable {
private final AssignableRolePlaceChannelDoesNotExistModel model;
public AssignableRolePlaceChannelDoesNotExist(Long channelId, String placeName) {
super("Assignable role place channel does not exist");
this.model = AssignableRolePlaceChannelDoesNotExistModel.builder().channelId(channelId).placeName(placeName).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_channel_does_not_exist_exception";
}
@Override
public Object getTemplateModel() {
return this.model;
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignableRolePlaceNotFoundModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignableRolePlaceNotFoundException extends AbstractoRunTimeException implements Templatable {
private final AssignableRolePlaceNotFoundModel model;
public AssignableRolePlaceNotFoundException(Long placeId) {
super("Assignable role place not found");
this.model = AssignableRolePlaceNotFoundModel.builder().placeId(placeId).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_not_found_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.AssignedUserNotFoundModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.templating.Templatable;
public class AssignedUserNotFoundException extends AbstractoRunTimeException implements Templatable {
private final AssignedUserNotFoundModel model;
public AssignedUserNotFoundException(AUserInAServer userInAServer) {
super("Assigned user was not found");
this.model = AssignedUserNotFoundModel.builder().aUserInAServer(userInAServer).build();
}
@Override
public String getTemplateName() {
return "assignable_role_place_assigned_user_not_found_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.assignableroles.exceptions;
import dev.sheldan.abstracto.assignableroles.models.exception.EmoteNotInAssignableRolePlaceModel;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.FullEmote;
import dev.sheldan.abstracto.templating.Templatable;
public class EmoteNotInAssignableRolePlaceException extends AbstractoRunTimeException implements Templatable {
private final EmoteNotInAssignableRolePlaceModel model;
public EmoteNotInAssignableRolePlaceException(FullEmote emote, String placeName) {
super("Emote not found in assignable role place");
this.model = EmoteNotInAssignableRolePlaceModel.builder().emote(emote).placeName(placeName).build();
}
@Override
public String getTemplateName() {
return "emote_not_in_assignable_role_place_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,73 @@
package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.ARole;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="assignable_role")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "emote_id")
private AEmote emote;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", nullable = false)
private ARole role;
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Getter
@Setter
@JoinColumn(name = "assignable_place_id", nullable = false)
private AssignableRolePlace assignablePlace;
@Getter
@Setter
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "assignable_role_place_post_id")
private AssignableRolePlacePost assignableRolePlacePost;
@Getter
@Setter
@ManyToMany(mappedBy = "roles")
@Builder.Default
private List<AssignedRoleUser> assignedUsers = new ArrayList<>();
private String description;
private Integer requiredLevel;
private Integer position;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
@PreUpdate
private void onUpdate() {
this.updated = Instant.now();
}
}

View File

@@ -0,0 +1,88 @@
package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="assignable_role_place")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRolePlace {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name="channel_id")
private AChannel channel;
@OneToOne
@JoinColumn(name="server_id")
private AServer server;
private String key;
@OneToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
orphanRemoval = true,
mappedBy = "assignablePlace"
)
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRolePlacePost> messagePosts = new ArrayList<>();
@OneToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
orphanRemoval = true,
mappedBy = "assignablePlace"
)
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRole> assignableRoles = new ArrayList<>();
private String text;
@Builder.Default
private Boolean active = true;
@Builder.Default
private Boolean inline = false;
@Builder.Default
private Boolean uniqueRoles = false;
@Builder.Default
private Boolean autoRemove = false;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
@PreUpdate
private void onUpdate() {
this.updated = Instant.now();
}
}

View File

@@ -0,0 +1,51 @@
package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="assignable_role_place_post")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRolePlacePost {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "channel_id")
private AChannel usedChannel;
@Column(name = "created")
private Instant created;
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Getter
@Setter
@JoinColumn(name = "assignable_place_id", nullable = false)
private AssignableRolePlace assignablePlace;
@OneToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "assignableRolePlacePost")
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRole> assignableRoles = new ArrayList<>();
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
}

View File

@@ -0,0 +1,46 @@
package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="assigned_role_user")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignedRoleUser {
@Id
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private AUserInAServer user;
@ManyToMany
@JoinTable(
name = "assigned_role_in_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "assigned_role_id"))
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Builder.Default
private List<AssignableRole> roles = new ArrayList<>();
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import dev.sheldan.abstracto.core.models.FullEmote;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@Builder
public class AssignableRoleAlreadyDefinedModel implements Serializable {
private FullEmote emote;
private String placeName;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import dev.sheldan.abstracto.core.models.FullRole;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Guild;
import java.io.Serializable;
@Getter
@Setter
@Builder
public class AssignableRoleNotUsableModel implements Serializable {
private FullRole role;
private Guild guild;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AssignableRolePlaceAlreadyExistsModel {
private String name;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@Builder
public class AssignableRolePlaceChannelDoesNotExistModel implements Serializable {
private Long channelId;
private String placeName;
}

View File

@@ -0,0 +1,28 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.templating.Templatable;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AssignableRolePlaceExceptionModel {
private AssignableRolePlace rolePlace;
private FullUser user;
private Throwable throwable;
public Templatable getTemplate() {
Throwable current = throwable;
while(!(current instanceof Templatable) && !current.getCause().equals(current)) {
current = current.getCause();
}
if(current instanceof Templatable) {
return (Templatable) current;
}
return null;
}
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AssignableRolePlaceNotFoundModel {
private Long placeId;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@Builder
public class AssignableRolePlacePostNotFoundModel implements Serializable {
private Long messageId;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AssignedUserNotFoundModel {
private AUserInAServer aUserInAServer;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.assignableroles.models.exception;
import dev.sheldan.abstracto.core.models.FullEmote;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@Builder
public class EmoteNotInAssignableRolePlaceModel implements Serializable {
private FullEmote emote;
private String placeName;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.assignableroles.models.templates;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@Builder
public class AssignablePlaceOverview {
@Builder.Default
private List<AssignableRolePlace> places = new ArrayList<>();
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.abstracto.assignableroles.models.templates;
import dev.sheldan.abstracto.core.models.database.ARole;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Role;
@Getter
@Setter
@Builder
public class AssignablePostConfigRole {
private Emote emote;
private String description;
private Integer position;
private Boolean inline;
private ARole role;
private Role awardedRole;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.assignableroles.models.templates;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class AssignablePostMessage {
private AssignableRolePlace place;
private List<AssignablePostRole> roles;
private Integer maxPosition;
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.assignableroles.models.templates;
import dev.sheldan.abstracto.core.models.FullEmote;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class AssignablePostRole {
private FullEmote emote;
private String description;
private Integer position;
@Builder.Default
private Boolean forceNewMessage = false;
private Boolean inline;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.assignableroles.models.templates;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class AssignableRolePlaceConfig {
private AssignableRolePlace place;
private List<AssignablePostConfigRole> roles;
}

View File

@@ -0,0 +1,66 @@
package dev.sheldan.abstracto.assignableroles.service;
import dev.sheldan.abstracto.assignableroles.config.AssignableRolePlaceParameterKey;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
import dev.sheldan.abstracto.core.models.FullEmote;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.TextChannel;
import java.util.concurrent.CompletableFuture;
public interface AssignableRolePlaceService {
void createAssignableRolePlace(AServer server, String name, AChannel channel, String text);
boolean hasAssignableRolePlaceEmote(AServer server, String placeName, AEmote emote);
boolean hasAssignableRolePlaceEmote(AssignableRolePlace place, AEmote emote);
boolean isPositionUsed(AServer server, String placeName, Integer position);
CompletableFuture<Void> setEmoteToPosition(AServer server, String placeName, FullEmote emote, Integer position);
CompletableFuture<Void> addRoleToAssignableRolePlace(AServer server, String placeName, ARole role, FullEmote emote, String description);
CompletableFuture<Void> removeRoleFromAssignableRolePlace(AServer server, String placeName, FullEmote emote);
CompletableFuture<Void> setupAssignableRolePlace(AServer server, String name);
CompletableFuture<Void> refreshAssignablePlacePosts(AServer server, String name);
CompletableFuture<Void> refreshAssignablePlacePosts(AssignableRolePlace place);
CompletableFuture<Void> refreshTextFromPlace(AssignableRolePlace place);
void setAssignablePlaceActiveTo(AServer server, String name, Boolean newValue);
void activateAssignableRolePlace(AServer server, String name);
void activateAssignableRolePlace(AssignableRolePlace place);
void deactivateAssignableRolePlace(AServer server, String name);
void deactivateAssignableRolePlace(AssignableRolePlace place);
// inline attribute
CompletableFuture<Void> setAssignablePlaceInlineTo(AServer server, String name, Boolean newValue);
CompletableFuture<Void> inlineAssignableRolePlace(AServer server, String name);
CompletableFuture<Void> inlineAssignableRolePlace(AssignableRolePlace place);
CompletableFuture<Void> spreadAssignableRolePlace(AServer server, String name);
CompletableFuture<Void> spreadAssignableRolePlace(AssignableRolePlace place);
// unique attribute
void setAssignablePlaceUniqueTo(AServer server, String name, Boolean newValue);
void uniqueAssignableRolePlace(AServer server, String name);
void uniqueAssignableRolePlace(AssignableRolePlace place);
void multipleAssignableRolePlace(AServer server, String name);
void multipleAssignableRolePlace(AssignableRolePlace place);
// auto remove attribute
void setAssignablePlaceAutoRemoveTo(AServer server, String name, Boolean newValue);
void autoRemoveAssignableRolePlace(AServer server, String name);
void autoRemoveAssignableRolePlace(AssignableRolePlace place);
void keepReactionsAssignableRolePlace(AServer server, String name);
void keepReactionsAssignableRolePlace(AssignableRolePlace place);
void swapPositions(AServer server, String name, FullEmote firstEmote, FullEmote secondEmote);
CompletableFuture<Void> testAssignableRolePlace(AServer server, String name, MessageChannel channel);
void showAssignablePlaceConfig(AServer server, String name, MessageChannel channel);
void moveAssignableRolePlace(AServer server, String name, TextChannel newChannel);
void changeAssignablePlaceDescription(AServer server, String name, String newDescription);
CompletableFuture<Void> deleteAssignableRolePlace(AServer server, String name);
CompletableFuture<Void> changeText(AServer server, String name, String newText);
CompletableFuture<Void> removeExistingReactionsAndRoles(AssignableRolePlace place, AssignedRoleUser user);
CompletableFuture<Void> changeConfiguration(AServer server, String name, AssignableRolePlaceParameterKey keyToChange, Object newValue);
CompletableFuture<Void> showAllAssignableRolePlaces(AServer server, MessageChannel channel);
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.assignableroles.service;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRole;
import net.dv8tion.jda.api.entities.Member;
import java.util.concurrent.CompletableFuture;
public interface AssignableRoleService {
CompletableFuture<Void> assignAssignableRoleToUser(Long assignableRoleId, Member toAdd);
CompletableFuture<Void> removeAssignableRoleFromUser(AssignableRole assignableRole, Member member);
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.assignableroles.service.management;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRole;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlacePost;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.ARole;
public interface AssignableRoleManagementService {
AssignableRole addRoleToPlace(AssignableRolePlace place, AEmote emote, ARole role, String description, AssignableRolePlacePost post);
AssignableRole addRoleToPlace(Long placeId, Integer emoteId, Long roleId, String description, Long messageId);
AssignableRole addRoleToPlace(Long placeId, Integer emoteId, Long roleId, String description);
AssignableRole getByAssignableRoleId(Long assignableRoleId);
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.assignableroles.service.management;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import java.util.List;
import java.util.Optional;
public interface AssignableRolePlaceManagementService {
AssignableRolePlace createPlace(AServer server, String name, AChannel channel, String text);
boolean doesPlaceExist(AServer server, String name);
AssignableRolePlace findByServerAndKey(AServer server, String name);
Optional<AssignableRolePlace> findByPlaceId(Long id);
void moveAssignableRolePlace(AServer server, String name, AChannel newChannel);
void changeAssignableRolePlaceDescription(AServer server, String name, String newDescription);
void deleteAssignablePlace(AssignableRolePlace place);
List<AssignableRolePlace> findAllByServer(AServer server);
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.assignableroles.service.management;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlacePost;
import java.util.Optional;
public interface AssignableRolePlacePostManagementService {
Optional<AssignableRolePlacePost> findByMessageIdOptional(Long messageId);
AssignableRolePlacePost findByMessageId(Long messageId);
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.assignableroles.service.management;
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRole;
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import java.util.Optional;
public interface AssignedRoleUserManagementService {
void addAssignedRoleToUser(AssignableRole assignableRole, AUserInAServer aUserInAServer);
void removeAssignedRoleFromUser(AssignableRole assignableRole, AUserInAServer aUserInAServer);
AssignedRoleUser createAssignedRoleUser(AUserInAServer aUserInAServer);
boolean doesAssignedRoleUserExist(AUserInAServer aUserInAServer);
Optional<AssignedRoleUser> findByUserInServerOptional(AUserInAServer aUserInAServer);
AssignedRoleUser findByUserInServer(AUserInAServer aUserInAServer);
}