diff --git a/.gitignore b/.gitignore index a1c2a238a..af7e11dba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Compiled class file *.class - +.idea/ +target/ +*.iml # Log file *.log diff --git a/abstracto-application/command/command-base/pom.xml b/abstracto-application/command/command-base/pom.xml new file mode 100644 index 000000000..e2426197d --- /dev/null +++ b/abstracto-application/command/command-base/pom.xml @@ -0,0 +1,46 @@ + + + + dev.sheldan.abstracto.command + command + 1.0-SNAPSHOT + + 4.0.0 + + + command-base + pom + + utility + support + + + + + dev.sheldan.abstracto.command + command-int + ${project.version} + + + + + + + maven-compiler-plugin + + + + only + + dev.sheldan.abstracto.command.annotations.CommandSpecProcessor + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/command/command-base/support/pom.xml b/abstracto-application/command/command-base/support/pom.xml new file mode 100644 index 000000000..77bd77348 --- /dev/null +++ b/abstracto-application/command/command-base/support/pom.xml @@ -0,0 +1,15 @@ + + + + command-base + dev.sheldan.abstracto.command + 1.0-SNAPSHOT + + 4.0.0 + + support + + + \ No newline at end of file diff --git a/abstracto-application/command/command-base/support/src/main/java/dev/sheldan/abstracto/command/support/Help.java b/abstracto-application/command/command-base/support/src/main/java/dev/sheldan/abstracto/command/support/Help.java new file mode 100644 index 000000000..d51d3a280 --- /dev/null +++ b/abstracto-application/command/command-base/support/src/main/java/dev/sheldan/abstracto/command/support/Help.java @@ -0,0 +1,38 @@ +package dev.sheldan.abstracto.command.support; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.execution.Configuration; +import dev.sheldan.abstracto.command.execution.Context; +import dev.sheldan.abstracto.command.execution.Result; +import dev.sheldan.abstracto.command.meta.CommandRegistry; +import net.dv8tion.jda.api.EmbedBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class Help implements Command { + + + @Autowired + private CommandRegistry registry; + + @Override + public Result execute(Context context) { + EmbedBuilder builder = new EmbedBuilder(); + registry.getAllCommands().forEach(command -> { + builder.addField(command.getConfiguration().getName(), command.getConfiguration().getDescription(), false); + }); + context.getChannel().sendMessage(builder.build()).queue(); + return Result.fromSuccess(); + } + + @Override + public Configuration getConfiguration() { + return Configuration.builder() + .name("help") + .module("utility") + .description("Prints the help") + .causesReaction(false) + .build(); + } +} diff --git a/abstracto-application/command/command-base/utility/pom.xml b/abstracto-application/command/command-base/utility/pom.xml new file mode 100644 index 000000000..c69b07136 --- /dev/null +++ b/abstracto-application/command/command-base/utility/pom.xml @@ -0,0 +1,15 @@ + + + + dev.sheldan.abstracto.command + command-base + 1.0-SNAPSHOT + + 4.0.0 + + utility + + + \ No newline at end of file diff --git a/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Echo.java b/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Echo.java new file mode 100644 index 000000000..ff4c4a61c --- /dev/null +++ b/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Echo.java @@ -0,0 +1,38 @@ +package dev.sheldan.abstracto.command.utility; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.execution.Configuration; +import dev.sheldan.abstracto.command.execution.Context; +import dev.sheldan.abstracto.command.execution.Parameter; +import dev.sheldan.abstracto.command.execution.Result; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class Echo implements Command { + + @Override + public Result execute(Context context) { + StringBuilder sb = new StringBuilder(); + context.getParameters().getParameters().forEach(o -> { + sb.append(o.toString()); + }); + context.getChannel().sendMessage(sb.toString()).queue(); + return Result.fromSuccess(); + } + + @Override + public Configuration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("input").type(String.class).remainder(true).build()); + return Configuration.builder() + .name("echo") + .module("utility") + .description("Echos the input back to the same channel") + .causesReaction(false) + .parameters(parameters) + .build(); + } +} diff --git a/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Ping.java b/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Ping.java new file mode 100644 index 000000000..746faa6c1 --- /dev/null +++ b/abstracto-application/command/command-base/utility/src/main/java/dev/sheldan/abstracto/command/utility/Ping.java @@ -0,0 +1,28 @@ +package dev.sheldan.abstracto.command.utility; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.execution.Configuration; +import dev.sheldan.abstracto.command.execution.Context; +import dev.sheldan.abstracto.command.execution.Result; +import org.springframework.stereotype.Service; + +@Service +public class Ping implements Command { + + @Override + public Result execute(Context context) { + long ping = context.getJda().getGatewayPing(); + context.getChannel().sendMessage("Latency: " + ping + " ms.").queue(); + return Result.fromSuccess(); + } + + @Override + public Configuration getConfiguration() { + return Configuration.builder() + .name("ping") + .module("utility") + .description("Prints the current bot latency to the discord api") + .causesReaction(false) + .build(); + } +} diff --git a/abstracto-application/command/command-int/pom.xml b/abstracto-application/command/command-int/pom.xml new file mode 100644 index 000000000..6a2d281ad --- /dev/null +++ b/abstracto-application/command/command-int/pom.xml @@ -0,0 +1,36 @@ + + + + dev.sheldan.abstracto.command + command + 1.0-SNAPSHOT + + 4.0.0 + jar + 1.0-SNAPSHOT + + command-int + + + + net.dv8tion + JDA + + + club.minnced + opus-java + + + + + org.springframework.boot + spring-boot-starter + + + + + + + \ No newline at end of file diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/Command.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/Command.java new file mode 100644 index 000000000..859bb679c --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/Command.java @@ -0,0 +1,11 @@ +package dev.sheldan.abstracto.command; + +import dev.sheldan.abstracto.command.execution.Configuration; +import dev.sheldan.abstracto.command.execution.Context; +import dev.sheldan.abstracto.command.execution.Result; + +public interface Command { + + Result execute(Context context); + Configuration getConfiguration(); +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Configuration.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Configuration.java new file mode 100644 index 000000000..4fbd64236 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Configuration.java @@ -0,0 +1,17 @@ +package dev.sheldan.abstracto.command.execution; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter @Setter @Builder +public class Configuration { + + private String name; + private String module; + private String description; + private List parameters; + private boolean causesReaction; +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Context.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Context.java new file mode 100644 index 000000000..d91a0dc8a --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Context.java @@ -0,0 +1,18 @@ +package dev.sheldan.abstracto.command.execution; + +import lombok.Builder; +import lombok.Getter; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.User; + +@Builder +@Getter +public class Context { + private TextChannel channel; + private User author; + private Message message; + private Parameters parameters; + private JDA jda; +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameter.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameter.java new file mode 100644 index 000000000..07064af21 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameter.java @@ -0,0 +1,13 @@ +package dev.sheldan.abstracto.command.execution; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter @Builder +public class Parameter { + private String name; + private Class type; + private boolean optional; + private boolean remainder; +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameters.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameters.java new file mode 100644 index 000000000..705998e95 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Parameters.java @@ -0,0 +1,12 @@ +package dev.sheldan.abstracto.command.execution; + +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Builder +public class Parameters { + @Getter + private List parameters; +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Result.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Result.java new file mode 100644 index 000000000..5cbb05ceb --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/Result.java @@ -0,0 +1,20 @@ +package dev.sheldan.abstracto.command.execution; + + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter @Builder +public class Result { + private ResultState result; + private String message; + + public static Result fromSuccess() { + return Result.builder().result(ResultState.SUCCESSFUL).build(); + } + + public static Result fromError(String message){ + return Result.builder().result(ResultState.ERROR).message(message).build(); + } +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/ResultState.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/ResultState.java new file mode 100644 index 000000000..181be0a94 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/execution/ResultState.java @@ -0,0 +1,5 @@ +package dev.sheldan.abstracto.command.execution; + +public enum ResultState { + ERROR, SUCCESSFUL, IGNORED +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/CommandRegistry.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/CommandRegistry.java new file mode 100644 index 000000000..8950993e3 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/CommandRegistry.java @@ -0,0 +1,14 @@ +package dev.sheldan.abstracto.command.meta; + + +import dev.sheldan.abstracto.command.Command; +import net.dv8tion.jda.api.entities.Message; + +import java.util.List; + +public interface CommandRegistry { + Command findCommandByParameters(String name, UnParsedCommandParameter context); + Command findCommand(String message); + List getAllCommands(); + boolean isCommand(Message message); +} diff --git a/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/UnParsedCommandParameter.java b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/UnParsedCommandParameter.java new file mode 100644 index 000000000..eb944d9f3 --- /dev/null +++ b/abstracto-application/command/command-int/src/main/java/dev/sheldan/abstracto/command/meta/UnParsedCommandParameter.java @@ -0,0 +1,11 @@ +package dev.sheldan.abstracto.command.meta; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter @Setter +public class UnParsedCommandParameter { + private List parameters; +} diff --git a/abstracto-application/command/command-management/pom.xml b/abstracto-application/command/command-management/pom.xml new file mode 100644 index 000000000..dc40c4944 --- /dev/null +++ b/abstracto-application/command/command-management/pom.xml @@ -0,0 +1,28 @@ + + + + dev.sheldan.abstracto.command + command + 1.0-SNAPSHOT + + 4.0.0 + + command-management + + + + dev.sheldan.abstracto.command + command-int + ${project.version} + + + dev.sheldan.abstracto.core + core-interface + 1.0-SNAPSHOT + compile + + + + \ No newline at end of file diff --git a/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/AbstractCommand.java b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/AbstractCommand.java new file mode 100644 index 000000000..1921be845 --- /dev/null +++ b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/AbstractCommand.java @@ -0,0 +1,6 @@ +package dev.sheldan.abstracto.commands.management; + +import dev.sheldan.abstracto.command.Command; + +public abstract class AbstractCommand implements Command { +} diff --git a/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandManager.java b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandManager.java new file mode 100644 index 000000000..3c6c01530 --- /dev/null +++ b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandManager.java @@ -0,0 +1,61 @@ +package dev.sheldan.abstracto.commands.management; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.execution.Configuration; +import dev.sheldan.abstracto.command.execution.Parameter; +import dev.sheldan.abstracto.command.meta.CommandRegistry; +import dev.sheldan.abstracto.command.meta.UnParsedCommandParameter; +import net.dv8tion.jda.api.entities.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class CommandManager implements CommandRegistry { + + @Autowired + private List commands; + + @Override + public Command findCommandByParameters(String name, UnParsedCommandParameter unParsedCommandParameter) { + Optional commandOptional = commands.stream().filter((Command o )-> { + Configuration configuration = o.getConfiguration(); + boolean parameterFit; + if(configuration.getParameters() != null){ + boolean paramCountFits = unParsedCommandParameter.getParameters().size() - 1 == configuration.getParameters().size(); + boolean hasRemainderParameter = configuration.getParameters().stream().anyMatch(Parameter::isRemainder); + parameterFit = paramCountFits || hasRemainderParameter; + } else { + parameterFit = unParsedCommandParameter.getParameters().size() == 0; + } + return configuration.getName().equals(name) && parameterFit; + }).findFirst(); + if(commandOptional.isPresent()){ + return commandOptional.get(); + } + throw new CommandNotFoundException(); + } + + public Command findCommand(String name) { + Optional commandOptional = commands.stream().filter((Command o )-> { + Configuration configuration = o.getConfiguration(); + return configuration.getName().equals(name); + }).findFirst(); + if(commandOptional.isPresent()){ + return commandOptional.get(); + } + throw new CommandNotFoundException(); + } + + @Override + public List getAllCommands() { + return commands; + } + + @Override + public boolean isCommand(Message message) { + return message.getContentRaw().startsWith("!"); + } +} diff --git a/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandNotFoundException.java b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandNotFoundException.java new file mode 100644 index 000000000..31923a1ac --- /dev/null +++ b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandNotFoundException.java @@ -0,0 +1,4 @@ +package dev.sheldan.abstracto.commands.management; + +public class CommandNotFoundException extends RuntimeException { +} diff --git a/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandReceivedHandler.java b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandReceivedHandler.java new file mode 100644 index 000000000..e35bdf840 --- /dev/null +++ b/abstracto-application/command/command-management/src/main/java/dev/sheldan/abstracto/commands/management/CommandReceivedHandler.java @@ -0,0 +1,60 @@ +package dev.sheldan.abstracto.commands.management; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.execution.Context; +import dev.sheldan.abstracto.command.execution.Parameter; +import dev.sheldan.abstracto.command.execution.Parameters; +import dev.sheldan.abstracto.command.meta.UnParsedCommandParameter; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service +public class CommandReceivedHandler extends ListenerAdapter { + + @Autowired + private CommandManager manager; + + @Override + public void onMessageReceived(@Nonnull MessageReceivedEvent event) { + if(!manager.isCommand(event.getMessage())) { + return; + } + List parameters = Arrays.asList(event.getMessage().getContentStripped().split(" ")); + UnParsedCommandParameter unparsedParameter = new UnParsedCommandParameter(); + unparsedParameter.setParameters(parameters.subList(1, parameters.size())); + String withoutPrefix = parameters.get(0).substring(1); + Command foundCommand = manager.findCommandByParameters(withoutPrefix, unparsedParameter); + Parameters parsedParameters = getParsedParameters(unparsedParameter, foundCommand); + Context context = Context.builder() + .author(event.getAuthor()) + .channel(event.getTextChannel()) + .message(event.getMessage()) + .parameters(parsedParameters) + .jda(event.getJDA()) + .build(); + foundCommand.execute(context); + } + + public Parameters getParsedParameters(UnParsedCommandParameter unParsedCommandParameter, Command command){ + List parsedParameters = new ArrayList<>(); + for (int i = 0; i < unParsedCommandParameter.getParameters().size(); i++) { + Parameter param = command.getConfiguration().getParameters().get(i); + String value = unParsedCommandParameter.getParameters().get(i); + if(param.getType().equals(Integer.class)){ + parsedParameters.add(Integer.parseInt(value)); + } else if(param.getType().equals(Double.class)){ + parsedParameters.add(Double.parseDouble(value)); + } else { + parsedParameters.add(value); + } + } + return Parameters.builder().parameters(parsedParameters).build(); + } +} diff --git a/abstracto-application/command/pom.xml b/abstracto-application/command/pom.xml new file mode 100644 index 000000000..941f83e46 --- /dev/null +++ b/abstracto-application/command/pom.xml @@ -0,0 +1,22 @@ + + + + dev.sheldan.abstracto + abstracto-application + 1.0-SNAPSHOT + + 4.0.0 + + dev.sheldan.abstracto.command + command + pom + + command-int + command-base + command-management + + + + \ No newline at end of file diff --git a/abstracto-application/core/core-impl/pom.xml b/abstracto-application/core/core-impl/pom.xml new file mode 100644 index 000000000..dbb4b36e3 --- /dev/null +++ b/abstracto-application/core/core-impl/pom.xml @@ -0,0 +1,114 @@ + + + + dev.sheldan.abstracto.core + core + 1.0-SNAPSHOT + + 4.0.0 + jar + + core-impl + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-oauth2-client + + + org.springframework.boot + spring-boot-starter-quartz + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + net.dv8tion + JDA + + + club.minnced + opus-java + + + + + + dev.sheldan.abstracto.core + core-interface + ${project.version} + compile + + + + dev.sheldan.abstracto.command + command-management + ${project.version} + compile + + + + dev.sheldan.abstracto.command + utility + ${project.version} + runtime + + + + dev.sheldan.abstracto.command + support + ${project.version} + runtime + + + + \ No newline at end of file diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/Application.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/Application.java new file mode 100644 index 000000000..350ede4e8 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/Application.java @@ -0,0 +1,29 @@ +package dev.sheldan.abstracto; + +import dev.sheldan.abstracto.service.StartupManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "dev.sheldan.abstracto") +@EnableCaching +public class Application implements CommandLineRunner { + + @Autowired + private StartupManager startup; + + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Override + public void run(String... args) throws Exception { + startup.startBot(); + } + +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Channel.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Channel.java new file mode 100644 index 000000000..6f0c19e8f --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Channel.java @@ -0,0 +1,24 @@ +package dev.sheldan.abstracto.models; + +import lombok.Builder; +import lombok.Getter; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import java.util.Set; + +@Entity +@Table +@Builder +public class Channel { + + @Id + @Getter + public Long id; + + @Getter + @ManyToMany(mappedBy = "channels") + private Set groups; +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/ChannelGroup.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/ChannelGroup.java new file mode 100644 index 000000000..270de985a --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/ChannelGroup.java @@ -0,0 +1,31 @@ +package dev.sheldan.abstracto.models; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Table +public class ChannelGroup { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter + private Long id; + + @Column + @Getter @Setter + private String groupName; + + @ManyToMany + @JoinTable( + name = "channel_in_group", + joinColumns = @JoinColumn(name = "group_id"), + inverseJoinColumns = @JoinColumn(name = "channel_id")) + @Getter + private Set channels; + + +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/PostTarget.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/PostTarget.java new file mode 100644 index 000000000..c3b215924 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/PostTarget.java @@ -0,0 +1,26 @@ +package dev.sheldan.abstracto.models; + +import lombok.Getter; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import javax.persistence.*; + +@Entity +@Table +public class PostTarget { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter + private Long id; + + @Column(unique = true) + @Getter + private String name; + + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "id", nullable = false) + @Getter + private Channel channel; +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Role.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Role.java new file mode 100644 index 000000000..54d3546b6 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/models/Role.java @@ -0,0 +1,23 @@ +package dev.sheldan.abstracto.models; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table +public class Role { + + @Id + @Getter + private Long id; + + @Column(unique = true) + @Getter @Setter + private String name; + +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/ChannelRepository.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/ChannelRepository.java new file mode 100644 index 000000000..41a18dda8 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/repository/ChannelRepository.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.repository; + +import dev.sheldan.abstracto.models.Channel; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChannelRepository extends JpaRepository { +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/BotService.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/BotService.java new file mode 100644 index 000000000..2dd0e55ae --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/BotService.java @@ -0,0 +1,35 @@ +package dev.sheldan.abstracto.service; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.utils.cache.CacheFlag; +import org.springframework.stereotype.Service; + +import javax.security.auth.login.LoginException; +import java.util.EnumSet; + +@Service +public class BotService implements Bot { + + private JDA instance; + + @Override + public void login() throws LoginException { + JDABuilder builder = new JDABuilder(System.getenv("TOKEN")); + + builder.setDisabledCacheFlags(EnumSet.of(CacheFlag.ACTIVITY, CacheFlag.VOICE_STATE)); + builder.setBulkDeleteSplittingEnabled(false); + + this.instance = builder.build(); + } + + @Override + public JDA getInstance() { + return instance; + } + + @Override + public void shutdown() { + + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/StartupManager.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/StartupManager.java new file mode 100644 index 000000000..a9007fc1e --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/service/StartupManager.java @@ -0,0 +1,25 @@ +package dev.sheldan.abstracto.service; + +import dev.sheldan.abstracto.commands.management.CommandReceivedHandler; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.security.auth.login.LoginException; +import java.util.List; + +@Service +public class StartupManager implements Startup { + + @Autowired + private BotService service; + + @Autowired + private List listeners; + + @Override + public void startBot() throws LoginException { + service.login(); + listeners.forEach(o -> service.getInstance().addEventListener(o)); + } +} diff --git a/abstracto-application/core/core-impl/src/main/resources/application.properties b/abstracto-application/core/core-impl/src/main/resources/application.properties new file mode 100644 index 000000000..aad3baab4 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/abstracto +spring.datasource.username= abstracto +spring.datasource.password= abstracto + +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto = update \ No newline at end of file diff --git a/abstracto-application/core/core-interface/pom.xml b/abstracto-application/core/core-interface/pom.xml new file mode 100644 index 000000000..e8fd26970 --- /dev/null +++ b/abstracto-application/core/core-interface/pom.xml @@ -0,0 +1,26 @@ + + + + dev.sheldan.abstracto.core + core + 1.0-SNAPSHOT + + 4.0.0 + jar + + core-interface + + + + + org.springframework.boot + spring-boot-starter + + + net.dv8tion + JDA + + + \ No newline at end of file diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Bot.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Bot.java new file mode 100644 index 000000000..5b6522c1f --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Bot.java @@ -0,0 +1,13 @@ +package dev.sheldan.abstracto.service; + +import net.dv8tion.jda.api.JDA; +import org.springframework.stereotype.Service; + +import javax.security.auth.login.LoginException; + +@Service +public interface Bot { + void login() throws LoginException; + JDA getInstance(); + void shutdown(); +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Startup.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Startup.java new file mode 100644 index 000000000..05e9c1300 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/service/Startup.java @@ -0,0 +1,10 @@ +package dev.sheldan.abstracto.service; + +import org.springframework.stereotype.Service; + +import javax.security.auth.login.LoginException; + +@Service +public interface Startup { + public void startBot() throws LoginException; +} diff --git a/abstracto-application/core/pom.xml b/abstracto-application/core/pom.xml new file mode 100644 index 000000000..779fcaa52 --- /dev/null +++ b/abstracto-application/core/pom.xml @@ -0,0 +1,21 @@ + + + + dev.sheldan.abstracto + abstracto-application + 1.0-SNAPSHOT + + 4.0.0 + + dev.sheldan.abstracto.core + core + pom + + core-interface + core-impl + + + + \ No newline at end of file diff --git a/abstracto-application/pom.xml b/abstracto-application/pom.xml new file mode 100644 index 000000000..c2de6fca7 --- /dev/null +++ b/abstracto-application/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + pom + + + dev.sheldan.abstracto + abstracto + 1.0-SNAPSHOT + + + abstracto-application + 1.0-SNAPSHOT + + + command + core + + + + + + + net.dv8tion + JDA + ${jda.version} + + + club.minnced + opus-java + + + + + + + + + org.projectlombok + lombok + true + + + + \ No newline at end of file diff --git a/database/pom.xml b/database/pom.xml new file mode 100644 index 000000000..11a7d0cde --- /dev/null +++ b/database/pom.xml @@ -0,0 +1,15 @@ + + + + dev.sheldan.abstracto + abstracto + 1.0-SNAPSHOT + + 4.0.0 + + database + + + \ No newline at end of file diff --git a/database/src/main/resources/docker-compose.yml b/database/src/main/resources/docker-compose.yml new file mode 100644 index 000000000..674ca1da2 --- /dev/null +++ b/database/src/main/resources/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.1' + +services: + db: + image: postgres + restart: always + ports: + - "5432:5432" + environment: + POSTGRES_PASSWORD: abstracto + POSTGRES_USER: abstracto diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..6f21cde2e --- /dev/null +++ b/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + + dev.sheldan.abstracto + abstracto + 1.0-SNAPSHOT + + + + 4.0.0_73 + + + + abstracto-application + database + + + + + jcenter + jcenter-bintray + https://jcenter.bintray.com + + + + \ No newline at end of file