From e31571bab6694011046ee8af944b37e01b905cd1 Mon Sep 17 00:00:00 2001 From: Anthony Cathers Date: Tue, 21 Jan 2020 12:10:22 -1000 Subject: [PATCH] #9 Database setup --- pom.xml | 94 +++++++++++++++++++ .../org/togetherjava/discordbot/BotMain.java | 4 +- .../discordbot/commands/CommandListener.java | 4 +- .../commands/commands/ExampleCommandDB.java | 36 +++++++ .../discordbot/config/TjBotConfig.java | 26 +++-- .../db/repositories/ExampleRepository.java | 41 ++++++++ .../discordbot/db/repository/Repository.java | 16 ++++ .../db/repository/SimpleRepository.java | 15 +++ .../events/modmail/ModMailListener.java | 47 ++++++++++ src/main/resources/db/V1__test.sql | 6 ++ src/main/resources/sample-config.yml | 8 +- 11 files changed, 287 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/togetherjava/discordbot/commands/commands/ExampleCommandDB.java create mode 100644 src/main/java/org/togetherjava/discordbot/db/repositories/ExampleRepository.java create mode 100644 src/main/java/org/togetherjava/discordbot/db/repository/Repository.java create mode 100644 src/main/java/org/togetherjava/discordbot/db/repository/SimpleRepository.java create mode 100644 src/main/java/org/togetherjava/discordbot/events/modmail/ModMailListener.java create mode 100644 src/main/resources/db/V1__test.sql diff --git a/pom.xml b/pom.xml index 27679ec..483c9ec 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 2.8.0 + jdbc:sqlite:tjbot.sqlite @@ -45,6 +46,59 @@ ${project.name} + + + org.jooq + jooq-codegen-maven + 3.12.3 + + + generate-sources + + generate + + + + + + org.sqlite.JDBC + ${db.jdbc.url} + + + + org.jooq.meta.sqlite.SQLiteDatabase + .* + + + true + + + org.togetherjava.discordbot.db.autogen + target/generated-sources/jooq + + + + + + + org.flywaydb + flyway-maven-plugin + 6.1.3 + + + generate-sources + + migrate + + + + + ${db.jdbc.url} + + filesystem:src/main/resources/db + + + @@ -55,14 +109,23 @@ -SNAPSHOT + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + maven-plugin + + com.fasterxml.jackson.core jackson-databind + com.fasterxml.jackson.dataformat jackson-dataformat-yaml + com.fasterxml.jackson.module jackson-module-parameter-names @@ -72,6 +135,7 @@ org.slf4j slf4j-api + org.apache.logging.log4j log4j-slf4j18-impl @@ -83,6 +147,36 @@ ${jbock.version} provided + + + org.jooq + jooq + 3.12.3 + + + + org.jooq + jooq-meta + 3.12.3 + + + + org.jooq + jooq-codegen + 3.12.3 + + + + org.xerial + sqlite-jdbc + 3.30.1 + + + + org.flywaydb + flyway-core + 6.1.3 + diff --git a/src/main/java/org/togetherjava/discordbot/BotMain.java b/src/main/java/org/togetherjava/discordbot/BotMain.java index 8900186..80f6c5c 100644 --- a/src/main/java/org/togetherjava/discordbot/BotMain.java +++ b/src/main/java/org/togetherjava/discordbot/BotMain.java @@ -10,6 +10,7 @@ import org.togetherjava.discordbot.cli.CliArgumentSpecification_Parser; import org.togetherjava.discordbot.commands.CommandListener; import org.togetherjava.discordbot.config.TjBotConfig; +import org.togetherjava.discordbot.events.modmail.ModMailListener; import org.togetherjava.discordbot.util.Messages; public class BotMain { @@ -30,10 +31,11 @@ public static void main(String[] args) throws Exception { logger.info("Starting JDA"); JDA jda = new JDABuilder(AccountType.BOT) .setToken(config.getAndDeleteBotToken()) - .addEventListeners() .build() .awaitReady(); + jda.addEventListener(new ModMailListener(jda, config)); jda.addEventListener(new CommandListener(config, messages, jda)); + logger.info("Started JDA"); } } diff --git a/src/main/java/org/togetherjava/discordbot/commands/CommandListener.java b/src/main/java/org/togetherjava/discordbot/commands/CommandListener.java index cc32ee8..1f91f09 100644 --- a/src/main/java/org/togetherjava/discordbot/commands/CommandListener.java +++ b/src/main/java/org/togetherjava/discordbot/commands/CommandListener.java @@ -10,6 +10,7 @@ import de.ialistannen.commandprocrastination.parsing.ParseException; import javax.annotation.Nonnull; import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.togetherjava.discordbot.commands.CommandContext.JdaRequestContext; @@ -42,9 +43,10 @@ public CommandListener(TjBotConfig config, Messages messages, JDA jda) { @Override public void onMessageReceived(@Nonnull MessageReceivedEvent event) { - if (event.getAuthor().isBot()) { + if (event.getAuthor().isBot() || event.isFromType(ChannelType.PRIVATE)) { return; } + String content = event.getMessage().getContentRaw(); try { JdaRequestContext context = new JdaRequestContext( diff --git a/src/main/java/org/togetherjava/discordbot/commands/commands/ExampleCommandDB.java b/src/main/java/org/togetherjava/discordbot/commands/commands/ExampleCommandDB.java new file mode 100644 index 0000000..a1f73a7 --- /dev/null +++ b/src/main/java/org/togetherjava/discordbot/commands/commands/ExampleCommandDB.java @@ -0,0 +1,36 @@ +package org.togetherjava.discordbot.commands.commands; + +import de.ialistannen.commandprocrastination.autodiscovery.ActiveCommand; +import de.ialistannen.commandprocrastination.command.tree.CommandNode; +import de.ialistannen.commandprocrastination.parsing.ParseException; +import org.togetherjava.discordbot.commands.CommandContext; +import org.togetherjava.discordbot.db.autogen.tables.pojos.Test; +import org.togetherjava.discordbot.db.repositories.ExampleRepository; + +import static de.ialistannen.commandprocrastination.parsing.defaults.StringParsers.greedyPhrase; + +@ActiveCommand(name = "example", parentClass = BasePrefixCommand.class) +@SuppressWarnings("unused") +public class ExampleCommandDB extends CommandNode { + + private ExampleRepository repository; + + @SuppressWarnings("unused") + public ExampleCommandDB(CommandContext context) { + super("example"); + repository = new ExampleRepository(context); + setCommand(this::execute); + } + + private void execute(CommandContext context) throws ParseException { + repository.add(new Test(null, context.getRequestContext().getUser().getName(), context.shift(greedyPhrase()))); + for(Test value: repository.getAll()){ + context.getRequestContext().getChannel().sendMessage(value.getText()).queue(); + } + + for(Test value: repository.getAll()){ + value.setText(value.getText() + "UPDATE TEST"); + repository.update(value); + } + } +} diff --git a/src/main/java/org/togetherjava/discordbot/config/TjBotConfig.java b/src/main/java/org/togetherjava/discordbot/config/TjBotConfig.java index ded3639..7ac5182 100644 --- a/src/main/java/org/togetherjava/discordbot/config/TjBotConfig.java +++ b/src/main/java/org/togetherjava/discordbot/config/TjBotConfig.java @@ -1,13 +1,12 @@ package org.togetherjava.discordbot.config; -import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import java.io.IOException; import java.io.InputStream; import java.util.List; -import java.util.Objects; /** * The pojo for the main config file for this bot. @@ -15,14 +14,20 @@ public class TjBotConfig { private List prefixes; + @JsonProperty("botToken") private String botToken; private CommandConfig commands; + private String moderationChannel; + private String dburl; - @JsonCreator - public TjBotConfig(List prefixes, String botToken, CommandConfig commands) { - this.prefixes = Objects.requireNonNull(prefixes, "prefixes can not be null!"); - this.botToken = Objects.requireNonNull(botToken, "botToken can not be null!"); - this.commands = Objects.requireNonNull(commands, "commands can not be null!"); + + /** + * Returns the database url + * + * @return the database url + */ + public String getDburl() { + return dburl; } /** @@ -43,6 +48,13 @@ public CommandConfig getCommands() { return commands; } + /** + * Returns the moderation channel for modmail. + * + * @return the moderation channel for modmail. + */ + public String getModerationChannel() { return moderationChannel; } + /** * Returns the token and deletes it from the config. * diff --git a/src/main/java/org/togetherjava/discordbot/db/repositories/ExampleRepository.java b/src/main/java/org/togetherjava/discordbot/db/repositories/ExampleRepository.java new file mode 100644 index 0000000..bdb80b8 --- /dev/null +++ b/src/main/java/org/togetherjava/discordbot/db/repositories/ExampleRepository.java @@ -0,0 +1,41 @@ +package org.togetherjava.discordbot.db.repositories; + +import org.togetherjava.discordbot.commands.CommandContext; +import org.togetherjava.discordbot.db.autogen.tables.daos.TestDao; +import org.togetherjava.discordbot.db.autogen.tables.pojos.Test; +import org.togetherjava.discordbot.db.repository.SimpleRepository; +import java.util.List; + +/** + * can use the dao or the DSLContext to write queries, the dao having most things pre written + */ +public class ExampleRepository extends SimpleRepository { + + private TestDao dao; + + public ExampleRepository(CommandContext context){ + super(context); + dao = new TestDao(dslContext.configuration()); + } + + @Override + public void add(Test item) { + dao.insert(item); + } + + @Override + public void update(Test item) { + dao.update(item); + } + + @Override + public void remove(Test item) { + dao.delete(item); + } + + @Override + public List getAll() { + return dao.findAll(); + } + +} diff --git a/src/main/java/org/togetherjava/discordbot/db/repository/Repository.java b/src/main/java/org/togetherjava/discordbot/db/repository/Repository.java new file mode 100644 index 0000000..6001274 --- /dev/null +++ b/src/main/java/org/togetherjava/discordbot/db/repository/Repository.java @@ -0,0 +1,16 @@ +package org.togetherjava.discordbot.db.repository; + +import java.util.List; + +public interface Repository { + + void add(T item); + + void update(T item); + + void remove(T item); + + List getAll(); + +} + diff --git a/src/main/java/org/togetherjava/discordbot/db/repository/SimpleRepository.java b/src/main/java/org/togetherjava/discordbot/db/repository/SimpleRepository.java new file mode 100644 index 0000000..57fde40 --- /dev/null +++ b/src/main/java/org/togetherjava/discordbot/db/repository/SimpleRepository.java @@ -0,0 +1,15 @@ +package org.togetherjava.discordbot.db.repository; + +import org.jooq.*; +import org.jooq.impl.DSL; +import org.togetherjava.discordbot.commands.CommandContext; + +public abstract class SimpleRepository implements Repository { + + protected DSLContext dslContext; + + public SimpleRepository(CommandContext context) { + dslContext = DSL.using(context.getConfig().getDburl()); + } + +} diff --git a/src/main/java/org/togetherjava/discordbot/events/modmail/ModMailListener.java b/src/main/java/org/togetherjava/discordbot/events/modmail/ModMailListener.java new file mode 100644 index 0000000..7f2af06 --- /dev/null +++ b/src/main/java/org/togetherjava/discordbot/events/modmail/ModMailListener.java @@ -0,0 +1,47 @@ +package org.togetherjava.discordbot.events.modmail; + +import lombok.NonNull; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.events.message.priv.PrivateMessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.togetherjava.discordbot.config.TjBotConfig; +import javax.annotation.Nonnull; +import java.util.List; + + + +public class ModMailListener extends ListenerAdapter { + private TextChannel moderation; + + public ModMailListener(JDA jda, TjBotConfig config) { + List channels = jda.getTextChannelsByName(config.getModerationChannel(), false); + if(channels.isEmpty()){ + throw new IllegalArgumentException("Moderation channel is invalid, does not exist"); + } + moderation = channels.get(0); + } + + @Override + public void onPrivateMessageReceived(@Nonnull PrivateMessageReceivedEvent event) { + if (!event.getAuthor().isBot()) { + String message = "<@" + event.getAuthor().getId() + ">: " + event.getMessage().getContentRaw(); + moderation.sendMessage(message).queue(); + } + } + + @Override + public void onGuildMessageReceived(@NonNull GuildMessageReceivedEvent event) { + if(!event.getMessage().getTextChannel().equals(moderation)){ + return; + } + + List mentioned = event.getMessage().getMentionedMembers(); + if (!event.getAuthor().isBot() && !mentioned.isEmpty()) { + mentioned.get(0).getUser().openPrivateChannel().queue((channel) -> + channel.sendMessage(event.getMessage()).queue()); + } + } +} diff --git a/src/main/resources/db/V1__test.sql b/src/main/resources/db/V1__test.sql new file mode 100644 index 0000000..472b10f --- /dev/null +++ b/src/main/resources/db/V1__test.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS TEST +( + ID INTEGER AUTO_INCREMENT PRIMARY KEY, + MEMBER varchar(30) NOT NULL, + TEXT varchar(30) NOT NULL +); diff --git a/src/main/resources/sample-config.yml b/src/main/resources/sample-config.yml index e4092ae..438a703 100644 --- a/src/main/resources/sample-config.yml +++ b/src/main/resources/sample-config.yml @@ -3,10 +3,16 @@ # The command prefixes prefixes: ["!", "?"] botToken: "your token" +# the url for the database connection +dburl: "jdbc:sqlite:yourfile.sqlite" + +# channel for modmail +moderationChannel: "your channel" # Command settings commands: # Configuration for the free command free: # The regex used to detect help channels for the free command - helpChannelRegex: ".*" \ No newline at end of file + helpChannelRegex: ".*" +