From e2c08bf8b0e5b5fcbfe160a82a86681ff24411ad Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 7 Jun 2022 16:51:06 +0100 Subject: [PATCH 01/24] Adding settings tot the database --- README.md | 6 ++- build.gradle | 12 +++-- .../org/programming/bot/ProgrammingBot.java | 2 +- .../org/programming/bot/SlashCommandReg.java | 2 +- .../{ => bot}/commands/ExampleCommand.java | 2 +- .../{ => bot}/config/BotConfig.java | 2 +- .../{ => bot}/config/LoggerColorScheme.java | 2 +- .../org/programming/database/Database.java | 52 +++++++++++++++++++ .../programming/database/DatabaseConfig.java | 18 +++++++ src/main/resources/logback.xml | 2 +- 10 files changed, 89 insertions(+), 11 deletions(-) rename src/main/java/io/github/org/programming/{ => bot}/commands/ExampleCommand.java (95%) rename src/main/java/io/github/org/programming/{ => bot}/config/BotConfig.java (91%) rename src/main/java/io/github/org/programming/{ => bot}/config/LoggerColorScheme.java (96%) create mode 100644 src/main/java/io/github/org/programming/database/Database.java create mode 100644 src/main/java/io/github/org/programming/database/DatabaseConfig.java diff --git a/README.md b/README.md index bf625a7..af9549f 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,12 @@ Once you have added the bot to your server, you will need to create a .env file TOKEN= GUILD_ID= OWNER_ID= -//for the excutor default is 1; +//for the excutor default is 1. CORE_POOL_SIZE= +//example : jdbc:maria://localhost:3306/programming +JDBC_URL= +DATA_BASE_USER_NAME= +DATA_BASE_PASSWORD= ``` ### Part 3 diff --git a/build.gradle b/build.gradle index 07e5df2..59adcbc 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id "com.diffplug.spotless" version "6.6.1" id "application" + id "nu.studer.jooq" version "6.0.1" } @@ -24,14 +25,17 @@ dependencies { implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.11' //config implementation group: 'io.github.yusufsdiscordbot', name: 'config', version: '1.0.4' - //Reflection - implementation group: 'org.reflections', name: 'reflections', version: '0.10.2' //json implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.13.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3' - //MongoDB - implementation group: 'org.mongodb', name: 'mongo-java-driver', version: '3.12.11' + //database + implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.0.5' + implementation group: 'org.jooq', name: 'jooq', version: '3.15.5' + implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.0.0' + //jooq dependency + jooqGenerator 'org.jooq:jooq-meta:3.16.6' + jooqGenerator 'org.jooq:jooq-codegen:3.16.6' //test testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' } diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 6903db2..a2951e5 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -1,6 +1,6 @@ package io.github.org.programming.bot; -import io.github.org.programming.config.BotConfig; +import io.github.org.programming.bot.config.BotConfig; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; diff --git a/src/main/java/io/github/org/programming/bot/SlashCommandReg.java b/src/main/java/io/github/org/programming/bot/SlashCommandReg.java index b2724d1..5b35d84 100644 --- a/src/main/java/io/github/org/programming/bot/SlashCommandReg.java +++ b/src/main/java/io/github/org/programming/bot/SlashCommandReg.java @@ -1,7 +1,7 @@ package io.github.org.programming.bot; import io.github.org.programming.backend.handler.SlashCommandHandler; -import io.github.org.programming.config.BotConfig; +import io.github.org.programming.bot.config.BotConfig; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/io/github/org/programming/commands/ExampleCommand.java b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java similarity index 95% rename from src/main/java/io/github/org/programming/commands/ExampleCommand.java rename to src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java index 16f123c..b18de7f 100644 --- a/src/main/java/io/github/org/programming/commands/ExampleCommand.java +++ b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java @@ -1,4 +1,4 @@ -package io.github.org.programming.commands; +package io.github.org.programming.bot.commands; import io.github.org.programming.backend.builder.slash.SlashCommand; import io.github.org.programming.backend.builder.slash.SlashCommandBuilder; diff --git a/src/main/java/io/github/org/programming/config/BotConfig.java b/src/main/java/io/github/org/programming/bot/config/BotConfig.java similarity index 91% rename from src/main/java/io/github/org/programming/config/BotConfig.java rename to src/main/java/io/github/org/programming/bot/config/BotConfig.java index 44ab9ee..89a6801 100644 --- a/src/main/java/io/github/org/programming/config/BotConfig.java +++ b/src/main/java/io/github/org/programming/bot/config/BotConfig.java @@ -1,4 +1,4 @@ -package io.github.org.programming.config; +package io.github.org.programming.bot.config; import io.github.yusufsdiscordbot.config.Config; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/io/github/org/programming/config/LoggerColorScheme.java b/src/main/java/io/github/org/programming/bot/config/LoggerColorScheme.java similarity index 96% rename from src/main/java/io/github/org/programming/config/LoggerColorScheme.java rename to src/main/java/io/github/org/programming/bot/config/LoggerColorScheme.java index 4d77867..18bd815 100644 --- a/src/main/java/io/github/org/programming/config/LoggerColorScheme.java +++ b/src/main/java/io/github/org/programming/bot/config/LoggerColorScheme.java @@ -1,4 +1,4 @@ -package io.github.org.programming.config; +package io.github.org.programming.bot.config; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java new file mode 100644 index 0000000..43204b1 --- /dev/null +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -0,0 +1,52 @@ +package io.github.org.programming.database; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.jetbrains.annotations.Nullable; +import org.mariadb.jdbc.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class Database { + private static final Logger logger = LoggerFactory.getLogger(Database.class); + private static final HikariConfig config = new HikariConfig(); + private static HikariDataSource ds; + + private static Connection connection; + + static { + config.setJdbcUrl(DatabaseConfig.getJDBCUrl()); + config.setUsername(DatabaseConfig.getUserName()); + config.setPassword(DatabaseConfig.getPassword()); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + ds = new HikariDataSource(config); + } + + public static void openDatabase() throws SQLException { + logger.info("Connecting to database..."); + connection = DriverManager.getConnection(config.getJdbcUrl(), config.getUsername(), + config.getPassword()); + + if (connection.isValid(5)) { + logger.info("Connected to database."); + } else { + logger.error("Failed to connect to database."); + } + } + + public static void closeDatabase() throws SQLException { + logger.info("Closing database connection..."); + connection.close(); + if (connection.isClosed()) { + logger.info("Database connection closed."); + } else { + logger.error("Failed to close database connection."); + } + } +} diff --git a/src/main/java/io/github/org/programming/database/DatabaseConfig.java b/src/main/java/io/github/org/programming/database/DatabaseConfig.java new file mode 100644 index 0000000..c7d4d45 --- /dev/null +++ b/src/main/java/io/github/org/programming/database/DatabaseConfig.java @@ -0,0 +1,18 @@ +package io.github.org.programming.database; + +import io.github.yusufsdiscordbot.config.Config; + +public class DatabaseConfig { + + public static String getJDBCUrl() { + return Config.getString("JDBC_URL"); + } + + public static String getUserName() { + return Config.getString("DATA_BASE_USER_NAME"); + } + + public static String getPassword() { + return Config.getString("DATA_BASE_PASSWORD"); + } +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index d0f5400..3f65cf3 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,6 +1,6 @@ - + From 3ec2f2bf19fcce6e90cd549fd3d2963e75669872 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 7 Jun 2022 17:05:51 +0100 Subject: [PATCH 02/24] Add try and finally to Main Bot class --- .../github/org/programming/bot/ProgrammingBot.java | 8 ++++++++ .../github/org/programming/database/Database.java | 14 ++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index a2951e5..1d253a5 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -1,6 +1,7 @@ package io.github.org.programming.bot; import io.github.org.programming.bot.config.BotConfig; +import io.github.org.programming.database.Database; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; @@ -29,6 +30,13 @@ public class ProgrammingBot extends ListenerAdapter { Executors.newScheduledThreadPool(BotConfig.getCorePoolSize()); public ProgrammingBot(String[] args) throws Exception { + + try { + Database.openDatabase(); + } finally { + Database.closeDatabase(); + } + JDA jda = JDABuilder .createDefault(BotConfig.getToken(), GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_VOICE_STATES, GatewayIntent.GUILD_MESSAGE_REACTIONS, diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 43204b1..78f3777 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -33,20 +33,14 @@ public static void openDatabase() throws SQLException { connection = DriverManager.getConnection(config.getJdbcUrl(), config.getUsername(), config.getPassword()); - if (connection.isValid(5)) { - logger.info("Connected to database."); - } else { - logger.error("Failed to connect to database."); - } + if (true) + throw new RuntimeException("Simulating a database error"); + logger.info("The connection to the database was '{}'", connection.isValid(5)); } public static void closeDatabase() throws SQLException { logger.info("Closing database connection..."); connection.close(); - if (connection.isClosed()) { - logger.info("Database connection closed."); - } else { - logger.error("Failed to close database connection."); - } + logger.info("The disconnection to the database was '{}'", connection.isClosed()); } } From e8f23db46d29c7cdbd96db37ba59b61e8e0a67fc Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 7 Jun 2022 23:02:57 +0100 Subject: [PATCH 03/24] Will implement jooq tomorrow --- .../org/programming/bot/ProgrammingBot.java | 1 + .../org/programming/database/Database.java | 49 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 1d253a5..845893c 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -33,6 +33,7 @@ public ProgrammingBot(String[] args) throws Exception { try { Database.openDatabase(); + Database.createModerationTable(); } finally { Database.closeDatabase(); } diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 78f3777..e6a9c45 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -9,6 +9,7 @@ import java.sql.Connection; import java.sql.DriverManager; +import java.sql.PreparedStatement; import java.sql.SQLException; public class Database { @@ -28,13 +29,57 @@ public class Database { ds = new HikariDataSource(config); } + /** + * Creates a new data for a programming_bot table + * + * @param name the name of the data + * @param rating the rating of the data + * @throws SQLException if the data could not be created This is an example of inserting data. + */ + public static void createData(String name, int rating) throws SQLException { + try (PreparedStatement preparedStatement = connection.prepareStatement(""" + INSERT INTO programming_bot (name, rating) + VALUES (?, ?) + """)) { + preparedStatement.setString(1, name); + preparedStatement.setInt(2, rating); + preparedStatement.executeUpdate(); + } + + } + + public static void readData() { + + } + + public static void updateData(String name, String newData) { + + } + + public static void deleteData(String nameExpression) {} + + public static void createModerationTable() { + try (PreparedStatement preparedStatement = connection.prepareStatement(""" + CREATE TABLE IF NOT EXISTS moderation ( + id INT NOT NULL AUTO_INCREMENT, + guild_id VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + moderator_id VARCHAR(255) NOT NULL, + reason VARCHAR(255) NOT NULL, + PRIMARY KEY (id) + ) + """)) { + preparedStatement.executeUpdate(); + } catch (SQLException e) { + logger.error("Error creating moderation table", e); + } + } + public static void openDatabase() throws SQLException { logger.info("Connecting to database..."); connection = DriverManager.getConnection(config.getJdbcUrl(), config.getUsername(), config.getPassword()); - if (true) - throw new RuntimeException("Simulating a database error"); logger.info("The connection to the database was '{}'", connection.isValid(5)); } From 99b6cabc4a3e06168793265116e79644d55ead4d Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Wed, 8 Jun 2022 23:05:32 +0100 Subject: [PATCH 04/24] Will test some setting tomorrow --- build.gradle | 50 +++++++++++++++++-- .../org/programming/bot/ProgrammingBot.java | 3 +- .../org/programming/database/Database.java | 31 +----------- .../database/ModerationDatabase.java | 32 ++++++++++++ 4 files changed, 81 insertions(+), 35 deletions(-) create mode 100644 src/main/java/io/github/org/programming/database/ModerationDatabase.java diff --git a/build.gradle b/build.gradle index 59adcbc..17184a6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import nu.studer.gradle.jooq.JooqEdition + plugins { id 'java' id "com.diffplug.spotless" version "6.6.1" @@ -5,7 +7,6 @@ plugins { id "nu.studer.jooq" version "6.0.1" } - group 'io.github.org.programming' version '1.0-SNAPSHOT' @@ -19,6 +20,7 @@ sourceCompatibility = 17 targetCompatibility = 17 dependencies { + implementation rootProject implementation group: 'net.dv8tion', name: 'JDA', version: '5.0.0-alpha.12' //Logger implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.11' @@ -31,11 +33,11 @@ dependencies { implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3' //database implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.0.5' - implementation group: 'org.jooq', name: 'jooq', version: '3.15.5' implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.0.0' - //jooq dependency - jooqGenerator 'org.jooq:jooq-meta:3.16.6' - jooqGenerator 'org.jooq:jooq-codegen:3.16.6' + //jooq + implementation group: 'org.jooq', name: 'jooq', version: '3.15.5' + implementation group: 'org.jooq', name: 'jooq-codegen', version: '3.16.6' + implementation group: 'org.jooq', name: 'jooq-meta', version: '3.16.6' //test testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' } @@ -135,4 +137,42 @@ task downloadDependencies { } } +jooq { + version = '3.15.2' + edition = JooqEdition.OSS + configurations { + main { + generateSchemaSourceOnCompilation = false + generationTool { + logging = org.jooq.meta.jaxb.Logging.WARN + jdbc { + driver = 'org.mariadb.jdbc.Driver' + //ُTODO: Make this configurable + url = System.getenv("JDBC_URL") + user = System.getenv("DATA_BASE_USER_NAME") + password = System.getenv("DATA_BASE_PASSWORD") + } + generator { + name = 'org.jooq.codegen.JavaGenerator' + database { + name = 'org.jooq.meta.sqlite.SQLiteDatabase' + includes = '.*' + excludes = '' + } + generate { + deprecated = false + records = true + fluentSetters = true + } + target { + packageName = 'io.github.org.programming.db.generated' + directory = "build/generated/java" + } + strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy" + } + } + } + } +} + check.dependsOn jacocoTestReport diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 845893c..24f4ac1 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -2,6 +2,7 @@ import io.github.org.programming.bot.config.BotConfig; import io.github.org.programming.database.Database; +import io.github.org.programming.database.ModerationDatabase; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; @@ -33,7 +34,7 @@ public ProgrammingBot(String[] args) throws Exception { try { Database.openDatabase(); - Database.createModerationTable(); + ModerationDatabase.createModerationTable(); } finally { Database.closeDatabase(); } diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index e6a9c45..233a409 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -13,11 +13,11 @@ import java.sql.SQLException; public class Database { - private static final Logger logger = LoggerFactory.getLogger(Database.class); + static final Logger logger = LoggerFactory.getLogger(Database.class); private static final HikariConfig config = new HikariConfig(); private static HikariDataSource ds; - private static Connection connection; + protected static Connection connection; static { config.setJdbcUrl(DatabaseConfig.getJDBCUrl()); @@ -48,33 +48,6 @@ INSERT INTO programming_bot (name, rating) } - public static void readData() { - - } - - public static void updateData(String name, String newData) { - - } - - public static void deleteData(String nameExpression) {} - - public static void createModerationTable() { - try (PreparedStatement preparedStatement = connection.prepareStatement(""" - CREATE TABLE IF NOT EXISTS moderation ( - id INT NOT NULL AUTO_INCREMENT, - guild_id VARCHAR(255) NOT NULL, - user_id VARCHAR(255) NOT NULL, - moderator_id VARCHAR(255) NOT NULL, - reason VARCHAR(255) NOT NULL, - PRIMARY KEY (id) - ) - """)) { - preparedStatement.executeUpdate(); - } catch (SQLException e) { - logger.error("Error creating moderation table", e); - } - } - public static void openDatabase() throws SQLException { logger.info("Connecting to database..."); connection = DriverManager.getConnection(config.getJdbcUrl(), config.getUsername(), diff --git a/src/main/java/io/github/org/programming/database/ModerationDatabase.java b/src/main/java/io/github/org/programming/database/ModerationDatabase.java new file mode 100644 index 0000000..2939283 --- /dev/null +++ b/src/main/java/io/github/org/programming/database/ModerationDatabase.java @@ -0,0 +1,32 @@ +package io.github.org.programming.database; + +import org.slf4j.Logger; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class ModerationDatabase { + + private static final Logger logger = Database.logger; + + private static final Connection connection = Database.connection; + + + public static void createModerationTable() { + try (PreparedStatement preparedStatement = connection.prepareStatement(""" + CREATE TABLE IF NOT EXISTS moderation ( + id INT NOT NULL AUTO_INCREMENT, + guild_id VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + moderator_id VARCHAR(255) NOT NULL, + reason VARCHAR(255) NOT NULL, + PRIMARY KEY (id) + ) + """)) { + preparedStatement.executeUpdate(); + } catch (SQLException e) { + logger.error("Error creating moderation table", e); + } + } +} From 7dd397941db8c03b0bdd89aab9d662da1163904f Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Thu, 9 Jun 2022 15:57:23 +0100 Subject: [PATCH 05/24] Update build.gradle --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 17184a6..81f4f09 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,6 @@ sourceCompatibility = 17 targetCompatibility = 17 dependencies { - implementation rootProject implementation group: 'net.dv8tion', name: 'JDA', version: '5.0.0-alpha.12' //Logger implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.11' From a1bc53a4278d0b06799d62915fc8b1d49d4e244b Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sat, 11 Jun 2022 19:57:57 +0100 Subject: [PATCH 06/24] Reworking the database --- README.md | 2 +- .../org/programming/bot/ProgrammingBot.java | 28 +++++--- .../org/programming/database/Database.java | 57 +++++++---------- .../org/programming/database/Database1.java | 64 +++++++++++++++++++ .../database/ModerationDatabase.java | 4 +- 5 files changed, 109 insertions(+), 46 deletions(-) create mode 100644 src/main/java/io/github/org/programming/database/Database1.java diff --git a/README.md b/README.md index af9549f..567e437 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ GUILD_ID= OWNER_ID= //for the excutor default is 1. CORE_POOL_SIZE= -//example : jdbc:maria://localhost:3306/programming +//example : jdbc:maria://localhost:3306/program_db JDBC_URL= DATA_BASE_USER_NAME= DATA_BASE_PASSWORD= diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 24f4ac1..44e813a 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -2,7 +2,6 @@ import io.github.org.programming.bot.config.BotConfig; import io.github.org.programming.database.Database; -import io.github.org.programming.database.ModerationDatabase; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; @@ -13,6 +12,9 @@ import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.utils.cache.CacheFlag; import org.jetbrains.annotations.NotNull; +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.jooq.impl.DSL; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,15 +32,9 @@ public class ProgrammingBot extends ListenerAdapter { private final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(BotConfig.getCorePoolSize()); - public ProgrammingBot(String[] args) throws Exception { - - try { - Database.openDatabase(); - ModerationDatabase.createModerationTable(); - } finally { - Database.closeDatabase(); - } + private static DSLContext context; + public ProgrammingBot(String[] args) throws Exception { JDA jda = JDABuilder .createDefault(BotConfig.getToken(), GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_VOICE_STATES, GatewayIntent.GUILD_MESSAGE_REACTIONS, @@ -49,6 +45,13 @@ public ProgrammingBot(String[] args) throws Exception { .setStatus(OnlineStatus.ONLINE) .build(); + try { + context = DSL.using(Database.getConnection(), SQLDialect.MARIADB); + } finally { + Database.disconnect(); + } + + Guild guild = jda.awaitReady().getGuildById(BotConfig.getGuildId()); jda.awaitReady().addEventListener(new SlashCommandReg(jda, guild), this); @@ -64,6 +67,11 @@ public ExecutorService getExecutor() { @Override public void onReady(@NotNull ReadyEvent readyEvent) { - logger.info("Bot is ready!"); + logger.info("Bot is ready in '{}' server", readyEvent.getGuildTotalCount()); + + if (Database.isConnected()) + logger.info("Database is connected"); + else + logger.error("Database is not connected"); } } diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 233a409..719adff 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -3,21 +3,16 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.jetbrains.annotations.Nullable; -import org.mariadb.jdbc.Driver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; import java.sql.SQLException; public class Database { - static final Logger logger = LoggerFactory.getLogger(Database.class); + private static final Logger logger = LoggerFactory.getLogger(Database.class); private static final HikariConfig config = new HikariConfig(); - private static HikariDataSource ds; - - protected static Connection connection; + private static final HikariDataSource dataSource; static { config.setJdbcUrl(DatabaseConfig.getJDBCUrl()); @@ -26,39 +21,35 @@ public class Database { config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - ds = new HikariDataSource(config); + config.addDataSourceProperty("characterEncoding", "utf8"); + config.addDataSourceProperty("useUnicode", "true"); + config.setMaximumPoolSize(10); + dataSource = new HikariDataSource(config); + executeTableUpdate(); } - /** - * Creates a new data for a programming_bot table - * - * @param name the name of the data - * @param rating the rating of the data - * @throws SQLException if the data could not be created This is an example of inserting data. - */ - public static void createData(String name, int rating) throws SQLException { - try (PreparedStatement preparedStatement = connection.prepareStatement(""" - INSERT INTO programming_bot (name, rating) - VALUES (?, ?) - """)) { - preparedStatement.setString(1, name); - preparedStatement.setInt(2, rating); - preparedStatement.executeUpdate(); - } + private static void executeTableUpdate() { } - public static void openDatabase() throws SQLException { - logger.info("Connecting to database..."); - connection = DriverManager.getConnection(config.getJdbcUrl(), config.getUsername(), - config.getPassword()); + public static void disconnect() { + dataSource.close(); + } - logger.info("The connection to the database was '{}'", connection.isValid(5)); + public static boolean isConnected() { + return (dataSource != null); } - public static void closeDatabase() throws SQLException { - logger.info("Closing database connection..."); - connection.close(); - logger.info("The disconnection to the database was '{}'", connection.isClosed()); + + /** + * @return The connection to the database + */ + public static @Nullable Connection getConnection() { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + logger.error("Error while getting connection", e); + return null; + } } } diff --git a/src/main/java/io/github/org/programming/database/Database1.java b/src/main/java/io/github/org/programming/database/Database1.java new file mode 100644 index 0000000..9fd66ce --- /dev/null +++ b/src/main/java/io/github/org/programming/database/Database1.java @@ -0,0 +1,64 @@ +package io.github.org.programming.database; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class Database1 { + static final Logger logger = LoggerFactory.getLogger(Database1.class); + + protected static Connection connection; + + public static void main(String[] args) throws Exception { + openDatabase(); + } + + /** + * Creates a new data for a programming_bot table + * + * @param name the name of the data + * @param rating the rating of the data + * @throws SQLException if the data could not be created This is an example of inserting data. + */ + public static void createData(String name, int rating) throws SQLException { + try (PreparedStatement preparedStatement = connection.prepareStatement(""" + INSERT INTO programming_bot (name, rating) + VALUES (?, ?) + """)) { + preparedStatement.setString(1, name); + preparedStatement.setInt(2, rating); + preparedStatement.executeUpdate(); + } + + } + + public static void createDataBase() { + try (PreparedStatement preparedStatement = connection.prepareStatement(""" + CREATE DATABASE IF NOT EXISTS programming_bot; + USE programming_bot; + """)) { + preparedStatement.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static void openDatabase() throws SQLException { + logger.info("Connecting to database..."); + connection = DriverManager.getConnection(DatabaseConfig.getJDBCUrl(), + DatabaseConfig.getUserName(), DatabaseConfig.getPassword()); + + logger.info("The connection to the database was '{}'", connection.isValid(5)); + } + + public static void closeDatabase() throws SQLException { + logger.info("Closing database connection..."); + connection.close(); + logger.info("The disconnection to the database was '{}'", connection.isClosed()); + } + +} diff --git a/src/main/java/io/github/org/programming/database/ModerationDatabase.java b/src/main/java/io/github/org/programming/database/ModerationDatabase.java index 2939283..caff1da 100644 --- a/src/main/java/io/github/org/programming/database/ModerationDatabase.java +++ b/src/main/java/io/github/org/programming/database/ModerationDatabase.java @@ -8,9 +8,9 @@ public class ModerationDatabase { - private static final Logger logger = Database.logger; + private static final Logger logger = Database1.logger; - private static final Connection connection = Database.connection; + private static final Connection connection = Database1.connection; public static void createModerationTable() { From a31f9f84d3a979797ea25e6017385e8394d335f3 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sat, 11 Jun 2022 23:06:08 +0100 Subject: [PATCH 07/24] more changes. --- .../org/programming/database/Database.java | 29 +++++++++++++++++++ src/main/resources/sql/test.sql | 3 ++ 2 files changed, 32 insertions(+) create mode 100644 src/main/resources/sql/test.sql diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 719adff..af365b5 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -6,8 +6,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; +import java.util.Objects; public class Database { private static final Logger logger = LoggerFactory.getLogger(Database.class); @@ -28,8 +31,34 @@ public class Database { executeTableUpdate(); } + private static void createDatabaseIfNotThere() { + try (Statement statement = dataSource.getConnection().createStatement()) { + + statement.executeUpdate("CREATE DATABASE IF NOT EXISTS programming_bot"); + statement.executeUpdate("USE programming_bot"); + } catch (SQLException e) { + logger.error("Error creating database", e); + } + } + private static void executeTableUpdate() { + try (final Statement statement = + Objects.requireNonNull(getConnection(), "Connection is null").createStatement()) { + File folder = new File("src/main/resources/sql"); + File[] listOfFiles = folder.listFiles(); + logger.info("Executing table updates..."); + + for (File file : Objects.requireNonNull(listOfFiles, "List of files is null")) { + if (file.isFile()) { + logger.info("Executing table update: {}", file.getName()); + statement.execute(file.getName()); + } + } + + } catch (SQLException e) { + logger.error("Error executing table update", e); + } } public static void disconnect() { diff --git a/src/main/resources/sql/test.sql b/src/main/resources/sql/test.sql new file mode 100644 index 0000000..b41d9b9 --- /dev/null +++ b/src/main/resources/sql/test.sql @@ -0,0 +1,3 @@ +CREATE TABLE IF NOT EXISTS test ( + test TEXT NOT NULL +) \ No newline at end of file From 155abded85cf50baada34ab3c63372dc5591cc1b Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 13:29:54 +0100 Subject: [PATCH 08/24] Fixed an issue with the handlers. Command works now still having issues with the database --- README.md | 2 +- .../extension/MessageCommandExtender.java | 8 +-- .../extension/SlashCommandExtender.java | 8 +-- .../extension/UserCommandExtender.java | 7 +- .../backend/handler/BaseHandler.java | 7 ++ .../handler/MessageCommandHandler.java | 33 ++++++---- .../backend/handler/SlashCommandHandler.java | 33 ++++++---- .../backend/handler/UserCommandHandler.java | 33 ++++++---- .../org/programming/bot/ProgrammingBot.java | 44 ++++++++----- .../org/programming/bot/SlashCommandReg.java | 9 +++ .../bot/commands/ExampleCommand.java | 5 +- .../org/programming/database/Database.java | 30 +++++---- .../org/programming/database/Database1.java | 64 ------------------- .../database/ModerationDatabase.java | 32 ---------- src/main/resources/sql/V1__moderation.sql | 8 +++ src/main/resources/sql/test.sql | 3 - 16 files changed, 136 insertions(+), 190 deletions(-) delete mode 100644 src/main/java/io/github/org/programming/database/Database1.java delete mode 100644 src/main/java/io/github/org/programming/database/ModerationDatabase.java create mode 100644 src/main/resources/sql/V1__moderation.sql delete mode 100644 src/main/resources/sql/test.sql diff --git a/README.md b/README.md index 567e437..5302d06 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ GUILD_ID= OWNER_ID= //for the excutor default is 1. CORE_POOL_SIZE= -//example : jdbc:maria://localhost:3306/program_db +//example : jdbc:mariadb://localhost:3306 JDBC_URL= DATA_BASE_USER_NAME= DATA_BASE_PASSWORD= diff --git a/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java index 7bd2e84..9079d67 100644 --- a/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java @@ -11,11 +11,7 @@ import javax.annotation.Nonnull; -public abstract class MessageCommandExtender extends MessageCommand { - - public MessageCommandExtender(CommandData commandData) { - super(commandData); - } +public abstract class MessageCommandExtender { public abstract void onMessageContextInteraction(@Nonnull MessageContextInteractionEvent event); @@ -35,5 +31,5 @@ public void onSelectMenu(@Nonnull SelectMenuInteractionEvent event) { } - protected abstract SlashCommand build(); + public abstract MessageCommand build(); } diff --git a/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java index f753e9c..dabef13 100644 --- a/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java @@ -11,11 +11,7 @@ import javax.annotation.Nonnull; -public abstract class SlashCommandExtender extends SlashCommand { - - protected SlashCommandExtender(SlashCommandData commandData) { - super(commandData); - } +public abstract class SlashCommandExtender { // This method is called when the command is executed. public abstract void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event); @@ -36,5 +32,5 @@ public void onSelectMenu(@Nonnull SelectMenuInteractionEvent event) { } - protected abstract SlashCommand build(); + public abstract SlashCommand build(); } diff --git a/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java index eae6014..9879d69 100644 --- a/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java @@ -11,10 +11,7 @@ import javax.annotation.Nonnull; -public abstract class UserCommandExtender extends UserCommand { - public UserCommandExtender(CommandData commandData) { - super(commandData); - } +public abstract class UserCommandExtender { public abstract void onUserContextInteraction(@NotNull UserContextInteractionEvent event); @@ -34,5 +31,5 @@ public void onSelectMenu(@Nonnull SelectMenuInteractionEvent event) { } - protected abstract UserCommand build(); + public abstract UserCommand build(); } diff --git a/src/main/java/io/github/org/programming/backend/handler/BaseHandler.java b/src/main/java/io/github/org/programming/backend/handler/BaseHandler.java index 225e99b..aa77404 100644 --- a/src/main/java/io/github/org/programming/backend/handler/BaseHandler.java +++ b/src/main/java/io/github/org/programming/backend/handler/BaseHandler.java @@ -2,6 +2,8 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter; +import java.util.Objects; + public abstract class BaseHandler extends ListenerAdapter { /** * @@ -10,4 +12,9 @@ public abstract class BaseHandler extends ListenerAdapter { protected abstract long botOwnerId(); + public static void checkIfBuildIsNull(Object build) { + if (Objects.isNull(build)) { + throw new IllegalArgumentException("Build is null"); + } + } } diff --git a/src/main/java/io/github/org/programming/backend/handler/MessageCommandHandler.java b/src/main/java/io/github/org/programming/backend/handler/MessageCommandHandler.java index 25d54ac..9efa853 100644 --- a/src/main/java/io/github/org/programming/backend/handler/MessageCommandHandler.java +++ b/src/main/java/io/github/org/programming/backend/handler/MessageCommandHandler.java @@ -44,18 +44,20 @@ protected MessageCommandHandler(@NotNull JDA jda, @NotNull Guild guild) { * The Command class is an interface class which contains all the need methods for the * making of the command.
*
- * The boolean {@link MessageCommandExtender#isGuildOnly()} ()} ()} is used to determine + * The boolean {@link MessageCommandExtender#build#isGuildOnly()} is used to determine * whether the command should be global or guild only. determines whether the command * should be Global or Guild only. */ @SuppressWarnings("ResultOfMethodCallIgnored") private void addMessageCommand(@NotNull MessageCommandExtender command) { - jda.addEventListener(command); - messageCommand.put(command.getCommandData().getName(), command); - if (command.isGuildOnly()) { - guildCommandsData.addCommands(command.getCommandData()); + + BaseHandler.checkIfBuildIsNull(command.build()); + + messageCommand.put(command.build().getCommandData().getName(), command); + if (command.build().isGuildOnly()) { + guildCommandsData.addCommands(command.build().getCommandData()); } else { - globalCommandsData.addCommands(command.getCommandData()); + globalCommandsData.addCommands(command.build().getCommandData()); } } @@ -88,22 +90,27 @@ private void onFinishedRegistration() { public void onMessageContextInteraction(@Nonnull MessageContextInteractionEvent event) { final MessageCommandExtender cmd = messageCommand.get(event.getName()); - if (cmd.isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { + if (cmd.build().isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); return; } - if (Objects.requireNonNull(event.getMember()).hasPermission(cmd.getUserPerms()) - || Objects.requireNonNull(event.getGuild()) - .getSelfMember() - .hasPermission(cmd.getBotPerms())) { - cmd.onMessageContextInteraction(event); - } else { + if (cmd.build().getUserPerms() != null + && event.getMember().hasPermission(cmd.build().getUserPerms())) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); + } else { + cmd.onMessageContextInteraction(event); + } + + if (cmd.build().getBotPerms() != null + && event.getGuild().getSelfMember().hasPermission(cmd.build().getBotPerms())) { + event.reply("I do not have permission to use this command.").setEphemeral(true).queue(); + } else { + cmd.onMessageContextInteraction(event); } } diff --git a/src/main/java/io/github/org/programming/backend/handler/SlashCommandHandler.java b/src/main/java/io/github/org/programming/backend/handler/SlashCommandHandler.java index f22c580..384b3ba 100644 --- a/src/main/java/io/github/org/programming/backend/handler/SlashCommandHandler.java +++ b/src/main/java/io/github/org/programming/backend/handler/SlashCommandHandler.java @@ -66,18 +66,20 @@ protected SlashCommandHandler(@NotNull JDA jda, @NotNull Guild guild) { * The Command class is an interface class which contains all the need methods for the * making of the command.
*
- * The boolean {@link SlashCommandExtender#isGuildOnly()} ()} ()} is used to determine + * The boolean {@link SlashCommandExtender#build()#isGuildOnly()} is used to determine * whether the command should be global or guild only. determines whether the command * should be Global or Guild only. */ @SuppressWarnings("ResultOfMethodCallIgnored") private void addSlashCommand(@NotNull SlashCommandExtender command) { - jda.addEventListener(command); - slashCommand.put(command.getSlashCommandData().getName(), command); - if (command.isGuildOnly()) { - guildCommandsData.addCommands(command.getSlashCommandData()); + + BaseHandler.checkIfBuildIsNull(command.build()); + + slashCommand.put(command.build().getSlashCommandData().getName(), command); + if (command.build().isGuildOnly()) { + guildCommandsData.addCommands(command.build().getSlashCommandData()); } else { - globalCommandsData.addCommands(command.getSlashCommandData()); + globalCommandsData.addCommands(command.build().getSlashCommandData()); } } @@ -110,22 +112,27 @@ private void onFinishedRegistration() { public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { final SlashCommandExtender cmd = slashCommand.get(event.getName()); - if (cmd.isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { + if (cmd.build().isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); return; } - if (Objects.requireNonNull(event.getMember()).hasPermission(cmd.getUserPerms()) - || Objects.requireNonNull(event.getGuild()) - .getSelfMember() - .hasPermission(cmd.getBotPerms())) { - cmd.onSlashCommandInteraction(event); - } else { + if (cmd.build().getUserPerms() != null + && event.getMember().hasPermission(cmd.build().getUserPerms())) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); + } else { + cmd.onSlashCommandInteraction(event); + } + + if (cmd.build().getBotPerms() != null + && event.getGuild().getSelfMember().hasPermission(cmd.build().getBotPerms())) { + event.reply("I do not have permission to use this command.").setEphemeral(true).queue(); + } else { + cmd.onSlashCommandInteraction(event); } } diff --git a/src/main/java/io/github/org/programming/backend/handler/UserCommandHandler.java b/src/main/java/io/github/org/programming/backend/handler/UserCommandHandler.java index fea6437..5fe293a 100644 --- a/src/main/java/io/github/org/programming/backend/handler/UserCommandHandler.java +++ b/src/main/java/io/github/org/programming/backend/handler/UserCommandHandler.java @@ -45,18 +45,20 @@ protected UserCommandHandler(@NotNull JDA jda, @NotNull Guild guild) { * The Command class is an interface class which contains all the need methods for the * making of the command.
*
- * The boolean {@link UserCommandExtender#isGuildOnly()} ()} ()} is used to determine + * The boolean {@link UserCommandExtender#build#isGuildOnly()} is used to determine * whether the command should be global or guild only. determines whether the command * should be Global or Guild only. */ @SuppressWarnings("ResultOfMethodCallIgnored") private void addUserCommand(@NotNull UserCommandExtender command) { - jda.addEventListener(command); - userCommand.put(command.getCommandData().getName(), command); - if (command.isGuildOnly()) { - guildCommandsData.addCommands(command.getCommandData()); + + BaseHandler.checkIfBuildIsNull(command.build()); + + userCommand.put(command.build().getCommandData().getName(), command); + if (command.build().isGuildOnly()) { + guildCommandsData.addCommands(command.build().getCommandData()); } else { - globalCommandsData.addCommands(command.getCommandData()); + globalCommandsData.addCommands(command.build().getCommandData()); } } @@ -89,22 +91,27 @@ private void onFinishedRegistration() { public void onUserContextInteraction(@NotNull UserContextInteractionEvent event) { final UserCommandExtender cmd = userCommand.get(event.getName()); - if (cmd.isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { + if (cmd.build().isOwnerOnly() && event.getUser().getIdLong() != botOwnerId()) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); return; } - if (Objects.requireNonNull(event.getMember()).hasPermission(cmd.getUserPerms()) - || Objects.requireNonNull(event.getGuild()) - .getSelfMember() - .hasPermission(cmd.getBotPerms())) { - cmd.onUserContextInteraction(event); - } else { + if (cmd.build().getUserPerms() != null + && event.getMember().hasPermission(cmd.build().getUserPerms())) { event.reply("You do not have permission to use this command.") .setEphemeral(true) .queue(); + } else { + cmd.onUserContextInteraction(event); + } + + if (cmd.build().getBotPerms() != null + && event.getGuild().getSelfMember().hasPermission(cmd.build().getBotPerms())) { + event.reply("I do not have permission to use this command.").setEphemeral(true).queue(); + } else { + cmd.onUserContextInteraction(event); } } diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 44e813a..4490cf4 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -25,8 +25,6 @@ public class ProgrammingBot extends ListenerAdapter { private final Logger logger = LoggerFactory.getLogger(ProgrammingBot.class); - private static ProgrammingBot instance; - private final ExecutorService executor = Executors.newCachedThreadPool(); private final ScheduledExecutorService scheduledExecutor = @@ -35,6 +33,9 @@ public class ProgrammingBot extends ListenerAdapter { private static DSLContext context; public ProgrammingBot(String[] args) throws Exception { + + onDatabase(context); + JDA jda = JDABuilder .createDefault(BotConfig.getToken(), GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_VOICE_STATES, GatewayIntent.GUILD_MESSAGE_REACTIONS, @@ -45,26 +46,12 @@ public ProgrammingBot(String[] args) throws Exception { .setStatus(OnlineStatus.ONLINE) .build(); - try { - context = DSL.using(Database.getConnection(), SQLDialect.MARIADB); - } finally { - Database.disconnect(); - } - Guild guild = jda.awaitReady().getGuildById(BotConfig.getGuildId()); jda.awaitReady().addEventListener(new SlashCommandReg(jda, guild), this); } - public static ProgrammingBot getInstance() { - return instance; - } - - public ExecutorService getExecutor() { - return executor; - } - @Override public void onReady(@NotNull ReadyEvent readyEvent) { logger.info("Bot is ready in '{}' server", readyEvent.getGuildTotalCount()); @@ -74,4 +61,29 @@ public void onReady(@NotNull ReadyEvent readyEvent) { else logger.error("Database is not connected"); } + + public void onDatabase(DSLContext dslContext) { + dslContext = DSL.using(Database.getConnection(), SQLDialect.MARIADB); + + + if (Database.isConnected()) { + logger.info("Connected to database"); + } else { + logger.error("Failed to connect to database"); + } + + // closes the database when the bot is shut down + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + Database.disconnect(); + } catch (Exception e) { + logger.error("Failed to close database", e); + } + })); + + } + + public static DSLContext getContext() { + return context; + } } diff --git a/src/main/java/io/github/org/programming/bot/SlashCommandReg.java b/src/main/java/io/github/org/programming/bot/SlashCommandReg.java index 5b35d84..4035e9d 100644 --- a/src/main/java/io/github/org/programming/bot/SlashCommandReg.java +++ b/src/main/java/io/github/org/programming/bot/SlashCommandReg.java @@ -1,17 +1,26 @@ package io.github.org.programming.bot; +import io.github.org.programming.backend.extension.SlashCommandExtender; import io.github.org.programming.backend.handler.SlashCommandHandler; +import io.github.org.programming.bot.commands.ExampleCommand; import io.github.org.programming.bot.config.BotConfig; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + public class SlashCommandReg extends SlashCommandHandler { protected SlashCommandReg(@NotNull JDA jda, @NotNull Guild guild) { super(jda, guild); + List extenders = new ArrayList<>(); + + extenders.add(new ExampleCommand()); + queueAndRegisterSlashCommands(extenders); } @Override diff --git a/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java index b18de7f..7af50d6 100644 --- a/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java +++ b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java @@ -13,9 +13,6 @@ * This command basically replays with the gateway ping. */ public class ExampleCommand extends SlashCommandExtender { - protected ExampleCommand(SlashCommandData commandData) { - super(commandData); - } @Override public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { @@ -23,7 +20,7 @@ public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent even } @Override - protected SlashCommand build() { + public SlashCommand build() { return new SlashCommandBuilder("ping", "Reply with the ping").build().setToGuildOnly(); } } diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index af365b5..0efdc76 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -7,6 +7,9 @@ import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; @@ -24,21 +27,21 @@ public class Database { config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - config.addDataSourceProperty("characterEncoding", "utf8"); - config.addDataSourceProperty("useUnicode", "true"); - config.setMaximumPoolSize(10); dataSource = new HikariDataSource(config); - executeTableUpdate(); - } - - private static void createDatabaseIfNotThere() { - try (Statement statement = dataSource.getConnection().createStatement()) { + // check if the database programming_bot exists - statement.executeUpdate("CREATE DATABASE IF NOT EXISTS programming_bot"); - statement.executeUpdate("USE programming_bot"); + try (Connection connection = dataSource.getConnection()) { + try (Statement statement = connection.createStatement()) { + statement.execute("CREATE DATABASE IF NOT EXISTS programming_bot"); + } } catch (SQLException e) { - logger.error("Error creating database", e); + logger.error("Failed to create database programming_bot", e); } + + // use the database programming_bot + config.setJdbcUrl(DatabaseConfig.getJDBCUrl() + "programming_bot"); + + executeTableUpdate(); } private static void executeTableUpdate() { @@ -52,11 +55,10 @@ private static void executeTableUpdate() { for (File file : Objects.requireNonNull(listOfFiles, "List of files is null")) { if (file.isFile()) { logger.info("Executing table update: {}", file.getName()); - statement.execute(file.getName()); + statement.executeUpdate(Files.readString(Path.of(file.getPath()))); } } - - } catch (SQLException e) { + } catch (SQLException | IOException e) { logger.error("Error executing table update", e); } } diff --git a/src/main/java/io/github/org/programming/database/Database1.java b/src/main/java/io/github/org/programming/database/Database1.java deleted file mode 100644 index 9fd66ce..0000000 --- a/src/main/java/io/github/org/programming/database/Database1.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.github.org.programming.database; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -public class Database1 { - static final Logger logger = LoggerFactory.getLogger(Database1.class); - - protected static Connection connection; - - public static void main(String[] args) throws Exception { - openDatabase(); - } - - /** - * Creates a new data for a programming_bot table - * - * @param name the name of the data - * @param rating the rating of the data - * @throws SQLException if the data could not be created This is an example of inserting data. - */ - public static void createData(String name, int rating) throws SQLException { - try (PreparedStatement preparedStatement = connection.prepareStatement(""" - INSERT INTO programming_bot (name, rating) - VALUES (?, ?) - """)) { - preparedStatement.setString(1, name); - preparedStatement.setInt(2, rating); - preparedStatement.executeUpdate(); - } - - } - - public static void createDataBase() { - try (PreparedStatement preparedStatement = connection.prepareStatement(""" - CREATE DATABASE IF NOT EXISTS programming_bot; - USE programming_bot; - """)) { - preparedStatement.executeUpdate(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public static void openDatabase() throws SQLException { - logger.info("Connecting to database..."); - connection = DriverManager.getConnection(DatabaseConfig.getJDBCUrl(), - DatabaseConfig.getUserName(), DatabaseConfig.getPassword()); - - logger.info("The connection to the database was '{}'", connection.isValid(5)); - } - - public static void closeDatabase() throws SQLException { - logger.info("Closing database connection..."); - connection.close(); - logger.info("The disconnection to the database was '{}'", connection.isClosed()); - } - -} diff --git a/src/main/java/io/github/org/programming/database/ModerationDatabase.java b/src/main/java/io/github/org/programming/database/ModerationDatabase.java deleted file mode 100644 index caff1da..0000000 --- a/src/main/java/io/github/org/programming/database/ModerationDatabase.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.org.programming.database; - -import org.slf4j.Logger; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -public class ModerationDatabase { - - private static final Logger logger = Database1.logger; - - private static final Connection connection = Database1.connection; - - - public static void createModerationTable() { - try (PreparedStatement preparedStatement = connection.prepareStatement(""" - CREATE TABLE IF NOT EXISTS moderation ( - id INT NOT NULL AUTO_INCREMENT, - guild_id VARCHAR(255) NOT NULL, - user_id VARCHAR(255) NOT NULL, - moderator_id VARCHAR(255) NOT NULL, - reason VARCHAR(255) NOT NULL, - PRIMARY KEY (id) - ) - """)) { - preparedStatement.executeUpdate(); - } catch (SQLException e) { - logger.error("Error creating moderation table", e); - } - } -} diff --git a/src/main/resources/sql/V1__moderation.sql b/src/main/resources/sql/V1__moderation.sql new file mode 100644 index 0000000..da59efe --- /dev/null +++ b/src/main/resources/sql/V1__moderation.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS moderation +( + id INT NOT NULL AUTO_INCREMENT, + guild_id VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + moderator_id VARCHAR(255) NOT NULL, + reason VARCHAR(255) NOT NULL +) \ No newline at end of file diff --git a/src/main/resources/sql/test.sql b/src/main/resources/sql/test.sql deleted file mode 100644 index b41d9b9..0000000 --- a/src/main/resources/sql/test.sql +++ /dev/null @@ -1,3 +0,0 @@ -CREATE TABLE IF NOT EXISTS test ( - test TEXT NOT NULL -) \ No newline at end of file From 46a1dcf8875f7a4a788c294f3efa068a3e650930 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 14:57:22 +0100 Subject: [PATCH 09/24] still having some issues --- .gitignore | 1 + build.gradle | 6 +++--- .../org/programming/database/Database.java | 18 +++++------------- src/main/resources/sql/V1__moderation.sql | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 4503571..83b8c2d 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ bin/ .DS_Store codecov *.log +gradle.properties diff --git a/build.gradle b/build.gradle index 81f4f09..9ef4ed9 100644 --- a/build.gradle +++ b/build.gradle @@ -147,9 +147,9 @@ jooq { jdbc { driver = 'org.mariadb.jdbc.Driver' //ُTODO: Make this configurable - url = System.getenv("JDBC_URL") - user = System.getenv("DATA_BASE_USER_NAME") - password = System.getenv("DATA_BASE_PASSWORD") + url = JDBC_URL + user = DATA_BASE_USER_NAME + password = DATA_BASE_PASSWORD } generator { name = 'org.jooq.codegen.JavaGenerator' diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 0efdc76..f05ebc9 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -21,6 +21,7 @@ public class Database { private static final HikariDataSource dataSource; static { + config.setDriverClassName("org.mariadb.jdbc.Driver"); config.setJdbcUrl(DatabaseConfig.getJDBCUrl()); config.setUsername(DatabaseConfig.getUserName()); config.setPassword(DatabaseConfig.getPassword()); @@ -28,19 +29,6 @@ public class Database { config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); dataSource = new HikariDataSource(config); - // check if the database programming_bot exists - - try (Connection connection = dataSource.getConnection()) { - try (Statement statement = connection.createStatement()) { - statement.execute("CREATE DATABASE IF NOT EXISTS programming_bot"); - } - } catch (SQLException e) { - logger.error("Failed to create database programming_bot", e); - } - - // use the database programming_bot - config.setJdbcUrl(DatabaseConfig.getJDBCUrl() + "programming_bot"); - executeTableUpdate(); } @@ -52,6 +40,10 @@ private static void executeTableUpdate() { logger.info("Executing table updates..."); + // select a database to use + statement.execute("CREATE DATABASE IF NOT EXISTS programming_bot"); + statement.execute("USE programming_bot"); + for (File file : Objects.requireNonNull(listOfFiles, "List of files is null")) { if (file.isFile()) { logger.info("Executing table update: {}", file.getName()); diff --git a/src/main/resources/sql/V1__moderation.sql b/src/main/resources/sql/V1__moderation.sql index da59efe..5b832ba 100644 --- a/src/main/resources/sql/V1__moderation.sql +++ b/src/main/resources/sql/V1__moderation.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS moderation ( - id INT NOT NULL AUTO_INCREMENT, + id INT AUTO_INCREMENT primary key NOT NULL, guild_id VARCHAR(255) NOT NULL, user_id VARCHAR(255) NOT NULL, moderator_id VARCHAR(255) NOT NULL, From 0b2753d94f841f0a9b57a03b9b94c214f179d45b Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 15:15:56 +0100 Subject: [PATCH 10/24] I think i can use .env in gradle now --- build.gradle | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9ef4ed9..9207dfe 100644 --- a/build.gradle +++ b/build.gradle @@ -136,6 +136,9 @@ task downloadDependencies { } } +def props = new Properties() +file(".env").withInputStream { props.load(it) } + jooq { version = '3.15.2' edition = JooqEdition.OSS @@ -147,9 +150,9 @@ jooq { jdbc { driver = 'org.mariadb.jdbc.Driver' //ُTODO: Make this configurable - url = JDBC_URL - user = DATA_BASE_USER_NAME - password = DATA_BASE_PASSWORD + url = props.getProperty("JDBC_URL") + user = props.getProperty("DATA_BASE_USER_NAME") + password = props.getProperty("DATA_BASE_PASSWORD") } generator { name = 'org.jooq.codegen.JavaGenerator' From 71b892c436f81160d045822f90340acbd16b6280 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 17:56:52 +0100 Subject: [PATCH 11/24] Jooq works --- README.md | 2 +- build.gradle | 17 +++++++++---- .../org/programming/bot/ProgrammingBot.java | 6 ++--- .../org/programming/database/Database.java | 24 +++++++++---------- src/main/resources/sql/V1__moderation.sql | 10 ++++---- 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5302d06..ed60f06 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ GUILD_ID= OWNER_ID= //for the excutor default is 1. CORE_POOL_SIZE= -//example : jdbc:mariadb://localhost:3306 +//example : jdbc:postgresql://localhost:5432/postgres JDBC_URL= DATA_BASE_USER_NAME= DATA_BASE_PASSWORD= diff --git a/build.gradle b/build.gradle index 9207dfe..9927757 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,11 @@ import nu.studer.gradle.jooq.JooqEdition +buildscript { + dependencies { + classpath 'org.postgresql:postgresql:42.4.0' + } +} + plugins { id 'java' id "com.diffplug.spotless" version "6.6.1" @@ -31,14 +37,16 @@ dependencies { implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.13.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3' //database - implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.0.5' implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.0.0' + implementation group: 'org.postgresql', name: 'postgresql', version: '42.4.0' //jooq implementation group: 'org.jooq', name: 'jooq', version: '3.15.5' implementation group: 'org.jooq', name: 'jooq-codegen', version: '3.16.6' implementation group: 'org.jooq', name: 'jooq-meta', version: '3.16.6' //test testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' + //jooq + jooqGenerator "org.postgresql:postgresql:42.4.0" } apply plugin: 'jacoco' // code coverage reports @@ -148,8 +156,7 @@ jooq { generationTool { logging = org.jooq.meta.jaxb.Logging.WARN jdbc { - driver = 'org.mariadb.jdbc.Driver' - //ُTODO: Make this configurable + driver = 'org.postgresql.Driver' url = props.getProperty("JDBC_URL") user = props.getProperty("DATA_BASE_USER_NAME") password = props.getProperty("DATA_BASE_PASSWORD") @@ -157,13 +164,13 @@ jooq { generator { name = 'org.jooq.codegen.JavaGenerator' database { - name = 'org.jooq.meta.sqlite.SQLiteDatabase' + name = 'org.jooq.meta.postgres.PostgresDatabase' includes = '.*' excludes = '' } generate { - deprecated = false records = true + immutablePojos = true fluentSetters = true } target { diff --git a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java index 4490cf4..80640db 100644 --- a/src/main/java/io/github/org/programming/bot/ProgrammingBot.java +++ b/src/main/java/io/github/org/programming/bot/ProgrammingBot.java @@ -34,7 +34,7 @@ public class ProgrammingBot extends ListenerAdapter { public ProgrammingBot(String[] args) throws Exception { - onDatabase(context); + onDatabase(); JDA jda = JDABuilder .createDefault(BotConfig.getToken(), GatewayIntent.GUILD_MESSAGES, @@ -62,8 +62,8 @@ public void onReady(@NotNull ReadyEvent readyEvent) { logger.error("Database is not connected"); } - public void onDatabase(DSLContext dslContext) { - dslContext = DSL.using(Database.getConnection(), SQLDialect.MARIADB); + public void onDatabase() { + context = DSL.using(Database.getConnection(), SQLDialect.MARIADB); if (Database.isConnected()) { diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index f05ebc9..8942939 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -8,26 +8,30 @@ import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Objects; +import java.util.Properties; public class Database { private static final Logger logger = LoggerFactory.getLogger(Database.class); - private static final HikariConfig config = new HikariConfig(); + private static final HikariConfig config; private static final HikariDataSource dataSource; static { - config.setDriverClassName("org.mariadb.jdbc.Driver"); - config.setJdbcUrl(DatabaseConfig.getJDBCUrl()); - config.setUsername(DatabaseConfig.getUserName()); - config.setPassword(DatabaseConfig.getPassword()); - config.addDataSourceProperty("cachePrepStmts", "true"); - config.addDataSourceProperty("prepStmtCacheSize", "250"); - config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + Properties props = new Properties(); + props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource"); + props.setProperty("dataSource.user", DatabaseConfig.getUserName()); + props.setProperty("dataSource.password", DatabaseConfig.getPassword()); + props.setProperty("dataSource.databaseName", "postgres"); + props.setProperty("dataSource.portNumber", String.valueOf(5432)); + props.setProperty("dataSource.serverName", "localhost"); + props.put("dataSource.logWriter", new PrintWriter(System.out)); + config = new HikariConfig(props); dataSource = new HikariDataSource(config); executeTableUpdate(); } @@ -40,10 +44,6 @@ private static void executeTableUpdate() { logger.info("Executing table updates..."); - // select a database to use - statement.execute("CREATE DATABASE IF NOT EXISTS programming_bot"); - statement.execute("USE programming_bot"); - for (File file : Objects.requireNonNull(listOfFiles, "List of files is null")) { if (file.isFile()) { logger.info("Executing table update: {}", file.getName()); diff --git a/src/main/resources/sql/V1__moderation.sql b/src/main/resources/sql/V1__moderation.sql index 5b832ba..76cec78 100644 --- a/src/main/resources/sql/V1__moderation.sql +++ b/src/main/resources/sql/V1__moderation.sql @@ -1,8 +1,8 @@ CREATE TABLE IF NOT EXISTS moderation ( - id INT AUTO_INCREMENT primary key NOT NULL, - guild_id VARCHAR(255) NOT NULL, - user_id VARCHAR(255) NOT NULL, - moderator_id VARCHAR(255) NOT NULL, - reason VARCHAR(255) NOT NULL + id serial not null primary key, + guild_id varchar(255) not null, + user_id varchar(255) not null, + moderator_id varchar(255) not null, + reason varchar(255) not null ) \ No newline at end of file From 524ffa44da818ac1da6d1eafd62fa290fd82dfcf Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 19:17:04 +0100 Subject: [PATCH 12/24] removed the need for auth --- README.md | 4 ---- build.gradle | 8 +++----- .../java/io/github/org/programming/database/Database.java | 2 -- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ed60f06..c359157 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,6 @@ GUILD_ID= OWNER_ID= //for the excutor default is 1. CORE_POOL_SIZE= -//example : jdbc:postgresql://localhost:5432/postgres -JDBC_URL= -DATA_BASE_USER_NAME= -DATA_BASE_PASSWORD= ``` ### Part 3 diff --git a/build.gradle b/build.gradle index 9927757..e9e2028 100644 --- a/build.gradle +++ b/build.gradle @@ -144,8 +144,8 @@ task downloadDependencies { } } -def props = new Properties() -file(".env").withInputStream { props.load(it) } +//def props = new Properties() +//file(".env").withInputStream { props.load(it) } jooq { version = '3.15.2' @@ -157,9 +157,7 @@ jooq { logging = org.jooq.meta.jaxb.Logging.WARN jdbc { driver = 'org.postgresql.Driver' - url = props.getProperty("JDBC_URL") - user = props.getProperty("DATA_BASE_USER_NAME") - password = props.getProperty("DATA_BASE_PASSWORD") + url = "jdbc:postgresql://localhost:5432/postgres" } generator { name = 'org.jooq.codegen.JavaGenerator' diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 8942939..d12c177 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -25,8 +25,6 @@ public class Database { static { Properties props = new Properties(); props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource"); - props.setProperty("dataSource.user", DatabaseConfig.getUserName()); - props.setProperty("dataSource.password", DatabaseConfig.getPassword()); props.setProperty("dataSource.databaseName", "postgres"); props.setProperty("dataSource.portNumber", String.valueOf(5432)); props.setProperty("dataSource.serverName", "localhost"); From 286a2e177e624af50b6f244e06e0ee97ab6bc793 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 21:29:29 +0100 Subject: [PATCH 13/24] bug fixing. only generates required stuff --- README.md | 17 ++++++++++++ build.gradle | 27 +++++++++++++++++-- .../org/programming/database/Database.java | 19 ++++++++----- .../programming/database/DatabaseConfig.java | 20 +++++++++----- src/main/resources/sql/V1__moderation.sql | 1 + 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c359157..c5d5ebd 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,26 @@ GUILD_ID= OWNER_ID= //for the excutor default is 1. CORE_POOL_SIZE= +DATABASE_NAME=programming_bot +DB_USER= +DB_PASSWORD= +PORT_NUMBER=5432 +SERVER_NAME=localhost ``` ### Part 3 +To get started with postgres you will need to install it using homebrew or any other package manager. + +To install it with homebrew run the following command: +```brew install postgresql``` + +For linux see the [postgresql download](https://www.postgresql.org/download/linux/) + +To start the server run the following command: +```brew servers start postgresql``` + + +### Part 4 In order to make a command for the bot, you will need to create an issue and wait to see if the command is needed. diff --git a/build.gradle b/build.gradle index e9e2028..32c75e9 100644 --- a/build.gradle +++ b/build.gradle @@ -147,6 +147,19 @@ task downloadDependencies { //def props = new Properties() //file(".env").withInputStream { props.load(it) } +/** + * Needed to make sure gradle workflow does not fail in Github Actions. + */ +tasks.register("createBuildDirectoryIfNeeded") { + doLast { + if (!databaseFile.parentFile.exists()) { + databaseFile.parentFile.mkdirs() + } + } + + mustRunAfter(project.tasks.findByPath('clean')) +} + jooq { version = '3.15.2' edition = JooqEdition.OSS @@ -157,14 +170,24 @@ jooq { logging = org.jooq.meta.jaxb.Logging.WARN jdbc { driver = 'org.postgresql.Driver' - url = "jdbc:postgresql://localhost:5432/postgres" + url = "jdbc:postgresql://localhost:5432/programming_bot" + user = DB_USER + password = DB_PASSWORD } generator { name = 'org.jooq.codegen.JavaGenerator' database { name = 'org.jooq.meta.postgres.PostgresDatabase' + inputSchema = 'public' includes = '.*' excludes = '' + + forcedTypes { + forcedType { + name = 'INSTANT' + includeTypes = 'TIMESTAMP' + } + } } generate { records = true @@ -172,7 +195,7 @@ jooq { fluentSetters = true } target { - packageName = 'io.github.org.programming.db.generated' + packageName = 'io.github.org.programming.jooq' directory = "build/generated/java" } strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy" diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index d12c177..37682d8 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -25,9 +25,11 @@ public class Database { static { Properties props = new Properties(); props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource"); - props.setProperty("dataSource.databaseName", "postgres"); - props.setProperty("dataSource.portNumber", String.valueOf(5432)); - props.setProperty("dataSource.serverName", "localhost"); + props.setProperty("dataSource.databaseName", DatabaseConfig.getDatabaseName()); + props.setProperty("dataSource.portNumber", String.valueOf(DatabaseConfig.getPortNumber())); + props.setProperty("dataSource.serverName", DatabaseConfig.getServerName()); + props.setProperty("dataSource.user", DatabaseConfig.getDatabaseUser()); + props.setProperty("dataSource.password", DatabaseConfig.getDatabasePassword()); props.put("dataSource.logWriter", new PrintWriter(System.out)); config = new HikariConfig(props); dataSource = new HikariDataSource(config); @@ -42,10 +44,11 @@ private static void executeTableUpdate() { logger.info("Executing table updates..."); - for (File file : Objects.requireNonNull(listOfFiles, "List of files is null")) { + for (File file : listOfFiles) { if (file.isFile()) { - logger.info("Executing table update: {}", file.getName()); - statement.executeUpdate(Files.readString(Path.of(file.getPath()))); + logger.info("Executing update: {}", file.getName()); + String sql = new String(Files.readAllBytes(file.toPath())); + statement.execute(sql); } } } catch (SQLException | IOException e) { @@ -73,4 +76,8 @@ public static boolean isConnected() { return null; } } + + public static Logger getLogger() { + return logger; + } } diff --git a/src/main/java/io/github/org/programming/database/DatabaseConfig.java b/src/main/java/io/github/org/programming/database/DatabaseConfig.java index c7d4d45..159e28a 100644 --- a/src/main/java/io/github/org/programming/database/DatabaseConfig.java +++ b/src/main/java/io/github/org/programming/database/DatabaseConfig.java @@ -4,15 +4,23 @@ public class DatabaseConfig { - public static String getJDBCUrl() { - return Config.getString("JDBC_URL"); + public static String getDatabaseUser() { + return Config.getString("DB_USER"); } - public static String getUserName() { - return Config.getString("DATA_BASE_USER_NAME"); + public static String getDatabasePassword() { + return Config.getString("DB_PASSWORD"); } - public static String getPassword() { - return Config.getString("DATA_BASE_PASSWORD"); + public static String getDatabaseName() { + return Config.getString("DATABASE_NAME"); + } + + public static int getPortNumber() { + return Config.getInt("PORT_NUMBER"); + } + + public static String getServerName() { + return Config.getString("SERVER_NAME"); } } diff --git a/src/main/resources/sql/V1__moderation.sql b/src/main/resources/sql/V1__moderation.sql index 76cec78..02191e1 100644 --- a/src/main/resources/sql/V1__moderation.sql +++ b/src/main/resources/sql/V1__moderation.sql @@ -4,5 +4,6 @@ CREATE TABLE IF NOT EXISTS moderation guild_id varchar(255) not null, user_id varchar(255) not null, moderator_id varchar(255) not null, + time_stamp timestamp not null default current_timestamp, reason varchar(255) not null ) \ No newline at end of file From b5e32fd3d89a2383e1edb37ac72c7d42714d9ecf Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 21:37:59 +0100 Subject: [PATCH 14/24] will deal with .env issue later --- README.md | 1 + build.gradle | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c5d5ebd..6ab3906 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ CORE_POOL_SIZE= DATABASE_NAME=programming_bot DB_USER= DB_PASSWORD= +DB_URL=jdbc:postgresql://localhost:5432/programming_bot PORT_NUMBER=5432 SERVER_NAME=localhost ``` diff --git a/build.gradle b/build.gradle index 32c75e9..cf010fd 100644 --- a/build.gradle +++ b/build.gradle @@ -144,8 +144,12 @@ task downloadDependencies { } } -//def props = new Properties() -//file(".env").withInputStream { props.load(it) } +def props = new Properties() +file(".env").withInputStream { props.load(it) } + +props.forEach { key, value -> + System.setProperty(key, value) +} /** * Needed to make sure gradle workflow does not fail in Github Actions. @@ -170,9 +174,9 @@ jooq { logging = org.jooq.meta.jaxb.Logging.WARN jdbc { driver = 'org.postgresql.Driver' - url = "jdbc:postgresql://localhost:5432/programming_bot" - user = DB_USER - password = DB_PASSWORD + url = props.getProperty("DB_URL") + user = props.getProperty("DB_USER") + password = props.getProperty("DB_PASSWORD") } generator { name = 'org.jooq.codegen.JavaGenerator' From feb7c0a58e0b4d1fa665ef9f6ba14d616fa53ac8 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Sun, 12 Jun 2022 22:28:14 +0100 Subject: [PATCH 15/24] see if this works --- build.gradle | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index cf010fd..945f373 100644 --- a/build.gradle +++ b/build.gradle @@ -145,12 +145,12 @@ task downloadDependencies { } def props = new Properties() -file(".env").withInputStream { props.load(it) } - -props.forEach { key, value -> - System.setProperty(key, value) +//if the file exists, load the properties +if (file(".env").exists()) { + file(".env").withInputStream { props.load(it) } } + /** * Needed to make sure gradle workflow does not fail in Github Actions. */ @@ -174,9 +174,9 @@ jooq { logging = org.jooq.meta.jaxb.Logging.WARN jdbc { driver = 'org.postgresql.Driver' - url = props.getProperty("DB_URL") - user = props.getProperty("DB_USER") - password = props.getProperty("DB_PASSWORD") + url = props.getProperty("DB_URL", "null") + user = props.getProperty("DB_USER", "null") + password = props.getProperty("DB_PASSWORD", "null") } generator { name = 'org.jooq.codegen.JavaGenerator' From 3fa80d7eb0939cd42e487f8bc0b064100bc3ac19 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Mon, 13 Jun 2022 12:22:43 +0100 Subject: [PATCH 16/24] Updated action --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ab3906..cb7e38f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Java CI with Gradle](https://github.com/Programming-Org/Programming/actions/workflows/gradle.yml/badge.svg)](https://github.com/YusufsDiscordbot/Yusuf-s-Moderation-Bot/actions/workflows/gradle.yml) +[![Java CI with Gradle](https://github.com/Programming-Org/Programming/actions/workflows/gradle.yml/badge.svg)](https://github.com/Programming-Org/Programming/actions/workflows/gradle.yml) [![codecov](https://codecov.io/gh/Programming-Org/Programming/branch/main/graph/badge.svg?token=M1KBWF0CDY)](https://codecov.io/gh/Programming-Org/Programming) # Welcome to the Programming Server's Discord bot! From 6ce58941e3a68b36372396129b0f0cec4a6c3802 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 13:24:05 +0100 Subject: [PATCH 17/24] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cb7e38f..47fdec5 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,9 @@ CORE_POOL_SIZE= DATABASE_NAME=programming_bot DB_USER= DB_PASSWORD= -DB_URL=jdbc:postgresql://localhost:5432/programming_bot -PORT_NUMBER=5432 -SERVER_NAME=localhost +DB_URL= +PORT_NUMBER= +SERVER_NAME= ``` ### Part 3 From a2d137f2587578d9850195e10b1970d6b654ff16 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 16:35:07 +0100 Subject: [PATCH 18/24] some bug fixing and figure the jooq part cleaning up imports --- .github/workflows/releases.yaml | 2 +- build.gradle | 1 + .../extension/MessageCommandExtender.java | 2 -- .../extension/SlashCommandExtender.java | 1 - .../extension/UserCommandExtender.java | 1 - .../bot/commands/ExampleCommand.java | 1 - .../org/programming/database/Database.java | 1 - .../moderation/ModerationDatabase.java | 21 +++++++++++++++++++ .../{V1__moderation.sql => moderation.sql} | 0 9 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 src/main/java/io/github/org/programming/database/moderation/ModerationDatabase.java rename src/main/resources/sql/{V1__moderation.sql => moderation.sql} (100%) diff --git a/.github/workflows/releases.yaml b/.github/workflows/releases.yaml index 7a017cb..4d3da5a 100644 --- a/.github/workflows/releases.yaml +++ b/.github/workflows/releases.yaml @@ -30,4 +30,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} with: - files: build/libs/ydw.jar \ No newline at end of file + files: build/libs/programming_bot.jar \ No newline at end of file diff --git a/build.gradle b/build.gradle index 945f373..64e4edd 100644 --- a/build.gradle +++ b/build.gradle @@ -197,6 +197,7 @@ jooq { records = true immutablePojos = true fluentSetters = true + } target { packageName = 'io.github.org.programming.jooq' diff --git a/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java index 9079d67..0bb438b 100644 --- a/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/MessageCommandExtender.java @@ -1,13 +1,11 @@ package io.github.org.programming.backend.extension; import io.github.org.programming.backend.builder.message.MessageCommand; -import io.github.org.programming.backend.builder.slash.SlashCommand; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.CommandData; import javax.annotation.Nonnull; diff --git a/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java index dabef13..53b5c25 100644 --- a/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/SlashCommandExtender.java @@ -6,7 +6,6 @@ import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; diff --git a/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java b/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java index 9879d69..2150c34 100644 --- a/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java +++ b/src/main/java/io/github/org/programming/backend/extension/UserCommandExtender.java @@ -6,7 +6,6 @@ import net.dv8tion.jda.api.events.interaction.command.UserContextInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.CommandData; import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; diff --git a/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java index 7af50d6..8bfd259 100644 --- a/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java +++ b/src/main/java/io/github/org/programming/bot/commands/ExampleCommand.java @@ -4,7 +4,6 @@ import io.github.org.programming.backend.builder.slash.SlashCommandBuilder; import io.github.org.programming.backend.extension.SlashCommandExtender; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/io/github/org/programming/database/Database.java b/src/main/java/io/github/org/programming/database/Database.java index 37682d8..775cb29 100644 --- a/src/main/java/io/github/org/programming/database/Database.java +++ b/src/main/java/io/github/org/programming/database/Database.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Files; -import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; diff --git a/src/main/java/io/github/org/programming/database/moderation/ModerationDatabase.java b/src/main/java/io/github/org/programming/database/moderation/ModerationDatabase.java new file mode 100644 index 0000000..d7c4275 --- /dev/null +++ b/src/main/java/io/github/org/programming/database/moderation/ModerationDatabase.java @@ -0,0 +1,21 @@ +package io.github.org.programming.database.moderation; + +import javax.annotation.Nullable; +import java.time.Instant; + +import static io.github.org.programming.bot.ProgrammingBot.getContext; +import static io.github.org.programming.jooq.tables.Moderation.MODERATION; + +public class ModerationDatabase { + + public static @Nullable Integer updateModerationDataBase(String guildId, String userId, + String moderationId, String reason) { + return getContext() + .insertInto(MODERATION, MODERATION.GUILD_ID, MODERATION.USER_ID, + MODERATION.MODERATOR_ID, MODERATION.TIME_STAMP, MODERATION.REASON) + .values(guildId, userId, moderationId, Instant.now(), reason) + .returning(MODERATION.ID) + .fetchOne(MODERATION.ID); + } + +} diff --git a/src/main/resources/sql/V1__moderation.sql b/src/main/resources/sql/moderation.sql similarity index 100% rename from src/main/resources/sql/V1__moderation.sql rename to src/main/resources/sql/moderation.sql From 8248affcc3dccda1956ddbaf49f71015e80e3d3f Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 16:49:24 +0100 Subject: [PATCH 19/24] trying this --- build.gradle | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 64e4edd..ac05a05 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { id "com.diffplug.spotless" version "6.6.1" id "application" id "nu.studer.jooq" version "6.0.1" + id "org.flywaydb.flyway" version "8.5.12" } group 'io.github.org.programming' @@ -164,6 +165,12 @@ tasks.register("createBuildDirectoryIfNeeded") { mustRunAfter(project.tasks.findByPath('clean')) } +//if createBuildDirectoryIfNeeded is needed, run it +tasks.flywayMigrate { + dependsOn("createBuildDirectoryIfNeeded") +} + + jooq { version = '3.15.2' edition = JooqEdition.OSS @@ -197,7 +204,7 @@ jooq { records = true immutablePojos = true fluentSetters = true - + } target { packageName = 'io.github.org.programming.jooq' From fa21ee32bf708f834d7ad1e113ac6c006a9417ac Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 16:51:23 +0100 Subject: [PATCH 20/24] hmm --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index ac05a05..3cbbc36 100644 --- a/build.gradle +++ b/build.gradle @@ -217,4 +217,8 @@ jooq { } } +tasks.generateJooq { + dependsOn("flywayMigrate") +} + check.dependsOn jacocoTestReport From c93265272f88e2796b9718a65768cb3ecdba7775 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 16:53:53 +0100 Subject: [PATCH 21/24] Update build.gradle --- build.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 3cbbc36..ce7dc30 100644 --- a/build.gradle +++ b/build.gradle @@ -157,15 +157,14 @@ if (file(".env").exists()) { */ tasks.register("createBuildDirectoryIfNeeded") { doLast { - if (!databaseFile.parentFile.exists()) { - databaseFile.parentFile.mkdirs() + if (!file("build").exists()) { + file("build").mkdirs() } } mustRunAfter(project.tasks.findByPath('clean')) } -//if createBuildDirectoryIfNeeded is needed, run it tasks.flywayMigrate { dependsOn("createBuildDirectoryIfNeeded") } From 515862d1c2c9223a5873efd622786d041c196f08 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Tue, 14 Jun 2022 17:07:49 +0100 Subject: [PATCH 22/24] work --- build.gradle | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index ce7dc30..30ece65 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,6 @@ plugins { id "com.diffplug.spotless" version "6.6.1" id "application" id "nu.studer.jooq" version "6.0.1" - id "org.flywaydb.flyway" version "8.5.12" } group 'io.github.org.programming' @@ -152,23 +151,17 @@ if (file(".env").exists()) { } -/** - * Needed to make sure gradle workflow does not fail in Github Actions. - */ -tasks.register("createBuildDirectoryIfNeeded") { +//create the build directory so no errors happen with the workflow +task createBuildDir { doLast { - if (!file("build").exists()) { - file("build").mkdirs() - } + logger.info("===== Creating build directory =====") + file("build").mkdirs() + logger.info("===== Build directory created ======") } mustRunAfter(project.tasks.findByPath('clean')) } -tasks.flywayMigrate { - dependsOn("createBuildDirectoryIfNeeded") -} - jooq { version = '3.15.2' @@ -216,8 +209,5 @@ jooq { } } -tasks.generateJooq { - dependsOn("flywayMigrate") -} check.dependsOn jacocoTestReport From d50af8e1fd531521a59c7d9a1cf426e942aa5664 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Thu, 16 Jun 2022 17:09:57 +0100 Subject: [PATCH 23/24] added jooq --- build.gradle | 3 +- .../org/programming/jooq/DefaultCatalog.java | 45 +++ .../io/github/org/programming/jooq/Keys.java | 28 ++ .../github/org/programming/jooq/Public.java | 54 +++ .../github/org/programming/jooq/Tables.java | 20 ++ .../programming/jooq/tables/Moderation.java | 162 +++++++++ .../jooq/tables/pojos/Moderation.java | 107 ++++++ .../jooq/tables/records/ModerationRecord.java | 316 ++++++++++++++++++ 8 files changed, 734 insertions(+), 1 deletion(-) create mode 100644 src/main/jooq/io/github/org/programming/jooq/DefaultCatalog.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/Keys.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/Public.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/Tables.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/tables/Moderation.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/tables/pojos/Moderation.java create mode 100644 src/main/jooq/io/github/org/programming/jooq/tables/records/ModerationRecord.java diff --git a/build.gradle b/build.gradle index 30ece65..b7d97b5 100644 --- a/build.gradle +++ b/build.gradle @@ -92,6 +92,7 @@ spotless { java { // Excludes build folder since it contains generated java classes. targetExclude("build/**") + targetExclude("src/main/jooq/**") eclipse('4.21.0').configFile("${rootProject.rootDir}/meta/formatting/google-style-eclipse.xml") } } @@ -200,7 +201,7 @@ jooq { } target { packageName = 'io.github.org.programming.jooq' - directory = "build/generated/java" + directory = "src/main/jooq" } strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy" } diff --git a/src/main/jooq/io/github/org/programming/jooq/DefaultCatalog.java b/src/main/jooq/io/github/org/programming/jooq/DefaultCatalog.java new file mode 100644 index 0000000..7d48fb2 --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/DefaultCatalog.java @@ -0,0 +1,45 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq; + + +import java.util.Arrays; +import java.util.List; + +import org.jooq.Schema; +import org.jooq.impl.CatalogImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class DefaultCatalog extends CatalogImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of DEFAULT_CATALOG + */ + public static final DefaultCatalog DEFAULT_CATALOG = new DefaultCatalog(); + + /** + * The schema public. + */ + public final Public PUBLIC = Public.PUBLIC; + + /** + * No further instances allowed + */ + private DefaultCatalog() { + super(""); + } + + @Override + public final List getSchemas() { + return Arrays.asList( + Public.PUBLIC + ); + } +} diff --git a/src/main/jooq/io/github/org/programming/jooq/Keys.java b/src/main/jooq/io/github/org/programming/jooq/Keys.java new file mode 100644 index 0000000..5dea07e --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/Keys.java @@ -0,0 +1,28 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq; + + +import io.github.org.programming.jooq.tables.Moderation; +import io.github.org.programming.jooq.tables.records.ModerationRecord; + +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.Internal; + + +/** + * A class modelling foreign key relationships and constraints of tables in + * public. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Keys { + + // ------------------------------------------------------------------------- + // UNIQUE and PRIMARY KEY definitions + // ------------------------------------------------------------------------- + + public static final UniqueKey MODERATION_PKEY = Internal.createUniqueKey(Moderation.MODERATION, DSL.name("moderation_pkey"), new TableField[] { Moderation.MODERATION.ID }, true); +} diff --git a/src/main/jooq/io/github/org/programming/jooq/Public.java b/src/main/jooq/io/github/org/programming/jooq/Public.java new file mode 100644 index 0000000..f7fc2de --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/Public.java @@ -0,0 +1,54 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq; + + +import io.github.org.programming.jooq.tables.Moderation; + +import java.util.Arrays; +import java.util.List; + +import org.jooq.Catalog; +import org.jooq.Table; +import org.jooq.impl.SchemaImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Public extends SchemaImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of public + */ + public static final Public PUBLIC = new Public(); + + /** + * The table public.moderation. + */ + public final Moderation MODERATION = Moderation.MODERATION; + + /** + * No further instances allowed + */ + private Public() { + super("public", null); + } + + + @Override + public Catalog getCatalog() { + return DefaultCatalog.DEFAULT_CATALOG; + } + + @Override + public final List> getTables() { + return Arrays.asList( + Moderation.MODERATION + ); + } +} diff --git a/src/main/jooq/io/github/org/programming/jooq/Tables.java b/src/main/jooq/io/github/org/programming/jooq/Tables.java new file mode 100644 index 0000000..673ff0a --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/Tables.java @@ -0,0 +1,20 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq; + + +import io.github.org.programming.jooq.tables.Moderation; + + +/** + * Convenience access to all tables in public. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Tables { + + /** + * The table public.moderation. + */ + public static final Moderation MODERATION = Moderation.MODERATION; +} diff --git a/src/main/jooq/io/github/org/programming/jooq/tables/Moderation.java b/src/main/jooq/io/github/org/programming/jooq/tables/Moderation.java new file mode 100644 index 0000000..4cab1c1 --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/tables/Moderation.java @@ -0,0 +1,162 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq.tables; + + +import io.github.org.programming.jooq.Keys; +import io.github.org.programming.jooq.Public; +import io.github.org.programming.jooq.tables.records.ModerationRecord; + +import java.time.Instant; + +import org.jooq.Field; +import org.jooq.ForeignKey; +import org.jooq.Identity; +import org.jooq.Name; +import org.jooq.Record; +import org.jooq.Row6; +import org.jooq.Schema; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.TableOptions; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.jooq.impl.TableImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Moderation extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of public.moderation + */ + public static final Moderation MODERATION = new Moderation(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return ModerationRecord.class; + } + + /** + * The column public.moderation.id. + */ + public final TableField ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); + + /** + * The column public.moderation.guild_id. + */ + public final TableField GUILD_ID = createField(DSL.name("guild_id"), SQLDataType.VARCHAR(255).nullable(false), this, ""); + + /** + * The column public.moderation.user_id. + */ + public final TableField USER_ID = createField(DSL.name("user_id"), SQLDataType.VARCHAR(255).nullable(false), this, ""); + + /** + * The column public.moderation.moderator_id. + */ + public final TableField MODERATOR_ID = createField(DSL.name("moderator_id"), SQLDataType.VARCHAR(255).nullable(false), this, ""); + + /** + * The column public.moderation.time_stamp. + */ + public final TableField TIME_STAMP = createField(DSL.name("time_stamp"), SQLDataType.INSTANT.nullable(false).defaultValue(DSL.field("CURRENT_TIMESTAMP", SQLDataType.INSTANT)), this, ""); + + /** + * The column public.moderation.reason. + */ + public final TableField REASON = createField(DSL.name("reason"), SQLDataType.VARCHAR(255).nullable(false), this, ""); + + private Moderation(Name alias, Table aliased) { + this(alias, aliased, null); + } + + private Moderation(Name alias, Table aliased, Field[] parameters) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table()); + } + + /** + * Create an aliased public.moderation table reference + */ + public Moderation(String alias) { + this(DSL.name(alias), MODERATION); + } + + /** + * Create an aliased public.moderation table reference + */ + public Moderation(Name alias) { + this(alias, MODERATION); + } + + /** + * Create a public.moderation table reference + */ + public Moderation() { + this(DSL.name("moderation"), null); + } + + public Moderation(Table child, ForeignKey key) { + super(child, key, MODERATION); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Public.PUBLIC; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.MODERATION_PKEY; + } + + @Override + public Moderation as(String alias) { + return new Moderation(DSL.name(alias), this); + } + + @Override + public Moderation as(Name alias) { + return new Moderation(alias, this); + } + + /** + * Rename this table + */ + @Override + public Moderation rename(String name) { + return new Moderation(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public Moderation rename(Name name) { + return new Moderation(name, null); + } + + // ------------------------------------------------------------------------- + // Row6 type methods + // ------------------------------------------------------------------------- + + @Override + public Row6 fieldsRow() { + return (Row6) super.fieldsRow(); + } +} diff --git a/src/main/jooq/io/github/org/programming/jooq/tables/pojos/Moderation.java b/src/main/jooq/io/github/org/programming/jooq/tables/pojos/Moderation.java new file mode 100644 index 0000000..4c573dc --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/tables/pojos/Moderation.java @@ -0,0 +1,107 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq.tables.pojos; + + +import java.io.Serializable; +import java.time.Instant; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Moderation implements Serializable { + + private static final long serialVersionUID = 1L; + + private final Integer id; + private final String guildId; + private final String userId; + private final String moderatorId; + private final Instant timeStamp; + private final String reason; + + public Moderation(Moderation value) { + this.id = value.id; + this.guildId = value.guildId; + this.userId = value.userId; + this.moderatorId = value.moderatorId; + this.timeStamp = value.timeStamp; + this.reason = value.reason; + } + + public Moderation( + Integer id, + String guildId, + String userId, + String moderatorId, + Instant timeStamp, + String reason + ) { + this.id = id; + this.guildId = guildId; + this.userId = userId; + this.moderatorId = moderatorId; + this.timeStamp = timeStamp; + this.reason = reason; + } + + /** + * Getter for public.moderation.id. + */ + public Integer getId() { + return this.id; + } + + /** + * Getter for public.moderation.guild_id. + */ + public String getGuildId() { + return this.guildId; + } + + /** + * Getter for public.moderation.user_id. + */ + public String getUserId() { + return this.userId; + } + + /** + * Getter for public.moderation.moderator_id. + */ + public String getModeratorId() { + return this.moderatorId; + } + + /** + * Getter for public.moderation.time_stamp. + */ + public Instant getTimeStamp() { + return this.timeStamp; + } + + /** + * Getter for public.moderation.reason. + */ + public String getReason() { + return this.reason; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("Moderation ("); + + sb.append(id); + sb.append(", ").append(guildId); + sb.append(", ").append(userId); + sb.append(", ").append(moderatorId); + sb.append(", ").append(timeStamp); + sb.append(", ").append(reason); + + sb.append(")"); + return sb.toString(); + } +} diff --git a/src/main/jooq/io/github/org/programming/jooq/tables/records/ModerationRecord.java b/src/main/jooq/io/github/org/programming/jooq/tables/records/ModerationRecord.java new file mode 100644 index 0000000..1166f54 --- /dev/null +++ b/src/main/jooq/io/github/org/programming/jooq/tables/records/ModerationRecord.java @@ -0,0 +1,316 @@ +/* + * This file is generated by jOOQ. + */ +package io.github.org.programming.jooq.tables.records; + + +import io.github.org.programming.jooq.tables.Moderation; + +import java.time.Instant; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record6; +import org.jooq.Row6; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ModerationRecord extends UpdatableRecordImpl implements Record6 { + + private static final long serialVersionUID = 1L; + + /** + * Setter for public.moderation.id. + */ + public ModerationRecord setId(Integer value) { + set(0, value); + return this; + } + + /** + * Getter for public.moderation.id. + */ + public Integer getId() { + return (Integer) get(0); + } + + /** + * Setter for public.moderation.guild_id. + */ + public ModerationRecord setGuildId(String value) { + set(1, value); + return this; + } + + /** + * Getter for public.moderation.guild_id. + */ + public String getGuildId() { + return (String) get(1); + } + + /** + * Setter for public.moderation.user_id. + */ + public ModerationRecord setUserId(String value) { + set(2, value); + return this; + } + + /** + * Getter for public.moderation.user_id. + */ + public String getUserId() { + return (String) get(2); + } + + /** + * Setter for public.moderation.moderator_id. + */ + public ModerationRecord setModeratorId(String value) { + set(3, value); + return this; + } + + /** + * Getter for public.moderation.moderator_id. + */ + public String getModeratorId() { + return (String) get(3); + } + + /** + * Setter for public.moderation.time_stamp. + */ + public ModerationRecord setTimeStamp(Instant value) { + set(4, value); + return this; + } + + /** + * Getter for public.moderation.time_stamp. + */ + public Instant getTimeStamp() { + return (Instant) get(4); + } + + /** + * Setter for public.moderation.reason. + */ + public ModerationRecord setReason(String value) { + set(5, value); + return this; + } + + /** + * Getter for public.moderation.reason. + */ + public String getReason() { + return (String) get(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record6 type implementation + // ------------------------------------------------------------------------- + + @Override + public Row6 fieldsRow() { + return (Row6) super.fieldsRow(); + } + + @Override + public Row6 valuesRow() { + return (Row6) super.valuesRow(); + } + + @Override + public Field field1() { + return Moderation.MODERATION.ID; + } + + @Override + public Field field2() { + return Moderation.MODERATION.GUILD_ID; + } + + @Override + public Field field3() { + return Moderation.MODERATION.USER_ID; + } + + @Override + public Field field4() { + return Moderation.MODERATION.MODERATOR_ID; + } + + @Override + public Field field5() { + return Moderation.MODERATION.TIME_STAMP; + } + + @Override + public Field field6() { + return Moderation.MODERATION.REASON; + } + + @Override + public Integer component1() { + return getId(); + } + + @Override + public String component2() { + return getGuildId(); + } + + @Override + public String component3() { + return getUserId(); + } + + @Override + public String component4() { + return getModeratorId(); + } + + @Override + public Instant component5() { + return getTimeStamp(); + } + + @Override + public String component6() { + return getReason(); + } + + @Override + public Integer value1() { + return getId(); + } + + @Override + public String value2() { + return getGuildId(); + } + + @Override + public String value3() { + return getUserId(); + } + + @Override + public String value4() { + return getModeratorId(); + } + + @Override + public Instant value5() { + return getTimeStamp(); + } + + @Override + public String value6() { + return getReason(); + } + + @Override + public ModerationRecord value1(Integer value) { + setId(value); + return this; + } + + @Override + public ModerationRecord value2(String value) { + setGuildId(value); + return this; + } + + @Override + public ModerationRecord value3(String value) { + setUserId(value); + return this; + } + + @Override + public ModerationRecord value4(String value) { + setModeratorId(value); + return this; + } + + @Override + public ModerationRecord value5(Instant value) { + setTimeStamp(value); + return this; + } + + @Override + public ModerationRecord value6(String value) { + setReason(value); + return this; + } + + @Override + public ModerationRecord values(Integer value1, String value2, String value3, String value4, Instant value5, String value6) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached ModerationRecord + */ + public ModerationRecord() { + super(Moderation.MODERATION); + } + + /** + * Create a detached, initialised ModerationRecord + */ + public ModerationRecord(Integer id, String guildId, String userId, String moderatorId, Instant timeStamp, String reason) { + super(Moderation.MODERATION); + + setId(id); + setGuildId(guildId); + setUserId(userId); + setModeratorId(moderatorId); + setTimeStamp(timeStamp); + setReason(reason); + } + + /** + * Create a detached, initialised ModerationRecord + */ + public ModerationRecord(io.github.org.programming.jooq.tables.pojos.Moderation value) { + super(Moderation.MODERATION); + + if (value != null) { + setId(value.getId()); + setGuildId(value.getGuildId()); + setUserId(value.getUserId()); + setModeratorId(value.getModeratorId()); + setTimeStamp(value.getTimeStamp()); + setReason(value.getReason()); + } + } +} From 3dd073c639d891e80d1854e3500ad124196fb073 Mon Sep 17 00:00:00 2001 From: Yusuf Arfan Ismail Date: Thu, 16 Jun 2022 17:15:17 +0100 Subject: [PATCH 24/24] Updated some comments --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b7d97b5..a48b571 100644 --- a/build.gradle +++ b/build.gradle @@ -90,8 +90,9 @@ compileJava { spotless { java { - // Excludes build folder since it contains generated java classes. + // Excludes build folder since it may contain compiled classes targetExclude("build/**") + //No need to do spotless on generated code targetExclude("src/main/jooq/**") eclipse('4.21.0').configFile("${rootProject.rootDir}/meta/formatting/google-style-eclipse.xml") }