added command to add/remove channels from channel groups

added storing the commands with their modules in the db
renamed command impl module
This commit is contained in:
Sheldan
2020-04-04 17:09:28 +02:00
parent bf94af66d5
commit 20b282584a
64 changed files with 637 additions and 71 deletions

View File

@@ -78,7 +78,7 @@
<dependency>
<groupId>dev.sheldan.abstracto.command</groupId>
<artifactId>command-support</artifactId>
<artifactId>command-int</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>

View File

@@ -0,0 +1,50 @@
package dev.sheldan.abstracto.core.commands.channels;
import dev.sheldan.abstracto.command.Command;
import dev.sheldan.abstracto.command.execution.CommandConfiguration;
import dev.sheldan.abstracto.command.execution.CommandContext;
import dev.sheldan.abstracto.command.execution.CommandResult;
import dev.sheldan.abstracto.command.execution.Parameter;
import dev.sheldan.abstracto.config.AbstractoFeatures;
import dev.sheldan.abstracto.core.service.ChannelGroupService;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class AddToChannelGroup implements Command {
@Autowired
private ChannelGroupService channelGroupService;
@Override
public CommandResult execute(CommandContext commandContext) {
String name = (String) commandContext.getParameters().getParameters().get(0);
TextChannel channel = (TextChannel) commandContext.getParameters().getParameters().get(1);
channelGroupService.addChannelToChannelGroup(name, channel);
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
Parameter channelGroupName = Parameter.builder().name("name").type(String.class).description("The name of the channel group to add the channel to.").build();
Parameter channelToAdd = Parameter.builder().name("channel").type(TextChannel.class).description("The mention of the channel to add to the group.").build();
List<Parameter> parameters = Arrays.asList(channelGroupName, channelToAdd);
return CommandConfiguration.builder()
.name("addToChannelGroup")
.module("channels")
.parameters(parameters)
.description("Adds the mentioned channel to the channel group.")
.causesReaction(true)
.build();
}
@Override
public String getFeature() {
return AbstractoFeatures.CORE;
}
}

View File

@@ -0,0 +1,46 @@
package dev.sheldan.abstracto.core.commands.channels;
import dev.sheldan.abstracto.command.Command;
import dev.sheldan.abstracto.command.execution.CommandConfiguration;
import dev.sheldan.abstracto.command.execution.CommandContext;
import dev.sheldan.abstracto.command.execution.CommandResult;
import dev.sheldan.abstracto.command.execution.Parameter;
import dev.sheldan.abstracto.config.AbstractoFeatures;
import dev.sheldan.abstracto.core.service.ChannelGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class CreateChannelGroup implements Command {
@Autowired
private ChannelGroupService channelGroupService;
@Override
public CommandResult execute(CommandContext commandContext) {
String groupName = (String) commandContext.getParameters().getParameters().get(0);
channelGroupService.createChannelGroup(groupName);
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
Parameter channelGroupName = Parameter.builder().name("name").type(String.class).description("The name of the channel group to create.").build();
List<Parameter> parameters = Arrays.asList(channelGroupName);
return CommandConfiguration.builder()
.name("createChannelGroup")
.module("channels")
.parameters(parameters)
.description("Creates a channel group to which channels can be added to.")
.causesReaction(true)
.build();
}
@Override
public String getFeature() {
return AbstractoFeatures.CORE;
}
}

View File

@@ -0,0 +1,50 @@
package dev.sheldan.abstracto.core.commands.channels;
import dev.sheldan.abstracto.command.Command;
import dev.sheldan.abstracto.command.execution.CommandConfiguration;
import dev.sheldan.abstracto.command.execution.CommandContext;
import dev.sheldan.abstracto.command.execution.CommandResult;
import dev.sheldan.abstracto.command.execution.Parameter;
import dev.sheldan.abstracto.config.AbstractoFeatures;
import dev.sheldan.abstracto.core.service.ChannelGroupService;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class RemoveFromChannelGroup implements Command {
@Autowired
private ChannelGroupService channelGroupService;
@Override
public CommandResult execute(CommandContext commandContext) {
String name = (String) commandContext.getParameters().getParameters().get(0);
TextChannel channel = (TextChannel) commandContext.getParameters().getParameters().get(1);
channelGroupService.removeChannelFromChannelGroup(name, channel);
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
Parameter channelGroupName = Parameter.builder().name("name").type(String.class).description("The name of the channel group to remove the channel from.").build();
Parameter channelToAdd = Parameter.builder().name("channel").type(TextChannel.class).description("The mention of the channel to remove from the group.").build();
List<Parameter> parameters = Arrays.asList(channelGroupName, channelToAdd);
return CommandConfiguration.builder()
.name("removeFromChannelGroup")
.module("channels")
.parameters(parameters)
.description("Removes the mentioned channel from the channel group.")
.causesReaction(true)
.build();
}
@Override
public String getFeature() {
return AbstractoFeatures.CORE;
}
}

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.commands.help;
import dev.sheldan.abstracto.command.*;
import dev.sheldan.abstracto.command.execution.*;
import dev.sheldan.abstracto.command.module.ModuleInfo;
import dev.sheldan.abstracto.command.service.ModuleRegistry;
import dev.sheldan.abstracto.config.AbstractoFeatures;
import dev.sheldan.abstracto.templating.TemplateService;
import org.apache.commons.lang3.StringUtils;
@@ -10,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ChannelGroupRepository extends JpaRepository<AChannelGroup, Long> {
AChannelGroup findByGroupName(String name);
}

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AChannel;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AConfig;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,8 +1,7 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AServer;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.ARole;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AServer;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;

View File

@@ -1,4 +1,4 @@
package dev.sheldan.abstracto.repository;
package dev.sheldan.abstracto.core.repository;
import dev.sheldan.abstracto.core.models.database.AUser;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -0,0 +1,58 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import dev.sheldan.abstracto.core.service.management.ChannelGroupManagementService;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ChannelGroupServiceBean implements ChannelGroupService {
@Autowired
private ChannelGroupManagementService channelGroupManagementService;
@Autowired
private ChannelManagementService channelManagementService;
@Override
public AChannelGroup createChannelGroup(String name) {
return channelGroupManagementService.createChannelGroup(name);
}
@Override
public void addChannelToChannelGroup(String channelGroupName, TextChannel textChannel) {
addChannelToChannelGroup(channelGroupName, textChannel.getIdLong());
}
@Override
public void addChannelToChannelGroup(String channelGroupName, Long channelId) {
AChannel aChannel = channelManagementService.loadChannel(channelId);
addChannelToChannelGroup(channelGroupName, aChannel);
}
@Override
public void addChannelToChannelGroup(String channelGroupName, AChannel channel) {
AChannelGroup channelGroup = channelGroupManagementService.findByName(channelGroupName);
channelGroupManagementService.addChannelToChannelGroup(channelGroup, channel);
}
@Override
public void removeChannelFromChannelGroup(String channelGroupName, TextChannel textChannel) {
removeChannelFromChannelGroup(channelGroupName, textChannel.getIdLong());
}
@Override
public void removeChannelFromChannelGroup(String channelGroupName, Long channelId) {
AChannel aChannel = channelManagementService.loadChannel(channelId);
removeChannelFromChannelGroup(channelGroupName, aChannel);
}
@Override
public void removeChannelFromChannelGroup(String channelGroupName, AChannel channel) {
AChannelGroup channelGroup = channelGroupManagementService.findByName(channelGroupName);
channelGroupManagementService.removeChannelFromChannelGroup(channelGroup, channel);
}
}

View File

@@ -0,0 +1,55 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.exception.ChannelException;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import dev.sheldan.abstracto.core.repository.ChannelGroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.function.Predicate;
@Component
public class ChannelGroupManagementServiceBean implements ChannelGroupManagementService {
@Autowired
private ChannelGroupRepository channelGroupRepository;
@Override
public AChannelGroup createChannelGroup(String name) {
AChannelGroup channelGroup = AChannelGroup
.builder()
.groupName(name)
.build();
channelGroupRepository.save(channelGroup);
return channelGroup;
}
@Override
public AChannelGroup addChannelToChannelGroup(AChannelGroup channelGroup, AChannel channel) {
Predicate<AChannel> channelInGroupPredicate = channel1 -> channel1.getId().equals(channel.getId());
if(channelGroup.getChannels().stream().anyMatch(channelInGroupPredicate)) {
throw new ChannelException(String.format("Channel %s is already part of group %s.", channel.getId(), channelGroup.getGroupName()));
}
channelGroup.getChannels().add(channel);
channel.getGroups().add(channelGroup);
channelGroupRepository.save(channelGroup);
return channelGroup;
}
@Override
public void removeChannelFromChannelGroup(AChannelGroup channelGroup, AChannel channel) {
Predicate<AChannel> channelInGroupPredicate = channel1 -> channel1.getId().equals(channel.getId());
if(channelGroup.getChannels().stream().noneMatch(channelInGroupPredicate)) {
throw new ChannelException(String.format("Channel %s is not part of group %s.", channel.getId(), channelGroup.getGroupName()));
}
channelGroup.getChannels().removeIf(channelInGroupPredicate);
channel.getGroups().removeIf(channelGroup1 -> channelGroup1.getId().equals(channelGroup.getId()));
channelGroupRepository.save(channelGroup);
}
@Override
public AChannelGroup findByName(String name) {
return channelGroupRepository.findByGroupName(name);
}
}

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.repository.ChannelRepository;
import dev.sheldan.abstracto.core.repository.ChannelRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AConfig;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.repository.ConfigRepository;
import dev.sheldan.abstracto.core.repository.ConfigRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.exception.EmoteException;
import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.Bot;
import dev.sheldan.abstracto.repository.EmoteRepository;
import dev.sheldan.abstracto.core.repository.EmoteRepository;
import net.dv8tion.jda.api.entities.Emote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.repository.FeatureFlagRepository;
import dev.sheldan.abstracto.core.repository.FeatureFlagRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -1,13 +1,12 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.DynamicKeyLoader;
import dev.sheldan.abstracto.core.exception.ConfigurationException;
import dev.sheldan.abstracto.core.exception.PostTargetException;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.repository.PostTargetRepository;
import dev.sheldan.abstracto.core.repository.PostTargetRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;

View File

@@ -1,7 +1,7 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.repository.RoleRepository;
import dev.sheldan.abstracto.core.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -1,7 +1,7 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.*;
import dev.sheldan.abstracto.repository.ServerRepository;
import dev.sheldan.abstracto.core.repository.ServerRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -3,8 +3,8 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.repository.UserInServerRepository;
import dev.sheldan.abstracto.repository.UserRepository;
import dev.sheldan.abstracto.core.repository.UserInServerRepository;
import dev.sheldan.abstracto.core.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService;
import dev.sheldan.abstracto.core.models.AChannelType;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.repository.ServerRepository;
import dev.sheldan.abstracto.core.repository.ServerRepository;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.events.channel.text.TextChannelCreateEvent;

View File

@@ -17,4 +17,6 @@ spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
abstracto.startup.synchronize=true
abstracto.parameter.lowerBound=50
abstracto.parameter.lowerBound=50
abstracto.features.core=true

View File

@@ -6,6 +6,7 @@ import lombok.*;
import net.dv8tion.jda.api.entities.ChannelType;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Entity
@@ -22,7 +23,7 @@ public class AChannel implements SnowFlake {
@Getter
@ManyToMany(mappedBy = "channels")
private Set<AChannelGroup> groups;
private List<AChannelGroup> groups;
@ManyToOne(fetch = FetchType.LAZY)
@Getter

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Entity
@@ -26,7 +27,7 @@ public class AChannelGroup {
name = "channel_in_group",
joinColumns = @JoinColumn(name = "group_id"),
inverseJoinColumns = @JoinColumn(name = "channel_id"))
private Set<AChannel> channels;
private List<AChannel> channels;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import net.dv8tion.jda.api.entities.TextChannel;
public interface ChannelGroupService {
AChannelGroup createChannelGroup(String name);
void addChannelToChannelGroup(String channelGroupName, TextChannel textChannel);
void addChannelToChannelGroup(String channelGroupName, Long channelId);
void addChannelToChannelGroup(String channelGroupName, AChannel channel);
void removeChannelFromChannelGroup(String channelGroupName, TextChannel textChannel);
void removeChannelFromChannelGroup(String channelGroupName, Long channelId);
void removeChannelFromChannelGroup(String channelGroupName, AChannel channel);
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
public interface ChannelGroupManagementService {
AChannelGroup createChannelGroup(String name);
AChannelGroup addChannelToChannelGroup(AChannelGroup channelGroup, AChannel channel);
void removeChannelFromChannelGroup(AChannelGroup channelGroup, AChannel channel);
AChannelGroup findByName(String name);
}