From dc7406df1d2edc2ae8fb38464a965c6303f98039 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 14 Feb 2020 00:13:13 -0500 Subject: [PATCH 001/157] Add SQLite3 dep --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8e42ecf..0f816bb 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ repositories { } dependencies { - + implementation 'org.xerial:sqlite-jdbc:3.30.1' implementation 'com.github.Kaaz:ConfigurationBuilder:0.4' implementation group: 'org.javacord', name: 'javacord', version:'3.0.5' implementation group: 'com.rethinkdb', name: 'rethinkdb-driver', version: '2.3.3' From 0e79e5aa05bdc2f7684d72ddd4731245dcedba4f Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 14 Feb 2020 23:56:34 -0500 Subject: [PATCH 002/157] Added initial SQLite implementation --- .../exceptions/UnknownParameterException.java | 25 +++++ src/main/java/dev/salmonllama/fsbot/Main.java | 5 +- .../salmonllama/fsbot/config/BotConfig.java | 5 +- .../fsbot/database/DatabaseModel.java | 9 ++ .../fsbot/database/DatabaseProvider.java | 92 +++++++++++++++++++ .../dev/salmonllama/fsbot/database/FSDB.java | 46 ++++++++++ 6 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/DatabaseModel.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/FSDB.java diff --git a/src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java b/src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java new file mode 100644 index 0000000..6803f2e --- /dev/null +++ b/src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.exceptions; + +import java.sql.SQLException; + +public class UnknownParameterException extends SQLException { + private String message; + + public UnknownParameterException(Object param) { + message = "Unknown parameter type: " + param; + } + + public UnknownParameterException(Object param, int index) { + message = String.format("Unknown parameter type %s at %d", param, index); + } + + @Override + public String toString() { + return message; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index cc9251b..78d7923 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -8,6 +8,7 @@ package dev.salmonllama.fsbot; import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.FSDB; import dev.salmonllama.fsbot.guthix.Guthix; import dev.salmonllama.fsbot.listeners.*; import org.javacord.api.DiscordApiBuilder; @@ -25,9 +26,11 @@ public class Main { String configLocation = Constants.BOT_FOLDER.concat(Constants.CONFIG_NAME); BotConfig.initConfig(configLocation); + FSDB.init(); + // Initialise the database with values from the bot's config file RethinkDB r = RethinkDB.r; - Connection conn = r.connection().hostname(BotConfig.DB_HOST).port(BotConfig.DB_PORT).connect(); + Connection conn = r.connection().hostname("localhost").port(28015).connect(); new DiscordApiBuilder().setToken(BotConfig.TOKEN).login().thenAccept(api -> { DatabaseUtilities db = new DatabaseUtilities(r, conn, api); diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index 180e55f..954cb03 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -3,6 +3,7 @@ * All rights reserved. */ +// Shoutout to Kaaz (again) for a kickass config service: https://github.com/Kaaz/ConfigurationBuilder package dev.salmonllama.fsbot.config; import com.kaaz.configuration.ConfigurationBuilder; @@ -15,10 +16,10 @@ public class BotConfig { public static String TOKEN = "token-goes-here"; @ConfigurationOption - public static String DB_HOST = "localhost"; + public static String DB_ADDR = "fsbot.db"; @ConfigurationOption - public static int DB_PORT = 28015; + public static String DB_NAME = "fsbot"; @ConfigurationOption public static String DEFAULT_PREFIX = "~"; diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseModel.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseModel.java new file mode 100644 index 0000000..41f9ddd --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseModel.java @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database; + +public class DatabaseModel { +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java new file mode 100644 index 0000000..463b95f --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +// Heavily inspired by Kaaz's Emily database connection: https://github.com/Kaaz/DiscordBot/tree/master/src/main/java/emily/db +package dev.salmonllama.fsbot.database; + +import dev.salmonllama.exceptions.UnknownParameterException; +import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.utilities.Constants; +import org.sqlite.javax.SQLiteConnectionPoolDataSource; + +import java.sql.*; + +public class DatabaseProvider { + private final String DB_ADDR; + private final String DB_NAME; + private Connection c; + + public DatabaseProvider(String dbName) { + DB_NAME = dbName; + DB_ADDR = "jdbc:sqlite:".concat(Constants.BOT_FOLDER).concat(BotConfig.DB_ADDR); + } + + private Connection createConnection() { + try { + SQLiteConnectionPoolDataSource dataSource = new SQLiteConnectionPoolDataSource(); + dataSource.setDatabaseName(DB_NAME); + dataSource.setUrl(DB_ADDR); + return dataSource.getConnection(); + } catch (SQLException e) { + e.printStackTrace(); + System.out.println("Could not connect to database, double check config values"); + System.exit(1); + } + return null; + } + + public Connection getConnection() { + if (c == null) { + return createConnection(); + } + return c; + } + + private void resolveParameters(PreparedStatement query, Object... params) throws SQLException { + int index = 1; + for (Object p : params) { + if (p instanceof String) { + query.setString(index, (String) p); + } + else if (p instanceof Boolean) { + query.setBoolean(index, (boolean) p); + } + else if (p instanceof Timestamp) { + query.setTimestamp(index, (Timestamp) p); + } else { + throw new UnknownParameterException(p, index); + } + index++; + } + } + + public int query(String sql) throws SQLException { + try (Statement stmt = getConnection().createStatement()) { + return stmt.executeUpdate(sql); + } + } + + public int insert(String sql, Object... params) throws SQLException { + try (PreparedStatement query = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + resolveParameters(query, params); + query.executeUpdate(); + + ResultSet rs = query.getGeneratedKeys(); + + if (rs.next()) { + return rs.getInt(1); + } + + return -1; + } + } + + public ResultSet select(String sql, Object... params) throws SQLException { + PreparedStatement query; + query = getConnection().prepareStatement(sql); + resolveParameters(query, params); + return query.executeQuery(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java new file mode 100644 index 0000000..866cce9 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +// Heavily inspired by Kaaz's Emily database connection: https://github.com/Kaaz/DiscordBot/tree/master/src/main/java/emily/db +package dev.salmonllama.fsbot.database; + +import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.models.OutfitModel; + +import java.sql.SQLException; +import java.util.HashMap; + +public class FSDB { + private static final String DEFAULT_CONNECTION = "fsbot"; + private static final HashMap connections = new HashMap<>(); + + public static DatabaseProvider get(String key) { + if (connections.containsKey(key)) { + return connections.get(key); + } + + System.out.println(String.format("Specified connection %s has not been set.", key)); + return null; + } + + public static DatabaseProvider get() { + return connections.get(DEFAULT_CONNECTION); + } + + public static void init() { + connections.clear(); + connections.put(DEFAULT_CONNECTION, new DatabaseProvider(BotConfig.DB_NAME)); + + prepareTables(); + } + + private static void prepareTables() { + try { + get().query(OutfitModel.schema()); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} From 314cfc9c913353ad5b020103b48699b5b54b9c19 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 14 Feb 2020 23:56:53 -0500 Subject: [PATCH 003/157] Created initial outfit model and controller --- .../controllers/OutfitController.java | 50 +++++++++ .../fsbot/database/models/OutfitModel.java | 106 ++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java new file mode 100644 index 0000000..d2cd7bb --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.OutfitModel; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class OutfitController { + public static void insert(OutfitModel outfit) { + try { + FSDB.get().insert( + "INSERT INTO outfits('id', 'link') VALUES (?, ?)", + outfit.id, outfit.link + ); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public static OutfitModel findById(String id) throws SQLException { + OutfitModel outfit; + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id)) { + if (rs.next()) { + outfit = mapObject(rs); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + private static OutfitModel mapObject(ResultSet rs) throws SQLException { + return new OutfitModel.OutfitBuilder(rs.getString("link"), rs.getString("submitter"), rs.getString("tag")) + .setId(rs.getString("id")) + .setCreated(rs.getTimestamp("created")) + .setUpdated(rs.getTimestamp("updated")) + .setDeleted(rs.getBoolean("deleted")) + .setFeatured(rs.getBoolean("featured")) + .setDisplayCount(rs.getInt("display_count")) + .setDeletionHash(rs.getString("deletion_hash")) + .build(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java b/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java new file mode 100644 index 0000000..08bd88d --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +import java.sql.Timestamp; + +public class OutfitModel extends DatabaseModel { + public String id = ""; + public String link = ""; + public String submitter = ""; + public String tag = ""; + public Timestamp created = null; + public Timestamp updated = null; + public boolean deleted = false; + public boolean featured = false; + public int displayCount = 0; + public String deletionHash = ""; + + private OutfitModel(OutfitBuilder builder) { + id = builder.id; + link = builder.link; + submitter = builder.submitter; + tag = builder.tag; + created = builder.created; + updated = builder.updated; + deleted = builder.deleted; + deletionHash = builder.deletionHash; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS outfits (" + + "id TEXT, " + + "link TEXT," + + "submitter TEXT," + + "tag TEXT," + + "created TEXT," + + "updated TEXT," + + "deleted TEXT," + + "featured TEXT," + + "display_count INT" + + "deletion_hash TEXT)"; + } + + public static class OutfitBuilder { + public String id = ""; + public final String link; + public final String submitter; + public String tag; + public Timestamp created = null; + public Timestamp updated = null; + public boolean deleted = false; + public boolean featured = false; + public int displayCount = 0; + public String deletionHash = ""; + + public OutfitBuilder(String link, String submitter, String tag) { + this.link = link; + this.submitter = submitter; + this.tag = tag; + } + + public OutfitBuilder setId(String id) { + this.id = id; + return this; + } + + public OutfitBuilder setCreated(Timestamp created) { + this.created = created; + return this; + } + + public OutfitBuilder setUpdated(Timestamp updated) { + this.updated = updated; + return this; + } + + public OutfitBuilder setDeleted(boolean deleted) { + this.deleted = deleted; + return this; + } + + public OutfitBuilder setFeatured(boolean featured) { + this.featured = featured; + return this; + } + + public OutfitBuilder setDisplayCount(int displayCount) { + this.displayCount = displayCount; + return this; + } + + public OutfitBuilder setDeletionHash(String hash) { + this.deletionHash = hash; + return this; + } + + public OutfitModel build() { + return new OutfitModel(this); + } + } +} From 010c3b97f4fed7f2243d7d5f9274203495f8379b Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 14 Feb 2020 23:58:21 -0500 Subject: [PATCH 004/157] Fixed Exceptions package location --- .../java/dev/salmonllama/fsbot/database/DatabaseProvider.java | 2 +- .../fsbot/database/controllers/OutfitController.java | 2 +- .../{ => fsbot}/exceptions/UnknownParameterException.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/dev/salmonllama/{ => fsbot}/exceptions/UnknownParameterException.java (92%) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index 463b95f..b93f6b7 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -6,7 +6,7 @@ // Heavily inspired by Kaaz's Emily database connection: https://github.com/Kaaz/DiscordBot/tree/master/src/main/java/emily/db package dev.salmonllama.fsbot.database; -import dev.salmonllama.exceptions.UnknownParameterException; +import dev.salmonllama.fsbot.exceptions.UnknownParameterException; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.utilities.Constants; import org.sqlite.javax.SQLiteConnectionPoolDataSource; diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index d2cd7bb..9d2b28d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -32,7 +32,7 @@ public class OutfitController { } catch (SQLException e) { e.printStackTrace(); } - + return null; } diff --git a/src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java b/src/main/java/dev/salmonllama/fsbot/exceptions/UnknownParameterException.java similarity index 92% rename from src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java rename to src/main/java/dev/salmonllama/fsbot/exceptions/UnknownParameterException.java index 6803f2e..9972698 100644 --- a/src/main/java/dev/salmonllama/exceptions/UnknownParameterException.java +++ b/src/main/java/dev/salmonllama/fsbot/exceptions/UnknownParameterException.java @@ -3,7 +3,7 @@ * All rights reserved. */ -package dev.salmonllama.exceptions; +package dev.salmonllama.fsbot.exceptions; import java.sql.SQLException; From b2da583fa183e00738c529f491e63ff573ffdd04 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 15 Feb 2020 00:01:32 -0500 Subject: [PATCH 005/157] Added integer parameter support --- .../java/dev/salmonllama/fsbot/database/DatabaseProvider.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index b93f6b7..d4f83fe 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -50,6 +50,9 @@ public class DatabaseProvider { if (p instanceof String) { query.setString(index, (String) p); } + else if (p instanceof Integer) { + query.setInt(index, (int) p); + } else if (p instanceof Boolean) { query.setBoolean(index, (boolean) p); } From a8936d14715fbef003d23e4e0c80503b60fadcce Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 15 Feb 2020 00:46:55 -0500 Subject: [PATCH 006/157] Added more operations for outfits --- .../controllers/OutfitController.java | 80 +++++++++++++++++-- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 9d2b28d..1e93497 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -14,30 +14,96 @@ import java.sql.SQLException; public class OutfitController { public static void insert(OutfitModel outfit) { try { - FSDB.get().insert( - "INSERT INTO outfits('id', 'link') VALUES (?, ?)", - outfit.id, outfit.link - ); + FSDB.get().insert("INSERT INTO outfits('id', 'link') VALUES (?, ?)", outfit.id, outfit.link); } catch (SQLException e) { e.printStackTrace(); } } public static OutfitModel findById(String id) throws SQLException { - OutfitModel outfit; + OutfitModel outfit = null; try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id)) { if (rs.next()) { outfit = mapObject(rs); } + rs.getStatement().close(); } catch (SQLException e) { e.printStackTrace(); } + return outfit; + } - return null; + public static OutfitModel findRandom() throws SQLException { + OutfitModel outfit = null; + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits ORDERBY random() LIMIT 1")) { + if (rs.next()) { + outfit = mapObject(rs); + } + rs.getStatement().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return outfit; + } + + public static OutfitModel findRandomByTag(String tag) { + OutfitModel outfit = null; + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? ORDERBY random() LIMIT 1", tag)) { + if (rs.next()) { + outfit = mapObject(rs); + } + rs.getStatement().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return outfit; + } + + public static OutfitModel findRandomBySubmitter(String submitterId) { + OutfitModel outfit = null; + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? ORDERBY random() LIMIT 1", submitterId)) { + if (rs.next()) { + outfit = mapObject(rs); + } + rs.getStatement().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return outfit; + } + + public static int countOutfits() { + int count = 0; + try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits")) { + if (rs.next()) { + count = rs.getInt("count"); + } + rs.getStatement().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return count; + } + + public static int countOutfitsBySubmitter(String submitterId) { + int count = 0; + try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ?", submitterId)) { + if (rs.next()) { + count = rs.getInt("count"); + } + rs.getStatement().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return count; } private static OutfitModel mapObject(ResultSet rs) throws SQLException { - return new OutfitModel.OutfitBuilder(rs.getString("link"), rs.getString("submitter"), rs.getString("tag")) + return new OutfitModel.OutfitBuilder( + rs.getString("link"), + rs.getString("submitter"), + rs.getString("tag") + ) .setId(rs.getString("id")) .setCreated(rs.getTimestamp("created")) .setUpdated(rs.getTimestamp("updated")) From a7f0556db955681c38e62c5a7865060d10ea3b20 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 15 Feb 2020 01:40:38 -0500 Subject: [PATCH 007/157] Changed mapping paradigm --- .../controllers/OutfitController.java | 33 +++++---- .../fsbot/database/models/OutfitModel.java | 69 +------------------ 2 files changed, 18 insertions(+), 84 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 1e93497..a318c73 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -21,7 +21,7 @@ public class OutfitController { } public static OutfitModel findById(String id) throws SQLException { - OutfitModel outfit = null; + OutfitModel outfit = new OutfitModel(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id)) { if (rs.next()) { outfit = mapObject(rs); @@ -34,7 +34,7 @@ public class OutfitController { } public static OutfitModel findRandom() throws SQLException { - OutfitModel outfit = null; + OutfitModel outfit = new OutfitModel(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits ORDERBY random() LIMIT 1")) { if (rs.next()) { outfit = mapObject(rs); @@ -47,7 +47,7 @@ public class OutfitController { } public static OutfitModel findRandomByTag(String tag) { - OutfitModel outfit = null; + OutfitModel outfit = new OutfitModel(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? ORDERBY random() LIMIT 1", tag)) { if (rs.next()) { outfit = mapObject(rs); @@ -60,7 +60,7 @@ public class OutfitController { } public static OutfitModel findRandomBySubmitter(String submitterId) { - OutfitModel outfit = null; + OutfitModel outfit = new OutfitModel(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? ORDERBY random() LIMIT 1", submitterId)) { if (rs.next()) { outfit = mapObject(rs); @@ -99,18 +99,17 @@ public class OutfitController { } private static OutfitModel mapObject(ResultSet rs) throws SQLException { - return new OutfitModel.OutfitBuilder( - rs.getString("link"), - rs.getString("submitter"), - rs.getString("tag") - ) - .setId(rs.getString("id")) - .setCreated(rs.getTimestamp("created")) - .setUpdated(rs.getTimestamp("updated")) - .setDeleted(rs.getBoolean("deleted")) - .setFeatured(rs.getBoolean("featured")) - .setDisplayCount(rs.getInt("display_count")) - .setDeletionHash(rs.getString("deletion_hash")) - .build(); + OutfitModel outfit = new OutfitModel(); + outfit.id = rs.getString("id"); + outfit.link = rs.getString("link"); + outfit.tag = rs.getString("tag"); + outfit.submitter = rs.getString("submitter"); + outfit.created = rs.getTimestamp("created"); + outfit.updated = rs.getTimestamp("updated"); + outfit.deleted = rs.getBoolean("deleted"); + outfit.featured = rs.getBoolean("featured"); + outfit.displayCount = rs.getInt("display_count"); + outfit.deletionHash = rs.getString("deletion_hash"); + return outfit; } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java b/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java index 08bd88d..7fddeb1 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java @@ -21,15 +21,8 @@ public class OutfitModel extends DatabaseModel { public int displayCount = 0; public String deletionHash = ""; - private OutfitModel(OutfitBuilder builder) { - id = builder.id; - link = builder.link; - submitter = builder.submitter; - tag = builder.tag; - created = builder.created; - updated = builder.updated; - deleted = builder.deleted; - deletionHash = builder.deletionHash; + public OutfitModel() { + } public static String schema() { @@ -45,62 +38,4 @@ public class OutfitModel extends DatabaseModel { "display_count INT" + "deletion_hash TEXT)"; } - - public static class OutfitBuilder { - public String id = ""; - public final String link; - public final String submitter; - public String tag; - public Timestamp created = null; - public Timestamp updated = null; - public boolean deleted = false; - public boolean featured = false; - public int displayCount = 0; - public String deletionHash = ""; - - public OutfitBuilder(String link, String submitter, String tag) { - this.link = link; - this.submitter = submitter; - this.tag = tag; - } - - public OutfitBuilder setId(String id) { - this.id = id; - return this; - } - - public OutfitBuilder setCreated(Timestamp created) { - this.created = created; - return this; - } - - public OutfitBuilder setUpdated(Timestamp updated) { - this.updated = updated; - return this; - } - - public OutfitBuilder setDeleted(boolean deleted) { - this.deleted = deleted; - return this; - } - - public OutfitBuilder setFeatured(boolean featured) { - this.featured = featured; - return this; - } - - public OutfitBuilder setDisplayCount(int displayCount) { - this.displayCount = displayCount; - return this; - } - - public OutfitBuilder setDeletionHash(String hash) { - this.deletionHash = hash; - return this; - } - - public OutfitModel build() { - return new OutfitModel(this); - } - } } From a0d21342a2401b573056b009041a9ccc46492740 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 17 Feb 2020 15:01:37 -0500 Subject: [PATCH 008/157] Added conditions for excluding deleted outfits --- .../fsbot/database/controllers/OutfitController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index a318c73..73614c4 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -35,7 +35,7 @@ public class OutfitController { public static OutfitModel findRandom() throws SQLException { OutfitModel outfit = new OutfitModel(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits ORDERBY random() LIMIT 1")) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDERBY random() LIMIT 1")) { if (rs.next()) { outfit = mapObject(rs); } @@ -48,7 +48,7 @@ public class OutfitController { public static OutfitModel findRandomByTag(String tag) { OutfitModel outfit = new OutfitModel(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? ORDERBY random() LIMIT 1", tag)) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDERBY random() LIMIT 1", tag)) { if (rs.next()) { outfit = mapObject(rs); } @@ -61,7 +61,7 @@ public class OutfitController { public static OutfitModel findRandomBySubmitter(String submitterId) { OutfitModel outfit = new OutfitModel(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? ORDERBY random() LIMIT 1", submitterId)) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDERBY random() LIMIT 1", submitterId)) { if (rs.next()) { outfit = mapObject(rs); } @@ -74,7 +74,7 @@ public class OutfitController { public static int countOutfits() { int count = 0; - try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits")) { + try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 0")) { if (rs.next()) { count = rs.getInt("count"); } @@ -87,7 +87,7 @@ public class OutfitController { public static int countOutfitsBySubmitter(String submitterId) { int count = 0; - try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ?", submitterId)) { + try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ? AND deleted = 0", submitterId)) { if (rs.next()) { count = rs.getInt("count"); } From ec5960321eecc9fcb34b72a653a92def16d73a78 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 19 Feb 2020 22:24:42 -0500 Subject: [PATCH 009/157] Renamed OutfitModel; Fixed typo in #schema() --- .../fsbot/database/models/{OutfitModel.java => Outfit.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/main/java/dev/salmonllama/fsbot/database/models/{OutfitModel.java => Outfit.java} (89%) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java similarity index 89% rename from src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java rename to src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 7fddeb1..cf9b707 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/OutfitModel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -9,7 +9,7 @@ import dev.salmonllama.fsbot.database.DatabaseModel; import java.sql.Timestamp; -public class OutfitModel extends DatabaseModel { +public class Outfit extends DatabaseModel { public String id = ""; public String link = ""; public String submitter = ""; @@ -21,7 +21,7 @@ public class OutfitModel extends DatabaseModel { public int displayCount = 0; public String deletionHash = ""; - public OutfitModel() { + public Outfit() { } @@ -35,7 +35,7 @@ public class OutfitModel extends DatabaseModel { "updated TEXT," + "deleted TEXT," + "featured TEXT," + - "display_count INT" + + "display_count INT," + "deletion_hash TEXT)"; } } From 504630e191c4b7ee94eb15ef606d49d4327614ec Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 19 Feb 2020 22:25:06 -0500 Subject: [PATCH 010/157] Completed insert statement --- .../dev/salmonllama/fsbot/database/FSDB.java | 4 +- .../controllers/OutfitController.java | 40 +++++++++++++------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index 866cce9..406dc54 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -7,7 +7,7 @@ package dev.salmonllama.fsbot.database; import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.database.models.OutfitModel; +import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.SQLException; import java.util.HashMap; @@ -38,7 +38,7 @@ public class FSDB { private static void prepareTables() { try { - get().query(OutfitModel.schema()); + get().query(Outfit.schema()); } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 73614c4..608549b 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -6,22 +6,36 @@ package dev.salmonllama.fsbot.database.controllers; import dev.salmonllama.fsbot.database.FSDB; -import dev.salmonllama.fsbot.database.models.OutfitModel; +import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; public class OutfitController { - public static void insert(OutfitModel outfit) { + public static void insert(Outfit outfit) { try { - FSDB.get().insert("INSERT INTO outfits('id', 'link') VALUES (?, ?)", outfit.id, outfit.link); + FSDB.get().insert( + "INSERT INTO " + + "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'deletion_hash') " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + outfit.id, + outfit.link, + outfit.submitter, + outfit.tag, + outfit.created, + outfit.updated, + outfit.deleted, + outfit.featured, + outfit.displayCount, + outfit.deletionHash + ); } catch (SQLException e) { e.printStackTrace(); } } - public static OutfitModel findById(String id) throws SQLException { - OutfitModel outfit = new OutfitModel(); + public static Outfit findById(String id) throws SQLException { + Outfit outfit = new Outfit(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id)) { if (rs.next()) { outfit = mapObject(rs); @@ -33,8 +47,8 @@ public class OutfitController { return outfit; } - public static OutfitModel findRandom() throws SQLException { - OutfitModel outfit = new OutfitModel(); + public static Outfit findRandom() throws SQLException { + Outfit outfit = new Outfit(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDERBY random() LIMIT 1")) { if (rs.next()) { outfit = mapObject(rs); @@ -46,8 +60,8 @@ public class OutfitController { return outfit; } - public static OutfitModel findRandomByTag(String tag) { - OutfitModel outfit = new OutfitModel(); + public static Outfit findRandomByTag(String tag) { + Outfit outfit = new Outfit(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDERBY random() LIMIT 1", tag)) { if (rs.next()) { outfit = mapObject(rs); @@ -59,8 +73,8 @@ public class OutfitController { return outfit; } - public static OutfitModel findRandomBySubmitter(String submitterId) { - OutfitModel outfit = new OutfitModel(); + public static Outfit findRandomBySubmitter(String submitterId) { + Outfit outfit = new Outfit(); try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDERBY random() LIMIT 1", submitterId)) { if (rs.next()) { outfit = mapObject(rs); @@ -98,8 +112,8 @@ public class OutfitController { return count; } - private static OutfitModel mapObject(ResultSet rs) throws SQLException { - OutfitModel outfit = new OutfitModel(); + private static Outfit mapObject(ResultSet rs) throws SQLException { + Outfit outfit = new Outfit(); outfit.id = rs.getString("id"); outfit.link = rs.getString("link"); outfit.tag = rs.getString("tag"); From 9b2a22727c868c10d61db8834b3d2a96e4a5cc76 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 19 Feb 2020 23:44:42 -0500 Subject: [PATCH 011/157] Fixed ORDER BY gaffe. Because I'm dumb. --- .../fsbot/database/controllers/OutfitController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 608549b..74c55d9 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -49,7 +49,7 @@ public class OutfitController { public static Outfit findRandom() throws SQLException { Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDERBY random() LIMIT 1")) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDER BY random() LIMIT 1")) { if (rs.next()) { outfit = mapObject(rs); } @@ -62,7 +62,7 @@ public class OutfitController { public static Outfit findRandomByTag(String tag) { Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDERBY random() LIMIT 1", tag)) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDER BY random() LIMIT 1", tag)) { if (rs.next()) { outfit = mapObject(rs); } @@ -75,7 +75,7 @@ public class OutfitController { public static Outfit findRandomBySubmitter(String submitterId) { Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDERBY random() LIMIT 1", submitterId)) { + try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDER BY random() LIMIT 1", submitterId)) { if (rs.next()) { outfit = mapObject(rs); } From 06a2ea2f5ccb54ff6a060f66458da666ba9a0b15 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 19 Feb 2020 23:45:10 -0500 Subject: [PATCH 012/157] Fixed SQLite TimeStamp bugs --- .../database/controllers/OutfitController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 74c55d9..fdf53b7 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -10,9 +10,18 @@ import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; public class OutfitController { public static void insert(Outfit outfit) { + if (outfit.created == null) { + outfit.created = new Timestamp(System.currentTimeMillis()); + } + + if (outfit.updated == null) { + outfit.updated = new Timestamp(System.currentTimeMillis()); + } + try { FSDB.get().insert( "INSERT INTO " + @@ -118,8 +127,8 @@ public class OutfitController { outfit.link = rs.getString("link"); outfit.tag = rs.getString("tag"); outfit.submitter = rs.getString("submitter"); - outfit.created = rs.getTimestamp("created"); - outfit.updated = rs.getTimestamp("updated"); + outfit.created = new Timestamp(rs.getLong("created")); + outfit.updated = new Timestamp(rs.getLong("updated")); outfit.deleted = rs.getBoolean("deleted"); outfit.featured = rs.getBoolean("featured"); outfit.displayCount = rs.getInt("display_count"); From 4b9f7ff1211477ee78276ce388ba8e54c23cc4dc Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 19 Feb 2020 23:45:23 -0500 Subject: [PATCH 013/157] Added toString() method --- .../java/dev/salmonllama/fsbot/database/models/Outfit.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index cf9b707..682a815 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -38,4 +38,11 @@ public class Outfit extends DatabaseModel { "display_count INT," + "deletion_hash TEXT)"; } + + @Override + public String toString() { + return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s", + id, link, submitter, tag, created, updated, deleted, featured, displayCount, deletionHash + ); + } } From 21f758e3c31d0b1d5cb6f9ed611484be1cccc63c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 00:30:00 -0500 Subject: [PATCH 014/157] Added model and controller for GalleryChannels --- .../controllers/GalleryController.java | 49 +++++++++++++++++++ .../fsbot/database/models/GalleryChannel.java | 35 +++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java new file mode 100644 index 0000000..507c57f --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.GalleryChannel; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; + +public class GalleryController { + public static void insert(GalleryChannel gallery) throws SQLException { + FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag')" + + "VALUES(?, ?, ?, ?, ?)", + gallery.serverId, + gallery.serverName, + gallery.channelId, + gallery.channelName, + gallery.tag + ); + } + + public static Collection getGalleriesByServer(String serverId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE server_id = ?", serverId); + + Collection galleries = new ArrayList<>(); + while (rs.next()) { + galleries.add(mapObject(rs)); + } + + return galleries; + } + + private static GalleryChannel mapObject(ResultSet rs) throws SQLException { + GalleryChannel gallery = new GalleryChannel(); + gallery.serverId = rs.getString("server_id"); + gallery.serverName = rs.getString("server_name"); + gallery.channelId = rs.getString("channel_id"); + gallery.channelName = rs.getString("channel_name"); + gallery.tag = rs.getString("tag"); + + return gallery; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java new file mode 100644 index 0000000..cf736fd --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +public class GalleryChannel extends DatabaseModel { + public String serverId; + public String serverName; + public String channelId; + public String channelName; + public String tag; + + public GalleryChannel() { + + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS galleries (" + + "server_id TEXT," + + "server_name TEXT," + + "channel_id TEXT," + // PRIMARY KEY? There can only be one gallery per channel. + "channel_name TEXT," + + "tag TEXT)"; + } + + @Override + public String toString() { + return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, channel name: %s, tag: %s]", + serverId, serverName, channelId, channelName, tag); + } +} From 7503742cc4667aa60ae058018189523e445d97a9 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 00:30:31 -0500 Subject: [PATCH 015/157] Added Gallery schema to table prep --- src/main/java/dev/salmonllama/fsbot/database/FSDB.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index 406dc54..62c4c87 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -7,6 +7,7 @@ package dev.salmonllama.fsbot.database; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.SQLException; @@ -39,6 +40,7 @@ public class FSDB { private static void prepareTables() { try { get().query(Outfit.schema()); + get().query(GalleryChannel.schema()); } catch (SQLException e) { e.printStackTrace(); } From c9539d7d5e0f159af250d3c97164d0ec698dd36a Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 00:30:52 -0500 Subject: [PATCH 016/157] Added closing bracket in Outfit's toString() --- src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 682a815..c14f252 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -41,7 +41,7 @@ public class Outfit extends DatabaseModel { @Override public String toString() { - return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s", + return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s]", id, link, submitter, tag, created, updated, deleted, featured, displayCount, deletionHash ); } From 6e6074b770037f3a1bd83f1180d2a3fbd6f0d893 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 15:58:53 -0500 Subject: [PATCH 017/157] Refactored CreateGallery with new Database --- .../developer/CreateGalleryCommand.java | 92 +++++++++---------- .../controllers/GalleryController.java | 10 ++ 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 1b8c93b..270786b 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -8,6 +8,8 @@ package dev.salmonllama.fsbot.commands.developer; import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.GalleryController; +import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; @@ -17,6 +19,7 @@ import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; import java.awt.*; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -34,63 +37,50 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs static final Connection CONN = R.connection().hostname("localhost").port(28015).connect(); @Override - public void onCommand(CommandContext ctx) { - Optional opServer = ctx.getServer(); - TextChannel channel = ctx.getChannel(); - String[] args = ctx.getArgs(); - String targetChannelId = channel.getIdAsString(); - String targetChannelName = channel.asServerChannel().get().getName(); // TODO: un-band-aid this. - - if (!opServer.isPresent()) { - ctx.reply("This command can only be used in a server"); + public void onCommand(CommandContext ctx) { // TODO: Might need some logic help... + if (ctx.isPrivateMessage()) { + ctx.reply("This command can only be used in a server!"); // TODO: Stop this. Turn this into a preset no-no embed. return; } + // Check if the channel is already a registered gallery channel. + // Create a gallery channel of the current channel. + // Store the gallery channel in the database. - Server server = opServer.get(); - String targetServerName = server.getName(); - String targetServerId = server.getIdAsString(); - - if (!server.getIdAsString().equals(BotConfig.HOME_SERVER)) { - channel.sendMessage("Fashion galleries can only be created in the Fashionscape server"); - return; + String channelId = ctx.getChannel().getIdAsString(); + try { + if (GalleryController.galleryExists(channelId)) { + ctx.reply("A gallery already exists in this channel, can not create a new one."); + return; + } + } catch (SQLException e) { + ctx.reply("An error occurred"); // TODO: error logging. } - if (args.length < 1) { - channel.sendMessage("No Arguments provided"); - return; - } - else if (args.length > 1) { - channel.sendMessage("Too many arguments provided."); - return; + GalleryChannel gallery = new GalleryChannel(); + gallery.channelId = channelId; + String tag = ctx.getArgs()[0]; + + ctx.getServer().ifPresent(server -> { + gallery.serverId = server.getIdAsString(); + gallery.serverName = server.getName(); + }); + + ctx.getChannel().asServerTextChannel().ifPresent(channel -> gallery.channelName = channel.getName()); + + try { + GalleryController.insert(gallery); + } catch(SQLException e) { + ctx.reply("An error occurred."); // TODO: error logging. } - String tag = args[0]; - - if (R.db("fsbot").table("channels").getField("cId").contains(targetChannelId).run(CONN)) { - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.RED) - .addField("ERROR", "This channel is already gathering images"); - channel.sendMessage(embed); + EmbedBuilder embed = new EmbedBuilder() + .setColor(Color.GREEN) + .addField("Success", "Channel added to storage with the following values:") + .addField("Channel Name:", gallery.channelName) + .addField("Channel Id:", gallery.channelId) + .addField("Tag:", tag) + .addField("End:", String.format("Table \"%s\" created for images in this channel", tag)); + ctx.getChannel().sendMessage(embed); } - else { - R.db("fsbot").table("channels").insert( - R.hashMap("sName", targetServerName) - .with("sId", targetServerId) - .with("cName", targetChannelName) - .with("cId", targetChannelId) - .with("tag", tag) - ).run(CONN); - - R.db("fsbot").tableCreate(tag).run(CONN); - - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.GREEN) - .addField("Success", "Channel added to storage with the following values:") - .addField("Channel Name:", targetChannelName) - .addField("Channel Id:", targetChannelId) - .addField("Tag:", tag) - .addField("End:", String.format("Table \"%s\" created for images in this channel", tag)); - channel.sendMessage(embed); - } - } } + diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 507c57f..9a40b13 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -33,9 +33,19 @@ public class GalleryController { galleries.add(mapObject(rs)); } + FSDB.get().close(rs); return galleries; } + public static boolean galleryExists(String channelId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 AS exists FROM galleries WHERE channel_id = ?", channelId); + + boolean exists = rs.getBoolean("exists"); + + FSDB.get().close(rs); + return exists; + } + private static GalleryChannel mapObject(ResultSet rs) throws SQLException { GalleryChannel gallery = new GalleryChannel(); gallery.serverId = rs.getString("server_id"); From efb6feb29769cba3fca37fa0c75c65cfaf4ec173 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 15:59:10 -0500 Subject: [PATCH 018/157] Added resource closure to Provider --- .../dev/salmonllama/fsbot/database/DatabaseProvider.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index d4f83fe..38eda5f 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -92,4 +92,9 @@ public class DatabaseProvider { resolveParameters(query, params); return query.executeQuery(); } + + public void close(ResultSet rs) throws SQLException { + rs.getStatement().close(); + rs.close(); + } } From e061acc8ef400ea36a3c40963e1e25be681f0cef Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 15:59:59 -0500 Subject: [PATCH 019/157] TODO on outfit controller --- .../fsbot/database/controllers/OutfitController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index fdf53b7..4d7ae48 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -12,7 +12,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; -public class OutfitController { +public class OutfitController { // TODO: Refactor for closing via FSDB.get(). SQLExceptions should be elevated; thrown in the command for logging. public static void insert(Outfit outfit) { if (outfit.created == null) { outfit.created = new Timestamp(System.currentTimeMillis()); From 5e788021aabb54df27238f67feb612d00f6cad05 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 16:00:13 -0500 Subject: [PATCH 020/157] Test command stuff --- .../fsbot/commands/developer/TestCommand.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index 295fe87..0270174 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -5,11 +5,14 @@ package dev.salmonllama.fsbot.commands.developer; +import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -24,6 +27,11 @@ public class TestCommand extends Command { @Override public void onCommand(CommandContext ctx) { - ctx.getChannel().sendMessage("Test Command has been invoked"); + try { + Outfit outfit = OutfitController.findRandom(); + ctx.reply(outfit.toString()); + } catch (SQLException e) { + ctx.reply(e.getSQLState()); + } } } From 7bd40d4b8ef3d6d957cd5ede878625ac6846cc2e Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 20 Feb 2020 18:10:38 -0500 Subject: [PATCH 021/157] Fixed, finished, and testing working AddGallery command. --- .../developer/CreateGalleryCommand.java | 20 +++++++++++++------ .../controllers/GalleryController.java | 4 ++-- .../fsbot/guthix/CommandContext.java | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 270786b..3987258 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -31,7 +31,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs @Override public String usage() { return "creategallery "; } @Override public String category() { return "Developer"; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "addgall")); } + @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); } static final RethinkDB R = RethinkDB.r; static final Connection CONN = R.connection().hostname("localhost").port(28015).connect(); @@ -42,6 +42,10 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs ctx.reply("This command can only be used in a server!"); // TODO: Stop this. Turn this into a preset no-no embed. return; } + if (ctx.getArgs().length != 1) { + ctx.reply("Args are incorrect"); + return; + } // Check if the channel is already a registered gallery channel. // Create a gallery channel of the current channel. // Store the gallery channel in the database. @@ -53,12 +57,15 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs return; } } catch (SQLException e) { - ctx.reply("An error occurred"); // TODO: error logging. + ctx.reply(String.format("Error: %s", e.getMessage())); // TODO: error logging. + return; } + String tag = ctx.getArgs()[0]; + GalleryChannel gallery = new GalleryChannel(); gallery.channelId = channelId; - String tag = ctx.getArgs()[0]; + gallery.tag = tag; ctx.getServer().ifPresent(server -> { gallery.serverId = server.getIdAsString(); @@ -70,16 +77,17 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs try { GalleryController.insert(gallery); } catch(SQLException e) { - ctx.reply("An error occurred."); // TODO: error logging. + ctx.reply(String.format("Error: %s", e.getMessage())); // TODO: error logging. + return; } EmbedBuilder embed = new EmbedBuilder() .setColor(Color.GREEN) - .addField("Success", "Channel added to storage with the following values:") + .addField("Success", "Gallery has been created:") .addField("Channel Name:", gallery.channelName) .addField("Channel Id:", gallery.channelId) .addField("Tag:", tag) - .addField("End:", String.format("Table \"%s\" created for images in this channel", tag)); + .addField("End:", String.format("This channel is now being tracked under: %s", tag)); ctx.getChannel().sendMessage(embed); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 9a40b13..d4b35a9 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -38,9 +38,9 @@ public class GalleryController { } public static boolean galleryExists(String channelId) throws SQLException { - ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 AS exists FROM galleries WHERE channel_id = ?", channelId); + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM galleries WHERE channel_id = ?) AS hmm", channelId); - boolean exists = rs.getBoolean("exists"); + boolean exists = rs.getBoolean("hmm"); FSDB.get().close(rs); return exists; diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/CommandContext.java b/src/main/java/dev/salmonllama/fsbot/guthix/CommandContext.java index a59b78d..f997a1c 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/CommandContext.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/CommandContext.java @@ -125,6 +125,7 @@ public class CommandContext { String usedAlias, String[] args ) { + this.event = event; this.api = event.getApi(); this.message = event.getMessage(); this.author = event.getMessageAuthor(); From a309acd3449937c917f2fd9b672792a3c1e7eb7a Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 22 Feb 2020 12:15:21 -0500 Subject: [PATCH 022/157] Commented/Removed old db ops that run every time. --- src/main/java/dev/salmonllama/fsbot/Main.java | 1 - .../utilities/database/DatabaseUtilities.java | 142 +++++++++--------- 2 files changed, 71 insertions(+), 72 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 78d7923..394ecb3 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -34,7 +34,6 @@ public class Main { new DiscordApiBuilder().setToken(BotConfig.TOKEN).login().thenAccept(api -> { DatabaseUtilities db = new DatabaseUtilities(r, conn, api); - db.tableSetup(); Guthix guthix = new Guthix(api, db); diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java b/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java index 879eac2..4b9d197 100644 --- a/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java +++ b/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java @@ -29,7 +29,7 @@ public class DatabaseUtilities { } private Table getTable(String table) { - if (this.r.db("fsbot").tableList().contains(table).run(this.conn)) { + if (this.r.db("fsbot").tableList().contains(table).run(this.conn) != null) { return this.r.db("fsbot").table(table); } else { @@ -164,83 +164,83 @@ public class DatabaseUtilities { .run(conn); } - public void newServerProcess(Server server) { + // public void newServerProcess(Server server) { - if (this.r.db("fsbot").table("serverConf").contains(server.getIdAsString()).run(this.conn)) { - return; - } + // if (this.r.db("fsbot").table("serverConf").contains(server.getIdAsString()).run(this.conn)) { + // return; + // } - String serverName = server.getName(); - String serverId = server.getIdAsString(); - String logChannel = "null"; - String giveawayChannel = "null"; - String welcomeChannel = "null"; - String defaultWelcome = "welcome to the server"; + // String serverName = server.getName(); + // String serverId = server.getIdAsString(); + // String logChannel = "null"; + // String giveawayChannel = "null"; + // String welcomeChannel = "null"; + // String defaultWelcome = "welcome to the server"; - this.r.db("fsbot").table("serverConf").insert( - this.r.hashMap("id", serverId) - .with("name", serverName) - .with("logChannel", logChannel) - .with("giveawayChannel", giveawayChannel) - .with("welcomeMsg", defaultWelcome) - .with("welcomeChannel", welcomeChannel) - .with("prefix", "~") - ).run(this.conn); - } + // this.r.db("fsbot").table("serverConf").insert( + // this.r.hashMap("id", serverId) + // .with("name", serverName) + // .with("logChannel", logChannel) + // .with("giveawayChannel", giveawayChannel) + // .with("welcomeMsg", defaultWelcome) + // .with("welcomeChannel", welcomeChannel) + // .with("prefix", "~") + // ).run(this.conn); + // } - public void tableSetup() { // TODO: Fix this -- invert conditionals, just create the tables. -> if *not* exist then create - // Check for database existence, if not, create - if (r.dbList().contains("fsbot").run(conn)) { -// System.out.println("database 'fsbot' already exists."); - } - else { - r.dbCreate("fsbot").run(conn); - System.out.println("database fsbot did not exist, and has been created"); - } +// public void tableSetup() { // TODO: Fix this -- invert conditionals, just create the tables. -> if *not* exist then create +// // Check for database existence, if not, create +// if (r.dbList().contains("fsbot").run(conn)) { +// // System.out.println("database 'fsbot' already exists."); +// } +// else { +// r.dbCreate("fsbot").run(conn); +// System.out.println("database fsbot did not exist, and has been created"); +// } - // Check for channels table existence, if not, create - if (r.db("fsbot").tableList().contains("channels").run(conn)) { -// System.out.println("table channels already exists"); - } - else { - r.db("fsbot").tableCreate("channels").run(conn); - System.out.println("table channels did not exist, and has been created."); - } +// // Check for channels table existence, if not, create +// if (r.db("fsbot").tableList().contains("channels").run(conn)) { +// // System.out.println("table channels already exists"); +// } +// else { +// r.db("fsbot").tableCreate("channels").run(conn); +// System.out.println("table channels did not exist, and has been created."); +// } - // Check for serverconf table existence, if not, create - if (r.db("fsbot").tableList().contains("serverConf").run(conn)) { -// System.out.println("table serverConf already exists"); - } - else { - r.db("fsbot").tableCreate("serverConf").run(conn); - System.out.println("table serverConf did not exist, and has been created"); - } +// // Check for serverconf table existence, if not, create +// if (r.db("fsbot").tableList().contains("serverConf").run(conn)) { +// // System.out.println("table serverConf already exists"); +// } +// else { +// r.db("fsbot").tableCreate("serverConf").run(conn); +// System.out.println("table serverConf did not exist, and has been created"); +// } - // Check for permissions table existene, if not, create - if (r.db("fsbot").tableList().contains("permissions").run(conn)) { -// System.out.println("table permissions already exists"); - } - else { - r.db("fsbot").tableCreate("permissions").run(conn); - System.out.println("table permissions did not exist and has been created"); - } +// // Check for permissions table existene, if not, create +// if (r.db("fsbot").tableList().contains("permissions").run(conn)) { +// // System.out.println("table permissions already exists"); +// } +// else { +// r.db("fsbot").tableCreate("permissions").run(conn); +// System.out.println("table permissions did not exist and has been created"); +// } - // Check for outfits table existence, if not, create - if (r.db("fsbot").tableList().contains("outfits").run(conn)) { -// System.out.println("table outfits already exists"); - } - else { - r.db("fsbot").tableCreate("outfits").run(conn); - System.out.println("table outfits did not exist and has been created"); - } +// // Check for outfits table existence, if not, create +// if (r.db("fsbot").tableList().contains("outfits").run(conn)) { +// // System.out.println("table outfits already exists"); +// } +// else { +// r.db("fsbot").tableCreate("outfits").run(conn); +// System.out.println("table outfits did not exist and has been created"); +// } - // Check for colourRoles table existence, if not, create - if (r.db("fsbot").tableList().contains("colourRoles").run(conn)) { -// System.out.println("table colourRoles already exists"); - } - else { - r.db("fsbot").tableCreate("colourRoles").run(conn); - System.out.println("table colourRoles did not exist and has been created"); - } - } +// // Check for colourRoles table existence, if not, create +// if (r.db("fsbot").tableList().contains("colourRoles").run(conn)) { +// // System.out.println("table colourRoles already exists"); +// } +// else { +// r.db("fsbot").tableCreate("colourRoles").run(conn); +// System.out.println("table colourRoles did not exist and has been created"); +// } +// } } From 29308afaedce4be342f267d3910ad65938215047 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 22 Feb 2020 12:15:40 -0500 Subject: [PATCH 023/157] Disabled imageListener and ServerJoined --- .../fsbot/listeners/ImageListener.java | 188 +++++++++--------- .../fsbot/listeners/ServerJoined.java | 14 +- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 0db9966..fc569c3 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -32,126 +32,126 @@ public class ImageListener implements MessageCreateListener { } @Override - public void onMessageCreate(MessageCreateEvent event) { + public void onMessageCreate(MessageCreateEvent event) { // TODO: This needs immediate help - event.getMessage().getUserAuthor().ifPresent(author -> { - if (author.isBot()) { - return; - } - }); + // event.getMessage().getUserAuthor().ifPresent(author -> { + // if (author.isBot()) { + // return; + // } + // }); - Message message = event.getMessage(); - String channel = event.getChannel().getIdAsString(); - String submitter = event.getMessage().getAuthor().getIdAsString(); + // Message message = event.getMessage(); + // String channel = event.getChannel().getIdAsString(); + // String submitter = event.getMessage().getAuthor().getIdAsString(); - if (message.getAttachments().stream().noneMatch(MessageAttachment::isImage)) { - return; - } + // if (message.getAttachments().stream().noneMatch(MessageAttachment::isImage)) { + // return; + // } - // If the message contains an image, check if the channel is being listened to for image storage + // // If the message contains an image, check if the channel is being listened to for image storage - String dbTable = null; + // String dbTable = null; - if(r.db("fsbot").table("channels").g("cId").contains(channel).run(conn)) { - Cursor cursor = r.db("fsbot") - .table("channels") - .filter(row -> row.getField("cId").eq(channel)) - .getField("tag") - .run(conn); + // if(r.db("fsbot").table("channels").g("cId").contains(channel).run(conn)) { + // Cursor cursor = r.db("fsbot") + // .table("channels") + // .filter(row -> row.getField("cId").eq(channel)) + // .getField("tag") + // .run(conn); - List tags = cursor.toList(); + // List tags = cursor.toList(); - for (Object tag : tags) { - dbTable = tag.toString(); - } - } - else { - return; - } + // for (Object tag : tags) { + // dbTable = tag.toString(); + // } + // } + // else { + // return; + // } - List attachments = message.getAttachments(); + // List attachments = message.getAttachments(); - for (MessageAttachment attachment : attachments) { - String discordLink = attachment.getUrl().toString(); - String imgurLink = null; + // for (MessageAttachment attachment : attachments) { + // String discordLink = attachment.getUrl().toString(); + // String imgurLink = null; - // Upload the image to imgur - try { - OkHttpClient client = new OkHttpClient(); + // // Upload the image to imgur + // try { + // OkHttpClient client = new OkHttpClient(); - MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); + // MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); - RequestBody body = RequestBody.create( - mediaType, - String.format("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", discordLink)); + // RequestBody body = RequestBody.create( + // mediaType, + // String.format("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", discordLink)); - Request request = new Request.Builder() - .url("https://api.imgur.com/3/image") - .method("POST", body) - .header("Authorization", BotConfig.IMGUR_ID) - .header("Authorization", BotConfig.IMGUR_BEARER) - .build(); + // Request request = new Request.Builder() + // .url("https://api.imgur.com/3/image") + // .method("POST", body) + // .header("Authorization", BotConfig.IMGUR_ID) + // .header("Authorization", BotConfig.IMGUR_BEARER) + // .build(); - Response response = client.newCall(request).execute(); + // Response response = client.newCall(request).execute(); - if (response.body() == null) { - event.getChannel().sendMessage("Something went wrong!"); - return; - } + // if (response.body() == null) { + // event.getChannel().sendMessage("Something went wrong!"); + // return; + // } - String jsonData = response.body().string(); - imgurLink = new JSONObject(jsonData).getJSONObject("data").getString("link"); + // String jsonData = response.body().string(); + // imgurLink = new JSONObject(jsonData).getJSONObject("data").getString("link"); - if (imgurLink == null) { - event.getChannel().sendMessage("Something went wrong!"); - return; - } + // if (imgurLink == null) { + // event.getChannel().sendMessage("Something went wrong!"); + // return; + // } - } - catch (Exception e) { - e.printStackTrace(); - } + // } + // catch (Exception e) { + // e.printStackTrace(); + // } - r.db("fsbot").table("outfits").insert( - r.hashMap("link", imgurLink) - .with("submitter", submitter) - .with("tag", dbTable) - ).run(conn); + // r.db("fsbot").table("outfits").insert( + // r.hashMap("link", imgurLink) + // .with("submitter", submitter) + // .with("tag", dbTable) + // ).run(conn); - final String finalLink = imgurLink; - Cursor imgId = r.db("fsbot") - .table("outfits") - .filter(row -> row.getField("link").eq(finalLink)) - .getField("id") - .run(conn); + // final String finalLink = imgurLink; + // Cursor imgId = r.db("fsbot") + // .table("outfits") + // .filter(row -> row.getField("link").eq(finalLink)) + // .getField("id") + // .run(conn); - String embedId = null; - List imgIds = imgId.toList(); - for (Object id : imgIds) { - embedId = id.toString(); - } + // String embedId = null; + // List imgIds = imgId.toList(); + // for (Object id : imgIds) { + // embedId = id.toString(); + // } - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Added an entry of tag " + dbTable) - .setColor(Color.GREEN) - .setThumbnail(imgurLink) - .setAuthor("Placeholder") - .setFooter(embedId); + // EmbedBuilder embed = new EmbedBuilder() + // .setTitle("Added an entry of tag " + dbTable) + // .setColor(Color.GREEN) + // .setThumbnail(imgurLink) + // .setAuthor("Placeholder") + // .setFooter(embedId); - event.getApi().getUserById(submitter).thenAccept(user -> embed.setAuthor(user.getDiscriminatedName())); + // event.getApi().getUserById(submitter).thenAccept(user -> embed.setAuthor(user.getDiscriminatedName())); - event.getApi().getChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { - chnl.asTextChannel().ifPresent(txtchnl -> { - txtchnl.sendMessage(embed).join(); - }); - }); + // event.getApi().getChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { + // chnl.asTextChannel().ifPresent(txtchnl -> { + // txtchnl.sendMessage(embed).join(); + // }); + // }); - if (dbTable.equals("disaster")) { - // Add custom panda emoji: <:PandaWut:433045737245376522> - message.addReaction("PandaWut:433045737245376522"); - } + // if (dbTable.equals("disaster")) { + // // Add custom panda emoji: <:PandaWut:433045737245376522> + // message.addReaction("PandaWut:433045737245376522"); + // } - message.addReaction(EmojiParser.parseToUnicode(":heartpulse:")); - } + // message.addReaction(EmojiParser.parseToUnicode(":heartpulse:")); + // } } } \ No newline at end of file diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java index 7ad7035..65c8e49 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java @@ -23,13 +23,13 @@ public class ServerJoined implements ServerJoinListener { this.db = db; } - public void onServerJoin(ServerJoinEvent event) { - db.newServerProcess(event.getServer()); + public void onServerJoin(ServerJoinEvent event) { // TODO: This needs fixing yo + // db.newServerProcess(event.getServer()); - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Server joined") - .setColor(Color.GREEN) - .addInlineField("Server name:", event.getServer().getName()) - .addInlineField("Server Id:", event.getServer().getIdAsString()); + // EmbedBuilder embed = new EmbedBuilder() + // .setTitle("Server joined") + // .setColor(Color.GREEN) + // .addInlineField("Server name:", event.getServer().getName()) + // .addInlineField("Server Id:", event.getServer().getIdAsString()); } } From d18d791fc435e8b6b1af3861cf74ce4e864107e2 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 22 Feb 2020 12:16:00 -0500 Subject: [PATCH 024/157] Added new ShowGalleries command --- .../commands/staff/ShowGalleriesCommand.java | 69 +++++++++++++++++++ .../fsbot/database/models/GalleryChannel.java | 20 ++++++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 1 + 3 files changed, 90 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java new file mode 100644 index 0000000..07851ef --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.staff; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import org.javacord.api.entity.channel.ServerTextChannel; +import org.javacord.api.entity.message.embed.EmbedBuilder; +import org.javacord.api.entity.server.Server; + +import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.GalleryController; +import dev.salmonllama.fsbot.database.models.GalleryChannel; +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; + +public class ShowGalleriesCommand extends Command { + @Override public String name() { return "Show Galleries"; } + @Override public String description() { return "Shows registered gallery channels in the current server"; } + @Override public String usage() { return "showgalleries"; } + @Override public String category() { return "Staff"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("showgalleries", "listgalleries")); } + + @Override public void onCommand(CommandContext ctx) { + if (ctx.isPrivateMessage()) { + ctx.reply("This command can only be used within a server"); // TODO: Preset embeds again, yeah + return; + } + + ctx.getServer().ifPresent(server -> { + try { + Collection galleries = GalleryController.getGalleriesByServer(server.getIdAsString()); + ctx.reply(galleryEmbed(galleries, server)); + } catch (SQLException e) { + ctx.reply("An exception has occurred: " + e.getMessage()); + } + + }); + } + + EmbedBuilder galleryEmbed(Collection galleries, Server server) { // TODO: Base FSBot embed. + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Server Gallery Channels"); + + Collection mentionTags = galleries.stream().map( + galleryChannel -> server.getChannelById( + galleryChannel.getChannelId()).get() // Can call get safely -> The channel is not stored if it is not a valid ServerTextChannel + .asServerTextChannel().get()) // Same as above + .map(ServerTextChannel::getMentionTag).collect(Collectors.toList()); + + Collection tags = galleries.stream().map(GalleryChannel::getTag).collect(Collectors.toList()); + + embed.addField("Channels", String.join("\n", mentionTags), true); + embed.addField("Tags", String.join("\n", tags), true); + + return embed; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java index cf736fd..dc6f4b5 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -18,6 +18,26 @@ public class GalleryChannel extends DatabaseModel { } + public String getServerId() { + return serverId; + } + + public String getServerName() { + return serverName; + } + + public String getChannelId() { + return channelId; + } + + public String getChannelName() { + return channelName; + } + + public String getTag() { + return tag; + } + public static String schema() { return "CREATE TABLE IF NOT EXISTS galleries (" + "server_id TEXT," + diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 7e7091a..cee76d9 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -68,6 +68,7 @@ public class Guthix implements MessageCreateListener { addCommand(new OutfitInfoCommand(db)); addCommand(new SetStatusCommand()); addCommand(new WelcomeMessageCommand()); + addCommand(new ShowGalleriesCommand()); // General Commands addCommand(new PingCommand()); From 6b8ea1740f4015993460588db76015911748cc85 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 22 Feb 2020 12:26:41 -0500 Subject: [PATCH 025/157] Recategorized ShowGalleriesCommand as general --- .../commands/{staff => general}/ShowGalleriesCommand.java | 4 ++-- src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) rename src/main/java/dev/salmonllama/fsbot/commands/{staff => general}/ShowGalleriesCommand.java (96%) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java similarity index 96% rename from src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java rename to src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java index 07851ef..f5e97e2 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/ShowGalleriesCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java @@ -3,7 +3,7 @@ * All rights reserved. */ -package dev.salmonllama.fsbot.commands.staff; +package dev.salmonllama.fsbot.commands.general; import java.sql.SQLException; import java.util.ArrayList; @@ -28,7 +28,7 @@ public class ShowGalleriesCommand extends Command { @Override public String name() { return "Show Galleries"; } @Override public String description() { return "Shows registered gallery channels in the current server"; } @Override public String usage() { return "showgalleries"; } - @Override public String category() { return "Staff"; } + @Override public String category() { return "General"; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("showgalleries", "listgalleries")); } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index cee76d9..32752e0 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -5,16 +5,11 @@ package dev.salmonllama.fsbot.guthix; -import dev.salmonllama.fsbot.commands.general.HelpCommand; -import dev.salmonllama.fsbot.commands.general.SpecificOutfitCommand; +import dev.salmonllama.fsbot.commands.general.*; import dev.salmonllama.fsbot.commands.staff.OutfitInfoCommand; -import dev.salmonllama.fsbot.commands.general.OutfitCommand; import dev.salmonllama.fsbot.commands.staff.*; import dev.salmonllama.fsbot.commands.developer.InviteCommand; import dev.salmonllama.fsbot.commands.developer.CreateGalleryCommand; -import dev.salmonllama.fsbot.commands.general.ColorsCommand; -import dev.salmonllama.fsbot.commands.general.ColorCommand; -import dev.salmonllama.fsbot.commands.general.PingCommand; import dev.salmonllama.fsbot.commands.developer.EvalCommand; import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import org.javacord.api.DiscordApi; From fc09d71a522001fa54919ad5af749eee5fc9a9e8 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 22 Feb 2020 12:31:00 -0500 Subject: [PATCH 026/157] Changed ShowGalleries required permission to none --- .../fsbot/commands/general/ShowGalleriesCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java index f5e97e2..0222467 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java @@ -29,7 +29,7 @@ public class ShowGalleriesCommand extends Command { @Override public String description() { return "Shows registered gallery channels in the current server"; } @Override public String usage() { return "showgalleries"; } @Override public String category() { return "General"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("showgalleries", "listgalleries")); } @Override public void onCommand(CommandContext ctx) { From 23d3c3c904780f9f78291ce2bb848c0346dc2401 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 24 Feb 2020 23:20:18 -0500 Subject: [PATCH 027/157] Start of CompletableFuture refactor --- .../developer/CreateGalleryCommand.java | 17 ++++------------- .../commands/general/ShowGalleriesCommand.java | 11 +++++------ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 3987258..7481d2b 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -17,6 +17,7 @@ import dev.salmonllama.fsbot.guthix.PermissionType; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; +import org.javacord.api.util.logging.ExceptionLogger; import java.awt.*; import java.sql.SQLException; @@ -51,13 +52,8 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs // Store the gallery channel in the database. String channelId = ctx.getChannel().getIdAsString(); - try { - if (GalleryController.galleryExists(channelId)) { - ctx.reply("A gallery already exists in this channel, can not create a new one."); - return; - } - } catch (SQLException e) { - ctx.reply(String.format("Error: %s", e.getMessage())); // TODO: error logging. + if (GalleryController.galleryExists(channelId).join()) { // This is a value that is needed immediately. + ctx.reply("A gallery already exists in this channel, can not create a new one."); return; } @@ -74,12 +70,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs ctx.getChannel().asServerTextChannel().ifPresent(channel -> gallery.channelName = channel.getName()); - try { - GalleryController.insert(gallery); - } catch(SQLException e) { - ctx.reply(String.format("Error: %s", e.getMessage())); // TODO: error logging. - return; - } + GalleryController.insert(gallery).exceptionally(ExceptionLogger.get()); // Make a discord exception logger for the thingos EmbedBuilder embed = new EmbedBuilder() .setColor(Color.GREEN) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java index 0222467..0535a16 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java @@ -23,6 +23,7 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.util.logging.ExceptionLogger; public class ShowGalleriesCommand extends Command { @Override public String name() { return "Show Galleries"; } @@ -39,13 +40,11 @@ public class ShowGalleriesCommand extends Command { } ctx.getServer().ifPresent(server -> { - try { - Collection galleries = GalleryController.getGalleriesByServer(server.getIdAsString()); + GalleryController.getGalleriesByServer(server.getIdAsString()) + .exceptionally(ExceptionLogger.get()) + .thenAccept(galleries -> { ctx.reply(galleryEmbed(galleries, server)); - } catch (SQLException e) { - ctx.reply("An exception has occurred: " + e.getMessage()); - } - + }); }); } From 34d01f6934629f27334a37400f975616234e5876 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 24 Feb 2020 23:46:22 -0500 Subject: [PATCH 028/157] GalleryController is an async controller now! --- .../controllers/GalleryController.java | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index d4b35a9..6cee4de 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -12,11 +12,43 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; public class GalleryController { - public static void insert(GalleryChannel gallery) throws SQLException { + public static CompletableFuture insert(GalleryChannel gallery) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(gallery); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> getGalleriesByServer(String serverId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getGalleriesByServerExec(serverId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture galleryExists(String channelId) { + return CompletableFuture.supplyAsync(() -> { + try { + return galleryExistsExec(channelId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(GalleryChannel gallery) throws SQLException { FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag')" + - "VALUES(?, ?, ?, ?, ?)", + "VALUES(?, ?, ?, ?, ?)", gallery.serverId, gallery.serverName, gallery.channelId, @@ -25,25 +57,22 @@ public class GalleryController { ); } - public static Collection getGalleriesByServer(String serverId) throws SQLException { + private static Collection getGalleriesByServerExec(String serverId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE server_id = ?", serverId); Collection galleries = new ArrayList<>(); while (rs.next()) { galleries.add(mapObject(rs)); } + rs.getStatement().close(); - FSDB.get().close(rs); return galleries; } - public static boolean galleryExists(String channelId) throws SQLException { + private static boolean galleryExistsExec(String channelId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM galleries WHERE channel_id = ?) AS hmm", channelId); - boolean exists = rs.getBoolean("hmm"); - - FSDB.get().close(rs); - return exists; + return rs.getBoolean("hmm"); } private static GalleryChannel mapObject(ResultSet rs) throws SQLException { From d2b64760cecce0d0da10665c1526c193baa6dbee Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 24 Feb 2020 23:49:52 -0500 Subject: [PATCH 029/157] Closed resources in GalleryController --- .../fsbot/database/controllers/GalleryController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 6cee4de..d789b9d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -64,13 +64,14 @@ public class GalleryController { while (rs.next()) { galleries.add(mapObject(rs)); } - rs.getStatement().close(); + FSDB.get().close(rs); return galleries; } private static boolean galleryExistsExec(String channelId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM galleries WHERE channel_id = ?) AS hmm", channelId); + FSDB.get().close(rs); return rs.getBoolean("hmm"); } From bcb7c260a4c42296635b27006feb5cdf5723ea99 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 09:49:13 -0500 Subject: [PATCH 030/157] Refactored OutfitController for futures --- .../fsbot/commands/developer/TestCommand.java | 11 +- .../controllers/OutfitController.java | 222 ++++++++++++------ 2 files changed, 147 insertions(+), 86 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index 0270174..3c2c061 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -6,13 +6,11 @@ package dev.salmonllama.fsbot.commands.developer; import dev.salmonllama.fsbot.database.controllers.OutfitController; -import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -27,11 +25,8 @@ public class TestCommand extends Command { @Override public void onCommand(CommandContext ctx) { - try { - Outfit outfit = OutfitController.findRandom(); - ctx.reply(outfit.toString()); - } catch (SQLException e) { - ctx.reply(e.getSQLState()); - } + OutfitController.findRandom().thenAccept(outfit -> { + ctx.reply(outfit.toString()); + }); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 4d7ae48..ab6cc3b 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -11,9 +11,82 @@ import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; -public class OutfitController { // TODO: Refactor for closing via FSDB.get(). SQLExceptions should be elevated; thrown in the command for logging. - public static void insert(Outfit outfit) { +public class OutfitController { + public static CompletableFuture insert(Outfit outfit) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(outfit); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> findById(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return findByIdExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture findRandom() { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> findRandomByTag(String tag) { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomByTagExec(tag); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> findRandomBySubmitter(String submitterId) { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomBySubmitterExec(submitterId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countOutfits() { + return CompletableFuture.supplyAsync(() -> { + try { + return countOutfitsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countOutfitsBySubmitter(String submitterId) { + return CompletableFuture.supplyAsync(() -> { + try { + return countOutfitsBySubmitterExec(submitterId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(Outfit outfit) throws SQLException { if (outfit.created == null) { outfit.created = new Timestamp(System.currentTimeMillis()); } @@ -22,102 +95,95 @@ public class OutfitController { // TODO: Refactor for closing via FSDB.get(). SQ outfit.updated = new Timestamp(System.currentTimeMillis()); } - try { - FSDB.get().insert( - "INSERT INTO " + - "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'deletion_hash') " + - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - outfit.id, - outfit.link, - outfit.submitter, - outfit.tag, - outfit.created, - outfit.updated, - outfit.deleted, - outfit.featured, - outfit.displayCount, - outfit.deletionHash - ); - } catch (SQLException e) { - e.printStackTrace(); - } + FSDB.get().insert( + "INSERT INTO " + + "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'deletion_hash') " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + outfit.id, + outfit.link, + outfit.submitter, + outfit.tag, + outfit.created, + outfit.updated, + outfit.deleted, + outfit.featured, + outfit.displayCount, + outfit.deletionHash + ); } - public static Outfit findById(String id) throws SQLException { - Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id)) { - if (rs.next()) { - outfit = mapObject(rs); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); + private static Optional findByIdExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE id = ?", id); + + if (rs.next()) { + Outfit outfit = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(outfit); } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private static Outfit findRandomExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDER BY random() LIMIT 1"); + + Outfit outfit = new Outfit(); + if (rs.next()) { + outfit = mapObject(rs); + } + FSDB.get().close(rs); + return outfit; } - public static Outfit findRandom() throws SQLException { - Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDER BY random() LIMIT 1")) { - if (rs.next()) { - outfit = mapObject(rs); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); + private static Optional findRandomByTagExec(String tag) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDER BY random() LIMIT 1", tag); + + if (rs.next()) { + Outfit outfit = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(outfit); } - return outfit; + + FSDB.get().close(rs); + return Optional.empty(); } - public static Outfit findRandomByTag(String tag) { - Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDER BY random() LIMIT 1", tag)) { - if (rs.next()) { - outfit = mapObject(rs); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); + private static Optional findRandomBySubmitterExec(String submitterId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDER BY random() LIMIT 1", submitterId); + + if (rs.next()) { + Outfit outfit = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(outfit); } - return outfit; + + FSDB.get().close(rs); + return Optional.empty(); } - public static Outfit findRandomBySubmitter(String submitterId) { - Outfit outfit = new Outfit(); - try (ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDER BY random() LIMIT 1", submitterId)) { - if (rs.next()) { - outfit = mapObject(rs); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); - } - return outfit; - } + private static int countOutfitsExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 0"); - public static int countOutfits() { int count = 0; - try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 0")) { - if (rs.next()) { - count = rs.getInt("count"); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); + if (rs.next()) { + count = rs.getInt("count"); } + FSDB.get().close(rs); + return count; } - public static int countOutfitsBySubmitter(String submitterId) { + private static int countOutfitsBySubmitterExec(String submitterId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ? AND deleted = 0", submitterId); + int count = 0; - try (ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ? AND deleted = 0", submitterId)) { - if (rs.next()) { - count = rs.getInt("count"); - } - rs.getStatement().close(); - } catch (SQLException e) { - e.printStackTrace(); + if (rs.next()) { + count = rs.getInt("count"); } + FSDB.get().close(rs); + return count; } From e2c6bbbc74c25a861d110182645d92a9b50dc7c2 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 10:13:42 -0500 Subject: [PATCH 031/157] Fixed indentation in TestCommand --- .../salmonllama/fsbot/commands/developer/TestCommand.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index 3c2c061..57df489 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -10,10 +10,12 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.MessageAttachment; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; public class TestCommand extends Command { @Override public String name() { return "Test"; } @@ -25,8 +27,8 @@ public class TestCommand extends Command { @Override public void onCommand(CommandContext ctx) { - OutfitController.findRandom().thenAccept(outfit -> { - ctx.reply(outfit.toString()); - }); + OutfitController.findRandom().thenAccept(outfit -> { + ctx.reply(outfit.toString()); + }); } } From 757e02cfebd307cf4536df436758fac78b473a9f Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 11:18:30 -0500 Subject: [PATCH 032/157] Refactored for proper builder design --- .../controllers/OutfitController.java | 64 ++++---- .../fsbot/database/models/Outfit.java | 137 ++++++++++++++++-- 2 files changed, 155 insertions(+), 46 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index ab6cc3b..e37f152 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -10,6 +10,7 @@ import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Time; import java.sql.Timestamp; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -36,7 +37,7 @@ public class OutfitController { }); } - public static CompletableFuture findRandom() { + public static CompletableFuture> findRandom() { return CompletableFuture.supplyAsync(() -> { try { return findRandomExec(); @@ -87,28 +88,28 @@ public class OutfitController { } private static void insertExec(Outfit outfit) throws SQLException { - if (outfit.created == null) { - outfit.created = new Timestamp(System.currentTimeMillis()); + if (outfit.getCreated() == null) { + outfit.setCreated(new Timestamp(System.currentTimeMillis())); } - if (outfit.updated == null) { - outfit.updated = new Timestamp(System.currentTimeMillis()); + if (outfit.getUpdated() == null) { + outfit.setUpdated(new Timestamp(System.currentTimeMillis())); } FSDB.get().insert( "INSERT INTO " + - "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'deletion_hash') " + + "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'delete_hash') " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - outfit.id, - outfit.link, - outfit.submitter, - outfit.tag, - outfit.created, - outfit.updated, - outfit.deleted, - outfit.featured, - outfit.displayCount, - outfit.deletionHash + outfit.getId(), + outfit.getLink(), + outfit.getSubmitter(), + outfit.getTag(), + outfit.getCreated(), + outfit.getUpdated(), + outfit.isDeleted(), + outfit.isFeatured(), + outfit.getDisplayCount(), + outfit.getDeleteHash() ); } @@ -125,16 +126,17 @@ public class OutfitController { return Optional.empty(); } - private static Outfit findRandomExec() throws SQLException { + private static Optional findRandomExec() throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDER BY random() LIMIT 1"); - Outfit outfit = new Outfit(); if (rs.next()) { - outfit = mapObject(rs); + Outfit outfit = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(outfit); } + FSDB.get().close(rs); - - return outfit; + return Optional.empty(); } private static Optional findRandomByTagExec(String tag) throws SQLException { @@ -188,17 +190,13 @@ public class OutfitController { } private static Outfit mapObject(ResultSet rs) throws SQLException { - Outfit outfit = new Outfit(); - outfit.id = rs.getString("id"); - outfit.link = rs.getString("link"); - outfit.tag = rs.getString("tag"); - outfit.submitter = rs.getString("submitter"); - outfit.created = new Timestamp(rs.getLong("created")); - outfit.updated = new Timestamp(rs.getLong("updated")); - outfit.deleted = rs.getBoolean("deleted"); - outfit.featured = rs.getBoolean("featured"); - outfit.displayCount = rs.getInt("display_count"); - outfit.deletionHash = rs.getString("deletion_hash"); - return outfit; + return new Outfit.OutfitBuilder(rs.getString("id"), rs.getString("link"), rs.getString("submitter"), rs.getString("tag")) + .setCreated(new Timestamp(rs.getLong("created"))) + .setUpdated(new Timestamp((rs.getLong("updated")))) + .setDeleted(rs.getBoolean("deleted")) + .setFeatured(rs.getBoolean("featured")) + .setDisplayCount(rs.getInt("display_count")) + .setDeleteHash(rs.getString("delete_hash")) + .build(); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index c14f252..88ecdd8 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -10,19 +10,76 @@ import dev.salmonllama.fsbot.database.DatabaseModel; import java.sql.Timestamp; public class Outfit extends DatabaseModel { - public String id = ""; - public String link = ""; - public String submitter = ""; - public String tag = ""; - public Timestamp created = null; - public Timestamp updated = null; - public boolean deleted = false; - public boolean featured = false; - public int displayCount = 0; - public String deletionHash = ""; + private String id = ""; + private String link = ""; + private String submitter = ""; + private String tag = ""; + private Timestamp created = null; + private Timestamp updated = null; + private boolean deleted = false; + private boolean featured = false; + private int displayCount = 0; + private String deleteHash = ""; - public Outfit() { + public Outfit(OutfitBuilder builder) { + id = builder.id; + link = builder.link; + submitter = builder.submitter; + tag = builder.tag; + created = builder.created; + updated = builder.updated; + deleted = builder.deleted; + featured = builder.featured; + displayCount = builder.displayCount; + deleteHash = builder.deleteHash; + } + public String getId() { + return id; + } + + public String getLink() { + return link; + } + + public String getSubmitter() { + return submitter; + } + + public String getTag() { + return tag; + } + + public Timestamp getCreated() { + return created; + } + + public void setCreated(Timestamp c) { + this.created = c; + } + + public Timestamp getUpdated() { + return updated; + } + + public void setUpdated(Timestamp u) { + this.updated = u; + } + + public boolean isDeleted() { + return deleted; + } + + public boolean isFeatured() { + return featured; + } + + public int getDisplayCount() { + return displayCount; + } + + public String getDeleteHash() { + return deleteHash; } public static String schema() { @@ -36,13 +93,67 @@ public class Outfit extends DatabaseModel { "deleted TEXT," + "featured TEXT," + "display_count INT," + - "deletion_hash TEXT)"; + "delete_hash TEXT)"; } @Override public String toString() { return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s]", - id, link, submitter, tag, created, updated, deleted, featured, displayCount, deletionHash + id, link, submitter, tag, created, updated, deleted, featured, displayCount, deleteHash ); } + + public static class OutfitBuilder { + private String id; + private String link; + private String submitter; + private String tag; + private Timestamp created = null; + private Timestamp updated = null; + private boolean deleted = false; + private boolean featured = false; + private int displayCount = 0; + private String deleteHash = ""; + + public OutfitBuilder(String id, String link, String submitter, String tag) { + this.id = id; + this.link = link; + this.submitter = submitter; + this.tag = tag; + } + + public OutfitBuilder setCreated(Timestamp created) { + this.created = created; + return this; + } + + public OutfitBuilder setUpdated(Timestamp updated) { + this.updated = updated; + return this; + } + + public OutfitBuilder setDeleted(boolean deleted) { + this.deleted = deleted; + return this; + } + + public OutfitBuilder setFeatured(boolean featured) { + this.featured = featured; + return this; + } + + public OutfitBuilder setDisplayCount(int displayCount) { + this.displayCount = displayCount; + return this; + } + + public OutfitBuilder setDeleteHash(String deletionHash) { + this.deleteHash = deletionHash; + return this; + } + + public Outfit build() { + return new Outfit(this); + } + } } From 8d4ec12ea9de97d9c3bd2201671174ba2f95e92d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 15:30:04 -0500 Subject: [PATCH 033/157] Added getTag methods to GalleryController --- .../controllers/GalleryController.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index d789b9d..9a38d4c 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -46,6 +46,16 @@ public class GalleryController { }); } + public static CompletableFuture getTag(String channelId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getTagExec(channelId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + private static void insertExec(GalleryChannel gallery) throws SQLException { FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag')" + "VALUES(?, ?, ?, ?, ?)", @@ -64,16 +74,25 @@ public class GalleryController { while (rs.next()) { galleries.add(mapObject(rs)); } - FSDB.get().close(rs); + FSDB.get().close(rs); return galleries; } private static boolean galleryExistsExec(String channelId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM galleries WHERE channel_id = ?) AS hmm", channelId); - FSDB.get().close(rs); + boolean exists = rs.getBoolean("hmm"); - return rs.getBoolean("hmm"); + FSDB.get().close(rs); + return exists; + } + + private static String getTagExec(String channelId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE channel_id = ?", channelId); + String tag = rs.getString("tag"); + + FSDB.get().close(rs); + return tag; } private static GalleryChannel mapObject(ResultSet rs) throws SQLException { From 93a550ab39900e81dc2713380513a14fd6ab6606 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 15:31:34 -0500 Subject: [PATCH 034/157] Made all builder properties optional. This may be detrimental. Most, if not all instances of outfit creation will be done in a controlled manner, so it seems logical this way given the use of futures and optionals. --- .../database/controllers/OutfitController.java | 10 +++++++--- .../fsbot/database/models/Outfit.java | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index e37f152..09ad3b1 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -172,8 +172,8 @@ public class OutfitController { if (rs.next()) { count = rs.getInt("count"); } - FSDB.get().close(rs); + FSDB.get().close(rs); return count; } @@ -184,13 +184,17 @@ public class OutfitController { if (rs.next()) { count = rs.getInt("count"); } - FSDB.get().close(rs); + FSDB.get().close(rs); return count; } private static Outfit mapObject(ResultSet rs) throws SQLException { - return new Outfit.OutfitBuilder(rs.getString("id"), rs.getString("link"), rs.getString("submitter"), rs.getString("tag")) + return new Outfit.OutfitBuilder() + .setId(rs.getString("id")) + .setLink(rs.getString("link")) + .setSubmitter(rs.getString("submitter")) + .setTag(rs.getString("tag")) .setCreated(new Timestamp(rs.getLong("created"))) .setUpdated(new Timestamp((rs.getLong("updated")))) .setDeleted(rs.getBoolean("deleted")) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 88ecdd8..a33225e 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -115,11 +115,27 @@ public class Outfit extends DatabaseModel { private int displayCount = 0; private String deleteHash = ""; - public OutfitBuilder(String id, String link, String submitter, String tag) { + public OutfitBuilder() { + } + + public OutfitBuilder setId(String id) { this.id = id; + return this; + } + + public OutfitBuilder setLink(String link) { this.link = link; + return this; + } + + public OutfitBuilder setSubmitter(String submitter) { this.submitter = submitter; + return this; + } + + public OutfitBuilder setTag(String tag) { this.tag = tag; + return this; } public OutfitBuilder setCreated(Timestamp created) { From 3f7d79a11e79412c3d4c247c428775a0bfc69695 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 15:32:26 -0500 Subject: [PATCH 035/157] Added Imgur API endpoints --- .../endpoints/imgur/ImgurAPIConnection.java | 90 +++++++++++++++++++ .../fsbot/endpoints/imgur/ImgurUpload.java | 71 +++++++++++++++ .../exceptions/FailedUploadException.java | 19 ++++ 3 files changed, 180 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java create mode 100644 src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java create mode 100644 src/main/java/dev/salmonllama/fsbot/exceptions/FailedUploadException.java diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java new file mode 100644 index 0000000..d981230 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.endpoints.imgur; + +import dev.salmonllama.fsbot.config.BotConfig; +import okhttp3.*; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; + +public class ImgurAPIConnection { + // No idea what these are or what they do, but the request doesn't work without them. + private final String MEDIA_TYPE = "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"; + // To be used with String.format() and a link to the image. It will populate automatically. + private final String BODY_THING = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"; + + private final String REQUEST_URL = "https://api.imgur.com/3/image/"; + + private final String CLIENT_ID; // Required for uploading + private final String BEARER_TOKEN; // Required for deleting + + // Create the okhttp objects. Use methods to complete requests. + private OkHttpClient client; + private Request.Builder requestBuilder; + + public ImgurAPIConnection() { + CLIENT_ID = BotConfig.IMGUR_ID; + BEARER_TOKEN = BotConfig.IMGUR_BEARER; + + client = new OkHttpClient().newBuilder().build(); + requestBuilder = new Request.Builder(); + } + + public CompletableFuture uploadImage(String link) { + return CompletableFuture.supplyAsync(() -> uploadImageExec(link)); + } + + public CompletableFuture deleteImage(String deleteHash) { + return CompletableFuture.supplyAsync(() -> deleteImageExec(deleteHash)); + } + + private ImgurUpload uploadImageExec(String discordLink) { + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("image", discordLink).build(); + + Request request = requestBuilder + .url(REQUEST_URL) + .method("POST", body) + .addHeader("Authorization", CLIENT_ID) + .build(); + + JSONObject json; + try (Response response = client.newCall(request).execute()) { + json = new JSONObject(response.body().string()).getJSONObject("data"); + } catch (IOException e) { + e.printStackTrace(); // TODO: Do tha logging thang. + return null; + } + + return new ImgurUpload.ImgurUploadBuilder() + .setId(json.getString("id")) + .setDateTime(json.getLong("datetime")) + .setDeleteHash(json.getString("deletehash")) + .setLink(json.getString("link")) + .build(); + } + + private boolean deleteImageExec(String deleteHash) { + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).build(); + + Request request = requestBuilder + .url(REQUEST_URL.concat(deleteHash)) + .method("DELETE", body) + .addHeader("Authorization", BEARER_TOKEN) + .build(); + + boolean success; + try (Response response = client.newCall(request).execute()) { + success = new JSONObject(response.body().string()).getBoolean("success"); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return success; + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java new file mode 100644 index 0000000..13fab63 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.endpoints.imgur; + +public class ImgurUpload { + private String id; + private long dateTime; + private String deleteHash; + private String link; + + public ImgurUpload(ImgurUploadBuilder builder) { + id = builder.id; + dateTime = builder.dateTime; + deleteHash = builder.deleteHash; + link = builder.link; + } + + public String getId() { + return id; + } + + public long getDateTime() { + return dateTime; + } + + public String getDeleteHash() { + return deleteHash; + } + + public String getLink() { + return link; + } + + public static class ImgurUploadBuilder { + private String id; + private long dateTime; + private String deleteHash; + private String link; + + public ImgurUploadBuilder() { + + } + + public ImgurUploadBuilder setId(String id) { + this.id = id; + return this; + } + + public ImgurUploadBuilder setDateTime(long dateTime) { + this.dateTime = dateTime; + return this; + } + + public ImgurUploadBuilder setDeleteHash(String deleteHash) { + this.deleteHash = deleteHash; + return this; + } + + public ImgurUploadBuilder setLink(String link) { + this.link = link; + return this; + } + + public ImgurUpload build() { + return new ImgurUpload(this); + } + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/exceptions/FailedUploadException.java b/src/main/java/dev/salmonllama/fsbot/exceptions/FailedUploadException.java new file mode 100644 index 0000000..b496191 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/exceptions/FailedUploadException.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.exceptions; + +public class FailedUploadException extends Exception { + private String message; + + public FailedUploadException(String imageLink) { + message = "Failed to upload: ".concat(imageLink); + } + + @Override + public String toString() { + return message; + } +} From 361e5e8a5ddcefd311b9b9b4fc03a489daff82bc Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 15:34:15 -0500 Subject: [PATCH 036/157] Full refactor of the image listener --- .../fsbot/listeners/ImageListener.java | 164 ++++++------------ 1 file changed, 50 insertions(+), 114 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index fc569c3..e59277a 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -9,17 +9,25 @@ import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; import com.rethinkdb.net.Cursor; import com.vdurmont.emoji.EmojiParser; +import dev.salmonllama.fsbot.database.controllers.GalleryController; +import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.database.models.Outfit; +import dev.salmonllama.fsbot.endpoints.imgur.ImgurAPIConnection; import okhttp3.*; import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.MessageAttachment; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; +import org.javacord.api.util.logging.ExceptionLogger; import org.json.JSONObject; import dev.salmonllama.fsbot.config.BotConfig; import java.awt.*; +import java.sql.Timestamp; +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public class ImageListener implements MessageCreateListener { @@ -33,125 +41,53 @@ public class ImageListener implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { // TODO: This needs immediate help + // Check for valid source -> DONE + // Check for gallery channel presence + // Check for images (attached files and links from approved sources) + // Upload the image(s) to imgur + // Store the image in the database + // Send confirmation && log event - // event.getMessage().getUserAuthor().ifPresent(author -> { - // if (author.isBot()) { - // return; - // } - // }); + if (!event.getMessageAuthor().isRegularUser()) { + // Ignore anything that is a webhook or a bot message + return; + } - // Message message = event.getMessage(); - // String channel = event.getChannel().getIdAsString(); - // String submitter = event.getMessage().getAuthor().getIdAsString(); + // Only works in Server Text Channels + event.getChannel().asServerTextChannel().ifPresent(channel -> { + // Only works in registered Gallery Channels + GalleryController.galleryExists(channel.getIdAsString()).thenAccept(exists -> { + if (exists) { + // Check the message for images + if (event.getMessageAttachments().stream().anyMatch(MessageAttachment::isImage)) { + // Upload the image(s) to Imgur, store in database, log the stored images. + ImgurAPIConnection imgur = new ImgurAPIConnection(); - // if (message.getAttachments().stream().noneMatch(MessageAttachment::isImage)) { - // return; - // } + event.getMessageAttachments() + .stream() + .filter(MessageAttachment::isImage) + .forEach(image -> { + // Upload to Imgur + imgur.uploadImage(image.getUrl().toString()).thenAccept(upload -> { + // Store in the database + Outfit.OutfitBuilder outfitBuilder = new Outfit.OutfitBuilder() + .setId(upload.getId()) + .setLink(upload.getLink()) + .setSubmitter(event.getMessageAuthor().getIdAsString()) + .setCreated(new Timestamp(upload.getDateTime())); - // // If the message contains an image, check if the channel is being listened to for image storage + GalleryController.getTag(channel.getIdAsString()).thenAccept(outfitBuilder::setTag).join(); - // String dbTable = null; + Outfit outfit = outfitBuilder.build(); + OutfitController.insert(outfit).join(); - // if(r.db("fsbot").table("channels").g("cId").contains(channel).run(conn)) { - // Cursor cursor = r.db("fsbot") - // .table("channels") - // .filter(row -> row.getField("cId").eq(channel)) - // .getField("tag") - // .run(conn); - - // List tags = cursor.toList(); - - // for (Object tag : tags) { - // dbTable = tag.toString(); - // } - // } - // else { - // return; - // } - - // List attachments = message.getAttachments(); - - // for (MessageAttachment attachment : attachments) { - // String discordLink = attachment.getUrl().toString(); - // String imgurLink = null; - - // // Upload the image to imgur - // try { - // OkHttpClient client = new OkHttpClient(); - - // MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); - - // RequestBody body = RequestBody.create( - // mediaType, - // String.format("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", discordLink)); - - // Request request = new Request.Builder() - // .url("https://api.imgur.com/3/image") - // .method("POST", body) - // .header("Authorization", BotConfig.IMGUR_ID) - // .header("Authorization", BotConfig.IMGUR_BEARER) - // .build(); - - // Response response = client.newCall(request).execute(); - - // if (response.body() == null) { - // event.getChannel().sendMessage("Something went wrong!"); - // return; - // } - - // String jsonData = response.body().string(); - // imgurLink = new JSONObject(jsonData).getJSONObject("data").getString("link"); - - // if (imgurLink == null) { - // event.getChannel().sendMessage("Something went wrong!"); - // return; - // } - - // } - // catch (Exception e) { - // e.printStackTrace(); - // } - - // r.db("fsbot").table("outfits").insert( - // r.hashMap("link", imgurLink) - // .with("submitter", submitter) - // .with("tag", dbTable) - // ).run(conn); - - // final String finalLink = imgurLink; - // Cursor imgId = r.db("fsbot") - // .table("outfits") - // .filter(row -> row.getField("link").eq(finalLink)) - // .getField("id") - // .run(conn); - - // String embedId = null; - // List imgIds = imgId.toList(); - // for (Object id : imgIds) { - // embedId = id.toString(); - // } - - // EmbedBuilder embed = new EmbedBuilder() - // .setTitle("Added an entry of tag " + dbTable) - // .setColor(Color.GREEN) - // .setThumbnail(imgurLink) - // .setAuthor("Placeholder") - // .setFooter(embedId); - - // event.getApi().getUserById(submitter).thenAccept(user -> embed.setAuthor(user.getDiscriminatedName())); - - // event.getApi().getChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { - // chnl.asTextChannel().ifPresent(txtchnl -> { - // txtchnl.sendMessage(embed).join(); - // }); - // }); - - // if (dbTable.equals("disaster")) { - // // Add custom panda emoji: <:PandaWut:433045737245376522> - // message.addReaction("PandaWut:433045737245376522"); - // } - - // message.addReaction(EmojiParser.parseToUnicode(":heartpulse:")); - // } + // Log the event + // event.getChannel().sendMessage("Outfit stored: " + outfit.toString()); // TODO: Logging. Log this to OutfitLog + }).exceptionally(ExceptionLogger.get()); + }); + } + } + }).exceptionally(ExceptionLogger.get()); + }); } } \ No newline at end of file From ce156a1bf92c3702e005bde5bf213ed7c2d0fcc1 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 15:36:11 -0500 Subject: [PATCH 037/157] status comment update --- .../salmonllama/fsbot/listeners/ImageListener.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index e59277a..f0e5525 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -41,12 +41,12 @@ public class ImageListener implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { // TODO: This needs immediate help - // Check for valid source -> DONE - // Check for gallery channel presence - // Check for images (attached files and links from approved sources) - // Upload the image(s) to imgur - // Store the image in the database - // Send confirmation && log event + // Check for valid source -> DONE -> WORKING + // Check for gallery channel presence -> DONE -> WORKING + // Check for images (attached files and links from approved sources) -> DONE -> WORKING (approved links to be added later) + // Upload the image(s) to imgur -> DONE -> WORKING + // Store the image in the database -> DONE -> WORKING + // Send confirmation && log event -> IN PROGRESS (waiting for logger upgrade) if (!event.getMessageAuthor().isRegularUser()) { // Ignore anything that is a webhook or a bot message From ee9e9546e53ccda052536f5593790289f06f77c9 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Tue, 25 Feb 2020 17:11:27 -0500 Subject: [PATCH 038/157] Import cleaning and stuff --- .../fsbot/commands/developer/TestCommand.java | 4 +--- .../controllers/OutfitController.java | 1 - .../fsbot/database/models/Outfit.java | 20 +++++++++---------- .../fsbot/listeners/ImageListener.java | 11 ---------- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index 57df489..e436668 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -10,12 +10,10 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.message.MessageAttachment; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class TestCommand extends Command { @Override public String name() { return "Test"; } @@ -28,7 +26,7 @@ public class TestCommand extends Command { @Override public void onCommand(CommandContext ctx) { OutfitController.findRandom().thenAccept(outfit -> { - ctx.reply(outfit.toString()); + outfit.ifPresent(o -> ctx.reply(o.toString())); }); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 09ad3b1..423c745 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -10,7 +10,6 @@ import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Time; import java.sql.Timestamp; import java.util.Optional; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index a33225e..75fae9f 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -10,16 +10,16 @@ import dev.salmonllama.fsbot.database.DatabaseModel; import java.sql.Timestamp; public class Outfit extends DatabaseModel { - private String id = ""; - private String link = ""; - private String submitter = ""; - private String tag = ""; - private Timestamp created = null; - private Timestamp updated = null; - private boolean deleted = false; - private boolean featured = false; - private int displayCount = 0; - private String deleteHash = ""; + private String id; + private String link; + private String submitter; + private String tag; + private Timestamp created; + private Timestamp updated; + private boolean deleted; + private boolean featured; + private int displayCount; + private String deleteHash; public Outfit(OutfitBuilder builder) { id = builder.id; diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index f0e5525..efee6a2 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -7,27 +7,16 @@ package dev.salmonllama.fsbot.listeners; import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; -import com.rethinkdb.net.Cursor; -import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.endpoints.imgur.ImgurAPIConnection; -import okhttp3.*; -import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.MessageAttachment; -import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; import org.javacord.api.util.logging.ExceptionLogger; -import org.json.JSONObject; -import dev.salmonllama.fsbot.config.BotConfig; -import java.awt.*; import java.sql.Timestamp; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; public class ImageListener implements MessageCreateListener { From 29c30d928ea2e7b816e2f170e1cdcdbd177c51bc Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 26 Feb 2020 14:40:56 -0500 Subject: [PATCH 039/157] Added method for getting tags from db --- .../controllers/OutfitController.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 423c745..9b96505 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -11,6 +11,8 @@ import dev.salmonllama.fsbot.database.models.Outfit; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -86,6 +88,16 @@ public class OutfitController { }); } + public static CompletableFuture> getDistinctTags() { + return CompletableFuture.supplyAsync(() -> { + try { + return getDistinctTagsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + private static void insertExec(Outfit outfit) throws SQLException { if (outfit.getCreated() == null) { outfit.setCreated(new Timestamp(System.currentTimeMillis())); @@ -188,6 +200,18 @@ public class OutfitController { return count; } + private static Collection getDistinctTagsExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT DISTINCT tag FROM outfits"); + + Collection tags = new ArrayList<>(); + while (rs.next()) { + tags.add(rs.getString("tag")); + } + + FSDB.get().close(rs); + return tags; + } + private static Outfit mapObject(ResultSet rs) throws SQLException { return new Outfit.OutfitBuilder() .setId(rs.getString("id")) From 099f92d0ac1d0490e67fc960fc1fe2285e3fe2eb Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 00:50:43 -0500 Subject: [PATCH 040/157] Initial OutfitCommand refactor. INCOMPLETE --- build.gradle | 2 +- .../fsbot/commands/general/OutfitCommand.java | 116 +++++++++--------- 2 files changed, 61 insertions(+), 57 deletions(-) diff --git a/build.gradle b/build.gradle index 0f816bb..711a47b 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { id 'application' } -group 'studio.spiderling' +group 'dev.salmonllama' version '1.1.11' sourceCompatibility = 1.8 diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java index b152310..98eaee7 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java @@ -5,85 +5,89 @@ package dev.salmonllama.fsbot.commands.general; +import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.message.Message; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; +import org.javacord.api.util.logging.ExceptionLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class OutfitCommand extends Command { + private final int MAX_OUTFITS = 5; + private final Collection NON_TAG_ALIASES = new ArrayList<>(Arrays.asList("outfit", "o")); + @Override public String name() { return "Outfit"; } @Override public String description() { return "Generates a random image with the given tag. Use ~tags to see valid tags."; } @Override public String usage() { return "outfit "; } @Override public String category() { return "General"; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("outfit", "o")); } - - private final DatabaseUtilities db; - - public OutfitCommand(DatabaseUtilities db) { - this.db = db; - } + @Override public Collection aliases() { return initAliases(); } @Override public void onCommand(CommandContext ctx) { + // Parse command used for logic path + // if "outfit" -> look for tags. if no tags -> show random + // if not "outfit" -> match the command to existing tags -> look for numbers + String command = ctx.getUsedAlias(); String[] args = ctx.getArgs(); - TextChannel channel = ctx.getChannel(); - Message message = ctx.getMessage(); - // Find the first arg for tag/submitter/naught, find the next arg for number to send - int MAX_OUTFITS = 5; + OutfitController.getDistinctTags().thenAccept(tags -> { + if (tags.contains(command)) { // TODO: Hey uh, test casing + // args parsing and command logic with tag as caller + handleTagCommand(command, args, ctx); + } else if (NON_TAG_ALIASES.contains(command)) { + // args parsing and command logic with name as caller + } + }); + } - if (args.length == 0) { - channel.sendMessage(db.randomOutfit().generateEmbed()); - } - else if (message.getMentionedUsers().size() > 0) { - // Outfit needs to be from submitter - String userId = message.getMentionedUsers().get(0).getIdAsString(); + private void handleTagCommand(String command, String[] args, CommandContext ctx) { + switch (args.length) { + case 0: + // Send one single random outfit of the given tag + OutfitController.findRandomByTag(command).thenAccept(outfit -> { + ctx.reply(outfit.toString()); + }).exceptionally(ExceptionLogger.get()); // TODO: Exception logging + case 1: + // Send the given number of outfits, not to exceed 5 for ratelimit reasons + if (isNumeric(args[0])) { + int num = Math.min(Integer.parseInt(args[0]), MAX_OUTFITS); - if (args.length == 2) { - // Send a number of outfits - int iterator = ((Integer.parseInt(args[1]) > MAX_OUTFITS) ? MAX_OUTFITS : Integer.parseInt(args[1])); - - for (int i = 0; i < iterator; i++) { - channel.sendMessage(db.getOutfitBySubmitter(userId).generateEmbed()); + OutfitController.findRandomByTag(command, num).thenAccept(outfitsOpt -> { + outfitsOpt.ifPresent(outfits -> { + outfits.forEach(outfit -> ctx.reply(outfit.toString())); + }); + }); + } else { + ctx.reply("Improper command usage"); // TODO: Logging update reminder } - } - else { - channel.sendMessage(db.getOutfitBySubmitter(userId).generateEmbed()); - } - } - else if (db.getTags().contains(args[0].toLowerCase())) { - // Outfit needs to be tagged - String tag = args[0]; - - if (args.length == 2) { - // Send a number of outfits - int iterator = ((Integer.parseInt(args[1]) > MAX_OUTFITS) ? MAX_OUTFITS : Integer.parseInt(args[1])); - - for (int i = 0; i < iterator; i++) { - channel.sendMessage(db.randomTaggedOutfit(tag).generateEmbed()); - } - } - else { - channel.sendMessage(db.randomTaggedOutfit(tag).generateEmbed()); - } - } - else if (args.length == 1 && args[0].matches("\\d")) { - int iterator = ((Integer.parseInt(args[0]) > MAX_OUTFITS) ? MAX_OUTFITS : Integer.parseInt(args[0])); - - for (int i = 0; i < iterator; i++) { - channel.sendMessage(db.randomOutfit().generateEmbed()); - } - } - else { - channel.sendMessage("Something went wrong"); } } + + private void handleNameCommand() { + + } + + private Collection initAliases() { + Collection aliases = OutfitController.getDistinctTags().join(); + aliases.addAll(NON_TAG_ALIASES); + return aliases; + } + + private boolean isNumeric(String input) { // If this is needed elsewhere, it will be moved to a public utility + if (input == null) { + return false; + } + + try { + double number = Double.parseDouble(input); + } catch (NumberFormatException e) { + return false; + } + return true; + } } From 801ed71b3812b18ff204242b730a8dce74db9237 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 00:50:57 -0500 Subject: [PATCH 041/157] TODO comment in GalleryController --- .../fsbot/database/controllers/GalleryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 9a38d4c..5e68320 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -67,7 +67,7 @@ public class GalleryController { ); } - private static Collection getGalleriesByServerExec(String serverId) throws SQLException { + private static Collection getGalleriesByServerExec(String serverId) throws SQLException { // TODO: What if the server has no galleries eh? ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE server_id = ?", serverId); Collection galleries = new ArrayList<>(); From 8b05297c4ce0502f98f60f1ad9d02d975198e9ba Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 00:51:19 -0500 Subject: [PATCH 042/157] TODO comment in ImageListener --- .../java/dev/salmonllama/fsbot/listeners/ImageListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index efee6a2..0ddfee8 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -65,7 +65,7 @@ public class ImageListener implements MessageCreateListener { .setSubmitter(event.getMessageAuthor().getIdAsString()) .setCreated(new Timestamp(upload.getDateTime())); - GalleryController.getTag(channel.getIdAsString()).thenAccept(outfitBuilder::setTag).join(); + GalleryController.getTag(channel.getIdAsString()).thenAccept(outfitBuilder::setTag).join(); // TODO: Wrap this around the insert, don't join no moah Outfit outfit = outfitBuilder.build(); OutfitController.insert(outfit).join(); From 1cffa89d36805fb7ab9c91fde5ec6aa1a726c23c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 00:51:44 -0500 Subject: [PATCH 043/157] Removed old DBUtils from OutfitCommand registration --- src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index ba94a6c..5d66ac6 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -69,7 +69,7 @@ public class Guthix implements MessageCreateListener { addCommand(new PingCommand()); addCommand(new ColorCommand()); addCommand(new ColorsCommand()); - addCommand(new OutfitCommand(db)); + addCommand(new OutfitCommand()); addCommand(new SpecificOutfitCommand(db)); addCommand(new HelpCommand(this)); } From 9d560b04784d193db3dc97934f4a84038573dadf Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 00:51:57 -0500 Subject: [PATCH 044/157] Added methods for multiple outfits --- .../controllers/OutfitController.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 9b96505..34388e0 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -48,6 +48,16 @@ public class OutfitController { }); } + public static CompletableFuture>> findRandom(int amount) { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomExec(amount); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture> findRandomByTag(String tag) { return CompletableFuture.supplyAsync(() -> { try { @@ -58,6 +68,16 @@ public class OutfitController { }); } + public static CompletableFuture>> findRandomByTag(String tag, int amount) { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomByTagExec(tag, amount); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture> findRandomBySubmitter(String submitterId) { return CompletableFuture.supplyAsync(() -> { try { @@ -68,6 +88,16 @@ public class OutfitController { }); } + public static CompletableFuture>> findRandomBySubmitter(String submitterId, int amount) { + return CompletableFuture.supplyAsync(() -> { + try { + return findRandomBySubmitterExec(submitterId, amount); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture countOutfits() { return CompletableFuture.supplyAsync(() -> { try { @@ -150,6 +180,12 @@ public class OutfitController { return Optional.empty(); } + private static Optional> findRandomExec(int amount) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE deleted = 0 ORDER BY random() LIMIT ?", amount); + + return extractMultiple(rs); + } + private static Optional findRandomByTagExec(String tag) throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDER BY random() LIMIT 1", tag); @@ -163,6 +199,12 @@ public class OutfitController { return Optional.empty(); } + private static Optional> findRandomByTagExec(String tag, int amount) throws SQLException { // Still has to be an optional, the tag may not exist. It is user-supplied. + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE tag = ? AND deleted = 0 ORDER BY random() LIMIT ?", tag, amount); + + return extractMultiple(rs); + } + private static Optional findRandomBySubmitterExec(String submitterId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDER BY random() LIMIT 1", submitterId); @@ -176,6 +218,12 @@ public class OutfitController { return Optional.empty(); } + private static Optional> findRandomBySubmitterExec(String submitterId, int amount) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM outfits WHERE submitter = ? AND deleted = 0 ORDER BY random() LIMIT ?", submitterId, amount); + + return extractMultiple(rs); + } + private static int countOutfitsExec() throws SQLException { ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 0"); @@ -212,6 +260,20 @@ public class OutfitController { return tags; } + private static Optional> extractMultiple(ResultSet rs) throws SQLException { + Collection outfits = new ArrayList<>(); + if (rs.next()) { // I don't see a better way to wrap this. If results exist -> iterate through them, return the optional. + while (rs.next()) { + outfits.add(mapObject(rs)); + } + FSDB.get().close(rs); + return Optional.of(outfits); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + private static Outfit mapObject(ResultSet rs) throws SQLException { return new Outfit.OutfitBuilder() .setId(rs.getString("id")) From 45fa1bdffd4a2112262337ce3700910f8ead7e67 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 16:05:10 -0500 Subject: [PATCH 045/157] Added explicit okhttp dep --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 711a47b..96f00f2 100644 --- a/build.gradle +++ b/build.gradle @@ -23,9 +23,10 @@ repositories { dependencies { implementation 'org.xerial:sqlite-jdbc:3.30.1' implementation 'com.github.Kaaz:ConfigurationBuilder:0.4' - implementation group: 'org.javacord', name: 'javacord', version:'3.0.5' - implementation group: 'com.rethinkdb', name: 'rethinkdb-driver', version: '2.3.3' + implementation 'org.javacord:javacord:3.0.5' + implementation group: 'com.rethinkdb', name: 'rethinkdb-driver', version: '2.3.3' // set for removal implementation 'com.vdurmont:emoji-java:4.0.0' + implementation 'com.squareup.okhttp3:okhttp:4.4.0' testCompile group: 'junit', name: 'junit', version: '4.12' } From c7ed16a6c8a4cee77384951c36f4e33b114700a9 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 16:09:26 -0500 Subject: [PATCH 046/157] Removed debug print in Registry --- src/main/java/dev/salmonllama/fsbot/guthix/Registry.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java b/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java index 0496296..642790c 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Registry.java @@ -73,7 +73,6 @@ class Registry { if (input.contains(" ")) { input = removePrefix(input); String[] splits = input.split(" "); - System.out.println(Arrays.toString(splits)); return cleanSpaces(splits); } else { input = removePrefix(input); From eed3bb9cd5b6098f5b06130fa9b5b1deffc67118 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 16:10:14 -0500 Subject: [PATCH 047/157] Fixed multiple extraction eating first result --- .../database/controllers/OutfitController.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 34388e0..e583703 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -262,16 +262,18 @@ public class OutfitController { private static Optional> extractMultiple(ResultSet rs) throws SQLException { Collection outfits = new ArrayList<>(); - if (rs.next()) { // I don't see a better way to wrap this. If results exist -> iterate through them, return the optional. - while (rs.next()) { - outfits.add(mapObject(rs)); - } - FSDB.get().close(rs); - return Optional.of(outfits); + + while (rs.next()) { + outfits.add(mapObject(rs)); } FSDB.get().close(rs); - return Optional.empty(); + + if (outfits.size() == 0) { + return Optional.empty(); + } + + return Optional.of(outfits); } private static Outfit mapObject(ResultSet rs) throws SQLException { From 16cbd4f5d028143e949bc6c213d5fef1c0cb6468 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 16:10:22 -0500 Subject: [PATCH 048/157] OutfitCommand refactor --- .../fsbot/commands/general/OutfitCommand.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java index 98eaee7..c436cf8 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java @@ -41,6 +41,7 @@ public class OutfitCommand extends Command { handleTagCommand(command, args, ctx); } else if (NON_TAG_ALIASES.contains(command)) { // args parsing and command logic with name as caller + handleNameCommand(command, args, ctx); } }); } @@ -68,8 +69,42 @@ public class OutfitCommand extends Command { } } - private void handleNameCommand() { + private void handleNameCommand(String command, String[] args, CommandContext ctx) { + switch (args.length) { + case 0: + // Send one truly random outfit + OutfitController.findRandom().thenAccept(outfit -> { + ctx.reply(outfit.toString()); + }); + case 1: + // Send the given number of outfits, not to exceed 5 for ratelimit reasons + if (isNumeric(args[0])) { + int num = Math.min(Integer.parseInt(args[0]), MAX_OUTFITS); + OutfitController.findRandom(num).thenAccept(outfitsOpt -> { + outfitsOpt.ifPresent(outfits -> { + outfits.forEach(outfit -> ctx.reply(outfit.toString())); + }); + }); + } else { + // First arg is not a number, send an outfit of the given tag + String tag = args[0]; + OutfitController.findRandomByTag(tag).thenAccept(outfitOpt -> { + outfitOpt.ifPresent(outfit -> ctx.reply(outfit.toString())); + }); + } + case 2: + // Send the given number of outfits of the given tag + if (isNumeric(args[1])) { + int num = Math.min(Integer.parseInt(args[1]), MAX_OUTFITS); + + OutfitController.findRandomByTag(args[0], num).thenAccept(outfitsOpt -> { + outfitsOpt.ifPresent(outfits -> { + outfits.forEach(outfit -> ctx.reply(outfit.toString())); + }); + }); + } + } } private Collection initAliases() { @@ -84,7 +119,7 @@ public class OutfitCommand extends Command { } try { - double number = Double.parseDouble(input); + Double.parseDouble(input); } catch (NumberFormatException e) { return false; } From cb0f7b82dc5964e9eb14cb87baec984657afa09d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:21:07 -0500 Subject: [PATCH 049/157] Source compatibility 11 for Optional methods --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 96f00f2..5f00c83 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { group 'dev.salmonllama' version '1.1.11' -sourceCompatibility = 1.8 +sourceCompatibility = 11 repositories { mavenCentral() From b68277d5b504910ddb8494651b001d0e3cbb709d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:21:30 -0500 Subject: [PATCH 050/157] Removed old duplicate command --- .../general/SpecificOutfitCommand.java | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 src/main/java/dev/salmonllama/fsbot/commands/general/SpecificOutfitCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/SpecificOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/SpecificOutfitCommand.java deleted file mode 100644 index f80087a..0000000 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/SpecificOutfitCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.commands.general; - -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.channel.ServerTextChannel; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import org.javacord.api.entity.channel.TextChannel; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.ArrayBlockingQueue; - -public class SpecificOutfitCommand extends Command { - @Override public String name() { return "Specific Outfit"; } - @Override public String description() { return "Generates an outfit of a specific tag"; } - @Override public String usage() { return " [int number]"; } - @Override public String category() { return "General"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } - @Override public Collection aliases() { return new ArrayList<>(db.getTags()); } - - private final DatabaseUtilities db; - - public SpecificOutfitCommand(DatabaseUtilities db) { - this.db = db; - } - - @Override - public void onCommand(CommandContext ctx) { - String[] args = ctx.getArgs(); - String tag = ctx.getUsedAlias(); - TextChannel channel = ctx.getChannel(); - - if (args.length == 1) { - // Send the specific number of outfits with a max of 5 - int outfitNumber = Integer.parseInt(args[0]); - if (outfitNumber > 5) { outfitNumber = 5; } - - for (int i = 0; i < outfitNumber; i++) { - channel.sendMessage(db.randomTaggedOutfit(tag).generateEmbed()); - } - } - else if (args.length > 1) { - channel.sendMessage("You did that wrong, mate"); - } - else { - channel.sendMessage(db.randomTaggedOutfit(tag).generateEmbed()); - } - } -} From a4df63a2cda6d27fa654b46c163e8597c18eea15 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:22:13 -0500 Subject: [PATCH 051/157] Fixed forced lowercase on command args --- .../java/dev/salmonllama/fsbot/guthix/Guthix.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 5d66ac6..a19a218 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -13,10 +13,7 @@ import dev.salmonllama.fsbot.commands.developer.CreateGalleryCommand; import dev.salmonllama.fsbot.commands.developer.EvalCommand; import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import org.javacord.api.DiscordApi; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.MessageAuthor; -import org.javacord.api.entity.server.Server; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; import dev.salmonllama.fsbot.commands.developer.TestCommand; @@ -70,7 +67,6 @@ public class Guthix implements MessageCreateListener { addCommand(new ColorCommand()); addCommand(new ColorsCommand()); addCommand(new OutfitCommand()); - addCommand(new SpecificOutfitCommand(db)); addCommand(new HelpCommand(this)); } @@ -97,16 +93,17 @@ public class Guthix implements MessageCreateListener { return; } - String content = event.getMessageContent().toLowerCase(); + String content = event.getMessageContent(); + String contentLower = content.toLowerCase(); - if (registry.startsWithPrefix(content)) { + if (registry.startsWithPrefix(contentLower)) { } else { return; } RegistryCommand rComm = registry.getCommandInfo(content); - String cmdString = rComm.getCommand(); + String cmdString = rComm.getCommand().toLowerCase(); if (registry.isCommandAlias(cmdString)) { @@ -114,9 +111,6 @@ public class Guthix implements MessageCreateListener { return; } - Message msg = event.getMessage(); - TextChannel channel = event.getChannel(); - Server server = event.getServer().orElse(null); String[] cmdArgs = rComm.getArgs(); Command cmd = registry.findCommand(cmdString).orElse(null); // TODO: default command here From 010eca59db96aab6180bc8b501ea8f7b9ae126b1 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:23:14 -0500 Subject: [PATCH 052/157] Remove unused imports/variables --- .../fsbot/commands/developer/CreateGalleryCommand.java | 5 ----- .../fsbot/commands/general/ShowGalleriesCommand.java | 3 --- 2 files changed, 8 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 7481d2b..89e250c 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -7,24 +7,19 @@ package dev.salmonllama.fsbot.commands.developer; import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; -import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.server.Server; import org.javacord.api.util.logging.ExceptionLogger; import java.awt.*; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Optional; public class CreateGalleryCommand extends Command { // TODO: This command needs help. @Override public String name() { return "Create Gallery"; } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java index 0535a16..6467fbd 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ShowGalleriesCommand.java @@ -5,18 +5,15 @@ package dev.salmonllama.fsbot.commands.general; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.stream.Collectors; import org.javacord.api.entity.channel.ServerTextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; -import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.guthix.Command; From 474e6db324ecee2d7e619c7c0db28d67ceb7217f Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:23:34 -0500 Subject: [PATCH 053/157] Refactored GetOutfitCommand --- .../commands/staff/GetOutfitCommand.java | 92 ++----------------- 1 file changed, 8 insertions(+), 84 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java index 45c1c0e..8e0ee51 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java @@ -5,22 +5,16 @@ package dev.salmonllama.fsbot.commands.staff; -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; -import com.rethinkdb.net.Cursor; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class GetOutfitCommand extends Command { // TODO: This command also needs HELP @Override public String name() { return "Get Outift"; } @@ -30,87 +24,17 @@ public class GetOutfitCommand extends Command { // TODO: This command also needs @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("getoutfit", "get")); } - static final RethinkDB r = RethinkDB.r; - static final Connection conn = r.connection().hostname("localhost").port(28015).connect(); - @Override public void onCommand(CommandContext ctx) { + // args is ONLY the ID String[] args = ctx.getArgs(); - TextChannel channel = ctx.getChannel(); - - if (args.length != 1) { - channel.sendMessage("you did that wrong mate"); - return; - } String id = args[0]; - - // Check if the given id exists in the table - try { - r.db("fsbot").table("outfits").filter(row -> row.getField("id").eq(id)).run(conn); - } - catch (Exception e) { - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.RED) - .addField("ERROR:", "That id does not exist in that table") - .addField("Output:", e.toString()) - .setFooter("Contact Salmonllama#5727 if you see this"); - channel.sendMessage(embed); - return; - } - - // Get the entry for the given table/tag and id, build the embed, and send it. - try { - - String embedLink = null; - String embedSubmitter = null; - - Cursor linkCursor = r.db("fsbot") - .table("outfits") - .filter(row -> row.getField("id").eq(id)) - .getField("link") - .run(conn); - - Cursor submitterCursor = r.db("fsbot") - .table("outfits") - .filter(row -> row.getField("id").eq(id)) - .getField("submitter") - .run(conn); - - List links = linkCursor.toList(); - for (Object link : links) { - embedLink = link.toString(); - } - - List submitters = submitterCursor.toList(); - for (Object submitter : submitters) { - embedSubmitter = submitter.toString(); - } - - // Send a diff message if any of the things are null - if (embedLink == null) { - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.RED) - .addField("ERROR: ", "The entry you tried to access doesn't exist."); - channel.sendMessage(embed); - return; - } - - // Send the final Embed with the outfit image as a link, the submitter, and the id of the image. - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.GREEN) - .setAuthor(embedSubmitter) - .setImage(embedLink) - .setFooter(id); - channel.sendMessage(embed); - } - catch (Exception e) { - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.RED) - .addField("ERROR:", "Something went wrong...") - .addField("Output:", e.toString()) - .setFooter("Contact Crablet#9999 and show him this error."); - channel.sendMessage(embed); - } + OutfitController.findById(id).thenAccept(outfitOpt -> { + outfitOpt.ifPresentOrElse( + outfit -> ctx.reply(outfit.toString()), + () -> ctx.reply("Outfit not found, did you get the id right?") + ); + }); } } From dea03532803fa8a3ae12e04dc81104b76ac3e405 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 27 Feb 2020 18:30:38 -0500 Subject: [PATCH 054/157] Removed more unused variables --- .../fsbot/endpoints/imgur/ImgurAPIConnection.java | 5 ----- src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java | 2 +- .../java/dev/salmonllama/fsbot/guthix/PermissionManager.java | 5 +---- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java index d981230..77a5c06 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java @@ -13,11 +13,6 @@ import java.io.IOException; import java.util.concurrent.CompletableFuture; public class ImgurAPIConnection { - // No idea what these are or what they do, but the request doesn't work without them. - private final String MEDIA_TYPE = "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"; - // To be used with String.format() and a link to the image. It will populate automatically. - private final String BODY_THING = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"; - private final String REQUEST_URL = "https://api.imgur.com/3/image/"; private final String CLIENT_ID; // Required for uploading diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index a19a218..186e549 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -37,7 +37,7 @@ public class Guthix implements MessageCreateListener { this.db = db; - manager = new PermissionManager(api); + manager = new PermissionManager(); registry = new Registry(); initCommands(); diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java index 5ea944b..173d54f 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java @@ -5,14 +5,11 @@ package dev.salmonllama.fsbot.guthix; -import org.javacord.api.DiscordApi; import org.javacord.api.entity.message.MessageAuthor; public class PermissionManager { - private DiscordApi api; - public PermissionManager(DiscordApi api) { - this.api = api; + public PermissionManager() { } public boolean hasPermission(CommandPermission reqPerm, CommandContext ctx) { From 1aef13e0ecfeaaed864f55f5fa6ec2f610727709 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 28 Feb 2020 17:43:36 -0500 Subject: [PATCH 055/157] Added TODO --- .../fsbot/commands/developer/CreateGalleryCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 89e250c..db75c23 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -65,7 +65,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs ctx.getChannel().asServerTextChannel().ifPresent(channel -> gallery.channelName = channel.getName()); - GalleryController.insert(gallery).exceptionally(ExceptionLogger.get()); // Make a discord exception logger for the thingos + GalleryController.insert(gallery).exceptionally(ExceptionLogger.get()); // TODO: Make a discord exception logger for the thingos EmbedBuilder embed = new EmbedBuilder() .setColor(Color.GREEN) From f1abf6998881ff8dfcf4e0ba50c18b064a007582 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 28 Feb 2020 17:43:53 -0500 Subject: [PATCH 056/157] Added more counting methods --- .../controllers/OutfitController.java | 94 +++++++++++++++---- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index e583703..eb4ee87 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -98,10 +98,50 @@ public class OutfitController { }); } - public static CompletableFuture countOutfits() { + public static CompletableFuture countTotalOutfits() { return CompletableFuture.supplyAsync(() -> { try { - return countOutfitsExec(); + return countTotalOutfitsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countDeletedOutfits() { + return CompletableFuture.supplyAsync(() -> { + try { + return countDeletedOutfitsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countActiveOutfits() { + return CompletableFuture.supplyAsync(() -> { + try { + return countActiveOutfitsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countFeaturedOutfits() { + return CompletableFuture.supplyAsync(() -> { + try { + return countFeaturedOutfitsExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture countOutfits(boolean deleted, boolean featured) { + return CompletableFuture.supplyAsync(() -> { + try { + return countOutfitsExec(deleted, featured); } catch (SQLException e) { throw new CompletionException(e); } @@ -224,28 +264,40 @@ public class OutfitController { return extractMultiple(rs); } - private static int countOutfitsExec() throws SQLException { + private static int countTotalOutfitsExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits"); + + return extractCount(rs); + } + + private static int countDeletedOutfitsExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 1"); + + return extractCount(rs); + } + + private static int countActiveOutfitsExec() throws SQLException { ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = 0"); - int count = 0; - if (rs.next()) { - count = rs.getInt("count"); - } + return extractCount(rs); + } - FSDB.get().close(rs); - return count; + private static int countFeaturedOutfitsExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE featured = 1"); + + return extractCount(rs); + } + + private static int countOutfitsExec(boolean deleted, boolean featured) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE deleted = ? AND featured = ?", deleted, featured); + + return extractCount(rs); } private static int countOutfitsBySubmitterExec(String submitterId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM outfits WHERE submitter = ? AND deleted = 0", submitterId); - int count = 0; - if (rs.next()) { - count = rs.getInt("count"); - } - - FSDB.get().close(rs); - return count; + return extractCount(rs); } private static Collection getDistinctTagsExec() throws SQLException { @@ -276,6 +328,16 @@ public class OutfitController { return Optional.of(outfits); } + private static int extractCount(ResultSet rs) throws SQLException { + int count = 0; + if (rs.next()) { + count = rs.getInt("count"); + } + + FSDB.get().close(rs); + return count; + } + private static Outfit mapObject(ResultSet rs) throws SQLException { return new Outfit.OutfitBuilder() .setId(rs.getString("id")) From 84e44fe4f833b8b669f4adb4ab7699df0d14ca72 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 28 Feb 2020 17:44:03 -0500 Subject: [PATCH 057/157] New StatsCommand --- .../fsbot/commands/general/StatsCommand.java | 46 +++++++++++++++++++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 4 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java new file mode 100644 index 0000000..c2338f2 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/StatsCommand.java @@ -0,0 +1,46 @@ +package dev.salmonllama.fsbot.commands.general; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; + +public class StatsCommand extends Command { + @Override public String name() { return "Stats"; } + @Override public String description() { return "Shows various stats from Fashionscape Bot"; } + @Override public String usage() { return "stats"; } + @Override public String category() { return "General"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("stats")); } + + @Override + public void onCommand(CommandContext ctx) { + // Stats to display: + // Number of users + // Number of servers + // Number of galleries + // Number of non-deleted images + // Number of total images + // CPU and RAM? + int userCount = ctx.getApi().getCachedUsers().size(); // Will these be accurate with sharding? + int serverCount = ctx.getApi().getServers().size(); + + EmbedBuilder embed = new EmbedBuilder(); // TODO: Standard embeds yeah? + embed.setTitle("Stats"); + embed.addField("Users:", String.valueOf(userCount)); + embed.addField("Servers:", String.valueOf(serverCount)); + + OutfitController.countActiveOutfits().thenAccept(count -> embed.addField("Active outfits:", String.valueOf(count))).join(); + OutfitController.countTotalOutfits().thenAccept(count -> embed.addField("Total outifts:", String.valueOf(count))).join(); + OutfitController.countFeaturedOutfits().thenAccept(count -> embed.addField("Featured outfits:", String.valueOf(count))).join(); + + ctx.reply(embed); + } +} \ No newline at end of file diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 186e549..f6c6a9f 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -22,9 +22,10 @@ import java.util.Collection; import java.util.HashMap; /* -* Guthix is Fashionscape Bot's command repository and dispatcher + * Guthix is Fashionscape Bot's command repository and dispatcher */ public class Guthix implements MessageCreateListener { + @SuppressWarnings("unused") private DiscordApi api; private DatabaseUtilities db; @@ -68,6 +69,7 @@ public class Guthix implements MessageCreateListener { addCommand(new ColorsCommand()); addCommand(new OutfitCommand()); addCommand(new HelpCommand(this)); + addCommand(new StatsCommand()); } public void addCommand(Command cmd) { From 03dd9bfbcd9e1f4b71aaf701e5631c93299253b2 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 28 Feb 2020 17:44:12 -0500 Subject: [PATCH 058/157] Suppressed warning on Guthix --- src/main/java/dev/salmonllama/fsbot/Main.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 394ecb3..544c063 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -35,6 +35,7 @@ public class Main { new DiscordApiBuilder().setToken(BotConfig.TOKEN).login().thenAccept(api -> { DatabaseUtilities db = new DatabaseUtilities(r, conn, api); + @SuppressWarnings("unused") Guthix guthix = new Guthix(api, db); // Register listeners From f2113b7671edaaf4e68f11108a136480b57ecae4 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Wed, 18 Mar 2020 13:08:24 -0400 Subject: [PATCH 059/157] Make gradlew executable --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 07fd40a9488e800d0f37d5d48318350876fe37ea Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 14:37:58 -0400 Subject: [PATCH 060/157] ServerConfig model and controller --- .../controllers/ServerConfigController.java | 71 +++++++++++++++++++ .../fsbot/database/models/ServerConfig.java | 70 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java new file mode 100644 index 0000000..88153e8 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.ServerConfig; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class ServerConfigController { + // insert + // retrieve + // update + // No need for delete -> guilds should persist after leaving. + + public static CompletableFuture insert(ServerConfig config) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(config); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> getServerConfig(String serverId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getServerConfigExec(serverId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(ServerConfig config) throws SQLException { + FSDB.get().insert("INSERT INTO server_config('id', 'name', 'prefix') VALUES (?, ?, ?)", + config.getId(), + config.getName(), + config.getPrefix() + ); + } + + private static Optional getServerConfigExec(String serverId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM server_config WHERE id = ?"); + + if (rs.next()) { + ServerConfig config = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(config); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private static ServerConfig mapObject(ResultSet rs) throws SQLException { + return new ServerConfig.ServerConfigBuilder() + .setId(rs.getString("id")) + .setName(rs.getString("name")) + .setPrefix(rs.getString("prefix")) + .build(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java new file mode 100644 index 0000000..1ad47db --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java @@ -0,0 +1,70 @@ +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +public class ServerConfig extends DatabaseModel { + private String id; + private String name; + private String prefix; + + public ServerConfig(ServerConfigBuilder builder) { + this.id = builder.id; + this.name = builder.name; + this.prefix = builder.prefix; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getPrefix() { + return prefix; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS server_config (" + + "id TEXT PRIMARY KEY ," + + "name TEXT," + + "prefix TEXT)"; + } + + @Override + public String toString() { + return String.format("Server Config: [id: %s, name: %s, prefix: %s", + id, name, prefix + ); + } + + public static class ServerConfigBuilder { + private String id; + private String name; + private String prefix; + + public ServerConfigBuilder() { + + } + + public ServerConfigBuilder setId(String id) { + this.id = id; + return this; + } + + public ServerConfigBuilder setName(String name) { + this.name = name; + return this; + } + + public ServerConfigBuilder setPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + public ServerConfig build() { + return new ServerConfig(this); + } + } +} \ No newline at end of file From d7e9cf7cd1ac4befe3d1605395eb1772a708a5a2 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 14:38:31 -0400 Subject: [PATCH 061/157] Added ServerConfig to startup schema --- src/main/java/dev/salmonllama/fsbot/database/FSDB.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index 62c4c87..c73d66f 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -9,6 +9,7 @@ package dev.salmonllama.fsbot.database; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.database.models.Outfit; +import dev.salmonllama.fsbot.database.models.ServerConfig; import java.sql.SQLException; import java.util.HashMap; @@ -41,6 +42,7 @@ public class FSDB { try { get().query(Outfit.schema()); get().query(GalleryChannel.schema()); + get().query(ServerConfig.schema()); } catch (SQLException e) { e.printStackTrace(); } From cea828eb387e1c4c36c4b432fd73c6a8201011f1 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 14:39:01 -0400 Subject: [PATCH 062/157] Pedantic formatting fixes --- src/main/java/dev/salmonllama/fsbot/Main.java | 1 - .../fsbot/database/controllers/OutfitController.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 544c063..8803ced 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -16,7 +16,6 @@ import org.javacord.api.DiscordApiBuilder; import dev.salmonllama.fsbot.utilities.Constants; import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; - // TODO: auto-switching status messages. // TODO: Add an official Logger --> logging to Discord, not console diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index eb4ee87..14f0ef7 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -191,7 +191,7 @@ public class OutfitController { outfit.isFeatured(), outfit.getDisplayCount(), outfit.getDeleteHash() - ); + ); } private static Optional findByIdExec(String id) throws SQLException { From 054c1894f4b8041e19a8a884fcdca8cfde08d580 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 14:39:19 -0400 Subject: [PATCH 063/157] Builder TODO --- .../fsbot/database/controllers/GalleryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 5e68320..bc1f984 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -95,7 +95,7 @@ public class GalleryController { return tag; } - private static GalleryChannel mapObject(ResultSet rs) throws SQLException { + private static GalleryChannel mapObject(ResultSet rs) throws SQLException { // TODO: Builder this GalleryChannel gallery = new GalleryChannel(); gallery.serverId = rs.getString("server_id"); gallery.serverName = rs.getString("server_name"); From da526d50e3d586b694b84a34860925c9b5736b77 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 14:39:32 -0400 Subject: [PATCH 064/157] Updated compile to implementation --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5f00c83..4af427c 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { implementation 'com.vdurmont:emoji-java:4.0.0' implementation 'com.squareup.okhttp3:okhttp:4.4.0' - testCompile group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.12' } mainClassName = 'dev.salmonllama.fsbot.Main' From 00c5842a341e8028de79f0f2ec095e6a1b44f913 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 15:48:25 -0400 Subject: [PATCH 065/157] Added query overload for updating --- .../dev/salmonllama/fsbot/database/DatabaseProvider.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index 38eda5f..c38ab73 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -71,6 +71,13 @@ public class DatabaseProvider { } } + public int query(String sql, Object... params) throws SQLException { + try (PreparedStatement stmt = getConnection().prepareStatement(sql)) { + resolveParameters(stmt, params); + return stmt.executeUpdate(sql); + } + } + public int insert(String sql, Object... params) throws SQLException { try (PreparedStatement query = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { resolveParameters(query, params); From bb8e31ff8d0a7dd21c11e326cf2aece479e50820 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 15:48:40 -0400 Subject: [PATCH 066/157] Added update for ServerConfig --- .../controllers/ServerConfigController.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java index 88153e8..e4a6dc1 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java @@ -40,6 +40,16 @@ public class ServerConfigController { }); } + public static CompletableFuture update(ServerConfig config) { + return CompletableFuture.runAsync(() -> { + try { + updateExec(config); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + private static void insertExec(ServerConfig config) throws SQLException { FSDB.get().insert("INSERT INTO server_config('id', 'name', 'prefix') VALUES (?, ?, ?)", config.getId(), @@ -61,6 +71,14 @@ public class ServerConfigController { return Optional.empty(); } + private static void updateExec(ServerConfig config) throws SQLException { + FSDB.get().query("UPDATE server_config SET prefix = ?, name = ? WHERE id = ?", + config.getPrefix(), + config.getName(), + config.getId() + ); + } + private static ServerConfig mapObject(ResultSet rs) throws SQLException { return new ServerConfig.ServerConfigBuilder() .setId(rs.getString("id")) From ef466013e0fdffa101bac46850a33f338f76eb1e Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 19:31:52 -0400 Subject: [PATCH 067/157] ServerBlacklist model/controller --- .../ServerBlacklistController.java | 121 ++++++++++++++++++ .../database/models/ServerBlacklist.java | 78 +++++++++++ 2 files changed, 199 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java new file mode 100644 index 0000000..3d3068c --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.ServerBlacklist; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class ServerBlacklistController { + // Need to create, read, and delete. No need for update? + public static CompletableFuture insert(ServerBlacklist bl) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(bl); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture exists(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture exists(ServerBlacklist bl) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(bl.getId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> get(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return getExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture delete(String id) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture delete(ServerBlacklist bl) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(bl.getId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(ServerBlacklist bl) throws SQLException { + FSDB.get().insert("INSERT INTO blacklist_servers ('id', 'name', 'owner_id', 'added') VALUES (?, ?, ?, ?)", + bl.getId(), + bl.getName(), + bl.getOwnerId(), + bl.getAdded() + ); + } + + private static boolean existsExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM blacklist_servers WHERE id = ?) AS hmm", id); + boolean exists = rs.getBoolean("hmm"); + + FSDB.get().close(rs); + return exists; + } + + private static Optional getExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM blacklist_servers WHERE id = ?", id); + + if (rs.next()) { + ServerBlacklist bl = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(bl); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private static void deleteExec(String id) throws SQLException { + FSDB.get().query("DELETE FROM blacklist_servers WHERE id = ?", id); + } + + private static ServerBlacklist mapObject(ResultSet rs) throws SQLException { + return new ServerBlacklist.ServerBlacklistBuilder(rs.getString("id")) + .setName(rs.getString("name")) + .setOwnerId(rs.getString("owner_id")) + .setAdded(new Timestamp( rs.getLong("added"))) + .build(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java new file mode 100644 index 0000000..4450daf --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +import java.sql.Timestamp; + +public class ServerBlacklist extends DatabaseModel { + private String id; + private String name; + private String ownerId; + private Timestamp added; + + private ServerBlacklist(ServerBlacklistBuilder builder) { + this.id = builder.id; + this.name = builder.name; + this.ownerId = builder.ownerId; + this.added = builder.added; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getOwnerId() { + return ownerId; + } + + public Timestamp getAdded() { + return added; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS blacklist_servers (" + + "id TEXT PRIMARY KEY," + + "name TEXT," + + "owner_id TEXT," + + "added TEXT)"; + } + + public static class ServerBlacklistBuilder { + private String id; + private String name; + private String ownerId; + private Timestamp added; + + public ServerBlacklistBuilder(String id) { + this.id = id; + } + + public ServerBlacklistBuilder setName(String name) { + this.name = name; + return this; + } + + public ServerBlacklistBuilder setOwnerId(String ownerId) { + this.ownerId = ownerId; + return this; + } + + public ServerBlacklistBuilder setAdded(Timestamp added) { + this.added = added; + return this; + } + + public ServerBlacklist build() { + return new ServerBlacklist(this); + } + } +} From c2dcf7ee8002de53a73363a740342dd6297af452 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 19:32:19 -0400 Subject: [PATCH 068/157] Fixed/added comments --- .../fsbot/database/controllers/OutfitController.java | 1 + .../dev/salmonllama/fsbot/database/models/GalleryChannel.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 14f0ef7..0ff0617 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -18,6 +18,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; public class OutfitController { + // There is no delete method. 'Deletions' should be executed as an update to the deleted flag. public static CompletableFuture insert(Outfit outfit) { return CompletableFuture.runAsync(() -> { try { diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java index dc6f4b5..deab448 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -42,7 +42,7 @@ public class GalleryChannel extends DatabaseModel { return "CREATE TABLE IF NOT EXISTS galleries (" + "server_id TEXT," + "server_name TEXT," + - "channel_id TEXT," + // PRIMARY KEY? There can only be one gallery per channel. + "channel_id TEXT," + // TODO: PRIMARY KEY? There can only be one gallery per channel. "channel_name TEXT," + "tag TEXT)"; } From aeb1ca9d3ed225d6a96e3d812d742ea915b3f4cf Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 19:32:44 -0400 Subject: [PATCH 069/157] Auto-closed insert ResultSet --- .../dev/salmonllama/fsbot/database/DatabaseProvider.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index c38ab73..e514bc8 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -79,12 +79,13 @@ public class DatabaseProvider { } public int insert(String sql, Object... params) throws SQLException { - try (PreparedStatement query = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + try ( + PreparedStatement query = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + ResultSet rs = query.getGeneratedKeys() + ) { resolveParameters(query, params); query.executeUpdate(); - ResultSet rs = query.getGeneratedKeys(); - if (rs.next()) { return rs.getInt(1); } From a1dd8e7c9802094b8478e383b406aeb3854b4679 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 19:33:13 -0400 Subject: [PATCH 070/157] Added ServerBlacklist schema to table setups --- src/main/java/dev/salmonllama/fsbot/database/FSDB.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index c73d66f..91b8023 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -9,6 +9,7 @@ package dev.salmonllama.fsbot.database; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.database.models.Outfit; +import dev.salmonllama.fsbot.database.models.ServerBlacklist; import dev.salmonllama.fsbot.database.models.ServerConfig; import java.sql.SQLException; @@ -43,6 +44,7 @@ public class FSDB { get().query(Outfit.schema()); get().query(GalleryChannel.schema()); get().query(ServerConfig.schema()); + get().query(ServerBlacklist.schema()); } catch (SQLException e) { e.printStackTrace(); } From 4fe7adae0c757aad3ad6f252a793143df411fd37 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sat, 11 Apr 2020 19:33:22 -0400 Subject: [PATCH 071/157] Fixed typo --- .../dev/salmonllama/fsbot/database/models/ServerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java index 1ad47db..187cff8 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java @@ -34,7 +34,7 @@ public class ServerConfig extends DatabaseModel { @Override public String toString() { - return String.format("Server Config: [id: %s, name: %s, prefix: %s", + return String.format("Server Config: [id: %s, name: %s, prefix: %s]", id, name, prefix ); } From bd7b4098be3d787d824bc89240bdae3ca31d1f14 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 12:06:49 -0400 Subject: [PATCH 072/157] Updated Javacord dependency --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4af427c..9b53525 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ repositories { dependencies { implementation 'org.xerial:sqlite-jdbc:3.30.1' implementation 'com.github.Kaaz:ConfigurationBuilder:0.4' - implementation 'org.javacord:javacord:3.0.5' + implementation 'org.javacord:javacord:3.0.6' implementation group: 'com.rethinkdb', name: 'rethinkdb-driver', version: '2.3.3' // set for removal implementation 'com.vdurmont:emoji-java:4.0.0' implementation 'com.squareup.okhttp3:okhttp:4.4.0' From e5ec9c75b58916ef0bec804fe6b14634af608740 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 12:07:20 -0400 Subject: [PATCH 073/157] Clean up comments and spacing --- .../fsbot/database/controllers/ServerBlacklistController.java | 2 +- .../dev/salmonllama/fsbot/database/models/ServerBlacklist.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java index 3d3068c..5a6ad63 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java @@ -115,7 +115,7 @@ public class ServerBlacklistController { return new ServerBlacklist.ServerBlacklistBuilder(rs.getString("id")) .setName(rs.getString("name")) .setOwnerId(rs.getString("owner_id")) - .setAdded(new Timestamp( rs.getLong("added"))) + .setAdded(new Timestamp(rs.getLong("added"))) .build(); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java index 4450daf..11c7d4f 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java @@ -9,7 +9,7 @@ import dev.salmonllama.fsbot.database.DatabaseModel; import java.sql.Timestamp; -public class ServerBlacklist extends DatabaseModel { +public class ServerBlacklist extends DatabaseModel { // TODO: Add a reason? private String id; private String name; private String ownerId; From 73e41b6c9799cd1dbee7d2c3c91a5853c68338e0 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 12:07:31 -0400 Subject: [PATCH 074/157] Added user blacklisting --- .../dev/salmonllama/fsbot/database/FSDB.java | 6 +- .../controllers/UserBlacklistController.java | 123 ++++++++++++++++++ .../fsbot/database/models/UserBlacklist.java | 70 ++++++++++ 3 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index 91b8023..b940eec 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -7,10 +7,7 @@ package dev.salmonllama.fsbot.database; import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.database.models.GalleryChannel; -import dev.salmonllama.fsbot.database.models.Outfit; -import dev.salmonllama.fsbot.database.models.ServerBlacklist; -import dev.salmonllama.fsbot.database.models.ServerConfig; +import dev.salmonllama.fsbot.database.models.*; import java.sql.SQLException; import java.util.HashMap; @@ -45,6 +42,7 @@ public class FSDB { get().query(GalleryChannel.schema()); get().query(ServerConfig.schema()); get().query(ServerBlacklist.schema()); + get().query(UserBlacklist.schema()); } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java new file mode 100644 index 0000000..d6dbec3 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.ServerBlacklist; +import dev.salmonllama.fsbot.database.models.UserBlacklist; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Optional; +import java.util.OptionalDouble; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class UserBlacklistController { + // Need to create, read, and delete. No need for update? + // Exists, insert, get, delete + public static CompletableFuture insert(UserBlacklist bl) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(bl); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture exists(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture exists(UserBlacklist bl) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(bl.getId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture> get(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return getExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + + public static CompletableFuture delete(String id) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture delete(UserBlacklist bl) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(bl.getId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(UserBlacklist bl) throws SQLException { + FSDB.get().insert("INSERT INTO blacklist_users ('id', 'reason', 'added') VALUES (?, ?, ?)", + bl.getId(), + bl.getReason(), + bl.getAdded() + ); + } + + private static boolean existsExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM blacklist_users WHERE id = ?) AS hmm", id); + boolean exists = rs.getBoolean("hmm"); + + FSDB.get().close(rs); + return exists; + } + + private static Optional getExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM blacklist_users WHERE id = ?", id); + + if (rs.next()) { + UserBlacklist bl = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(bl); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private static void deleteExec(String id) throws SQLException { + FSDB.get().query("DELETE FROM blacklist_users WHERE id = ?", id); + } + + private static UserBlacklist mapObject(ResultSet rs) throws SQLException { + return new UserBlacklist.UserBlacklistBuilder(rs.getString("id")) + .setReason(rs.getString("reason")) + .setAdded(new Timestamp(rs.getLong("added"))) + .build(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java new file mode 100644 index 0000000..1075f80 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +import java.sql.Timestamp; + +public class UserBlacklist extends DatabaseModel { + private String id; + private String reason; + private Timestamp added; + + private UserBlacklist(UserBlacklistBuilder builder) { + this.id = builder.id; + this.reason = builder.reason; + this.added = builder.added; + } + + public String getId() { + return id; + } + + public String getReason() { + return reason; + } + + public Timestamp getAdded() { + return added; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS blacklist_users(" + + "id TEXT PRIMARY KEY," + + "reason TEXT," + + "added TEXT)"; + } + + public static class UserBlacklistBuilder { + private String id; + private String reason; + private Timestamp added; + + public UserBlacklistBuilder(String id) { + this.id = id; + } + + public UserBlacklistBuilder setId(String id) { + this.id = id; + return this; + } + + public UserBlacklistBuilder setReason(String reason) { + this.reason = reason; + return this; + } + + public UserBlacklistBuilder setAdded(Timestamp added) { + this.added = added; + return this; + } + + public UserBlacklist build() { + return new UserBlacklist(this); + } + } +} From 3e7fad6410e62150dec3ae8c1fa4ba1f4950a598 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 12:25:18 -0400 Subject: [PATCH 075/157] Added emoji modifiers to Gallery model/controller --- .../database/controllers/GalleryController.java | 16 +++++++++++++--- .../fsbot/database/models/GalleryChannel.java | 13 +++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index bc1f984..75d88d0 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -55,15 +55,16 @@ public class GalleryController { } }); } - + // TODO: Refactor for proper Java-ing, add GalleryBuilder private static void insertExec(GalleryChannel gallery) throws SQLException { - FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag')" + + FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag', 'emoji')" + "VALUES(?, ?, ?, ?, ?)", gallery.serverId, gallery.serverName, gallery.channelId, gallery.channelName, - gallery.tag + gallery.tag, + gallery.emoji ); } @@ -95,6 +96,14 @@ public class GalleryController { return tag; } + private static String getEmojiExec(String channelId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE channel_id = ?"); + String emoji = rs.getString("emoji"); + + FSDB.get().close(rs); + return emoji; + } + private static GalleryChannel mapObject(ResultSet rs) throws SQLException { // TODO: Builder this GalleryChannel gallery = new GalleryChannel(); gallery.serverId = rs.getString("server_id"); @@ -102,6 +111,7 @@ public class GalleryController { gallery.channelId = rs.getString("channel_id"); gallery.channelName = rs.getString("channel_name"); gallery.tag = rs.getString("tag"); + gallery.emoji = rs.getString("emoji"); return gallery; } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java index deab448..c92b8f8 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -13,6 +13,10 @@ public class GalleryChannel extends DatabaseModel { public String channelId; public String channelName; public String tag; + // Normal emojis will be stored in plain text as :emoji: + // Server emojis will be stored in plain text as <:emoji:emoji-id> + // This can be acquired through CustomEmoji#getMentionTag() + public String emoji; public GalleryChannel() { @@ -38,18 +42,23 @@ public class GalleryChannel extends DatabaseModel { return tag; } + public String getEmoji() { + return emoji; + } + public static String schema() { return "CREATE TABLE IF NOT EXISTS galleries (" + "server_id TEXT," + "server_name TEXT," + "channel_id TEXT," + // TODO: PRIMARY KEY? There can only be one gallery per channel. "channel_name TEXT," + + "emoji TEXT," + "tag TEXT)"; } @Override public String toString() { - return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, channel name: %s, tag: %s]", - serverId, serverName, channelId, channelName, tag); + return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, channel name: %s, tag: %s, emoji: %s]", + serverId, serverName, channelId, channelName, tag, emoji); } } From 393ea64462d60462ac590c05320fb92d19bdf54b Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 17:51:16 -0400 Subject: [PATCH 076/157] Created Travis integration --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..00b7753 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: java +jdk: + - openjdk11 \ No newline at end of file From 879612918f6964de5e5050673f9ae603bfa37cbd Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 19:27:11 -0400 Subject: [PATCH 077/157] Webhook on finish --- .travis.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 00b7753..8e716ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,11 @@ language: java jdk: - - openjdk11 \ No newline at end of file + - openjdk11 +after_success: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh success $WEBHOOK_URL +after_failure: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh failure $WEBHOOK_URL \ No newline at end of file From 4daf677595c99fabdd7b19fffbb3f4731548e0f1 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 23:56:47 -0400 Subject: [PATCH 078/157] Add toString overrides to blacklist models --- .../fsbot/database/models/ServerBlacklist.java | 10 ++++++++++ .../fsbot/database/models/UserBlacklist.java | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java index 11c7d4f..4aaeb92 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerBlacklist.java @@ -46,6 +46,16 @@ public class ServerBlacklist extends DatabaseModel { // TODO: Add a reason? "added TEXT)"; } + @Override + public String toString() { + return String.format("Server Blacklist: [id: %s, name: %s, owner_id: %s, added %s]", + this.getId(), + this.getName(), + this.getOwnerId(), + this.getAdded() + ); + } + public static class ServerBlacklistBuilder { private String id; private String name; diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java index 1075f80..7ef05df 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java @@ -39,6 +39,15 @@ public class UserBlacklist extends DatabaseModel { "added TEXT)"; } + @Override + public String toString() { + return String.format("User Blacklist: [id: %s, reason: %s, added: %s", + this.getId(), + this.getReason(), + this.getAdded() + ); + } + public static class UserBlacklistBuilder { private String id; private String reason; From c8539bfaefed047defae35d3bad1ebd004dd30df Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 23:56:55 -0400 Subject: [PATCH 079/157] reminders --- .../fsbot/database/controllers/ServerBlacklistController.java | 1 + .../fsbot/database/controllers/UserBlacklistController.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java index 5a6ad63..c32a839 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerBlacklistController.java @@ -78,6 +78,7 @@ public class ServerBlacklistController { } private static void insertExec(ServerBlacklist bl) throws SQLException { + // TODO: Check for null added timestamp and init FSDB.get().insert("INSERT INTO blacklist_servers ('id', 'name', 'owner_id', 'added') VALUES (?, ?, ?, ?)", bl.getId(), bl.getName(), diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java index d6dbec3..50761ee 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java @@ -82,6 +82,7 @@ public class UserBlacklistController { } private static void insertExec(UserBlacklist bl) throws SQLException { + // TODO: Check for null timestamp and init FSDB.get().insert("INSERT INTO blacklist_users ('id', 'reason', 'added') VALUES (?, ?, ?)", bl.getId(), bl.getReason(), From a2ae57ab6cdd52a1e97972c9da13d57badb3d56d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Sun, 28 Jun 2020 23:57:07 -0400 Subject: [PATCH 080/157] Scaffold welcome message model/controller --- .../controllers/WelcomeMessageController.java | 10 ++++ .../fsbot/database/models/WelcomeMessage.java | 57 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java new file mode 100644 index 0000000..fa719e8 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +public class WelcomeMessageController { + // Needs insert, update, and delete. Only one per server -> needs exists +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java b/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java new file mode 100644 index 0000000..501e72e --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +import java.sql.Timestamp; + +public class WelcomeMessage extends DatabaseModel { + // Need the message, the last time it was updated, and the id of the last person who updated it. + private String message; + private Timestamp updated; + private String editor; + + private WelcomeMessage(WelcomeMessageBuilder builder) { + message = builder.message; + updated = builder.updated; + editor = builder.editor; + } + + public String getMessage() { + return message; + } + + public Timestamp getUpdated() { + return updated; + } + + public String getEditor() { + return editor; + } + + public static class WelcomeMessageBuilder { + private String message; + private Timestamp updated = null; + private String editor = null; + + public WelcomeMessageBuilder(String message) { + this.message = message; + } + + public void setUpdated(Timestamp updated) { + this.updated = updated; + } + + public void setEditor(String editor) { + this.editor = editor; + } + + public WelcomeMessage build() { + return new WelcomeMessage(this); + } + } +} From 170e453617517e6758c63c8d948830f88c1a01dd Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 14:47:51 -0400 Subject: [PATCH 081/157] Fix spacing --- .../fsbot/database/controllers/OutfitController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 0ff0617..cbd7f13 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -179,7 +179,7 @@ public class OutfitController { } FSDB.get().insert( - "INSERT INTO " + + "INSERT INTO " + "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'delete_hash') " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", outfit.getId(), From 7ad59e382529ffe7f5db828fdb290e533ec99413 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 14:47:59 -0400 Subject: [PATCH 082/157] Fix spacing --- .../dev/salmonllama/fsbot/database/models/UserBlacklist.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java index 7ef05df..fe17629 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java @@ -33,7 +33,7 @@ public class UserBlacklist extends DatabaseModel { } public static String schema() { - return "CREATE TABLE IF NOT EXISTS blacklist_users(" + + return "CREATE TABLE IF NOT EXISTS blacklist_users (" + "id TEXT PRIMARY KEY," + "reason TEXT," + "added TEXT)"; From 2f68e09199ad9cb719aeb3bbceab590806510167 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 14:48:18 -0400 Subject: [PATCH 083/157] Add identifier --- .../fsbot/database/models/WelcomeMessage.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java b/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java index 501e72e..218a904 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java @@ -11,16 +11,22 @@ import java.sql.Timestamp; public class WelcomeMessage extends DatabaseModel { // Need the message, the last time it was updated, and the id of the last person who updated it. + private String serverId; private String message; private Timestamp updated; private String editor; private WelcomeMessage(WelcomeMessageBuilder builder) { + serverId = builder.serverId; message = builder.message; updated = builder.updated; editor = builder.editor; } + public String getServerId() { + return serverId; + } + public String getMessage() { return message; } @@ -33,21 +39,37 @@ public class WelcomeMessage extends DatabaseModel { return editor; } + public static String schema() { + return "CREATE TABLE IF NOT EXISTS welcome_messages (" + + "server_id TEXT PRIMARY KEY," + + "message TEXT," + + "updated TEXT," + + "editor TEXT)"; + } + public static class WelcomeMessageBuilder { - private String message; + private String serverId; + private String message = null; private Timestamp updated = null; private String editor = null; - public WelcomeMessageBuilder(String message) { + public WelcomeMessageBuilder(String serverId) { + this.serverId = serverId; + } + + public WelcomeMessageBuilder setMessage(String message) { this.message = message; + return this; } - public void setUpdated(Timestamp updated) { + public WelcomeMessageBuilder setUpdated(Timestamp updated) { this.updated = updated; + return this; } - public void setEditor(String editor) { + public WelcomeMessageBuilder setEditor(String editor) { this.editor = editor; + return this; } public WelcomeMessage build() { From addd635d4b8d2e546cd7c02dad8732f05abc327c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 14:48:27 -0400 Subject: [PATCH 084/157] Controller logic --- .../controllers/WelcomeMessageController.java | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java index fa719e8..fdb6839 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java @@ -5,6 +5,126 @@ package dev.salmonllama.fsbot.database.controllers; +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.WelcomeMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + public class WelcomeMessageController { // Needs insert, update, and delete. Only one per server -> needs exists + public CompletableFuture insert(WelcomeMessage msg) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(msg); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture> get(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return getExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture update(WelcomeMessage msg) { + return CompletableFuture.runAsync(() -> { + try { + updateExec(msg); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture exists(String id) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture delete(String id) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture delete(WelcomeMessage msg) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(msg.getServerId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private void insertExec(WelcomeMessage msg) throws SQLException { + FSDB.get().insert("INSERT INTO welcome_messages (server_id, message, updated, editor) VALUES (?, ?, ?, ?)", + msg.getServerId(), + msg.getMessage(), + msg.getUpdated(), + msg.getEditor() + ); + } + + private Optional getExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM welcome_messages WHERE server_id = ?", id); + + if (rs.next()) { + WelcomeMessage msg = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(msg); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private void updateExec(WelcomeMessage msg) throws SQLException { + FSDB.get().query("UPDATE welcome_messages SET message = ?, updated = ?, editor = ? WHERE server_id = ?", + msg.getMessage(), + msg.getUpdated(), + msg.getEditor(), + msg.getServerId() + ); + } + + private boolean existsExec(String id) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM welcome_messages WHERE server_id = ?) AS hmm", id); + boolean exists = rs.getBoolean("hmm"); + + FSDB.get().close(rs); + return exists; + } + + private void deleteExec(String id) throws SQLException { + FSDB.get().query("DELETE FROM welcome_messages WHERE server_id = ?", id); + } + + private WelcomeMessage mapObject(ResultSet rs) throws SQLException { + return new WelcomeMessage.WelcomeMessageBuilder(rs.getString("server_id")) + .setMessage(rs.getString("message")) + .setUpdated(new Timestamp(rs.getLong("updated"))) + .setEditor(rs.getString("editor")) + .build(); + } } From 7f62b9bf58dc8aa97127cf582612996674671fae Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 17:04:00 -0400 Subject: [PATCH 085/157] Needs to be static --- .../controllers/WelcomeMessageController.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java index fdb6839..623fa5b 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java @@ -17,7 +17,7 @@ import java.util.concurrent.CompletionException; public class WelcomeMessageController { // Needs insert, update, and delete. Only one per server -> needs exists - public CompletableFuture insert(WelcomeMessage msg) { + public static CompletableFuture insert(WelcomeMessage msg) { return CompletableFuture.runAsync(() -> { try { insertExec(msg); @@ -27,7 +27,7 @@ public class WelcomeMessageController { }); } - public CompletableFuture> get(String id) { + public static CompletableFuture> get(String id) { return CompletableFuture.supplyAsync(() -> { try { return getExec(id); @@ -37,7 +37,7 @@ public class WelcomeMessageController { }); } - public CompletableFuture update(WelcomeMessage msg) { + public static CompletableFuture update(WelcomeMessage msg) { return CompletableFuture.runAsync(() -> { try { updateExec(msg); @@ -47,7 +47,7 @@ public class WelcomeMessageController { }); } - public CompletableFuture exists(String id) { + public static CompletableFuture exists(String id) { return CompletableFuture.supplyAsync(() -> { try { return existsExec(id); @@ -57,7 +57,7 @@ public class WelcomeMessageController { }); } - public CompletableFuture delete(String id) { + public static CompletableFuture delete(String id) { return CompletableFuture.runAsync(() -> { try { deleteExec(id); @@ -67,7 +67,7 @@ public class WelcomeMessageController { }); } - public CompletableFuture delete(WelcomeMessage msg) { + public static CompletableFuture delete(WelcomeMessage msg) { return CompletableFuture.runAsync(() -> { try { deleteExec(msg.getServerId()); @@ -77,7 +77,7 @@ public class WelcomeMessageController { }); } - private void insertExec(WelcomeMessage msg) throws SQLException { + private static void insertExec(WelcomeMessage msg) throws SQLException { FSDB.get().insert("INSERT INTO welcome_messages (server_id, message, updated, editor) VALUES (?, ?, ?, ?)", msg.getServerId(), msg.getMessage(), @@ -86,7 +86,7 @@ public class WelcomeMessageController { ); } - private Optional getExec(String id) throws SQLException { + private static Optional getExec(String id) throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM welcome_messages WHERE server_id = ?", id); if (rs.next()) { @@ -99,7 +99,7 @@ public class WelcomeMessageController { return Optional.empty(); } - private void updateExec(WelcomeMessage msg) throws SQLException { + private static void updateExec(WelcomeMessage msg) throws SQLException { FSDB.get().query("UPDATE welcome_messages SET message = ?, updated = ?, editor = ? WHERE server_id = ?", msg.getMessage(), msg.getUpdated(), @@ -108,7 +108,7 @@ public class WelcomeMessageController { ); } - private boolean existsExec(String id) throws SQLException { + private static boolean existsExec(String id) throws SQLException { ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM welcome_messages WHERE server_id = ?) AS hmm", id); boolean exists = rs.getBoolean("hmm"); @@ -116,11 +116,11 @@ public class WelcomeMessageController { return exists; } - private void deleteExec(String id) throws SQLException { + private static void deleteExec(String id) throws SQLException { FSDB.get().query("DELETE FROM welcome_messages WHERE server_id = ?", id); } - private WelcomeMessage mapObject(ResultSet rs) throws SQLException { + private static WelcomeMessage mapObject(ResultSet rs) throws SQLException { return new WelcomeMessage.WelcomeMessageBuilder(rs.getString("server_id")) .setMessage(rs.getString("message")) .setUpdated(new Timestamp(rs.getLong("updated"))) From 6f55d755e685cfcf6029c4cfb9ca9d574c2f8d01 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 17:19:44 -0400 Subject: [PATCH 086/157] Add schemas into build method --- src/main/java/dev/salmonllama/fsbot/database/FSDB.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index b940eec..fa08ea6 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -43,6 +43,8 @@ public class FSDB { get().query(ServerConfig.schema()); get().query(ServerBlacklist.schema()); get().query(UserBlacklist.schema()); + get().query(WelcomeMessage.schema()); + get().query(StaticPermission.schema()); } catch (SQLException e) { e.printStackTrace(); } From 8c3dce43130cff9a94dfe01d288138a35749106f Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 17:19:57 -0400 Subject: [PATCH 087/157] Add model/controller for staticpermission --- .../StaticPermissionController.java | 118 ++++++++++++++++++ .../database/models/StaticPermission.java | 62 +++++++++ 2 files changed, 180 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java new file mode 100644 index 0000000..d70aefd --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.StaticPermission; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class StaticPermissionController { + // Need to insert, get all per user, get per keyword, and delete + public static CompletableFuture insert(StaticPermission perm) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(perm); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture>> getByUser(String userId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getByUserExec(userId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture>> getByPermission(String perm) { + return CompletableFuture.supplyAsync(() -> { + try { + return getByPermissionExec(perm); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture delete(StaticPermission perm) { + return delete(perm.getUserId(), perm.getPermission()); + } + + public static CompletableFuture delete(String userId, String perm) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(userId, perm); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private static void insertExec(StaticPermission perm) throws SQLException { + FSDB.get().insert("INSERT INTO static_permissions (user_id, permission, date_added) VALUES (?, ?, ?)", + perm.getUserId(), + perm.getPermission(), + perm.getAdded() + ); + } + + private static Optional> getByUserExec(String userId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM static_permissions WHERE user_id = ?", userId); + + Collection permissions = new ArrayList<>(); + while (rs.next()) { + permissions.add(mapObject(rs)); + } + + FSDB.get().close(rs); + + if (permissions.isEmpty()) { + return Optional.empty(); + } + + return Optional.of(permissions); + } + + private static Optional> getByPermissionExec(String perm) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM static_permissions WHERE permission = ?", perm); + + Collection users = new ArrayList<>(); + while (rs.next()) { + users.add(mapObject(rs)); + } + + FSDB.get().close(rs); + + if (users.isEmpty()) { + return Optional.empty(); + } + + return Optional.of(users); + } + + private static void deleteExec(String userId, String perm) throws SQLException { + FSDB.get().query("DELETE FROM static_permissions WHERE user_id = ? AND permission = ?", userId, perm); + } + + private static StaticPermission mapObject(ResultSet rs) throws SQLException { + return new StaticPermission.StaticPermissionBuilder(rs.getString("user_id")) + .setPermission(rs.getString("permission")) + .setAdded(new Timestamp(rs.getLong("date_added"))) + .build(); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java b/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java new file mode 100644 index 0000000..3ddd2ab --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +import java.sql.Timestamp; + +public class StaticPermission extends DatabaseModel { + private String userId; + private String permission; + private Timestamp added; + + private StaticPermission(StaticPermissionBuilder builder) { + userId = builder.userId; + permission = builder.permission; + added = builder.added; + } + + public String getUserId() { + return userId; + } + + public String getPermission() { + return permission; + } + + public Timestamp getAdded() { + return added; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS static_permissions (user_id TEXT, permission TEXT, date_added TEXT)"; + } + + public static class StaticPermissionBuilder { + private String userId; + private String permission = null; + private Timestamp added = null; + + public StaticPermissionBuilder(String userId) { + this.userId = userId; + } + + public StaticPermissionBuilder setPermission(String permission) { + this.permission = permission; + return this; + } + + public StaticPermissionBuilder setAdded(Timestamp added) { + this.added = added; + return this; + } + + public StaticPermission build() { + return new StaticPermission(this); + } + } +} From b598b670e5f34e0caa6ce43543256f306fe385d6 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 18:40:39 -0400 Subject: [PATCH 088/157] Implemented custom emoji in GalleryChannelCommand --- .../fsbot/commands/developer/CreateGalleryCommand.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index db75c23..ad660e0 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -7,6 +7,7 @@ package dev.salmonllama.fsbot.commands.developer; import com.rethinkdb.RethinkDB; import com.rethinkdb.net.Connection; +import com.vdurmont.emoji.EmojiManager; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.guthix.Command; @@ -29,9 +30,6 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); } - static final RethinkDB R = RethinkDB.r; - static final Connection CONN = R.connection().hostname("localhost").port(28015).connect(); - @Override public void onCommand(CommandContext ctx) { // TODO: Might need some logic help... if (ctx.isPrivateMessage()) { @@ -57,6 +55,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs GalleryChannel gallery = new GalleryChannel(); gallery.channelId = channelId; gallery.tag = tag; + gallery.emoji = ":heartpulse:"; ctx.getServer().ifPresent(server -> { gallery.serverId = server.getIdAsString(); @@ -73,8 +72,9 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs .addField("Channel Name:", gallery.channelName) .addField("Channel Id:", gallery.channelId) .addField("Tag:", tag) + .addField("Emoji:", EmojiManager.getByUnicode(gallery.emoji).toString()) .addField("End:", String.format("This channel is now being tracked under: %s", tag)); ctx.getChannel().sendMessage(embed); - } + } } From 1efd66fc447767cf034c16e4f04e6199b5832f37 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 21:52:35 -0400 Subject: [PATCH 089/157] Added gitlab CI config --- .gitlab-ci.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..f843435 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,34 @@ +# This is the Gradle build system for JVM applications +# https://gradle.org/ +# https://github.com/gradle/gradle +image: gradle:alpine + +# Disable the Gradle daemon for Continuous Integration servers as correctness +# is usually a priority over speed in CI environments. Using a fresh +# runtime for each build is more reliable since the runtime is completely +# isolated from any previous builds. +variables: + GRADLE_OPTS: "-Dorg.gradle.daemon=false" + +before_script: + - export GRADLE_USER_HOME=`pwd`/.gradle + +build: + stage: build + script: gradle --build-cache assemble + cache: + key: "$CI_COMMIT_REF_NAME" + policy: push + paths: + - build + - .gradle + +test: + stage: test + script: gradle check + cache: + key: "$CI_COMMIT_REF_NAME" + policy: pull + paths: + - build + - .gradle \ No newline at end of file From 5290921b1653561c030715d3c3f6e8fd980e036a Mon Sep 17 00:00:00 2001 From: Aleksei Date: Fri, 3 Jul 2020 22:10:05 -0400 Subject: [PATCH 090/157] add jdk11 to gitlab ci config --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f843435..b8c7193 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ # This is the Gradle build system for JVM applications # https://gradle.org/ # https://github.com/gradle/gradle -image: gradle:alpine +image: gradle:jdk11 # Disable the Gradle daemon for Continuous Integration servers as correctness # is usually a priority over speed in CI environments. Using a fresh From 5831720ca58afdc09564e7453a2cde73ccadc5f8 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Fri, 3 Jul 2020 22:50:48 -0400 Subject: [PATCH 091/157] Remove Travis config --- .travis.yml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8e716ba..0000000 --- a/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: java -jdk: - - openjdk11 -after_success: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh success $WEBHOOK_URL -after_failure: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh failure $WEBHOOK_URL \ No newline at end of file From 1a7b6c6ada9cd75802fb4d6a9b0475f1c431aae2 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 4 Jul 2020 18:46:53 -0400 Subject: [PATCH 092/157] Update OutfitInfo Command for database changes --- .../commands/staff/OutfitInfoCommand.java | 37 +++++++++++-------- .../dev/salmonllama/fsbot/guthix/Guthix.java | 2 +- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java index 5b9bd96..769a6ff 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java @@ -6,6 +6,7 @@ package dev.salmonllama.fsbot.commands.staff; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; @@ -15,6 +16,7 @@ import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.embed.EmbedBuilder; import java.util.ArrayList; import java.util.Arrays; @@ -28,28 +30,33 @@ public class OutfitInfoCommand extends Command { @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("outfitinfo", "oinfo")); } - private final DatabaseUtilities db; - - public OutfitInfoCommand(DatabaseUtilities db) { - this.db = db; - } - @Override public void onCommand(CommandContext ctx) { String[] args = ctx.getArgs(); - DiscordApi api = ctx.getApi(); - TextChannel channel = ctx.getChannel(); if (args.length != 1) { - channel.sendMessage(String.format("you did that wrong. bother %s to make these more specific.", api.getOwner().join().getDiscriminatedName())); + ctx.reply("You must supply an outfit ID."); return; } - try { - channel.sendMessage(db.getOutfitFromId(args[0]).generateInfo()); - } - catch (OutfitNotFoundException e) { - channel.sendMessage(new DiscordError(e.getMessage()).get()); - } + String id = args[0]; + OutfitController.findById(id).thenAcceptAsync(possibleOutfit -> { + possibleOutfit.ifPresentOrElse(outfit -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Outfit Info") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getYourself()) + .setUrl(outfit.getLink()) + .setFooter(String.format("Tag: %s", outfit.getTag())) + .addField("Added", outfit.getCreated().toString(), true) + .addField("Updated", outfit.getUpdated().toString(), true) + .addField("Submitted by:", ctx.getApi().getUserById(outfit.getSubmitter()).join().getDiscriminatedName()) + .addField("Deleted", outfit.isDeleted() ? "True" : "False", true) + .addField("Featured", outfit.isFeatured() ? "True" : "False", true); + ctx.reply(embed); + }, () -> { + ctx.reply("Outfit not found"); + }); + }); } } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index f6c6a9f..bf76765 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -58,7 +58,7 @@ public class Guthix implements MessageCreateListener { addCommand(new GetOutfitCommand()); addCommand(new RetagCommand(db)); addCommand(new RemoveOutfitCommand(db)); - addCommand(new OutfitInfoCommand(db)); + addCommand(new OutfitInfoCommand()); addCommand(new SetStatusCommand()); addCommand(new WelcomeMessageCommand()); addCommand(new ShowGalleriesCommand()); From 9c8de32397d503ceb4ff08a96528816052fcfdd8 Mon Sep 17 00:00:00 2001 From: Aleksei Fox Date: Fri, 10 Jul 2020 18:27:31 -0400 Subject: [PATCH 093/157] Added ColorRole Model/Controller --- .../controllers/ColorRoleController.java | 171 ++++++++++++++++++ .../fsbot/database/models/ColorRole.java | 60 ++++++ 2 files changed, 231 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/ColorRoleController.java create mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/ColorRole.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ColorRoleController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ColorRoleController.java new file mode 100644 index 0000000..896dd11 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ColorRoleController.java @@ -0,0 +1,171 @@ +package dev.salmonllama.fsbot.database.controllers; + +import dev.salmonllama.fsbot.database.FSDB; +import dev.salmonllama.fsbot.database.models.ColorRole; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class ColorRoleController { + // Need insert, get by color, exists by color, exists by role, get by server, count, and delete + public CompletableFuture insert(ColorRole cr) { + return CompletableFuture.runAsync(() -> { + try { + insertExec(cr); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture exists(String color) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(color); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture exists(long roleId) { + return CompletableFuture.supplyAsync(() -> { + try { + return existsExec(roleId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture> get(String color) { + return CompletableFuture.supplyAsync(() -> { + try { + return getExec(color); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture> get(long roleId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getExec(roleId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture count(long serverId) { + return CompletableFuture.supplyAsync(() -> { + try { + return countExec(serverId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture delete(long roleId) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(roleId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public CompletableFuture delete(String color) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(color); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + private void insertExec(ColorRole cr) throws SQLException { + FSDB.get().insert("INSERT INTO color_roles (role_id, server_id, color) VALUES (?, ?, ?)", + cr.getRoleId(), + cr.getServerId(), + cr.getColor() + ); + } + + private boolean existsExec(String color) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM color_roles WHERE color = ?) AS hmm", color); + boolean exists = rs.getBoolean("hmm"); + + FSDB.get().close(rs); + return exists; + } + + private boolean existsExec(long roleId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM color_roles WHERE role_id = ?) AS hmm", roleId); + boolean exists = rs.getBoolean("hmm"); + + FSDB.get().close(rs); + return exists; + } + + private Optional getExec(String color) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM color_roles WHERE color = ?", color); + + if (rs.next()) { + ColorRole colorRole = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(colorRole); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private Optional getExec(Long roleId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM color_roles WHERE role_id = ?", roleId); + + if (rs.next()) { + ColorRole colorRole = mapObject(rs); + FSDB.get().close(rs); + return Optional.of(colorRole); + } + + FSDB.get().close(rs); + return Optional.empty(); + } + + private int countExec(long serverId) throws SQLException { + ResultSet rs = FSDB.get().select("SELECT COUNT(*) AS count FROM color_roles WHERE server_id = ?", serverId); + + if (rs.next()) { + int count = rs.getInt("count"); + FSDB.get().close(rs); + return count; + } + + FSDB.get().close(rs); + return 0; + } + + private void deleteExec(long roleId) throws SQLException { + FSDB.get().query("DELETE FROM color_roles WHERE role_id = ?", roleId); + } + + private void deleteExec(String color) throws SQLException { + FSDB.get().query("DELETE FROM color_roles WHERE color = ?", color); + } + + private ColorRole mapObject(ResultSet rs) throws SQLException { + return new ColorRole.ColorRoleBuilder(rs.getLong("role_id")) + .setServerId(rs.getLong("server_id")) + .setColor(rs.getString("color")) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ColorRole.java b/src/main/java/dev/salmonllama/fsbot/database/models/ColorRole.java new file mode 100644 index 0000000..39ff347 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ColorRole.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.database.models; + +import dev.salmonllama.fsbot.database.DatabaseModel; + +public class ColorRole extends DatabaseModel { + private long roleId; + private long serverId; + private String color; + + public ColorRole(ColorRoleBuilder builder) { + roleId = builder.roleId; + serverId = builder.serverId; + color = builder.color; + } + + public long getRoleId() { + return roleId; + } + + public long getServerId() { + return serverId; + } + + public String getColor() { + return color; + } + + public static String schema() { + return "CREATE TABLE IF NOT EXISTS color_roles (role_id INTEGER, server_id INTEGER, color TEXT)"; + } + + public static class ColorRoleBuilder { + private long roleId; + private long serverId; + private String color; + + public ColorRoleBuilder(long roleId) { + this.roleId = roleId; + } + + public ColorRoleBuilder setServerId(long serverId) { + this.serverId = serverId; + return this; + } + + public ColorRoleBuilder setColor(String color) { + this.color = color; + return this; + } + + public ColorRole build() { + return new ColorRole(this); + } + } +} From 712e98261722a66e812a7fec16fe65404165a609 Mon Sep 17 00:00:00 2001 From: Aleksei Fox Date: Sat, 11 Jul 2020 01:54:56 -0400 Subject: [PATCH 094/157] Reworked outfit deletion --- .../commands/staff/RemoveOutfitCommand.java | 79 +++++++++++++------ .../controllers/OutfitController.java | 24 ++++++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 2 +- 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index deb3424..f8ea40e 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -7,17 +7,14 @@ package dev.salmonllama.fsbot.commands.staff; import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.user.User; -import dev.salmonllama.fsbot.listeners.ReactionDeleteConfirmationListener; -import dev.salmonllama.fsbot.utilities.Outfit; +import org.javacord.api.entity.message.embed.EmbedBuilder; import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; import java.util.ArrayList; import java.util.Arrays; @@ -31,35 +28,69 @@ public class RemoveOutfitCommand extends Command { @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("removeoutfit", "remove")); } - private final DatabaseUtilities db; - - public RemoveOutfitCommand(DatabaseUtilities db) { - this.db = db; - } - @Override public void onCommand(CommandContext ctx) { String[] args = ctx.getArgs(); TextChannel channel = ctx.getChannel(); - User author = ctx.getUser(); + long authorId = ctx.getUser().getId(); if (args.length != 1) { - channel.sendMessage("You did that wrong, mate"); + channel.sendMessage("You must supply a valid outfit ID."); return; } // get the outfit, confirm deletion through reaction. - try { - Outfit outfit = db.getOutfitFromId(args[0]); + String outfitId = args[0]; + OutfitController.findById(outfitId).thenAcceptAsync(possibleOutfit -> { + possibleOutfit.ifPresentOrElse(outfit -> { + // Send outfit info, react with selectors, add a listener to the message + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Confirm Outfit Deletion") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getYourself()) + .setUrl(outfit.getLink()) + .setFooter(String.format("Tag: %s", outfit.getTag())) + .addField("Added", outfit.getCreated().toString(), true) + .addField("Updated", outfit.getUpdated().toString(), true) + .addField("Submitted by:", ctx.getApi().getUserById(outfit.getSubmitter()).join().getDiscriminatedName()) + .addField("Deleted", outfit.isDeleted() ? "True" : "False", true) + .addField("Featured", outfit.isFeatured() ? "True" : "False", true); - channel.sendMessage(outfit.generateInfo().setTitle("Confirm Outfit Deletion")).thenAccept(message -> { - message.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); - message.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); - message.addReactionAddListener(new ReactionDeleteConfirmationListener(author, message, outfit, db)); - }); - } - catch (OutfitNotFoundException e) { - channel.sendMessage(new DiscordError(e.getMessage()).get()); - } + ctx.reply(embed).thenAcceptAsync(msg -> { + msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); + msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); + + msg.addReactionAddListener(event -> { + if (event.getUser().getId() != authorId) { + return; + } + + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { + // Delete the outfit + OutfitController.delete(outfit.getId()); + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Deletion Successful!") + .setDescription(String.format("Outfit %s marked as deleted", outfit.getId())); + ctx.reply(response); + + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { + // Do nothing + EmbedBuilder response = new EmbedBuilder() + .setTitle("Deletion Aborted") + .setDescription(String.format("No modifications were made to %s", outfit.getId())); + + ctx.reply(response); + } + }); + }); + }, () -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Outfit not Found") + .setDescription(String.format("ID %s does not exist", outfitId)); + + ctx.reply(response); + }); + }); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index cbd7f13..15bb82f 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -169,6 +169,26 @@ public class OutfitController { }); } + public static CompletableFuture delete(String id) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(id); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + + public static CompletableFuture delete(Outfit outfit) { + return CompletableFuture.runAsync(() -> { + try { + deleteExec(outfit.getId()); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + private static void insertExec(Outfit outfit) throws SQLException { if (outfit.getCreated() == null) { outfit.setCreated(new Timestamp(System.currentTimeMillis())); @@ -313,6 +333,10 @@ public class OutfitController { return tags; } + private static void deleteExec(String id) throws SQLException { + FSDB.get().query("UPDATE outfits SET deleted = true WHERE id = ?", id); + } + private static Optional> extractMultiple(ResultSet rs) throws SQLException { Collection outfits = new ArrayList<>(); diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index bf76765..802e429 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -57,7 +57,7 @@ public class Guthix implements MessageCreateListener { addCommand(new AddColorCommand()); addCommand(new GetOutfitCommand()); addCommand(new RetagCommand(db)); - addCommand(new RemoveOutfitCommand(db)); + addCommand(new RemoveOutfitCommand()); addCommand(new OutfitInfoCommand()); addCommand(new SetStatusCommand()); addCommand(new WelcomeMessageCommand()); From 92c54bd9bb4f0fd1cfa640bee717d7bebc7ba34e Mon Sep 17 00:00:00 2001 From: Aleksei Fox Date: Sat, 11 Jul 2020 01:55:17 -0400 Subject: [PATCH 095/157] Added join log to config --- src/main/java/dev/salmonllama/fsbot/config/BotConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index 954cb03..1f24677 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -45,6 +45,9 @@ public class BotConfig { @ConfigurationOption public static String VOTE_CHANNEL = "vote channel here"; + @ConfigurationOption + public static String JOIN_LOG = "join log channel"; + @ConfigurationOption public static String REPORT_LOG = "report_log_channel"; From 23c1fe4f3712ed2e8dde4fcb97afd290a78cd397 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 11 Jul 2020 13:01:57 -0400 Subject: [PATCH 096/157] Whitespace fix --- .../commands/developer/PermissionCommand.java | 60 +++++++++++++++++++ .../fsbot/commands/developer/TestCommand.java | 14 ++++- .../commands/staff/RemoveOutfitCommand.java | 2 +- .../fsbot/database/models/Outfit.java | 1 + .../dev/salmonllama/fsbot/logging/Logger.java | 48 +++++++++++++++ .../fsbot/logging/ResponseType.java | 21 +++++++ .../fsbot/logging/StandardEmbed.java | 14 +++++ 7 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java create mode 100644 src/main/java/dev/salmonllama/fsbot/logging/Logger.java create mode 100644 src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java create mode 100644 src/main/java/dev/salmonllama/fsbot/logging/StandardEmbed.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java new file mode 100644 index 0000000..9d85656 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.commands.developer; + +import dev.salmonllama.fsbot.database.controllers.StaticPermissionController; +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +public class PermissionCommand extends Command { + @Override public String name() { return "Permission"; } + @Override public String description() { return "Manages a user's static permissions"; } + @Override public String usage() { return "permission "; } + @Override public String category() { return "Staff"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } + @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("permission", "perm")); } + + @Override + public void onCommand(CommandContext ctx) { + String[] args = ctx.getArgs(); + + switch(args[0]) { + case "list": + // List all the static permissions + break; + case "add": + // Add a static permission to the mentioned user, if any + break; + case "remove": + // Remove a static permission from the mentioned user, if any + break; + default: + // You don't know how to use this command LUL + } + } + + private void list(CommandContext ctx) { + + } + + private void listForUser(CommandContext ctx) { + + } + + private void add(CommandContext ctx) { + + } + + private void remove(CommandContext ctx) { + + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java index e436668..3cac897 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/TestCommand.java @@ -10,10 +10,13 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.Message; +import org.javacord.api.entity.permission.Role; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.stream.Collectors; public class TestCommand extends Command { @Override public String name() { return "Test"; } @@ -25,8 +28,15 @@ public class TestCommand extends Command { @Override public void onCommand(CommandContext ctx) { - OutfitController.findRandom().thenAccept(outfit -> { - outfit.ifPresent(o -> ctx.reply(o.toString())); + Message msg = ctx.getMessage(); + + Collection roles = msg.getMentionedRoles(); + + roles.stream().map(Role::getIdAsString).collect(Collectors.toList()).forEach(id -> { + ctx.getServer().ifPresent(server -> { + Role r = server.getRoleById(id).orElse(null); + ctx.reply(r.getMentionTag()); + }); }); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index f8ea40e..9a07b81 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -64,7 +64,7 @@ public class RemoveOutfitCommand extends Command { if (event.getUser().getId() != authorId) { return; } - + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { // Delete the outfit OutfitController.delete(outfit.getId()); diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 75fae9f..5296f3d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -6,6 +6,7 @@ package dev.salmonllama.fsbot.database.models; import dev.salmonllama.fsbot.database.DatabaseModel; +import org.javacord.api.entity.message.embed.EmbedBuilder; import java.sql.Timestamp; diff --git a/src/main/java/dev/salmonllama/fsbot/logging/Logger.java b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java new file mode 100644 index 0000000..dfdfa88 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.logging; + +import dev.salmonllama.fsbot.config.BotConfig; +import org.javacord.api.DiscordApi; +import org.javacord.api.entity.channel.ServerTextChannel; +import org.javacord.api.entity.message.Message; + +import java.util.concurrent.CompletableFuture; + +public class Logger { + + private DiscordApi api; + + private final String OUTFIT_LOG = BotConfig.OUTFIT_LOG; + private final String REPORT_LOG = BotConfig.REPORT_LOG; + private final String JOIN_LOG = BotConfig.JOIN_LOG; + private final String BOT_LOG = BotConfig.BOT_LOG; + private final String SALMONLLAMA = BotConfig.BOT_OWNER; + + public Logger(DiscordApi api) { + this.api = api; + } + + public void logOutfit() { + api.getServerTextChannelById(OUTFIT_LOG).ifPresentOrElse(channel -> { + // Log the thing + channel.sendMessage("thing"); + }, () -> { + // Do something else + api.getUserById(SALMONLLAMA).thenAcceptAsync(user -> { + user.sendMessage("Outfit log failed and was not found"); + }); + }); + } + + public void logReport() { + + } + + public static void error() { + + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java b/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java new file mode 100644 index 0000000..ae603eb --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.logging; + +import java.awt.*; + +public enum ResponseType { + ERROR (Color.RED), + WARN (Color.YELLOW), + INFO (Color.BLUE), + LOG (Color.GRAY); + + private Color color; + private String title; + ResponseType(Color color, String title) { + + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/logging/StandardEmbed.java b/src/main/java/dev/salmonllama/fsbot/logging/StandardEmbed.java new file mode 100644 index 0000000..f15c5a9 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/logging/StandardEmbed.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2020. Aleksei Gryczewski + * All rights reserved. + */ + +package dev.salmonllama.fsbot.logging; + +import org.javacord.api.entity.message.embed.EmbedBuilder; + +public class StandardEmbed extends EmbedBuilder { + public StandardEmbed() { + super(); + } +} From 21f3a035201b0177daa2eef4ffb7b656bd78a32c Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 11 Jul 2020 13:05:40 -0400 Subject: [PATCH 097/157] Welcome back, Travis! --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8e716ba --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: java +jdk: + - openjdk11 +after_success: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh success $WEBHOOK_URL +after_failure: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh failure $WEBHOOK_URL \ No newline at end of file From 438ab113dabf7da727e5c7379b716d645454e15f Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 11 Jul 2020 13:17:25 -0400 Subject: [PATCH 098/157] Remove un-needed CI configs --- .gitlab-ci.yml | 34 ---------------------------------- .travis.yml | 11 ----------- 2 files changed, 45 deletions(-) delete mode 100644 .gitlab-ci.yml delete mode 100644 .travis.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index b8c7193..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,34 +0,0 @@ -# This is the Gradle build system for JVM applications -# https://gradle.org/ -# https://github.com/gradle/gradle -image: gradle:jdk11 - -# Disable the Gradle daemon for Continuous Integration servers as correctness -# is usually a priority over speed in CI environments. Using a fresh -# runtime for each build is more reliable since the runtime is completely -# isolated from any previous builds. -variables: - GRADLE_OPTS: "-Dorg.gradle.daemon=false" - -before_script: - - export GRADLE_USER_HOME=`pwd`/.gradle - -build: - stage: build - script: gradle --build-cache assemble - cache: - key: "$CI_COMMIT_REF_NAME" - policy: push - paths: - - build - - .gradle - -test: - stage: test - script: gradle check - cache: - key: "$CI_COMMIT_REF_NAME" - policy: pull - paths: - - build - - .gradle \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8e716ba..0000000 --- a/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: java -jdk: - - openjdk11 -after_success: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh success $WEBHOOK_URL -after_failure: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh failure $WEBHOOK_URL \ No newline at end of file From 81a6f2985c6ddf99abd174e89990f2d56f974c25 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 11 Jul 2020 13:19:53 -0400 Subject: [PATCH 099/157] Not sure what I'm doing with this quite yet --- .../java/dev/salmonllama/fsbot/logging/ResponseType.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java b/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java index ae603eb..c5d381f 100644 --- a/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java +++ b/src/main/java/dev/salmonllama/fsbot/logging/ResponseType.java @@ -8,10 +8,10 @@ package dev.salmonllama.fsbot.logging; import java.awt.*; public enum ResponseType { - ERROR (Color.RED), - WARN (Color.YELLOW), - INFO (Color.BLUE), - LOG (Color.GRAY); + ERROR (Color.RED, "Error"), + WARN (Color.YELLOW, "Warning"), + INFO (Color.BLUE, "Info"), + LOG (Color.GRAY, "Log"); private Color color; private String title; From fbfc6c9dfde2babf594aa99631d53426e1bcabed Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Sat, 11 Jul 2020 13:28:47 -0400 Subject: [PATCH 100/157] Add DB method to retrieve all --- .../StaticPermissionController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java index d70aefd..955fb70 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java @@ -49,6 +49,16 @@ public class StaticPermissionController { }); } + public static CompletableFuture>> getAll() { + return CompletableFuture.supplyAsync(() -> { + try { + return getAllExec(); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture delete(StaticPermission perm) { return delete(perm.getUserId(), perm.getPermission()); } @@ -105,6 +115,23 @@ public class StaticPermissionController { return Optional.of(users); } + private static Optional> getAllExec() throws SQLException { + ResultSet rs = FSDB.get().select("SELECT * FROM static_permissions"); + + Collection permissions = new ArrayList<>(); + while (rs.next()) { + permissions.add(mapObject(rs)); + } + + FSDB.get().close(rs); + + if (permissions.isEmpty()) { + return Optional.empty(); + } + + return Optional.of(permissions); + } + private static void deleteExec(String userId, String perm) throws SQLException { FSDB.get().query("DELETE FROM static_permissions WHERE user_id = ? AND permission = ?", userId, perm); } From 5c5153212a9aba022d0e16a2b3031fd581f458c0 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 13 Jul 2020 15:27:09 -0400 Subject: [PATCH 101/157] WIP Perm Command/Logger --- .../commands/developer/PermissionCommand.java | 56 ++++++++++++++++++- .../dev/salmonllama/fsbot/logging/Logger.java | 42 +++++++++++--- 2 files changed, 87 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java index 9d85656..9714296 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -6,11 +6,15 @@ package dev.salmonllama.fsbot.commands.developer; import dev.salmonllama.fsbot.database.controllers.StaticPermissionController; +import dev.salmonllama.fsbot.database.models.StaticPermission; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.embed.EmbedBuilder; +import org.javacord.api.entity.user.User; +import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -30,6 +34,7 @@ public class PermissionCommand extends Command { switch(args[0]) { case "list": // List all the static permissions + list(ctx); break; case "add": // Add a static permission to the mentioned user, if any @@ -43,15 +48,62 @@ public class PermissionCommand extends Command { } private void list(CommandContext ctx) { + if (!ctx.getMessage().getMentionedUsers().isEmpty()) { + User mentionedUser = ctx.getMessage().getMentionedUsers().get(0); - } + StaticPermissionController.getByUser(mentionedUser.getIdAsString()).thenAcceptAsync(possiblePerms -> { + possiblePerms.ifPresentOrElse(perms -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle(String.format("Permissions for %s", mentionedUser.getName())) + .setFooter(String.format("User has %s total static permissions", perms.size())) + .setColor(Color.GREEN); - private void listForUser(CommandContext ctx) { + perms.forEach(perm -> { + embed.addField(perm.getUserId(), perm.getPermission()); + }); + ctx.reply(embed); + }, () -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("No Permissions Found") + .setDescription(String.format("User %s has no static permissions", mentionedUser.getName())); + + ctx.reply(embed); + }); + }); + } + + StaticPermissionController.getAll().thenAcceptAsync(possiblePerms -> { + possiblePerms.ifPresentOrElse(perms -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("All static permissions") + .setFooter(String.format("Found %s total static permissions", perms.size())) + .setColor(Color.green); + + perms.forEach(perm -> { + embed.addField(perm.getUserId(), perm.getPermission()); + }); + + ctx.reply(embed); + }, () -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("No Permissions Found") + .setDescription("No permissions have been added."); + + ctx.reply(embed); + }); + }); } private void add(CommandContext ctx) { + if (ctx.getMessage().getMentionedUsers().isEmpty()) { + // If no mentioned users, improper usage + return; + } + String userId = ctx.getMessage().getMentionedUsers().get(0).getIdAsString(); + + StaticPermission perm = new StaticPermission.StaticPermissionBuilder(userId).setPermission(ctx.getArgs()[2]).build(); } private void remove(CommandContext ctx) { diff --git a/src/main/java/dev/salmonllama/fsbot/logging/Logger.java b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java index dfdfa88..0a55f2e 100644 --- a/src/main/java/dev/salmonllama/fsbot/logging/Logger.java +++ b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java @@ -7,14 +7,10 @@ package dev.salmonllama.fsbot.logging; import dev.salmonllama.fsbot.config.BotConfig; import org.javacord.api.DiscordApi; -import org.javacord.api.entity.channel.ServerTextChannel; -import org.javacord.api.entity.message.Message; - -import java.util.concurrent.CompletableFuture; public class Logger { - private DiscordApi api; + private final DiscordApi api; private final String OUTFIT_LOG = BotConfig.OUTFIT_LOG; private final String REPORT_LOG = BotConfig.REPORT_LOG; @@ -29,9 +25,9 @@ public class Logger { public void logOutfit() { api.getServerTextChannelById(OUTFIT_LOG).ifPresentOrElse(channel -> { // Log the thing - channel.sendMessage("thing"); + channel.sendMessage("outfit"); }, () -> { - // Do something else + // DM me api.getUserById(SALMONLLAMA).thenAcceptAsync(user -> { user.sendMessage("Outfit log failed and was not found"); }); @@ -39,10 +35,38 @@ public class Logger { } public void logReport() { - + api.getServerTextChannelById(REPORT_LOG).ifPresentOrElse(channel -> { + // Log the thing + channel.sendMessage("report"); + }, () -> { + // DM me + api.getUserById(SALMONLLAMA).thenAcceptAsync(user -> { + user.sendMessage("Report log failed and was not found"); + }); + }); } - public static void error() { + public void logError() { + api.getServerTextChannelById(BOT_LOG).ifPresentOrElse(channel -> { + // Log the thing + channel.sendMessage("error"); + }, () -> { + // DM me + api.getUserById(SALMONLLAMA).thenAcceptAsync(user -> { + user.sendMessage("Error log failed and was not found"); + }); + }); + } + public void logMovement() { + api.getServerTextChannelById(JOIN_LOG).ifPresentOrElse(channel -> { + // Log the thing + channel.sendMessage("User joined/Left"); + }, () -> { + // DM me + api.getUserById(SALMONLLAMA).thenAcceptAsync(user -> { + user.sendMessage("Movement log failed and was not found"); + }); + }); } } From e7fd553c4d767be5fd20a4d99959b37cfae4b45c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:14:52 -0400 Subject: [PATCH 102/157] Remove RethinkDB --- build.gradle | 1 - src/main/java/dev/salmonllama/fsbot/Main.java | 16 +--- .../developer/CreateGalleryCommand.java | 2 - .../fsbot/commands/general/ColorCommand.java | 79 +----------------- .../fsbot/commands/general/ColorsCommand.java | 17 +--- .../fsbot/commands/staff/AddColorCommand.java | 34 +------- .../commands/staff/OutfitInfoCommand.java | 5 -- .../commands/staff/RemoveOutfitCommand.java | 1 - .../commands/staff/WelcomeMessageCommand.java | 81 +------------------ .../dev/salmonllama/fsbot/guthix/Guthix.java | 9 +-- .../fsbot/listeners/ImageListener.java | 9 +-- .../fsbot/listeners/NewMemberListener.java | 25 ++---- .../fsbot/listeners/ServerJoined.java | 8 +- 13 files changed, 18 insertions(+), 269 deletions(-) diff --git a/build.gradle b/build.gradle index 9b53525..102779c 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,6 @@ dependencies { implementation 'org.xerial:sqlite-jdbc:3.30.1' implementation 'com.github.Kaaz:ConfigurationBuilder:0.4' implementation 'org.javacord:javacord:3.0.6' - implementation group: 'com.rethinkdb', name: 'rethinkdb-driver', version: '2.3.3' // set for removal implementation 'com.vdurmont:emoji-java:4.0.0' implementation 'com.squareup.okhttp3:okhttp:4.4.0' diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 8803ced..8eb5014 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -5,8 +5,6 @@ package dev.salmonllama.fsbot; -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.FSDB; import dev.salmonllama.fsbot.guthix.Guthix; @@ -14,7 +12,6 @@ import dev.salmonllama.fsbot.listeners.*; import org.javacord.api.DiscordApiBuilder; import dev.salmonllama.fsbot.utilities.Constants; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; // TODO: auto-switching status messages. // TODO: Add an official Logger --> logging to Discord, not console @@ -27,20 +24,15 @@ public class Main { FSDB.init(); - // Initialise the database with values from the bot's config file - RethinkDB r = RethinkDB.r; - Connection conn = r.connection().hostname("localhost").port(28015).connect(); - new DiscordApiBuilder().setToken(BotConfig.TOKEN).login().thenAccept(api -> { - DatabaseUtilities db = new DatabaseUtilities(r, conn, api); @SuppressWarnings("unused") - Guthix guthix = new Guthix(api, db); + Guthix guthix = new Guthix(api); // Register listeners - api.addMessageCreateListener(new ImageListener(r, conn)); - api.addServerMemberJoinListener(new NewMemberListener(api)); - api.addServerJoinListener(new ServerJoined(api, db)); + api.addMessageCreateListener(new ImageListener()); + api.addServerMemberJoinListener(new NewMemberListener()); + api.addServerJoinListener(new ServerJoined(api)); api.addMessageCreateListener(new ThumbsListener()); api.addMessageCreateListener(new AchievementListener()); api.addMessageCreateListener(new ReportListener()); diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index ad660e0..06afbb3 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -5,8 +5,6 @@ package dev.salmonllama.fsbot.commands.developer; -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; import com.vdurmont.emoji.EmojiManager; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java index cfec117..4212b7f 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java @@ -10,21 +10,10 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.utilities.ColorRole; -import dev.salmonllama.fsbot.utilities.database.RoleColourUtility; -import org.javacord.api.DiscordApi; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.permission.Role; -import org.javacord.api.entity.server.Server; -import dev.salmonllama.fsbot.utilities.warnings.Warning; -import org.javacord.api.entity.user.User; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class ColorCommand extends Command { @Override public String name() { return "Color"; } @@ -36,72 +25,6 @@ public class ColorCommand extends Command { @Override public void onCommand(CommandContext ctx) { - if (!ctx.getServer().isPresent()) { - ctx.reply("This command must be used inside a server."); - return; - } - String[] args = ctx.getArgs(); - DiscordApi api = ctx.getApi(); - Server server = ctx.getServer().get(); - User user = ctx.getUser(); - TextChannel channel = ctx.getChannel(); - - // Live server - if (!server.getIdAsString().equals(BotConfig.HOME_SERVER)) { return; } - - if (!user.getRoles(server).contains(server.getRoleById(BotConfig.HYDRIX_ROLE).orElseThrow(AssertionError::new))) { - channel.sendMessage(new Warning("You need the Hydrix role to use this").sendWarning()); - return; - } - - if (args.length != 1) { - channel.sendMessage(new Warning("Not enough arguments provided").sendWarning()); - return; - } - - // args[0] is the subcommand, either list, or a colour - if (args[0].equals("list")) { - System.out.println(RoleColourUtility.getAllRoleInfo()); - return; - } - - String roleId = RoleColourUtility.getColour(args[0]); - Role role; - - if (!api.getRoleById(roleId).isPresent()) { - channel.sendMessage(new Warning("That role doesn't exist, mate!").sendWarning()); - return; - } - else { - role = api.getRoleById(roleId).get(); - } - - // Actual command logic now - - // Remove all the colour roles from the user, except the target one - List allRoles = RoleColourUtility.getAllRoles(); - allRoles.forEach(r -> { - if (r.id.equals(roleId)) { - server.removeRoleFromUser(user, server.getRoleById(r.id).orElseThrow(AssertionError::new)); - } - }); - - // If user already has the role, remove it - if (user.getRoles(server).contains(role)) { - user.removeRole(role); - channel.sendMessage(new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Role Removed") - .addInlineField("Role:", role.getName()) - ); - } - else { - user.addRole(role); - channel.sendMessage(new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Role Added") - .addInlineField("Role:", role.getName()) - ); - } + ctx.reply("This command is a WIP and will be available soon"); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java index 161c403..0f35521 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorsCommand.java @@ -9,10 +9,6 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.server.Server; -import dev.salmonllama.fsbot.config.BotConfig; -import dev.salmonllama.fsbot.utilities.ColorRole; import java.util.ArrayList; import java.util.Arrays; @@ -28,17 +24,6 @@ public class ColorsCommand extends Command { @Override public void onCommand(CommandContext ctx) { - if (!ctx.getServer().isPresent()) { - ctx.reply("This command must be used in a server."); - return; - } - Server server = ctx.getServer().get(); - TextChannel channel = ctx.getChannel(); - - if (!server.getIdAsString().equals(BotConfig.HOME_SERVER)) { - return; - } - - channel.sendMessage(ColorRole.rolesListEmbed()); + ctx.reply("This command is a WIP and will be available soon."); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java index 436b734..aa274d6 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java @@ -10,14 +10,7 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.utilities.database.RoleColourUtility; -import dev.salmonllama.fsbot.utilities.warnings.Warning; -import org.javacord.api.DiscordApi; -import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.permission.Role; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -32,31 +25,6 @@ public class AddColorCommand extends Command { @Override public void onCommand(CommandContext ctx) { - String[] args = (String[]) ctx.getArgs(); - TextChannel channel = ctx.getChannel(); - DiscordApi api = ctx.getApi(); - - if (args.length != 2) { - channel.sendMessage(new Warning("Insufficient arguments").sendWarning()); - return; - } - - String colour = args[0]; - String id = args[1]; - - Role role = api.getRoleById(args[1]).orElse(null); - if (role == null) { - channel.sendMessage(new Warning("Supplied roleId isn't a roleId").sendWarning()); - return; - } - - RoleColourUtility.addColourRole(colour, id); - - channel.sendMessage(new EmbedBuilder() - .setTitle(role.getName()) - .setColor(role.getColor().orElse(Color.GREEN)) - .addField("Role id:", role.getIdAsString()) - .addField("Colour to be stored as:", args[0]) - ); + ctx.reply("This command is a WIP and will be available soon."); } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java index 769a6ff..ad58b0a 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java @@ -11,11 +11,6 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.DiscordApi; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; -import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; import java.util.ArrayList; diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index 9a07b81..2300918 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -14,7 +14,6 @@ import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java index c4b343e..62ee535 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java @@ -10,7 +10,6 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.utilities.database.ServerConfUtility; import dev.salmonllama.fsbot.utilities.warnings.Warning; import org.javacord.api.entity.channel.TextChannel; import org.javacord.api.entity.message.embed.EmbedBuilder; @@ -31,84 +30,6 @@ public class WelcomeMessageCommand extends Command { @Override public void onCommand(CommandContext ctx) { - if (!ctx.getServer().isPresent()) { - ctx.reply("You must use this command in a server"); - return; - } - String[] args = ctx.getArgs(); - TextChannel channel = ctx.getChannel(); - Server server = ctx.getServer().get(); - - if (!server.getIdAsString().equals(BotConfig.HOME_SERVER)) { - return; - } - - if (args.length == 0) channel.sendMessage(new Warning("Not enough arguments provided").sendWarning()); - - switch (args[0]) { - case ("get"): - channel.sendMessage(fetchWelcomeMsg(server)); - break; - case ("set"): - StringBuilder sb = new StringBuilder(); - for (int i = 1; i < args.length; i++) { - sb.append(String.format("%s ", args[i])); - } - - channel.sendMessage(updateWelcomeMsg(sb.toString(), server)); - break; - case ("getchannel"): - channel.sendMessage(fetchWelcomeChannel(server)); - break; - case ("setchannel"): - if (args.length < 2) channel.sendMessage(new Warning("Not enough arguments provided").sendWarning()); - - channel.sendMessage(updateWelcomeChannel(args[1], server)); - break; - } - } - - private EmbedBuilder fetchWelcomeMsg(Server server) { - - ServerConfUtility conf = new ServerConfUtility(server.getIdAsString()); - String msg = conf.getWelcomeMsg(); - - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Current welcome message:") - .setDescription(msg); - } - - private EmbedBuilder updateWelcomeMsg(String msg, Server server) { - - ServerConfUtility conf = new ServerConfUtility(server.getIdAsString()); - conf.setWelcomeMsg(msg); - - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Welcome message updated") - .addField("New welcome message:", msg); - } - - private EmbedBuilder fetchWelcomeChannel(Server server) { - - ServerConfUtility conf = new ServerConfUtility(server.getIdAsString()); - String welcomeChannel = conf.getWelcomeChannel(); - - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Current welcome channel:") - .setDescription(welcomeChannel); - } - - private EmbedBuilder updateWelcomeChannel(String id, Server server) { - - ServerConfUtility conf = new ServerConfUtility(server.getIdAsString()); - conf.setWelcomeChannel(id); - - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Welcome channel updated:") - .addField("New welcome channel:", id); + ctx.reply("This command is a WIP and will be available soon."); } } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 802e429..6d4aee5 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -11,7 +11,6 @@ import dev.salmonllama.fsbot.commands.staff.*; import dev.salmonllama.fsbot.commands.developer.InviteCommand; import dev.salmonllama.fsbot.commands.developer.CreateGalleryCommand; import dev.salmonllama.fsbot.commands.developer.EvalCommand; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import org.javacord.api.DiscordApi; import org.javacord.api.entity.message.MessageAuthor; import org.javacord.api.event.message.MessageCreateEvent; @@ -27,17 +26,14 @@ import java.util.HashMap; public class Guthix implements MessageCreateListener { @SuppressWarnings("unused") private DiscordApi api; - private DatabaseUtilities db; private Registry registry; private PermissionManager manager; - public Guthix(DiscordApi api, DatabaseUtilities db) { + public Guthix(DiscordApi api) { this.api = api; api.addMessageCreateListener(this); - this.db = db; - manager = new PermissionManager(); registry = new Registry(); @@ -47,7 +43,6 @@ public class Guthix implements MessageCreateListener { public void initCommands() { // Developer Commands addCommand(new TestCommand()); - addCommand(new EvalCommand(db)); addCommand(new CreateGalleryCommand()); addCommand(new InviteCommand()); @@ -56,7 +51,7 @@ public class Guthix implements MessageCreateListener { addCommand(new GetServersCommand()); addCommand(new AddColorCommand()); addCommand(new GetOutfitCommand()); - addCommand(new RetagCommand(db)); + addCommand(new RetagCommand()); addCommand(new RemoveOutfitCommand()); addCommand(new OutfitInfoCommand()); addCommand(new SetStatusCommand()); diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 0ddfee8..f1f5f5f 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -5,8 +5,6 @@ package dev.salmonllama.fsbot.listeners; -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.models.Outfit; @@ -20,12 +18,7 @@ import java.sql.Timestamp; public class ImageListener implements MessageCreateListener { - final RethinkDB r; - final Connection conn; - - public ImageListener(RethinkDB r, Connection conn) { - this.r = r; - this.conn = conn; + public ImageListener() { } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java index e7506a8..8ea2737 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/NewMemberListener.java @@ -5,33 +5,20 @@ package dev.salmonllama.fsbot.listeners; -import dev.salmonllama.fsbot.utilities.database.ServerConfUtility; -import org.javacord.api.DiscordApi; +import dev.salmonllama.fsbot.config.BotConfig; import org.javacord.api.event.server.member.ServerMemberJoinEvent; import org.javacord.api.listener.server.member.ServerMemberJoinListener; public class NewMemberListener implements ServerMemberJoinListener { - private DiscordApi api; - - public NewMemberListener(DiscordApi api) { - this.api = api; - } - public void onServerMemberJoin(ServerMemberJoinEvent event) { - if (!event.getServer().getIdAsString().equals("340511685024546816")) return; + if (!event.getServer().getIdAsString().equals(BotConfig.HOME_SERVER)) { + return; + } - ServerConfUtility conf = new ServerConfUtility(event.getServer().getIdAsString()); - String welcomeMsg = conf.getWelcomeMsg(); - String welcomeChannel = conf.getWelcomeChannel(); +// String logMessage = String.format(welcomeMsg, event.getUser().getMentionTag()); - String logMessage = String.format(welcomeMsg, event.getUser().getMentionTag()); - - api.getChannelById(welcomeChannel).ifPresent(chnl -> { - chnl.asServerTextChannel().ifPresent(channel -> { - channel.sendMessage(logMessage); - }); - }); + event.getApi().getServerTextChannelById(BotConfig.WELCOME_CHANNEL).ifPresent(channel -> channel.sendMessage("Welcome!")); } } diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java index 65c8e49..5f47903 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ServerJoined.java @@ -5,22 +5,16 @@ package dev.salmonllama.fsbot.listeners; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; import org.javacord.api.DiscordApi; -import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.server.ServerJoinEvent; import org.javacord.api.listener.server.ServerJoinListener; -import java.awt.*; - public class ServerJoined implements ServerJoinListener { private DiscordApi api; - private DatabaseUtilities db; - public ServerJoined(DiscordApi api, DatabaseUtilities db) { + public ServerJoined(DiscordApi api) { this.api = api; - this.db = db; } public void onServerJoin(ServerJoinEvent event) { // TODO: This needs fixing yo From 3769eff40147fd38a2996fec5002a73989e1b253 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:15:24 -0400 Subject: [PATCH 103/157] Remove old classes, utilities, and listeners --- .../fsbot/commands/developer/EvalCommand.java | 51 ---- .../ReactionDeleteConfirmationListener.java | 93 ------- .../ReactionRetagConfirmationListener.java | 107 -------- .../fsbot/utilities/ColorRole.java | 41 --- .../salmonllama/fsbot/utilities/Outfit.java | 70 ----- .../utilities/database/DatabaseUtilities.java | 246 ------------------ .../utilities/database/RoleColourUtility.java | 68 ----- .../utilities/database/ServerConfUtility.java | 74 ------ 8 files changed, 750 deletions(-) delete mode 100644 src/main/java/dev/salmonllama/fsbot/commands/developer/EvalCommand.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/listeners/ReactionDeleteConfirmationListener.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/listeners/ReactionRetagConfirmationListener.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/utilities/ColorRole.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/utilities/Outfit.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/utilities/database/RoleColourUtility.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/utilities/database/ServerConfUtility.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/EvalCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/EvalCommand.java deleted file mode 100644 index 517e20f..0000000 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/EvalCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.commands.developer; - -import dev.salmonllama.fsbot.guthix.Command; -import dev.salmonllama.fsbot.guthix.CommandContext; -import dev.salmonllama.fsbot.guthix.CommandPermission; -import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; - -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; - -public class EvalCommand extends Command { - @Override public String name() { return "Eval"; } - @Override public String description() { return "Evaluates the given parameters"; } - @Override public String usage() { return "eval "; } - @Override public String category() { return "Developer"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("eval", "ev")); } - - private final DatabaseUtilities db; - - public EvalCommand(DatabaseUtilities db) { - this.db = db; - } - - @Override - public void onCommand(CommandContext ctx) { - String statement = String.join(" ", ctx.getArgs()); - - ScriptEngineManager factory = new ScriptEngineManager(); - ScriptEngine engine = factory.getEngineByName("JavaScript"); - - engine.put("db", db); - - try { - Object result = engine.eval(statement); - ctx.reply(result.toString()); - } - catch (Exception e) { - ctx.reply(e.getMessage()); - } - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ReactionDeleteConfirmationListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ReactionDeleteConfirmationListener.java deleted file mode 100644 index a320213..0000000 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ReactionDeleteConfirmationListener.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.listeners; - -import com.vdurmont.emoji.EmojiParser; -import dev.salmonllama.fsbot.config.BotConfig; -import org.javacord.api.entity.channel.Channel; -import org.javacord.api.entity.message.Message; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.user.User; -import org.javacord.api.event.message.reaction.ReactionAddEvent; -import org.javacord.api.listener.message.reaction.ReactionAddListener; -import dev.salmonllama.fsbot.utilities.Outfit; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; - -import java.awt.*; - -public class ReactionDeleteConfirmationListener implements ReactionAddListener { - - private final User author; - private final Message message; - private final Outfit outfit; - private final DatabaseUtilities db; - - public ReactionDeleteConfirmationListener(User author, Message message, Outfit outfit, DatabaseUtilities db) { - this.author = author; - this.message = message; - this.outfit = outfit; - this.db = db; - } - - public void onReactionAdd(ReactionAddEvent event) { - if (!event.getUser().getIdAsString().equals(author.getIdAsString())) { - return; - } - - if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { - // Delete the message and send confirmation - - String completed = ""; - - try { - completed = db.removeFromDatabase(outfit.getId()); - } - catch(OutfitNotFoundException e) { - event.getChannel().sendMessage(new DiscordError(e.getMessage()).get().addField("Info:", "This message was sent by a reaction listener. **YOU SHOULD NOT BE SEEING THIS!**")); - } - - if (Integer.parseInt(completed) > 0) { - // Successful deletion - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Success!") - .setColor(Color.GREEN) - .setDescription("Outfit deleted successfully"); - - message.removeAllReactions(); - message.edit(embed); - - event.getApi().getChannelById(BotConfig.OUTFIT_LOG).map(Channel::asServerTextChannel).orElseThrow(AssertionError::new).map(channel -> - channel.sendMessage(outfit.generateInfo().setTitle(String.format("Outfit Deleted by %s", event.getUser().getDiscriminatedName())).setColor(Color.RED)) - ); - } - else { - // Deletion failure - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Error!") - .setColor(Color.RED) - .setDescription("An error occurred and the outfit was not deleted. Did you use the correct ID?") - .setFooter(String.format("Bother %s about making these stupid things more useful.", event.getApi().getOwner().thenAccept(User::getDiscriminatedName))); - - message.removeAllReactions(); - message.edit(embed); - } - } - else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { - // Cancel deletion and do nothing - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Oops!") - .setColor(Color.GREEN) - .setDescription("Deletion cancelled. No changes were made."); - - message.removeAllReactions(); - message.edit(embed); - } - - event.getApi().removeListener(this); - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ReactionRetagConfirmationListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ReactionRetagConfirmationListener.java deleted file mode 100644 index f1feeba..0000000 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ReactionRetagConfirmationListener.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.listeners; - -import com.vdurmont.emoji.EmojiParser; -import dev.salmonllama.fsbot.config.BotConfig; -import org.javacord.api.entity.message.Message; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.user.User; -import org.javacord.api.event.message.reaction.ReactionAddEvent; -import org.javacord.api.listener.message.reaction.ReactionAddListener; -import dev.salmonllama.fsbot.utilities.Outfit; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; - -import java.awt.*; - -public class ReactionRetagConfirmationListener implements ReactionAddListener { - - private User author; - private final Message message; - private final Outfit outfit; - private final DatabaseUtilities db; - private final String oldTag; - private final String newTag; - - public ReactionRetagConfirmationListener(User author, Message message, Outfit outfit, DatabaseUtilities db, String oldTag, String newTag) { - this.author = author; - this.message = message; - this.outfit = outfit; - this.db = db; - this.oldTag = oldTag; - this.newTag = newTag; - } - - public void onReactionAdd(ReactionAddEvent event) { - if (!event.getUser().getIdAsString().equals(this.author.getIdAsString())) { - return; - } - - if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { - // retag the image, send a confirmation, or an error if it failed for whatever reason. - String result = ""; - - try { - result = db.changeOutfitTag(outfit.getId(), this.newTag); - } - catch (OutfitNotFoundException e) { - message.delete(); - event.getChannel().sendMessage(new DiscordError(e.getMessage()).get().addField("Info", "This message was generated by a listener thread. YOU SHOULD NOT BE SEEING THIS ERROR!")); - } - - message.removeAllReactions(); - - if (Integer.parseInt(result) > 0) { - // success, send confirmation - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Success") - .setColor(Color.GREEN) - .setDescription("Outfit retagged successfully") - .setFooter("Check the log for more information"); - - message.edit(embed); - - // log message with new tag and old tag - - event.getApi().getChannelById(BotConfig.OUTFIT_LOG).ifPresent(channel -> { - channel.asServerTextChannel().ifPresent(chnl -> { - chnl.sendMessage(outfit.tagChangeEmbed(this.author.getDiscriminatedName(), this.oldTag, this.newTag)); - }); - }); - } - else { - // failure, something went wrong - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Error!") - .setColor(Color.RED) - .setFooter("Big oopsie"); - - event.getApi().getOwner().thenAcceptAsync(user -> { - embed.setDescription(String.format("Something has gone horribly wrong, contact %s", user.getDiscriminatedName())); - }); - - message.edit(embed); - } - } - else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { - // Cancel the image retagging. - - message.removeAllReactions(); - - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Operation cancelled!") - .setDescription("No changes made.") - .setColor(Color.GREEN) - .setFooter("boop"); - - message.edit(embed); - } - - event.getApi().removeListener(this); - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/ColorRole.java b/src/main/java/dev/salmonllama/fsbot/utilities/ColorRole.java deleted file mode 100644 index 2a4bdf9..0000000 --- a/src/main/java/dev/salmonllama/fsbot/utilities/ColorRole.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.utilities; - -import org.javacord.api.entity.message.embed.EmbedBuilder; -import dev.salmonllama.fsbot.utilities.database.RoleColourUtility; - -import java.util.List; -import java.awt.Color; - -public class ColorRole { - public String id; - public String name; - - public ColorRole(String id, String name) { - this.id = id; - this.name = name; - } - - public static EmbedBuilder rolesListEmbed() { - List roles = RoleColourUtility.getAllRoles(); - - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Available ColorRoles") - .setColor(Color.GREEN) - .setFooter("Showing " + roles.size() + " roles"); - - StringBuilder builder = new StringBuilder(); - - roles.forEach(role -> { - builder.append(role.name).append("\n"); - }); - - embed.addField("Roles:", builder.toString()); - - return embed; - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/Outfit.java b/src/main/java/dev/salmonllama/fsbot/utilities/Outfit.java deleted file mode 100644 index 7642bc1..0000000 --- a/src/main/java/dev/salmonllama/fsbot/utilities/Outfit.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.utilities; - -import org.javacord.api.DiscordApi; -import org.javacord.api.entity.message.embed.EmbedBuilder; - -import java.awt.*; - -public class Outfit { - - private String id; - private String tag; - private String submitter; - private String link; - private DiscordApi api; - - public Outfit(String id, String tag, String submitter, String link) { - this.id = id; - this.tag = tag; - this.submitter = submitter; - this.link = link; - } - - public void setId(String id) { this.id = id; } - public String getId() { return this.id; } - - public String getTag() { return this.tag; } - - // public void setTag(String tag) { this.tag = tag; } - // public String getTag() { return this.tag; } - - // public void setSubmitter(String submitter) { this.submitter = submitter; } - // public String getSubmitter() { return this.submitter; } - - // public void setLink(String link) { this.link = link; } - // public String getLink() { return this.link; } - - public EmbedBuilder generateEmbed() { - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle(submitter + " | " + tag) - .setImage(this.link) - .setFooter(this.id); - } - - public EmbedBuilder generateInfo() { - return new EmbedBuilder() - .setColor(Color.GREEN) - .setTitle("Outfit Information") - .setThumbnail(this.link) - .addField("Submitter:", this.submitter, true) - .addField("Tag:", this.tag, true) - .addField("Id:", this.id) - .addField("Link:", this.link); - } - - public EmbedBuilder tagChangeEmbed(String changer, String oldTag, String newTag) { - return new EmbedBuilder() - .setColor(Color.YELLOW) - .setTitle(String.format("Tag changed by %s", changer)) - .setThumbnail(this.link) - .addField("Old Tag:", oldTag) - .addField("New Tag:", newTag) - .setFooter(this.id); - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java b/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java deleted file mode 100644 index 4b9d197..0000000 --- a/src/main/java/dev/salmonllama/fsbot/utilities/database/DatabaseUtilities.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.utilities.database; - -import com.rethinkdb.RethinkDB; -import com.rethinkdb.gen.ast.Table; -import com.rethinkdb.net.Connection; -import com.rethinkdb.net.Cursor; -import org.javacord.api.DiscordApi; -import dev.salmonllama.fsbot.utilities.Outfit; -import org.javacord.api.entity.server.Server; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; - -import java.util.*; - -public class DatabaseUtilities { - - private final RethinkDB r; - private final Connection conn; - private final DiscordApi api; - - public DatabaseUtilities(RethinkDB r, Connection conn, DiscordApi api) { - this.r = r; - this.conn = conn; - this.api = api; - } - - private Table getTable(String table) { - if (this.r.db("fsbot").tableList().contains(table).run(this.conn) != null) { - return this.r.db("fsbot").table(table); - } - else { - return null; - } - } - - private boolean validateId(String id) { - return r.db("fsbot").table("outfits").getField("id").contains(id).run(this.conn); - } - - public boolean tagExists(String tag) { - return r.db("fsbot").table("outfits").getField("tag").distinct().contains(tag).run(this.conn); - } - - public int countTags() { - return this.r.db("fsbot").table("outfits").getField("tag").distinct().count().run(this.conn); - } - - public ArrayList getTags() { - return r.db("fsbot").table("outfits").getField("tag").distinct().run(this.conn); - } - - public Outfit getOutfitFromId(String id) throws OutfitNotFoundException { - if (!this.validateId(id)) throw new OutfitNotFoundException(); - - HashMap sample = this.r.db("fsbot").table("outfits") - .get(id) - .run(this.conn); - - String tag = sample.get("tag").toString(); - String link = sample.get("link").toString(); - String submitterId = sample.get("submitter").toString(); - - String submitterName = api.getUserById(submitterId).join().getDiscriminatedName(); - - return new Outfit(id, tag, submitterName, link); - } - - public String removeFromDatabase(String id) throws OutfitNotFoundException { - if (!this.validateId(id)) throw new OutfitNotFoundException(); - - // Remove outfit return deletion status. 0 = failed, >= 1 = success - HashMap deletion = r.db("fsbot").table("outfits").get(id).delete().run(conn); - - return deletion.get("deleted").toString(); - } - - public Outfit randomOutfit() { - HashMap sample = this.r.db("fsbot").table("outfits") - .sample(1).nth(0) - .run(this.conn); - - String id = sample.get("id").toString(); - String tag = sample.get("tag").toString(); - String link = sample.get("link").toString(); - String submitterId = sample.get("submitter").toString(); - - String submitterName = api.getUserById(submitterId).join().getDiscriminatedName(); - - return new Outfit(id, tag, submitterName, link); - } - - public Outfit randomTaggedOutfit(String targetTag) { - HashMap sample = r.db("fsbot").table("outfits") - .filter(row -> row.getField("tag").eq(targetTag)) - .sample(1).nth(0) - .run(conn); - - String id = String.valueOf(sample.get("id")); - String tag = String.valueOf(sample.get("tag")); - String link = String.valueOf(sample.get("link")); - String submitterId = String.valueOf(sample.get("submitter")); - - String submitterName = api.getUserById(submitterId).join().getDiscriminatedName(); // Try a thenAccept with a thenApply - - return new Outfit(id, tag, submitterName, link); - } - - public String changeOutfitTag(String outfitId, String newTag) throws OutfitNotFoundException { - if (!this.validateId(outfitId)) throw new OutfitNotFoundException(); - - HashMap replacement = this.r.db("fsbot").table("outfits").get(outfitId).update(r.hashMap("tag", newTag)).run(this.conn); - - return replacement.get("replaced").toString(); - } - - public Outfit getOutfitBySubmitter(String userId) { - HashMap sample = r.db("fsbot").table("outfits") - .filter(row -> row.getField("submitter").eq(userId)) - .sample(1).nth(0) - .run(conn); - - String id = String.valueOf(sample.get("id")); - String tag = String.valueOf(sample.get("tag")); - String link = String.valueOf(sample.get("link")); - String submitterId = String.valueOf(sample.get("submitter")); - - String submitterName = api.getUserById(submitterId).join().getDiscriminatedName(); - - return new Outfit(id, tag, submitterName, link); - } - - public long getSubmitterCount(String submitter) { - return r.db("fsbot").table("outfits") - .filter( - row -> row.getField("submitter").eq(submitter) - ) - .count() - .run(conn); - } - - public List getSubmitterIds(String submitter) { - List ids = new ArrayList<>(); - Cursor cursor = r.db("fsbot").table("outfits") - .filter( - row -> row.getField("submitter").eq(submitter) - ) - .getField("id") - .run(conn); - - cursor.forEach(ids::add); - - return ids; - } - - public void updateSubmitter(String submitter, String newSubmitter) { - // Add feature to return update-error? - r.db("fsbot").table("outfits") - .filter(r.hashMap("submitter", submitter)) - .update(r.hashMap("submitter", newSubmitter)) - .run(conn); - } - - // public void newServerProcess(Server server) { - - // if (this.r.db("fsbot").table("serverConf").contains(server.getIdAsString()).run(this.conn)) { - // return; - // } - - // String serverName = server.getName(); - // String serverId = server.getIdAsString(); - // String logChannel = "null"; - // String giveawayChannel = "null"; - // String welcomeChannel = "null"; - // String defaultWelcome = "welcome to the server"; - - // this.r.db("fsbot").table("serverConf").insert( - // this.r.hashMap("id", serverId) - // .with("name", serverName) - // .with("logChannel", logChannel) - // .with("giveawayChannel", giveawayChannel) - // .with("welcomeMsg", defaultWelcome) - // .with("welcomeChannel", welcomeChannel) - // .with("prefix", "~") - // ).run(this.conn); - // } - -// public void tableSetup() { // TODO: Fix this -- invert conditionals, just create the tables. -> if *not* exist then create -// // Check for database existence, if not, create -// if (r.dbList().contains("fsbot").run(conn)) { -// // System.out.println("database 'fsbot' already exists."); -// } -// else { -// r.dbCreate("fsbot").run(conn); -// System.out.println("database fsbot did not exist, and has been created"); -// } - -// // Check for channels table existence, if not, create -// if (r.db("fsbot").tableList().contains("channels").run(conn)) { -// // System.out.println("table channels already exists"); -// } -// else { -// r.db("fsbot").tableCreate("channels").run(conn); -// System.out.println("table channels did not exist, and has been created."); -// } - -// // Check for serverconf table existence, if not, create -// if (r.db("fsbot").tableList().contains("serverConf").run(conn)) { -// // System.out.println("table serverConf already exists"); -// } -// else { -// r.db("fsbot").tableCreate("serverConf").run(conn); -// System.out.println("table serverConf did not exist, and has been created"); -// } - -// // Check for permissions table existene, if not, create -// if (r.db("fsbot").tableList().contains("permissions").run(conn)) { -// // System.out.println("table permissions already exists"); -// } -// else { -// r.db("fsbot").tableCreate("permissions").run(conn); -// System.out.println("table permissions did not exist and has been created"); -// } - -// // Check for outfits table existence, if not, create -// if (r.db("fsbot").tableList().contains("outfits").run(conn)) { -// // System.out.println("table outfits already exists"); -// } -// else { -// r.db("fsbot").tableCreate("outfits").run(conn); -// System.out.println("table outfits did not exist and has been created"); -// } - -// // Check for colourRoles table existence, if not, create -// if (r.db("fsbot").tableList().contains("colourRoles").run(conn)) { -// // System.out.println("table colourRoles already exists"); -// } -// else { -// r.db("fsbot").tableCreate("colourRoles").run(conn); -// System.out.println("table colourRoles did not exist and has been created"); -// } -// } -} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/database/RoleColourUtility.java b/src/main/java/dev/salmonllama/fsbot/utilities/database/RoleColourUtility.java deleted file mode 100644 index be86216..0000000 --- a/src/main/java/dev/salmonllama/fsbot/utilities/database/RoleColourUtility.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.utilities.database; - -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; -import com.rethinkdb.net.Cursor; -import dev.salmonllama.fsbot.utilities.ColorRole; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class RoleColourUtility { - - private static RethinkDB r = RethinkDB.r; - private static Connection conn = r.connection().hostname("localhost").port(28015).connect(); - - public static void addColourRole(String colourName, String roleId) { - r.db("fsbot").table("colourRoles").insert( - r.hashMap("id", roleId) - .with("name", colourName)).run(conn); - } - - public static void deleteColourRole() { - - } - - public static String getColour(String colourName) { - String roleId = null; - - Cursor cursor = r.db("fsbot").table("colourRoles") - .filter(row -> row.getField("name").eq(colourName)) - .getField("id") - .run(conn); - List roleIds = cursor.toList(); - for (Object id : roleIds) { - roleId = id.toString(); - } - - return roleId; - } - - public static List getAllRoles() { - List allRoles = new ArrayList<>(); - - Cursor cursor = r.db("fsbot").table("colourRoles") - .run(conn); - - while (cursor.hasNext()) { - HashMap role = (HashMap) cursor.next(); - - String id = String.valueOf(role.get("id")); - String name = String.valueOf(role.get("name")); - - allRoles.add(new ColorRole(id, name)); - } - - return allRoles; - } - - public static String getAllRoleInfo() { - return r.db("fsbot").table("colourRoles").run(conn); - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/utilities/database/ServerConfUtility.java b/src/main/java/dev/salmonllama/fsbot/utilities/database/ServerConfUtility.java deleted file mode 100644 index 06c2cbf..0000000 --- a/src/main/java/dev/salmonllama/fsbot/utilities/database/ServerConfUtility.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.utilities.database; - -import com.rethinkdb.RethinkDB; -import com.rethinkdb.net.Connection; -import com.rethinkdb.net.Cursor; - -import java.util.List; - -public class ServerConfUtility { - - private static final RethinkDB r = RethinkDB.r; - private static final Connection conn = r.connection().hostname("localhost").port(28015).connect(); - - private static String serverId; - - public ServerConfUtility(String sId) { - serverId = sId; - } - - // TODO: Turn server into method args, not class field. - - public String getWelcomeMsg() { - - String welcomeMsg = null; - - Cursor welcomes = r.db("fsbot").table("serverConf") - .filter(row -> row.getField("id").eq(serverId)) - .getField("welcomeMsg") - .run(conn); - List welcomeMsgs = welcomes.toList(); - for (Object msg : welcomeMsgs) { - welcomeMsg = msg.toString(); - } - - return welcomeMsg; - } - - public void setWelcomeMsg(String msg) { - - r.db("fsbot").table("serverConf") - .get(serverId) - .update(r.hashMap("welcomeMsg", msg)) - .run(conn); - } - - public String getWelcomeChannel() { - - String welcomeChannel = null; - - Cursor channels = r.db("fsbot").table("serverConf") - .filter(row -> row.getField("id").eq(serverId)) - .getField("welcomeChannel") - .run(conn); - List welcomeChannels = channels.toList(); - for (Object chnl : welcomeChannels) { - welcomeChannel = chnl.toString(); - } - - return welcomeChannel; - } - - public void setWelcomeChannel(String id) { - - r.db("fsbot").table("serverConf") - .get(serverId) - .update(r.hashMap("welcomeChannel", id)) - .run(conn); - } -} From 421b42bf714d72c7b559ac17a4eee7bbaa02374c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:17:46 -0400 Subject: [PATCH 104/157] Added easy outfit re-creation --- .../salmonllama/fsbot/database/models/Outfit.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index 5296f3d..ddd4bbf 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -119,6 +119,19 @@ public class Outfit extends DatabaseModel { public OutfitBuilder() { } + public OutfitBuilder(Outfit outfit) { + this.id = outfit.getId(); + this.link = outfit.getLink(); + this.submitter = outfit.getSubmitter(); + this.tag = outfit.getTag(); + this.created = outfit.getCreated(); + this.updated = outfit.getUpdated(); + this.deleted = outfit.isDeleted(); + this.featured = outfit.isFeatured(); + this.displayCount = outfit.getDisplayCount(); + this.deleteHash = outfit.getDeleteHash(); + } + public OutfitBuilder setId(String id) { this.id = id; return this; From a649da2d5ad80cf9ad3a7c59284ed516c23a9bf0 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:18:27 -0400 Subject: [PATCH 105/157] Deployment futureproofing --- src/main/java/dev/salmonllama/fsbot/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/Main.java b/src/main/java/dev/salmonllama/fsbot/Main.java index 8eb5014..3d93c72 100644 --- a/src/main/java/dev/salmonllama/fsbot/Main.java +++ b/src/main/java/dev/salmonllama/fsbot/Main.java @@ -20,7 +20,7 @@ public class Main { public static void main(String[] args) { String configLocation = Constants.BOT_FOLDER.concat(Constants.CONFIG_NAME); - BotConfig.initConfig(configLocation); + BotConfig.initConfig(configLocation, false); // TODO: Use args to dictate newFiling. Also use args to dictate database setup. FSDB.init(); From bf6a1fb7a8d0b5f041befdb9defd63c38006dc11 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:18:39 -0400 Subject: [PATCH 106/157] WelcomeChannel config option --- src/main/java/dev/salmonllama/fsbot/config/BotConfig.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index 1f24677..adb9f95 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -45,6 +45,9 @@ public class BotConfig { @ConfigurationOption public static String VOTE_CHANNEL = "vote channel here"; + @ConfigurationOption + public static String WELCOME_CHANNEL = "welcome channel here"; + @ConfigurationOption public static String JOIN_LOG = "join log channel"; @@ -69,9 +72,9 @@ public class BotConfig { @ConfigurationOption public static String HOME_SERVER = "340511685024546816"; - public static void initConfig(String filePath) { + public static void initConfig(String filePath, boolean cleanfile) { try { - new ConfigurationBuilder(BotConfig.class, new File(filePath)).build(false); + new ConfigurationBuilder(BotConfig.class, new File(filePath)).build(cleanfile); } catch (Exception e) { e.printStackTrace(); System.exit(1); From 5f8fd66ee317dedd05084bd6f9452fbb16caf91d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:19:05 -0400 Subject: [PATCH 107/157] Fixed nullpointer on creation --- .../database/controllers/StaticPermissionController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java index 955fb70..027337a 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/StaticPermissionController.java @@ -74,6 +74,10 @@ public class StaticPermissionController { } private static void insertExec(StaticPermission perm) throws SQLException { + if (perm.getAdded() == null) { + perm.setAdded(new Timestamp(System.currentTimeMillis())); + } + FSDB.get().insert("INSERT INTO static_permissions (user_id, permission, date_added) VALUES (?, ?, ?)", perm.getUserId(), perm.getPermission(), From 9788e1783e3007a10a433a986880fe3a80dc78d7 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:19:48 -0400 Subject: [PATCH 108/157] Finished command logic --- .../commands/developer/PermissionCommand.java | 74 +++++++++++++------ 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java index 9714296..36171ed 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -11,8 +11,10 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import dev.salmonllama.fsbot.logging.Logger; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.user.User; +import org.javacord.api.util.logging.ExceptionLogger; import java.awt.*; import java.util.ArrayList; @@ -25,7 +27,7 @@ public class PermissionCommand extends Command { @Override public String usage() { return "permission "; } @Override public String category() { return "Staff"; } @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } - @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("permission", "perm")); } + @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("permission", "permissions", "perm", "perms")); } @Override public void onCommand(CommandContext ctx) { @@ -38,9 +40,11 @@ public class PermissionCommand extends Command { break; case "add": // Add a static permission to the mentioned user, if any + add(ctx); break; case "remove": // Remove a static permission from the mentioned user, if any + remove(ctx); break; default: // You don't know how to use this command LUL @@ -71,31 +75,55 @@ public class PermissionCommand extends Command { ctx.reply(embed); }); }); - } + } else { + StaticPermissionController.getAll().thenAcceptAsync(possiblePerms -> { + possiblePerms.ifPresentOrElse(perms -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("All static permissions") + .setFooter(String.format("Found %s total static permissions", perms.size())) + .setColor(Color.green); - StaticPermissionController.getAll().thenAcceptAsync(possiblePerms -> { - possiblePerms.ifPresentOrElse(perms -> { - EmbedBuilder embed = new EmbedBuilder() - .setTitle("All static permissions") - .setFooter(String.format("Found %s total static permissions", perms.size())) - .setColor(Color.green); + perms.forEach(perm -> { + embed.addField(perm.getUserId(), perm.getPermission()); + }); - perms.forEach(perm -> { - embed.addField(perm.getUserId(), perm.getPermission()); + ctx.reply(embed); + }, () -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("No Permissions Found") + .setDescription("No permissions have been added."); + + ctx.reply(embed); }); - - ctx.reply(embed); - }, () -> { - EmbedBuilder embed = new EmbedBuilder() - .setTitle("No Permissions Found") - .setDescription("No permissions have been added."); - - ctx.reply(embed); }); - }); + } } private void add(CommandContext ctx) { + System.out.println("Add run"); + if (ctx.getMessage().getMentionedUsers().isEmpty()) { + System.out.println("No mentioned users"); + // If no mentioned users, improper usage + return; + } + + String userId = ctx.getMessage().getMentionedUsers().get(0).getIdAsString(); + System.out.println(String.format("Got mentioned user %s", userId)); + + StaticPermission perm = new StaticPermission.StaticPermissionBuilder(userId).setPermission(ctx.getArgs()[2]).build(); + + StaticPermissionController.insert(perm).thenAcceptAsync((Void) -> { + System.out.println("Permission added"); + EmbedBuilder response = new EmbedBuilder() + .setTitle("Permissions Added") + .addField("User:", userId) + .addField("Permission:", ctx.getArgs()[2]); + + ctx.reply(response); + }); + } + + private void remove(CommandContext ctx) { // TODO: Remove is not functional if (ctx.getMessage().getMentionedUsers().isEmpty()) { // If no mentioned users, improper usage return; @@ -103,10 +131,8 @@ public class PermissionCommand extends Command { String userId = ctx.getMessage().getMentionedUsers().get(0).getIdAsString(); - StaticPermission perm = new StaticPermission.StaticPermissionBuilder(userId).setPermission(ctx.getArgs()[2]).build(); - } - - private void remove(CommandContext ctx) { - + StaticPermissionController.delete(userId, ctx.getArgs()[2]).thenAcceptAsync((Void) -> { + System.out.println("Permission removed"); + }).exceptionally(ExceptionLogger.get()); } } From be3b109ebe7aedb4b2a4cbbc3937f904fa0431bb Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:20:40 -0400 Subject: [PATCH 109/157] Updated command list and imports --- src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 6d4aee5..974f4bd 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -5,17 +5,14 @@ package dev.salmonllama.fsbot.guthix; +import dev.salmonllama.fsbot.commands.developer.*; import dev.salmonllama.fsbot.commands.general.*; import dev.salmonllama.fsbot.commands.staff.OutfitInfoCommand; import dev.salmonllama.fsbot.commands.staff.*; -import dev.salmonllama.fsbot.commands.developer.InviteCommand; -import dev.salmonllama.fsbot.commands.developer.CreateGalleryCommand; -import dev.salmonllama.fsbot.commands.developer.EvalCommand; import org.javacord.api.DiscordApi; import org.javacord.api.entity.message.MessageAuthor; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; -import dev.salmonllama.fsbot.commands.developer.TestCommand; import java.util.Collection; import java.util.HashMap; @@ -45,6 +42,7 @@ public class Guthix implements MessageCreateListener { addCommand(new TestCommand()); addCommand(new CreateGalleryCommand()); addCommand(new InviteCommand()); + addCommand(new PermissionCommand()); // Staff Commands addCommand(new EchoCommand()); From 60f9b4e3b2ee368c8363c6c4b8cb9a5b70c7d7aa Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:20:58 -0400 Subject: [PATCH 110/157] Changed author to submitter --- .../salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index 2300918..21d151d 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -46,7 +46,7 @@ public class RemoveOutfitCommand extends Command { EmbedBuilder embed = new EmbedBuilder() .setTitle("Confirm Outfit Deletion") .setThumbnail(outfit.getLink()) - .setAuthor(ctx.getApi().getYourself()) + .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) .setUrl(outfit.getLink()) .setFooter(String.format("Tag: %s", outfit.getTag())) .addField("Added", outfit.getCreated().toString(), true) @@ -72,6 +72,7 @@ public class RemoveOutfitCommand extends Command { .setTitle("Deletion Successful!") .setDescription(String.format("Outfit %s marked as deleted", outfit.getId())); ctx.reply(response); + // TODO: Log the action in FSBot-Log } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { // Do nothing From 74d4c3c4ce0d0f7d449b069d5f9e96e2f8afb67d Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:21:34 -0400 Subject: [PATCH 111/157] Added static and discord permission handlers --- .../fsbot/guthix/PermissionManager.java | 44 ++++++++++++++++--- .../fsbot/guthix/PermissionType.java | 2 + 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java index 173d54f..de7aad2 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java @@ -5,32 +5,43 @@ package dev.salmonllama.fsbot.guthix; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicBoolean; + import org.javacord.api.entity.message.MessageAuthor; +import dev.salmonllama.fsbot.database.controllers.StaticPermissionController; +import dev.salmonllama.fsbot.database.models.StaticPermission; + public class PermissionManager { public PermissionManager() { } public boolean hasPermission(CommandPermission reqPerm, CommandContext ctx) { - PermissionType permtype = reqPerm.getType(); + PermissionType permType = reqPerm.getType(); + String permValue = reqPerm.getValue(); - switch (permtype) { + switch (permType) { case NONE: return true; case ROLE: // If the author has the role, yes. Doesn't work in DM - return roleHandler(reqPerm.getValue(), ctx); + return roleHandler(permValue, ctx); + case STATIC: + return staticHandler(permValue, ctx); + case PERMISSION: + return permissionHandler(ctx); case OWNER: // If the author is the owner, yes. return ownerHandler(ctx); + default: + return false; } - - return false; } private boolean roleHandler(String roleId, CommandContext ctx) { - if (!ctx.getUserRoles().isPresent()) { + if (ctx.getUserRoles().isEmpty()) { ctx.reply("This command can only be used in a server"); return false; } @@ -41,6 +52,27 @@ public class PermissionManager { return ctx.isUserOwner(); } + private boolean permissionHandler(CommandContext ctx) { + // Not implemented yet + return false; + } + + private boolean staticHandler(String staticPerm, CommandContext ctx) { + AtomicBoolean ret = new AtomicBoolean(false); + + StaticPermissionController.getByUser(ctx.getAuthor().getIdAsString()).thenAccept(possiblePerms -> { + possiblePerms.ifPresent( + staticPermissions -> ret.set( + staticPermissions.stream() + .map(StaticPermission::getPermission) + .anyMatch(staticPerm::equals) + ) + ); + }); + + return ret.get(); + } + boolean sourceIsValid(MessageAuthor author) { return !author.isBotUser() && !author.isWebhook(); } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java index b20e97b..bafca5e 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java @@ -7,6 +7,8 @@ package dev.salmonllama.fsbot.guthix; public enum PermissionType { ROLE, // User has a specific role inside the server + PERMISSION, // User has a specific Discord permission bit + STATIC, // User has a pre-defined permission stored in the database OWNER, // User is the bot owner NONE // No requirement } From cf698be97e8e117dae1d36f180ac4768d86e094f Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:22:12 -0400 Subject: [PATCH 112/157] Updated outfit retag command --- .../fsbot/commands/staff/RetagCommand.java | 103 ++++++++++++++---- 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java index ee9f059..5ecc903 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java @@ -7,18 +7,17 @@ package dev.salmonllama.fsbot.commands.staff; import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; import org.javacord.api.entity.channel.TextChannel; -import org.javacord.api.entity.user.User; -import dev.salmonllama.fsbot.listeners.ReactionRetagConfirmationListener; -import dev.salmonllama.fsbot.utilities.Outfit; -import dev.salmonllama.fsbot.utilities.database.DatabaseUtilities; -import dev.salmonllama.fsbot.utilities.exceptions.DiscordError; -import dev.salmonllama.fsbot.utilities.exceptions.OutfitNotFoundException; +import org.javacord.api.entity.message.embed.EmbedBuilder; +import java.awt.*; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,34 +30,90 @@ public class RetagCommand extends Command { @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("retag")); } - private final DatabaseUtilities db; - - public RetagCommand(DatabaseUtilities db) { - this.db = db; - } - @Override public void onCommand(CommandContext ctx) { String[] args = ctx.getArgs(); TextChannel channel = ctx.getChannel(); - User author = ctx.getUser(); + long authorId = ctx.getUser().getId(); if (args.length != 2) { - channel.sendMessage("You did that wrong mate. check the help command."); + channel.sendMessage("Improper usage"); return; } - try { - Outfit outfit = this.db.getOutfitFromId(args[0]); + // Get the outfit, confirm update through reaction + String outfitId = args[0]; + String newTag = args[1]; - channel.sendMessage(outfit.generateInfo().setTitle(String.format("Update tag to %s?", args[1]))).thenAcceptAsync(message -> { - message.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); - message.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); - message.addReactionAddListener(new ReactionRetagConfirmationListener(author, message, outfit, db, outfit.getTag(), args[1])); + OutfitController.findById(outfitId).thenAcceptAsync(possibleOutfit -> { + possibleOutfit.ifPresentOrElse(outfit -> { + // Send info, confirmation, and add reaction listener + EmbedBuilder response = new EmbedBuilder() + .setTitle("Confirm Tag Edit") + .setThumbnail(outfit.getLink()) + .setAuthor(ctx.getApi().getUserById(outfit.getSubmitter()).join()) + .setUrl(outfit.getLink()) + .addField("Current Tag:", outfit.getTag()) + .addField("New Tag:", newTag); + + ctx.reply(response).thenAcceptAsync(msg -> { + msg.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); + msg.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); + + msg.addReactionAddListener(event -> { + if (event.getUser().getId() != authorId) { + return; + } + + if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":white_check_mark:"))) { + // Update the outfit + Outfit newOutfit = new Outfit.OutfitBuilder(outfit) + .setTag(newTag) + .setUpdated(new Timestamp(System.currentTimeMillis())) + .build(); + + OutfitController.update(newOutfit).thenAcceptAsync((Void) -> { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Outfit retagged successfully!") + .setDescription(String.format("Outfit %s will now display as %s", newOutfit.getId(), newOutfit.getTag())); + + msg.delete(); + ctx.reply(embed); + // TODO: Log the action in FSBot-log + }); + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { + // Do nothing + msg.delete(); + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Update Cancelled") + .setDescription("No modifications were made"); + + ctx.reply(embed); + } + }); + }); + }, () -> { + // Err, outfit not found + EmbedBuilder response = new EmbedBuilder() + .setTitle("Error occurred") + .setDescription("That ID was not found in the database") + .setColor(Color.RED); + + ctx.reply(response); }); - } - catch (OutfitNotFoundException e) { - channel.sendMessage(new DiscordError(e.getMessage()).get()); - } + }); + +// try { +// Outfit outfit = this.db.getOutfitFromId(args[0]); +// +// channel.sendMessage(outfit.generateInfo().setTitle(String.format("Update tag to %s?", args[1]))).thenAcceptAsync(message -> { +// message.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); +// message.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); +// message.addReactionAddListener(new ReactionRetagConfirmationListener(author, message, outfit, db, outfit.getTag(), args[1])); +// }); +// } +// catch (OutfitNotFoundException e) { +// channel.sendMessage(new DiscordError(e.getMessage()).get()); +// } } } From a53bc60f4bb7267dee16380843e8ae95f15b3be2 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:22:22 -0400 Subject: [PATCH 113/157] Allowed outfits to be retagged/updated --- .../controllers/OutfitController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 15bb82f..19f3f8d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -169,6 +169,16 @@ public class OutfitController { }); } + public static CompletableFuture update(Outfit outfit) { + return CompletableFuture.runAsync(() -> { + try { + updateExec(outfit); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + public static CompletableFuture delete(String id) { return CompletableFuture.runAsync(() -> { try { @@ -333,6 +343,22 @@ public class OutfitController { return tags; } + private static void updateExec(Outfit outfit) throws SQLException { + FSDB.get().query("UPDATE outfits SET " + + "link = ?," + + "submitter = ?," + + "tag = ?," + + "updated = ?," + + "featured = ?," + + "display_count = ?" + + "WHERE id = ?", + outfit.getLink(), + outfit.getSubmitter(), + outfit.getTag(), + outfit.isFeatured(), + outfit.getDisplayCount()); + } + private static void deleteExec(String id) throws SQLException { FSDB.get().query("UPDATE outfits SET deleted = true WHERE id = ?", id); } From 941ec1bf4d7e63d84f1dc86d323349433275ed97 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:22:53 -0400 Subject: [PATCH 114/157] Fixed timestamp NPI and added toString --- .../fsbot/database/models/StaticPermission.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java b/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java index 3ddd2ab..273f44a 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/StaticPermission.java @@ -8,6 +8,7 @@ package dev.salmonllama.fsbot.database.models; import dev.salmonllama.fsbot.database.DatabaseModel; import java.sql.Timestamp; +import java.time.Instant; public class StaticPermission extends DatabaseModel { private String userId; @@ -32,10 +33,19 @@ public class StaticPermission extends DatabaseModel { return added; } + public void setAdded(Timestamp added) { + this.added = added; + } + public static String schema() { return "CREATE TABLE IF NOT EXISTS static_permissions (user_id TEXT, permission TEXT, date_added TEXT)"; } + @Override + public String toString() { + return String.format("Static Permission [userId: %s, permission: %s, added: %s", userId, permission, added.toString()); + } + public static class StaticPermissionBuilder { private String userId; private String permission = null; From 94336b2a3fc99db3ea2bf1eab8b6af063f334166 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 14:23:08 -0400 Subject: [PATCH 115/157] I still have no idea --- src/main/java/dev/salmonllama/fsbot/logging/Logger.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/logging/Logger.java b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java index 0a55f2e..4d5c5ed 100644 --- a/src/main/java/dev/salmonllama/fsbot/logging/Logger.java +++ b/src/main/java/dev/salmonllama/fsbot/logging/Logger.java @@ -7,6 +7,9 @@ package dev.salmonllama.fsbot.logging; import dev.salmonllama.fsbot.config.BotConfig; import org.javacord.api.DiscordApi; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.util.function.Function; public class Logger { @@ -18,6 +21,10 @@ public class Logger { private final String BOT_LOG = BotConfig.BOT_LOG; private final String SALMONLLAMA = BotConfig.BOT_OWNER; + private EmbedBuilder reportEmbed; + + private EmbedBuilder errorEmbed; + public Logger(DiscordApi api) { this.api = api; } @@ -46,7 +53,7 @@ public class Logger { }); } - public void logError() { + public void logError(String errorMsg) { api.getServerTextChannelById(BOT_LOG).ifPresentOrElse(channel -> { // Log the thing channel.sendMessage("error"); From 8173a8ee6345f351690f7f658c14678727753b69 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 16:02:10 -0400 Subject: [PATCH 116/157] Privacy policy for TOS compliance --- privacy.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 privacy.md diff --git a/privacy.md b/privacy.md new file mode 100644 index 0000000..6ced587 --- /dev/null +++ b/privacy.md @@ -0,0 +1,47 @@ +# Privacy Policy + +To comply with Discord's new Terms of Service, this document exists +to provide an overview of Fashionscape Bot and the information it +collects, and why. + +This document is also accessible to users within Discord through the +`~privacy` command. + +## The data we store +####Guild Data: +Guild Snowflakes (IDs) - Generated by Discord + +####User Data: +User Snowflakes (IDs) - Generated by Discord + +####User Content: +Permanent links to user-provided images supplied in gallery channels. + +## Why we store it and how we use it +####Guild Data: +Guild IDs are stored so that the bot may use custom prefixes and settings +as a guild's administrators see fit. It is also used to prevent the bot +from joining a guild, should the guild prove to be abusing or misusing +either the bot, or Discord/Jagex Terms of Service. + +####User Data: +User IDs are stored mainly for image attribution, to give proper credit +to users who submit their screenshots to the gallery. + +User IDs may also be used to prevent a user from utilizing some or all +features of the bot, if the user is proven to be abusing or misusing it. + +####User Content: +Images posted to gallery channels are not stored directly. The bot +first uploads them to a private imgur gallery, and retrieves the link. +This link is then stored in the bot's database as part of the gallery. + +## Accessing and deleting your data +You may request deletion of your submitted content through myself +or another administrator. To do this, either join our discord and +ping one of us, or create an issue on GitHub. + +## Questions, Comments, Concerns +Any further questions or concerns may be submitted through the +Fashionscape Server's #report-issues-here channel, or directed to +Salmonllama#5727 or LisaaRS#2604. \ No newline at end of file From c8dea0f7e636f72a96366954c701827b05c1a069 Mon Sep 17 00:00:00 2001 From: Aleksei Gryczewski Date: Thu, 23 Jul 2020 16:03:40 -0400 Subject: [PATCH 117/157] Formatting --- privacy.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/privacy.md b/privacy.md index 6ced587..643def4 100644 --- a/privacy.md +++ b/privacy.md @@ -8,30 +8,30 @@ This document is also accessible to users within Discord through the `~privacy` command. ## The data we store -####Guild Data: +Guild Data:\n Guild Snowflakes (IDs) - Generated by Discord -####User Data: +User Data:\n User Snowflakes (IDs) - Generated by Discord -####User Content: +User Content:\n Permanent links to user-provided images supplied in gallery channels. ## Why we store it and how we use it -####Guild Data: +Guild Data:\n Guild IDs are stored so that the bot may use custom prefixes and settings as a guild's administrators see fit. It is also used to prevent the bot from joining a guild, should the guild prove to be abusing or misusing either the bot, or Discord/Jagex Terms of Service. -####User Data: +User Data:\n User IDs are stored mainly for image attribution, to give proper credit to users who submit their screenshots to the gallery. User IDs may also be used to prevent a user from utilizing some or all features of the bot, if the user is proven to be abusing or misusing it. -####User Content: +User Content:\n Images posted to gallery channels are not stored directly. The bot first uploads them to a private imgur gallery, and retrieves the link. This link is then stored in the bot's database as part of the gallery. @@ -44,4 +44,4 @@ ping one of us, or create an issue on GitHub. ## Questions, Comments, Concerns Any further questions or concerns may be submitted through the Fashionscape Server's #report-issues-here channel, or directed to -Salmonllama#5727 or LisaaRS#2604. \ No newline at end of file +Salmonllama#5727 or LisaaRS#2604. From 5cc415a2b4e2e3f30b871878b2ee7f09e66aa673 Mon Sep 17 00:00:00 2001 From: Aleksei Gryczewski Date: Thu, 23 Jul 2020 16:04:33 -0400 Subject: [PATCH 118/157] Formatting --- privacy.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/privacy.md b/privacy.md index 643def4..28be95c 100644 --- a/privacy.md +++ b/privacy.md @@ -8,30 +8,30 @@ This document is also accessible to users within Discord through the `~privacy` command. ## The data we store -Guild Data:\n +Guild Data:\ Guild Snowflakes (IDs) - Generated by Discord -User Data:\n +User Data:\ User Snowflakes (IDs) - Generated by Discord -User Content:\n +User Content:\ Permanent links to user-provided images supplied in gallery channels. ## Why we store it and how we use it -Guild Data:\n +Guild Data:\ Guild IDs are stored so that the bot may use custom prefixes and settings as a guild's administrators see fit. It is also used to prevent the bot from joining a guild, should the guild prove to be abusing or misusing either the bot, or Discord/Jagex Terms of Service. -User Data:\n +User Data:\ User IDs are stored mainly for image attribution, to give proper credit to users who submit their screenshots to the gallery. User IDs may also be used to prevent a user from utilizing some or all features of the bot, if the user is proven to be abusing or misusing it. -User Content:\n +User Content:\ Images posted to gallery channels are not stored directly. The bot first uploads them to a private imgur gallery, and retrieves the link. This link is then stored in the bot's database as part of the gallery. From 6f19c24a6b8cffe7bd153e2b5871bb475832e311 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 16:05:40 -0400 Subject: [PATCH 119/157] More formatting --- privacy.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/privacy.md b/privacy.md index 28be95c..781e92b 100644 --- a/privacy.md +++ b/privacy.md @@ -8,30 +8,30 @@ This document is also accessible to users within Discord through the `~privacy` command. ## The data we store -Guild Data:\ +###Guild Data: Guild Snowflakes (IDs) - Generated by Discord -User Data:\ +###User Data: User Snowflakes (IDs) - Generated by Discord -User Content:\ +###User Content: Permanent links to user-provided images supplied in gallery channels. ## Why we store it and how we use it -Guild Data:\ +###Guild Data: Guild IDs are stored so that the bot may use custom prefixes and settings as a guild's administrators see fit. It is also used to prevent the bot from joining a guild, should the guild prove to be abusing or misusing either the bot, or Discord/Jagex Terms of Service. -User Data:\ +###User Data: User IDs are stored mainly for image attribution, to give proper credit to users who submit their screenshots to the gallery. User IDs may also be used to prevent a user from utilizing some or all features of the bot, if the user is proven to be abusing or misusing it. -User Content:\ +###User Content: Images posted to gallery channels are not stored directly. The bot first uploads them to a private imgur gallery, and retrieves the link. This link is then stored in the bot's database as part of the gallery. From 6f35dd71a21cb96c71c09de698c64b1ce7296dcf Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 16:07:56 -0400 Subject: [PATCH 120/157] Haha more formatting. --- privacy.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/privacy.md b/privacy.md index 781e92b..6a24099 100644 --- a/privacy.md +++ b/privacy.md @@ -8,30 +8,30 @@ This document is also accessible to users within Discord through the `~privacy` command. ## The data we store -###Guild Data: +### Guild Data: Guild Snowflakes (IDs) - Generated by Discord -###User Data: +### User Data: User Snowflakes (IDs) - Generated by Discord -###User Content: +### User Content: Permanent links to user-provided images supplied in gallery channels. ## Why we store it and how we use it -###Guild Data: +### Guild Data: Guild IDs are stored so that the bot may use custom prefixes and settings as a guild's administrators see fit. It is also used to prevent the bot from joining a guild, should the guild prove to be abusing or misusing either the bot, or Discord/Jagex Terms of Service. -###User Data: +### User Data: User IDs are stored mainly for image attribution, to give proper credit to users who submit their screenshots to the gallery. User IDs may also be used to prevent a user from utilizing some or all features of the bot, if the user is proven to be abusing or misusing it. -###User Content: +User Content: Images posted to gallery channels are not stored directly. The bot first uploads them to a private imgur gallery, and retrieves the link. This link is then stored in the bot's database as part of the gallery. From cf1a715ddf7e261eafd9a5f37d3da6b8046950f5 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 16:42:46 -0400 Subject: [PATCH 121/157] Added command for privacy policy --- .../commands/general/PrivacyCommand.java | 36 +++++++++++++++++++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java new file mode 100644 index 0000000..253f115 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/PrivacyCommand.java @@ -0,0 +1,36 @@ +package dev.salmonllama.fsbot.commands.general; + +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.util.Collection; +import java.util.Collections; + +public class PrivacyCommand extends Command { + @Override public String name() { return "Privacy"; } + @Override public String description() { return "Directs users to the bot's privacy policy"; } + @Override public String usage() { return "privacy"; } + @Override public String category() { return "General"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.NONE); } + @Override public Collection aliases() { return Collections.singletonList("privacy"); } + + + @Override + public void onCommand(CommandContext ctx) { + String privacyUrl = "https://github.com/Salmonllama/Fashionscape-Bot/blob/database-rewrite/privacy.md"; // TODO: Change this to master + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Click Here to open") + .setUrl(privacyUrl); + + EmbedBuilder response2 = new EmbedBuilder() + .setTitle("Link") + .setDescription(privacyUrl) + .setAuthor(ctx.getApi().getYourself()); + + ctx.reply(response).thenAcceptAsync(msg -> ctx.reply(response2)); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index 974f4bd..bda093b 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -63,6 +63,7 @@ public class Guthix implements MessageCreateListener { addCommand(new OutfitCommand()); addCommand(new HelpCommand(this)); addCommand(new StatsCommand()); + addCommand(new PrivacyCommand()); } public void addCommand(Command cmd) { From 784a21e2576fb202c3f45690351a447fb1e75575 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:05:28 -0400 Subject: [PATCH 122/157] Use CompletableFuture in command invocation --- src/main/java/dev/salmonllama/fsbot/guthix/Command.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Command.java b/src/main/java/dev/salmonllama/fsbot/guthix/Command.java index 2479c8a..92c8df8 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Command.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Command.java @@ -6,6 +6,7 @@ package dev.salmonllama.fsbot.guthix; import java.util.Collection; +import java.util.concurrent.CompletableFuture; public abstract class Command { public abstract String name(); @@ -18,7 +19,6 @@ public abstract class Command { public abstract void onCommand(CommandContext ctx); public void invoke(final CommandContext ctx) { - Thread thread = new Thread(() -> onCommand(ctx)); - thread.start(); + CompletableFuture.runAsync(() -> onCommand(ctx)); } } From b71a70f64ae3c0125693f82ffcfeb914c5b841ef Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:10:08 -0400 Subject: [PATCH 123/157] Add link --- privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacy.md b/privacy.md index 6a24099..16c959f 100644 --- a/privacy.md +++ b/privacy.md @@ -43,5 +43,5 @@ ping one of us, or create an issue on GitHub. ## Questions, Comments, Concerns Any further questions or concerns may be submitted through the -Fashionscape Server's #report-issues-here channel, or directed to +[Fashionscape Server](https://discord.com/invite/Tfvxe22)'s #report-issues-here channel, or directed to Salmonllama#5727 or LisaaRS#2604. From c217e024946972cc248b3b8b26b93ceeecb639da Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:11:37 -0400 Subject: [PATCH 124/157] Link opens in new tab --- privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacy.md b/privacy.md index 16c959f..cda253e 100644 --- a/privacy.md +++ b/privacy.md @@ -43,5 +43,5 @@ ping one of us, or create an issue on GitHub. ## Questions, Comments, Concerns Any further questions or concerns may be submitted through the -[Fashionscape Server](https://discord.com/invite/Tfvxe22)'s #report-issues-here channel, or directed to +[Fashionscape Server](https://discord.com/invite/Tfvxe22){:target="_blank"}'s #report-issues-here channel, or directed to Salmonllama#5727 or LisaaRS#2604. From 85c00639127be40daa0ae30f8268e0c8abd1204c Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:13:50 -0400 Subject: [PATCH 125/157] Revert link opener --- privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacy.md b/privacy.md index cda253e..16c959f 100644 --- a/privacy.md +++ b/privacy.md @@ -43,5 +43,5 @@ ping one of us, or create an issue on GitHub. ## Questions, Comments, Concerns Any further questions or concerns may be submitted through the -[Fashionscape Server](https://discord.com/invite/Tfvxe22){:target="_blank"}'s #report-issues-here channel, or directed to +[Fashionscape Server](https://discord.com/invite/Tfvxe22)'s #report-issues-here channel, or directed to Salmonllama#5727 or LisaaRS#2604. From deb58f6a74e3c63ab61b4bd32a4c9334bd7f893a Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:26:05 -0400 Subject: [PATCH 126/157] User Blacklist command --- .../developer/BlacklistUserCommand.java | 61 +++++++++++++++++++ .../controllers/UserBlacklistController.java | 5 +- .../fsbot/database/models/UserBlacklist.java | 6 +- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java new file mode 100644 index 0000000..5a8cfe4 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/BlacklistUserCommand.java @@ -0,0 +1,61 @@ +package dev.salmonllama.fsbot.commands.developer; + +import dev.salmonllama.fsbot.database.controllers.UserBlacklistController; +import dev.salmonllama.fsbot.database.models.UserBlacklist; +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.util.Arrays; +import java.util.Collection; + +public class BlacklistUserCommand extends Command { + @Override public String name() { return "Blacklist User"; } + @Override public String description() { return "Adds the user to the bot's blacklist, preventing them from using any commands or features"; } + @Override public String usage() { return "blacklistuser "; } + @Override public String category() { return "Developer"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } + @Override public Collection aliases() { return Arrays.asList("blacklistuser", "bluser", "sabusr"); } + + @Override + public void onCommand(CommandContext ctx) { + String[] args = ctx.getArgs(); + + if (args.length < 1) { + // Did it wrong + return; + } + + // If the user is on the blacklist, remove them, otherwise, add them with the reason. + UserBlacklistController.get(args[0]).thenAcceptAsync(possibleBlacklist -> { + possibleBlacklist.ifPresentOrElse(blacklist -> { + // Remove user from the blacklist + UserBlacklistController.delete(blacklist).thenAcceptAsync((Void) -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Removed User from Blacklist") + .addField("User ID:", blacklist.getId()) + .addField("Reason for Add", blacklist.getReason()) + .addField("Added:", blacklist.getAdded().toString()); + + ctx.reply(response); + }); + }, () -> { + // Add user to the blacklist, check args + UserBlacklist.UserBlacklistBuilder blBuilder = new UserBlacklist.UserBlacklistBuilder(args[0]); + EmbedBuilder response = new EmbedBuilder().setTitle("Added User to Blacklist").addField("User ID:", args[0]); + + if (args.length > 1) { + String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + blBuilder.setReason(reason); + response.addField("With reason:", reason); + } + + UserBlacklistController.insert(blBuilder.build()).thenAcceptAsync((Void) -> { + ctx.reply(response); + }); + }); + }); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java index 50761ee..fbbb0e2 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/UserBlacklistController.java @@ -82,7 +82,10 @@ public class UserBlacklistController { } private static void insertExec(UserBlacklist bl) throws SQLException { - // TODO: Check for null timestamp and init + if (bl.getAdded() == null) { + bl.setAdded(new Timestamp(System.currentTimeMillis())); + } + FSDB.get().insert("INSERT INTO blacklist_users ('id', 'reason', 'added') VALUES (?, ?, ?)", bl.getId(), bl.getReason(), diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java index fe17629..1b138d9 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/UserBlacklist.java @@ -32,6 +32,10 @@ public class UserBlacklist extends DatabaseModel { return added; } + public void setAdded(Timestamp added) { + this.added = added; + } + public static String schema() { return "CREATE TABLE IF NOT EXISTS blacklist_users (" + "id TEXT PRIMARY KEY," + @@ -41,7 +45,7 @@ public class UserBlacklist extends DatabaseModel { @Override public String toString() { - return String.format("User Blacklist: [id: %s, reason: %s, added: %s", + return String.format("User Blacklist: [id: %s, reason: %s, added: %s]", this.getId(), this.getReason(), this.getAdded() From d88cd05e1b63cfe868209fa3d71125a64e23a355 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:36:56 -0400 Subject: [PATCH 127/157] Add outfit meta --- .../controllers/OutfitController.java | 8 ++++++-- .../fsbot/database/models/Outfit.java | 19 ++++++++++++++++--- .../fsbot/listeners/ImageListener.java | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 19f3f8d..10adc13 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -210,12 +210,13 @@ public class OutfitController { FSDB.get().insert( "INSERT INTO " + - "outfits('id', 'link', 'submitter', 'tag', 'created', 'updated', 'deleted', 'featured', 'display_count', 'delete_hash') " + - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "outfits('id', 'link', 'submitter', 'tag', 'meta', 'created', 'updated', 'deleted', 'featured', 'display_count', 'delete_hash') " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", outfit.getId(), outfit.getLink(), outfit.getSubmitter(), outfit.getTag(), + outfit.getMeta(), outfit.getCreated(), outfit.getUpdated(), outfit.isDeleted(), @@ -348,6 +349,7 @@ public class OutfitController { "link = ?," + "submitter = ?," + "tag = ?," + + "meta = ?," + "updated = ?," + "featured = ?," + "display_count = ?" + @@ -355,6 +357,7 @@ public class OutfitController { outfit.getLink(), outfit.getSubmitter(), outfit.getTag(), + outfit.getMeta(), outfit.isFeatured(), outfit.getDisplayCount()); } @@ -395,6 +398,7 @@ public class OutfitController { .setLink(rs.getString("link")) .setSubmitter(rs.getString("submitter")) .setTag(rs.getString("tag")) + .setMeta(rs.getString("meta")) .setCreated(new Timestamp(rs.getLong("created"))) .setUpdated(new Timestamp((rs.getLong("updated")))) .setDeleted(rs.getBoolean("deleted")) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java index ddd4bbf..6791f5d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/Outfit.java @@ -6,7 +6,6 @@ package dev.salmonllama.fsbot.database.models; import dev.salmonllama.fsbot.database.DatabaseModel; -import org.javacord.api.entity.message.embed.EmbedBuilder; import java.sql.Timestamp; @@ -15,6 +14,7 @@ public class Outfit extends DatabaseModel { private String link; private String submitter; private String tag; + private String meta; private Timestamp created; private Timestamp updated; private boolean deleted; @@ -27,6 +27,7 @@ public class Outfit extends DatabaseModel { link = builder.link; submitter = builder.submitter; tag = builder.tag; + meta = builder.meta; created = builder.created; updated = builder.updated; deleted = builder.deleted; @@ -51,6 +52,10 @@ public class Outfit extends DatabaseModel { return tag; } + public String getMeta() { + return meta; + } + public Timestamp getCreated() { return created; } @@ -89,6 +94,7 @@ public class Outfit extends DatabaseModel { "link TEXT," + "submitter TEXT," + "tag TEXT," + + "meta TEXT," + "created TEXT," + "updated TEXT," + "deleted TEXT," + @@ -99,8 +105,8 @@ public class Outfit extends DatabaseModel { @Override public String toString() { - return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s]", - id, link, submitter, tag, created, updated, deleted, featured, displayCount, deleteHash + return String.format("Outfit: [id: %s, link: %s, submitter: %s, tag: %s, created: %s, updated: %s, deleted: %s, featured: %s, display count: %s, deletion hash: %s, meta: %s]", + id, link, submitter, tag, created, updated, deleted, featured, displayCount, deleteHash, meta ); } @@ -109,6 +115,7 @@ public class Outfit extends DatabaseModel { private String link; private String submitter; private String tag; + private String meta; private Timestamp created = null; private Timestamp updated = null; private boolean deleted = false; @@ -124,6 +131,7 @@ public class Outfit extends DatabaseModel { this.link = outfit.getLink(); this.submitter = outfit.getSubmitter(); this.tag = outfit.getTag(); + this.meta = outfit.getMeta(); this.created = outfit.getCreated(); this.updated = outfit.getUpdated(); this.deleted = outfit.isDeleted(); @@ -152,6 +160,11 @@ public class Outfit extends DatabaseModel { return this; } + public OutfitBuilder setMeta(String meta) { + this.meta = meta; + return this; + } + public OutfitBuilder setCreated(Timestamp created) { this.created = created; return this; diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index f1f5f5f..7bcbd06 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -54,6 +54,7 @@ public class ImageListener implements MessageCreateListener { // Store in the database Outfit.OutfitBuilder outfitBuilder = new Outfit.OutfitBuilder() .setId(upload.getId()) + .setMeta(event.getMessageContent()) .setLink(upload.getLink()) .setSubmitter(event.getMessageAuthor().getIdAsString()) .setCreated(new Timestamp(upload.getDateTime())); From 4afe83169d51f0d18f052c3a68a72d06b7ab51ab Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 18:54:20 -0400 Subject: [PATCH 128/157] Added Outfit meta and proper logging --- .../fsbot/listeners/ImageListener.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 7bcbd06..2078090 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -5,11 +5,13 @@ package dev.salmonllama.fsbot.listeners; +import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.endpoints.imgur.ImgurAPIConnection; import org.javacord.api.entity.message.MessageAttachment; +import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.listener.message.MessageCreateListener; import org.javacord.api.util.logging.ExceptionLogger; @@ -18,9 +20,6 @@ import java.sql.Timestamp; public class ImageListener implements MessageCreateListener { - public ImageListener() { - } - @Override public void onMessageCreate(MessageCreateEvent event) { // TODO: This needs immediate help // Check for valid source -> DONE -> WORKING @@ -59,13 +58,31 @@ public class ImageListener implements MessageCreateListener { .setSubmitter(event.getMessageAuthor().getIdAsString()) .setCreated(new Timestamp(upload.getDateTime())); - GalleryController.getTag(channel.getIdAsString()).thenAccept(outfitBuilder::setTag).join(); // TODO: Wrap this around the insert, don't join no moah + GalleryController.getTag(channel.getIdAsString()).thenAccept(tag -> { + outfitBuilder.setTag(tag); + Outfit outfit = outfitBuilder.build(); - Outfit outfit = outfitBuilder.build(); - OutfitController.insert(outfit).join(); + OutfitController.insert(outfit).thenAcceptAsync((Void) -> { + // Log the outfit + event.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresentOrElse(chnl -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Outfit Added") + .setAuthor(event.getMessageAuthor()) + .setThumbnail(outfit.getLink()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setUrl(outfit.getLink()) + .addField("Uploaded:", outfit.getCreated().toString()) + .addField("Meta:", outfit.getMeta()); - // Log the event - // event.getChannel().sendMessage("Outfit stored: " + outfit.toString()); // TODO: Logging. Log this to OutfitLog + chnl.sendMessage(response); + }, () -> { + // Fallback error message to me + event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync(user -> { + user.sendMessage("Could not find OUTFIT LOG"); + }); + }); + }); + }); }).exceptionally(ExceptionLogger.get()); }); } From 5242bb4f8913a9cbfa95d3899476fb3b0a3e5100 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 19:18:26 -0400 Subject: [PATCH 129/157] Made some fields final --- .../fsbot/endpoints/imgur/ImgurAPIConnection.java | 4 ++-- .../salmonllama/fsbot/endpoints/imgur/ImgurUpload.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java index 77a5c06..ff7417b 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurAPIConnection.java @@ -19,8 +19,8 @@ public class ImgurAPIConnection { private final String BEARER_TOKEN; // Required for deleting // Create the okhttp objects. Use methods to complete requests. - private OkHttpClient client; - private Request.Builder requestBuilder; + private final OkHttpClient client; + private final Request.Builder requestBuilder; public ImgurAPIConnection() { CLIENT_ID = BotConfig.IMGUR_ID; diff --git a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java index 13fab63..59252d3 100644 --- a/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java +++ b/src/main/java/dev/salmonllama/fsbot/endpoints/imgur/ImgurUpload.java @@ -6,10 +6,10 @@ package dev.salmonllama.fsbot.endpoints.imgur; public class ImgurUpload { - private String id; - private long dateTime; - private String deleteHash; - private String link; + private final String id; + private final long dateTime; + private final String deleteHash; + private final String link; public ImgurUpload(ImgurUploadBuilder builder) { id = builder.id; From 7ce2f97acf147f142f843e76da4e4a64568ae367 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 19:18:37 -0400 Subject: [PATCH 130/157] Set deleteHash on outfits --- src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 2078090..1e9a579 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -56,6 +56,7 @@ public class ImageListener implements MessageCreateListener { .setMeta(event.getMessageContent()) .setLink(upload.getLink()) .setSubmitter(event.getMessageAuthor().getIdAsString()) + .setDeleteHash(upload.getDeleteHash()) .setCreated(new Timestamp(upload.getDateTime())); GalleryController.getTag(channel.getIdAsString()).thenAccept(tag -> { From 7abd82f77a3cd3a507320caeef1240c5aa5f2d8a Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 19:40:38 -0400 Subject: [PATCH 131/157] Reformat Galleries with a builder --- .../developer/CreateGalleryCommand.java | 24 +++---- .../controllers/GalleryController.java | 29 ++++---- .../fsbot/database/models/GalleryChannel.java | 69 +++++++++++++++---- 3 files changed, 78 insertions(+), 44 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 06afbb3..07c3732 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -29,12 +29,12 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); } @Override - public void onCommand(CommandContext ctx) { // TODO: Might need some logic help... + public void onCommand(CommandContext ctx) { if (ctx.isPrivateMessage()) { ctx.reply("This command can only be used in a server!"); // TODO: Stop this. Turn this into a preset no-no embed. return; } - if (ctx.getArgs().length != 1) { + if (ctx.getArgs().length < 1) { ctx.reply("Args are incorrect"); return; } @@ -50,27 +50,25 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs String tag = ctx.getArgs()[0]; - GalleryChannel gallery = new GalleryChannel(); - gallery.channelId = channelId; - gallery.tag = tag; - gallery.emoji = ":heartpulse:"; + GalleryChannel.GalleryBuilder galleryBuilder = new GalleryChannel.GalleryBuilder(); + galleryBuilder.setChannelId(channelId); + galleryBuilder.setTag(tag); + galleryBuilder.setEmoji(":heartpulse:"); ctx.getServer().ifPresent(server -> { - gallery.serverId = server.getIdAsString(); - gallery.serverName = server.getName(); + galleryBuilder.setServerId(server.getIdAsString()); + galleryBuilder.setServerName(server.getName()); }); - ctx.getChannel().asServerTextChannel().ifPresent(channel -> gallery.channelName = channel.getName()); - + GalleryChannel gallery = galleryBuilder.build(); GalleryController.insert(gallery).exceptionally(ExceptionLogger.get()); // TODO: Make a discord exception logger for the thingos EmbedBuilder embed = new EmbedBuilder() .setColor(Color.GREEN) .addField("Success", "Gallery has been created:") - .addField("Channel Name:", gallery.channelName) - .addField("Channel Id:", gallery.channelId) + .addField("Channel Id:", gallery.getChannelId()) .addField("Tag:", tag) - .addField("Emoji:", EmojiManager.getByUnicode(gallery.emoji).toString()) + .addField("Emoji:", EmojiManager.getByUnicode(gallery.getEmoji()).toString()) .addField("End:", String.format("This channel is now being tracked under: %s", tag)); ctx.getChannel().sendMessage(embed); } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 75d88d0..e4dad23 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -57,14 +57,13 @@ public class GalleryController { } // TODO: Refactor for proper Java-ing, add GalleryBuilder private static void insertExec(GalleryChannel gallery) throws SQLException { - FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'channel_name', 'tag', 'emoji')" + + FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'tag', 'emoji')" + "VALUES(?, ?, ?, ?, ?)", - gallery.serverId, - gallery.serverName, - gallery.channelId, - gallery.channelName, - gallery.tag, - gallery.emoji + gallery.getServerId(), + gallery.getChannelId(), + gallery.getChannelId(), + gallery.getTag(), + gallery.getEmoji() ); } @@ -105,14 +104,12 @@ public class GalleryController { } private static GalleryChannel mapObject(ResultSet rs) throws SQLException { // TODO: Builder this - GalleryChannel gallery = new GalleryChannel(); - gallery.serverId = rs.getString("server_id"); - gallery.serverName = rs.getString("server_name"); - gallery.channelId = rs.getString("channel_id"); - gallery.channelName = rs.getString("channel_name"); - gallery.tag = rs.getString("tag"); - gallery.emoji = rs.getString("emoji"); - - return gallery; + return new GalleryChannel.GalleryBuilder() + .setServerId(rs.getString("server_id")) + .setServerName(rs.getString("server_name")) + .setChannelId(rs.getString("channel_id")) + .setTag(rs.getString("tag")) + .setEmoji(rs.getString("emoji")) + .build(); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java index c92b8f8..c771776 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -8,18 +8,21 @@ package dev.salmonllama.fsbot.database.models; import dev.salmonllama.fsbot.database.DatabaseModel; public class GalleryChannel extends DatabaseModel { - public String serverId; - public String serverName; - public String channelId; - public String channelName; - public String tag; + private final String serverId; + private final String serverName; + private final String channelId; + private final String tag; // Normal emojis will be stored in plain text as :emoji: // Server emojis will be stored in plain text as <:emoji:emoji-id> // This can be acquired through CustomEmoji#getMentionTag() - public String emoji; - - public GalleryChannel() { + private final String emoji; + public GalleryChannel(GalleryBuilder builder) { + serverId = builder.serverId; + serverName = builder.serverName; + channelId = builder.channelId; + tag = builder.tag; + emoji = builder.emoji; } public String getServerId() { @@ -34,9 +37,6 @@ public class GalleryChannel extends DatabaseModel { return channelId; } - public String getChannelName() { - return channelName; - } public String getTag() { return tag; @@ -50,15 +50,54 @@ public class GalleryChannel extends DatabaseModel { return "CREATE TABLE IF NOT EXISTS galleries (" + "server_id TEXT," + "server_name TEXT," + - "channel_id TEXT," + // TODO: PRIMARY KEY? There can only be one gallery per channel. - "channel_name TEXT," + + "channel_id TEXT," + "emoji TEXT," + "tag TEXT)"; } @Override public String toString() { - return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, channel name: %s, tag: %s, emoji: %s]", - serverId, serverName, channelId, channelName, tag, emoji); + return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, tag: %s, emoji: %s]", + serverId, serverName, channelId, tag, emoji); + } + + public static class GalleryBuilder { + private String serverId; + private String serverName; + private String channelId; + private String tag; + private String emoji; + + public GalleryBuilder() { + + } + public GalleryBuilder setServerId(String serverId) { + this.serverId = serverId; + return this; + } + + public GalleryBuilder setServerName(String serverName) { + this.serverName = serverName; + return this; + } + + public GalleryBuilder setChannelId(String channelId) { + this.channelId = channelId; + return this; + } + + public GalleryBuilder setTag(String tag) { + this.tag = tag; + return this; + } + + public GalleryBuilder setEmoji(String emoji) { + this.emoji = emoji; + return this; + } + + public GalleryChannel build() { + return new GalleryChannel(this); + } } } From 09f142b48dbecf183e1d60e94a699d6e233a2857 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 20:04:00 -0400 Subject: [PATCH 132/157] Remove unused import --- .../dev/salmonllama/fsbot/commands/general/ColorCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java index 4212b7f..110ea1f 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/ColorCommand.java @@ -5,7 +5,6 @@ package dev.salmonllama.fsbot.commands.general; -import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; From 0f1316aa30a51dda6d8ecd69672e32e9b592c299 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 20:12:54 -0400 Subject: [PATCH 133/157] Implement custom gallery emojis --- .../commands/developer/CreateGalleryCommand.java | 15 +++++++++++++-- .../dev/salmonllama/fsbot/config/BotConfig.java | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index 07c3732..dfd63b2 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -6,6 +6,8 @@ package dev.salmonllama.fsbot.commands.developer; import com.vdurmont.emoji.EmojiManager; +import com.vdurmont.emoji.EmojiParser; +import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.models.GalleryChannel; import dev.salmonllama.fsbot.guthix.Command; @@ -38,6 +40,8 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs ctx.reply("Args are incorrect"); return; } + + String[] args = ctx.getArgs(); // Check if the channel is already a registered gallery channel. // Create a gallery channel of the current channel. // Store the gallery channel in the database. @@ -48,12 +52,19 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs return; } - String tag = ctx.getArgs()[0]; + String tag = args[0]; + + String emoji; + if (args.length == 2) { + emoji = EmojiParser.parseToAliases(args[1]); + } else { + emoji = BotConfig.DEFAULT_REACTION; + } GalleryChannel.GalleryBuilder galleryBuilder = new GalleryChannel.GalleryBuilder(); galleryBuilder.setChannelId(channelId); galleryBuilder.setTag(tag); - galleryBuilder.setEmoji(":heartpulse:"); + galleryBuilder.setEmoji(emoji); ctx.getServer().ifPresent(server -> { galleryBuilder.setServerId(server.getIdAsString()); diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index adb9f95..ad2ea03 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -69,6 +69,9 @@ public class BotConfig { @ConfigurationOption public static String IMGUR_BEARER = "imgur bearer here"; + @ConfigurationOption + public static String DEFAULT_REACTION = ":heartpulse:"; + @ConfigurationOption public static String HOME_SERVER = "340511685024546816"; From d1dd1fe7581711326a331aef82a3aac5483f9fc4 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Thu, 23 Jul 2020 20:34:06 -0400 Subject: [PATCH 134/157] Added default command for fallback catching --- .../commands/developer/DefaultCommand.java | 29 +++++++++++++++++++ .../dev/salmonllama/fsbot/guthix/Guthix.java | 12 ++++---- 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java new file mode 100644 index 0000000..ad811a4 --- /dev/null +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/DefaultCommand.java @@ -0,0 +1,29 @@ +package dev.salmonllama.fsbot.commands.developer; + +import dev.salmonllama.fsbot.guthix.Command; +import dev.salmonllama.fsbot.guthix.CommandContext; +import dev.salmonllama.fsbot.guthix.CommandPermission; +import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.util.Collection; +import java.util.Collections; + +public class DefaultCommand extends Command { + @Override public String name() { return "Default"; } + @Override public String description() { return "The command that gets invoked when the prefix is used, but the command is not recognized"; } + @Override public String usage() { return "you don't use this command"; } + @Override public String category() { return "Invisible"; } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } + @Override public Collection aliases() { return Collections.singletonList("default"); } + + @Override + public void onCommand(CommandContext ctx) { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Oops!") + .setAuthor(ctx.getApi().getYourself()) + .setDescription("That's my prefix, but I don't know that command! Try using `~help` to see what I can do!"); + + ctx.reply(response); + } +} diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java index bda093b..e65f7ae 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/Guthix.java @@ -101,15 +101,15 @@ public class Guthix implements MessageCreateListener { RegistryCommand rComm = registry.getCommandInfo(content); String cmdString = rComm.getCommand().toLowerCase(); - if (registry.isCommandAlias(cmdString)) { - - } else { - return; - } +// if (registry.isCommandAlias(cmdString)) { +// +// } else { +// return; +// } String[] cmdArgs = rComm.getArgs(); - Command cmd = registry.findCommand(cmdString).orElse(null); // TODO: default command here + Command cmd = registry.findCommand(cmdString).orElse(new DefaultCommand()); // TODO: default command here CommandContext ctx = new CommandContext.CommandContextBuilder( event, From badb05202becc92b5e47ad11e0d0e2483506a1b9 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 27 Jul 2020 17:27:07 -0400 Subject: [PATCH 135/157] Moved WelcomeMessages to ServerConf --- .../dev/salmonllama/fsbot/database/FSDB.java | 1 - .../controllers/ServerConfigController.java | 20 +-- .../controllers/WelcomeMessageController.java | 130 ------------------ .../fsbot/database/models/ServerConfig.java | 55 +++++--- .../fsbot/database/models/WelcomeMessage.java | 79 ----------- 5 files changed, 49 insertions(+), 236 deletions(-) delete mode 100644 src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java delete mode 100644 src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java diff --git a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java index fa08ea6..c353589 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/FSDB.java +++ b/src/main/java/dev/salmonllama/fsbot/database/FSDB.java @@ -43,7 +43,6 @@ public class FSDB { get().query(ServerConfig.schema()); get().query(ServerBlacklist.schema()); get().query(UserBlacklist.schema()); - get().query(WelcomeMessage.schema()); get().query(StaticPermission.schema()); } catch (SQLException e) { e.printStackTrace(); diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java index e4a6dc1..47a8969 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java @@ -30,10 +30,10 @@ public class ServerConfigController { }); } - public static CompletableFuture> getServerConfig(String serverId) { + public static CompletableFuture> get(String serverId) { return CompletableFuture.supplyAsync(() -> { try { - return getServerConfigExec(serverId); + return getExec(serverId); } catch (SQLException e) { throw new CompletionException(e); } @@ -51,14 +51,14 @@ public class ServerConfigController { } private static void insertExec(ServerConfig config) throws SQLException { - FSDB.get().insert("INSERT INTO server_config('id', 'name', 'prefix') VALUES (?, ?, ?)", + FSDB.get().insert("INSERT INTO server_config(id, prefix, welcome_message) VALUES (?, ?, ?)", config.getId(), - config.getName(), - config.getPrefix() + config.getPrefix(), + config.getWelcomeMessage() ); } - private static Optional getServerConfigExec(String serverId) throws SQLException { + private static Optional getExec(String serverId) throws SQLException { ResultSet rs = FSDB.get().select("SELECT * FROM server_config WHERE id = ?"); if (rs.next()) { @@ -72,9 +72,10 @@ public class ServerConfigController { } private static void updateExec(ServerConfig config) throws SQLException { - FSDB.get().query("UPDATE server_config SET prefix = ?, name = ? WHERE id = ?", + FSDB.get().query("UPDATE server_config SET prefix = ?, welcome_message = ?, welcome_channel = ?, WHERE id = ?", config.getPrefix(), - config.getName(), + config.getWelcomeMessage(), + config.getWelcomeChannel(), config.getId() ); } @@ -82,8 +83,9 @@ public class ServerConfigController { private static ServerConfig mapObject(ResultSet rs) throws SQLException { return new ServerConfig.ServerConfigBuilder() .setId(rs.getString("id")) - .setName(rs.getString("name")) .setPrefix(rs.getString("prefix")) + .setWelcomeMessage(rs.getString("welcome_message")) + .setWelcomeChannel(rs.getString("welcome_channel")) .build(); } } diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java deleted file mode 100644 index 623fa5b..0000000 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/WelcomeMessageController.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.database.controllers; - -import dev.salmonllama.fsbot.database.FSDB; -import dev.salmonllama.fsbot.database.models.WelcomeMessage; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionException; - -public class WelcomeMessageController { - // Needs insert, update, and delete. Only one per server -> needs exists - public static CompletableFuture insert(WelcomeMessage msg) { - return CompletableFuture.runAsync(() -> { - try { - insertExec(msg); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - public static CompletableFuture> get(String id) { - return CompletableFuture.supplyAsync(() -> { - try { - return getExec(id); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - public static CompletableFuture update(WelcomeMessage msg) { - return CompletableFuture.runAsync(() -> { - try { - updateExec(msg); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - public static CompletableFuture exists(String id) { - return CompletableFuture.supplyAsync(() -> { - try { - return existsExec(id); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - public static CompletableFuture delete(String id) { - return CompletableFuture.runAsync(() -> { - try { - deleteExec(id); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - public static CompletableFuture delete(WelcomeMessage msg) { - return CompletableFuture.runAsync(() -> { - try { - deleteExec(msg.getServerId()); - } catch (SQLException e) { - throw new CompletionException(e); - } - }); - } - - private static void insertExec(WelcomeMessage msg) throws SQLException { - FSDB.get().insert("INSERT INTO welcome_messages (server_id, message, updated, editor) VALUES (?, ?, ?, ?)", - msg.getServerId(), - msg.getMessage(), - msg.getUpdated(), - msg.getEditor() - ); - } - - private static Optional getExec(String id) throws SQLException { - ResultSet rs = FSDB.get().select("SELECT * FROM welcome_messages WHERE server_id = ?", id); - - if (rs.next()) { - WelcomeMessage msg = mapObject(rs); - FSDB.get().close(rs); - return Optional.of(msg); - } - - FSDB.get().close(rs); - return Optional.empty(); - } - - private static void updateExec(WelcomeMessage msg) throws SQLException { - FSDB.get().query("UPDATE welcome_messages SET message = ?, updated = ?, editor = ? WHERE server_id = ?", - msg.getMessage(), - msg.getUpdated(), - msg.getEditor(), - msg.getServerId() - ); - } - - private static boolean existsExec(String id) throws SQLException { - ResultSet rs = FSDB.get().select("SELECT EXISTS(SELECT 1 FROM welcome_messages WHERE server_id = ?) AS hmm", id); - boolean exists = rs.getBoolean("hmm"); - - FSDB.get().close(rs); - return exists; - } - - private static void deleteExec(String id) throws SQLException { - FSDB.get().query("DELETE FROM welcome_messages WHERE server_id = ?", id); - } - - private static WelcomeMessage mapObject(ResultSet rs) throws SQLException { - return new WelcomeMessage.WelcomeMessageBuilder(rs.getString("server_id")) - .setMessage(rs.getString("message")) - .setUpdated(new Timestamp(rs.getLong("updated"))) - .setEditor(rs.getString("editor")) - .build(); - } -} diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java index 187cff8..da6bb70 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java @@ -3,58 +3,69 @@ package dev.salmonllama.fsbot.database.models; import dev.salmonllama.fsbot.database.DatabaseModel; public class ServerConfig extends DatabaseModel { - private String id; - private String name; - private String prefix; + private final String id; + private final String prefix; + private final String welcomeMessage; + private final String welcomeChannel; public ServerConfig(ServerConfigBuilder builder) { this.id = builder.id; - this.name = builder.name; this.prefix = builder.prefix; + this.welcomeMessage = builder.welcomeMessage; + this.welcomeChannel = builder.welcomeChannel; } public String getId() { return id; } - public String getName() { - return name; - } - public String getPrefix() { return prefix; } + public String getWelcomeMessage() { + return welcomeMessage; + } + + public String getWelcomeChannel() { + return welcomeChannel; + } + public static String schema() { return "CREATE TABLE IF NOT EXISTS server_config (" + "id TEXT PRIMARY KEY ," + - "name TEXT," + - "prefix TEXT)"; + "prefix TEXT," + + "welcome_message TEXT," + + "welcome_channel TEXT)"; } @Override public String toString() { - return String.format("Server Config: [id: %s, name: %s, prefix: %s]", - id, name, prefix + return String.format("Server Config: [id: %s, prefix: %s, welcome_message: %s, welcome_channel: %s]", + id, prefix, welcomeMessage, welcomeChannel ); } public static class ServerConfigBuilder { private String id; - private String name; private String prefix; + private String welcomeMessage; + private String welcomeChannel; public ServerConfigBuilder() { } - public ServerConfigBuilder setId(String id) { - this.id = id; + public ServerConfigBuilder from(ServerConfig config) { + this.id = config.id; + this.prefix = config.prefix; + this.welcomeMessage = config.welcomeMessage; + this.welcomeChannel = config.welcomeChannel; return this; } - public ServerConfigBuilder setName(String name) { - this.name = name; + public ServerConfigBuilder setId(String id) { + this.id = id; return this; } @@ -63,6 +74,16 @@ public class ServerConfig extends DatabaseModel { return this; } + public ServerConfigBuilder setWelcomeMessage(String welcomeMessage) { + this.welcomeMessage = welcomeMessage; + return this; + } + + public ServerConfigBuilder setWelcomeChannel(String welcomeChannel) { + this.welcomeChannel = welcomeChannel; + return this; + } + public ServerConfig build() { return new ServerConfig(this); } diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java b/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java deleted file mode 100644 index 218a904..0000000 --- a/src/main/java/dev/salmonllama/fsbot/database/models/WelcomeMessage.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2020. Aleksei Gryczewski - * All rights reserved. - */ - -package dev.salmonllama.fsbot.database.models; - -import dev.salmonllama.fsbot.database.DatabaseModel; - -import java.sql.Timestamp; - -public class WelcomeMessage extends DatabaseModel { - // Need the message, the last time it was updated, and the id of the last person who updated it. - private String serverId; - private String message; - private Timestamp updated; - private String editor; - - private WelcomeMessage(WelcomeMessageBuilder builder) { - serverId = builder.serverId; - message = builder.message; - updated = builder.updated; - editor = builder.editor; - } - - public String getServerId() { - return serverId; - } - - public String getMessage() { - return message; - } - - public Timestamp getUpdated() { - return updated; - } - - public String getEditor() { - return editor; - } - - public static String schema() { - return "CREATE TABLE IF NOT EXISTS welcome_messages (" + - "server_id TEXT PRIMARY KEY," + - "message TEXT," + - "updated TEXT," + - "editor TEXT)"; - } - - public static class WelcomeMessageBuilder { - private String serverId; - private String message = null; - private Timestamp updated = null; - private String editor = null; - - public WelcomeMessageBuilder(String serverId) { - this.serverId = serverId; - } - - public WelcomeMessageBuilder setMessage(String message) { - this.message = message; - return this; - } - - public WelcomeMessageBuilder setUpdated(Timestamp updated) { - this.updated = updated; - return this; - } - - public WelcomeMessageBuilder setEditor(String editor) { - this.editor = editor; - return this; - } - - public WelcomeMessage build() { - return new WelcomeMessage(this); - } - } -} From 9452bb5a96184c6305ae0eae1278e1ba9852cdb7 Mon Sep 17 00:00:00 2001 From: Aleksei Date: Mon, 27 Jul 2020 17:27:34 -0400 Subject: [PATCH 136/157] Wmsg command --- .../commands/staff/WelcomeMessageCommand.java | 78 +++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java index 62ee535..54333d5 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java @@ -6,16 +6,15 @@ package dev.salmonllama.fsbot.commands.staff; import dev.salmonllama.fsbot.config.BotConfig; +import dev.salmonllama.fsbot.database.controllers.ServerConfigController; +import dev.salmonllama.fsbot.database.models.ServerConfig; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.utilities.warnings.Warning; -import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.embed.Embed; import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.entity.server.Server; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -30,6 +29,75 @@ public class WelcomeMessageCommand extends Command { @Override public void onCommand(CommandContext ctx) { - ctx.reply("This command is a WIP and will be available soon."); + if (ctx.isPrivateMessage()) { + ctx.reply("This command can only be used within a server"); + return; + } + + if (ctx.getArgs().length < 1) { + ctx.reply("You need to supply arguments for this command"); + return; + } + + String[] args = ctx.getArgs(); + switch (args[0]) { + case "get": + get(ctx); + case "set": // TODO: check for args here + set(ctx, args[1]); + } + } + + private void get(CommandContext ctx) { + ServerConfigController.get(ctx.getServer().get().getIdAsString()).thenAcceptAsync(possibleConf -> { + possibleConf.ifPresentOrElse(conf -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Current Welcome Message") + .setDescription(conf.getWelcomeMessage()); + + ctx.reply(response); + }, () -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle("Does not exist!") + .setDescription("No welcome message was found! use `~wmsg set` to set one!"); + + ctx.reply(response); + }); + }); + } + + private void set(CommandContext ctx, String newMsg) { + ServerConfigController.get(ctx.getServer().get().getIdAsString()).thenAcceptAsync(possibleConf -> { + possibleConf.ifPresentOrElse(conf -> { + // Update the config + ServerConfig config = new ServerConfig.ServerConfigBuilder().from(conf) + .setWelcomeMessage(newMsg) + .build(); + + ServerConfigController.update(config); + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Welcome Message Set") + .addField("New Welcome Message:", config.getWelcomeMessage()); + + ctx.reply(response); + }, () -> { + // Create a config and set the welcome message + ServerConfig config = new ServerConfig.ServerConfigBuilder() + .setId(ctx.getServer().get().getIdAsString()) + .setPrefix(BotConfig.DEFAULT_PREFIX) + .setWelcomeMessage(newMsg) + .build(); + + ServerConfigController.insert(config); + + EmbedBuilder response = new EmbedBuilder() + .setTitle("Welcome Message Set!") + .setDescription("server conf has been created") + .addField("New Welcome Message:", newMsg); + + ctx.reply(response); + }); + }); } } From af3bcb5cd001597bd6ba2cc3ed71d3fbea068057 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 20:21:40 -0400 Subject: [PATCH 137/157] Made CommandPermissions static:owner --- .../fsbot/commands/developer/CreateGalleryCommand.java | 4 ++-- .../salmonllama/fsbot/commands/developer/InviteCommand.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index dfd63b2..f07fc9f 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -27,7 +27,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs @Override public String description() { return "Creates a channel gallery, tracking any posted images"; } @Override public String usage() { return "creategallery "; } @Override public String category() { return "Developer"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("creategallery", "addgallery", "newgallery")); } @Override @@ -81,7 +81,7 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs .addField("Tag:", tag) .addField("Emoji:", EmojiManager.getByUnicode(gallery.getEmoji()).toString()) .addField("End:", String.format("This channel is now being tracked under: %s", tag)); - ctx.getChannel().sendMessage(embed); + ctx.getChannel().sendMessage(embed); // TODO: Make this a reply } } diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java index 5bc4afc..487e8de 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/InviteCommand.java @@ -21,7 +21,7 @@ public class InviteCommand extends Command { @Override public String description() { return "Spits out a bot invite"; } @Override public String usage() { return "invite"; } @Override public String category() { return "Developer"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.OWNER); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "owner"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("invite", "inv")); } @Override From 35c370777ab8d4a7158907cde14af139450fbf06 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 20:21:50 -0400 Subject: [PATCH 138/157] Remove unused import --- .../salmonllama/fsbot/commands/developer/PermissionCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java index 36171ed..7b5a3f1 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -11,7 +11,6 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import dev.salmonllama.fsbot.logging.Logger; import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.user.User; import org.javacord.api.util.logging.ExceptionLogger; From 54674c25a02f782839682717b27b4b60f75799c3 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 20:22:04 -0400 Subject: [PATCH 139/157] Log outfit deletion --- .../fsbot/commands/staff/RemoveOutfitCommand.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index 21d151d..f056a1d 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -74,6 +74,15 @@ public class RemoveOutfitCommand extends Command { ctx.reply(response); // TODO: Log the action in FSBot-Log + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Marked as Deleted") + .setThumbnail(outfit.getLink()) + .addField("Deleted By:", ctx.getAuthor().getDiscriminatedName()); + + ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { + chnl.sendMessage(log); + }); + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { // Do nothing EmbedBuilder response = new EmbedBuilder() From b63bc80095e10bd4ceac5b6d6db65b7b83df6af1 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:55:51 -0400 Subject: [PATCH 140/157] Add outfit-log --- .../fsbot/commands/staff/RetagCommand.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java index 5ecc903..ac202d1 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java @@ -80,7 +80,17 @@ public class RetagCommand extends Command { msg.delete(); ctx.reply(embed); // TODO: Log the action in FSBot-log + + EmbedBuilder log = new EmbedBuilder() + .setTitle("Outfit Retagged") + .setThumbnail(outfit.getLink()) + .addField("New tag:", newTag); + + ctx.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresent(chnl -> { + chnl.sendMessage(log); + }); }); + } else if (event.getEmoji().equalsEmoji(EmojiParser.parseToUnicode(":octagonal_sign:"))) { // Do nothing msg.delete(); @@ -102,18 +112,5 @@ public class RetagCommand extends Command { ctx.reply(response); }); }); - -// try { -// Outfit outfit = this.db.getOutfitFromId(args[0]); -// -// channel.sendMessage(outfit.generateInfo().setTitle(String.format("Update tag to %s?", args[1]))).thenAcceptAsync(message -> { -// message.addReaction(EmojiParser.parseToUnicode(":white_check_mark:")); -// message.addReaction(EmojiParser.parseToUnicode(":octagonal_sign:")); -// message.addReactionAddListener(new ReactionRetagConfirmationListener(author, message, outfit, db, outfit.getTag(), args[1])); -// }); -// } -// catch (OutfitNotFoundException e) { -// channel.sendMessage(new DiscordError(e.getMessage()).get()); -// } } } From f5865793937e1565eafd6c8cfc41fd96d71d33fc Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:56:35 -0400 Subject: [PATCH 141/157] Remove hard-coded home server --- src/main/java/dev/salmonllama/fsbot/config/BotConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java index ad2ea03..6911530 100644 --- a/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/config/BotConfig.java @@ -73,7 +73,7 @@ public class BotConfig { public static String DEFAULT_REACTION = ":heartpulse:"; @ConfigurationOption - public static String HOME_SERVER = "340511685024546816"; + public static String HOME_SERVER = "Home server here"; public static void initConfig(String filePath, boolean cleanfile) { try { From 123771bf125a2037850992983d067b5b642a3002 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:57:42 -0400 Subject: [PATCH 142/157] Add emoji getter --- .../database/controllers/GalleryController.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index e4dad23..0d346d5 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -55,7 +55,17 @@ public class GalleryController { } }); } - // TODO: Refactor for proper Java-ing, add GalleryBuilder + + public static CompletableFuture getEmoji(String channelId) { + return CompletableFuture.supplyAsync(() -> { + try { + return getEmojiExec(channelId); + } catch (SQLException e) { + throw new CompletionException(e); + } + }); + } + private static void insertExec(GalleryChannel gallery) throws SQLException { FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'tag', 'emoji')" + "VALUES(?, ?, ?, ?, ?)", @@ -96,6 +106,7 @@ public class GalleryController { } private static String getEmojiExec(String channelId) throws SQLException { + // Does not need to be an optional. CreateGalleryCommand populates it automatically with the default. ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE channel_id = ?"); String emoji = rs.getString("emoji"); From e8cbe785879f1dee6438a12a215eafffb44c2a44 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:57:58 -0400 Subject: [PATCH 143/157] Fixed update query args --- .../fsbot/database/controllers/OutfitController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java index 10adc13..b9e4d21 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/OutfitController.java @@ -358,8 +358,10 @@ public class OutfitController { outfit.getSubmitter(), outfit.getTag(), outfit.getMeta(), + outfit.getUpdated(), outfit.isFeatured(), - outfit.getDisplayCount()); + outfit.getDisplayCount(), + outfit.getId()); } private static void deleteExec(String id) throws SQLException { From b90d981d69e5160e12ab96c0ff52d851b63e49d3 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:58:15 -0400 Subject: [PATCH 144/157] Fixed config get args --- .../fsbot/database/controllers/ServerConfigController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java index 47a8969..c88a155 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/ServerConfigController.java @@ -59,7 +59,7 @@ public class ServerConfigController { } private static Optional getExec(String serverId) throws SQLException { - ResultSet rs = FSDB.get().select("SELECT * FROM server_config WHERE id = ?"); + ResultSet rs = FSDB.get().select("SELECT * FROM server_config WHERE id = ?", serverId); if (rs.next()) { ServerConfig config = mapObject(rs); From 2928069b1fec6c3b92c8783782387be4f0fa4c77 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:58:32 -0400 Subject: [PATCH 145/157] Fix doubly statemented query --- .../java/dev/salmonllama/fsbot/database/DatabaseProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java index e514bc8..d898bac 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java +++ b/src/main/java/dev/salmonllama/fsbot/database/DatabaseProvider.java @@ -74,7 +74,7 @@ public class DatabaseProvider { public int query(String sql, Object... params) throws SQLException { try (PreparedStatement stmt = getConnection().prepareStatement(sql)) { resolveParameters(stmt, params); - return stmt.executeUpdate(sql); + return stmt.executeUpdate(); } } From f3324131642805aebae8e1085430f1222095e91d Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:58:44 -0400 Subject: [PATCH 146/157] Remove primary key from config --- .../dev/salmonllama/fsbot/database/models/ServerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java index da6bb70..0230cd3 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/ServerConfig.java @@ -33,7 +33,7 @@ public class ServerConfig extends DatabaseModel { public static String schema() { return "CREATE TABLE IF NOT EXISTS server_config (" + - "id TEXT PRIMARY KEY ," + + "id TEXT," + "prefix TEXT," + "welcome_message TEXT," + "welcome_channel TEXT)"; From ac37c6b5e1202d44b8606f423f5247e4a9202141 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 21:59:08 -0400 Subject: [PATCH 147/157] Add emoji implementation to ImageListener --- .../salmonllama/fsbot/listeners/ImageListener.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 1e9a579..cb8154f 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -5,6 +5,7 @@ package dev.salmonllama.fsbot.listeners; +import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.controllers.OutfitController; @@ -72,10 +73,18 @@ public class ImageListener implements MessageCreateListener { .setThumbnail(outfit.getLink()) .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) .setUrl(outfit.getLink()) - .addField("Uploaded:", outfit.getCreated().toString()) - .addField("Meta:", outfit.getMeta()); + .addField("Uploaded:", outfit.getCreated().toString()); + + if (outfit.getMeta() != null) { + response.addField("Meta:", outfit.getMeta()); + } chnl.sendMessage(response); + + // Add the reaction to the original message + GalleryController.getEmoji(channel.getIdAsString()).thenAcceptAsync(emoji -> { + event.getMessage().addReaction(EmojiParser.parseToUnicode(emoji)); + }); }, () -> { // Fallback error message to me event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync(user -> { From e46bc1c7879ce08cbddd0068219369bf4bbb73f0 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:00:15 -0400 Subject: [PATCH 148/157] Made StaticHandler block temporarily --- .../fsbot/guthix/PermissionManager.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java index de7aad2..039f33d 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java @@ -5,7 +5,6 @@ package dev.salmonllama.fsbot.guthix; -import java.util.Collection; import java.util.concurrent.atomic.AtomicBoolean; import org.javacord.api.entity.message.MessageAuthor; @@ -58,18 +57,21 @@ public class PermissionManager { } private boolean staticHandler(String staticPerm, CommandContext ctx) { + System.out.println(staticPerm); AtomicBoolean ret = new AtomicBoolean(false); StaticPermissionController.getByUser(ctx.getAuthor().getIdAsString()).thenAccept(possiblePerms -> { - possiblePerms.ifPresent( - staticPermissions -> ret.set( - staticPermissions.stream() - .map(StaticPermission::getPermission) - .anyMatch(staticPerm::equals) - ) - ); - }); + possiblePerms.ifPresent(staticPermissions -> { + for (StaticPermission perm : staticPermissions) { + if (perm.getPermission().equals(staticPerm)) { + ret.set(true); + } + } + staticPermissions.forEach(System.out::println); + }); + }).join(); // TODO: Figure out a way to have this not join + System.out.println(ret.get()); return ret.get(); } From 995a3738dffcc8145271f93ff335d56ccbf1fc14 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:40:42 -0400 Subject: [PATCH 149/157] Move outfit logging inside the insertion future --- .../developer/CreateGalleryCommand.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java index f07fc9f..5838bc6 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/CreateGalleryCommand.java @@ -68,20 +68,19 @@ public class CreateGalleryCommand extends Command { // TODO: This command needs ctx.getServer().ifPresent(server -> { galleryBuilder.setServerId(server.getIdAsString()); - galleryBuilder.setServerName(server.getName()); }); GalleryChannel gallery = galleryBuilder.build(); - GalleryController.insert(gallery).exceptionally(ExceptionLogger.get()); // TODO: Make a discord exception logger for the thingos - - EmbedBuilder embed = new EmbedBuilder() - .setColor(Color.GREEN) - .addField("Success", "Gallery has been created:") - .addField("Channel Id:", gallery.getChannelId()) - .addField("Tag:", tag) - .addField("Emoji:", EmojiManager.getByUnicode(gallery.getEmoji()).toString()) - .addField("End:", String.format("This channel is now being tracked under: %s", tag)); - ctx.getChannel().sendMessage(embed); // TODO: Make this a reply + GalleryController.insert(gallery).thenAcceptAsync((Void) -> { + EmbedBuilder embed = new EmbedBuilder() + .setColor(Color.GREEN) + .addField("Success", "Gallery has been created:") + .addField("Channel Id:", gallery.getChannelId()) + .addField("Tag:", tag) + .addField("Emoji:", EmojiParser.parseToUnicode(gallery.getEmoji())) + .addField("End:", String.format("This channel is now being tracked under: %s", tag)); + ctx.reply(embed); + }); } } From b6f9f4f1445b1be01fad4ef1a48e27839678bfce Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:41:02 -0400 Subject: [PATCH 150/157] Remove Debug messages --- .../fsbot/commands/developer/PermissionCommand.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java index 7b5a3f1..676c7d6 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/developer/PermissionCommand.java @@ -99,7 +99,6 @@ public class PermissionCommand extends Command { } private void add(CommandContext ctx) { - System.out.println("Add run"); if (ctx.getMessage().getMentionedUsers().isEmpty()) { System.out.println("No mentioned users"); // If no mentioned users, improper usage @@ -107,12 +106,10 @@ public class PermissionCommand extends Command { } String userId = ctx.getMessage().getMentionedUsers().get(0).getIdAsString(); - System.out.println(String.format("Got mentioned user %s", userId)); StaticPermission perm = new StaticPermission.StaticPermissionBuilder(userId).setPermission(ctx.getArgs()[2]).build(); StaticPermissionController.insert(perm).thenAcceptAsync((Void) -> { - System.out.println("Permission added"); EmbedBuilder response = new EmbedBuilder() .setTitle("Permissions Added") .addField("User:", userId) From 468d6b74ddac4aa12638d52c04116aa37f9cfbc1 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:41:29 -0400 Subject: [PATCH 151/157] Fix prepared statements without values --- .../fsbot/database/controllers/GalleryController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java index 0d346d5..943a066 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java +++ b/src/main/java/dev/salmonllama/fsbot/database/controllers/GalleryController.java @@ -67,11 +67,10 @@ public class GalleryController { } private static void insertExec(GalleryChannel gallery) throws SQLException { - FSDB.get().insert("INSERT INTO galleries('server_id', 'server_name', 'channel_id', 'tag', 'emoji')" + - "VALUES(?, ?, ?, ?, ?)", + FSDB.get().insert("INSERT INTO galleries(server_id, channel_id, tag, emoji)" + + "VALUES(?, ?, ?, ?)", gallery.getServerId(), gallery.getChannelId(), - gallery.getChannelId(), gallery.getTag(), gallery.getEmoji() ); @@ -107,7 +106,7 @@ public class GalleryController { private static String getEmojiExec(String channelId) throws SQLException { // Does not need to be an optional. CreateGalleryCommand populates it automatically with the default. - ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE channel_id = ?"); + ResultSet rs = FSDB.get().select("SELECT * FROM galleries WHERE channel_id = ?", channelId); String emoji = rs.getString("emoji"); FSDB.get().close(rs); @@ -117,7 +116,6 @@ public class GalleryController { private static GalleryChannel mapObject(ResultSet rs) throws SQLException { // TODO: Builder this return new GalleryChannel.GalleryBuilder() .setServerId(rs.getString("server_id")) - .setServerName(rs.getString("server_name")) .setChannelId(rs.getString("channel_id")) .setTag(rs.getString("tag")) .setEmoji(rs.getString("emoji")) From 7c8f9acca5303f5951cee68fcde2827465b2348a Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:41:42 -0400 Subject: [PATCH 152/157] Remove serverName field --- .../fsbot/database/models/GalleryChannel.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java index c771776..5ae2d2d 100644 --- a/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java +++ b/src/main/java/dev/salmonllama/fsbot/database/models/GalleryChannel.java @@ -9,7 +9,6 @@ import dev.salmonllama.fsbot.database.DatabaseModel; public class GalleryChannel extends DatabaseModel { private final String serverId; - private final String serverName; private final String channelId; private final String tag; // Normal emojis will be stored in plain text as :emoji: @@ -19,7 +18,6 @@ public class GalleryChannel extends DatabaseModel { public GalleryChannel(GalleryBuilder builder) { serverId = builder.serverId; - serverName = builder.serverName; channelId = builder.channelId; tag = builder.tag; emoji = builder.emoji; @@ -29,10 +27,6 @@ public class GalleryChannel extends DatabaseModel { return serverId; } - public String getServerName() { - return serverName; - } - public String getChannelId() { return channelId; } @@ -49,7 +43,6 @@ public class GalleryChannel extends DatabaseModel { public static String schema() { return "CREATE TABLE IF NOT EXISTS galleries (" + "server_id TEXT," + - "server_name TEXT," + "channel_id TEXT," + "emoji TEXT," + "tag TEXT)"; @@ -57,13 +50,12 @@ public class GalleryChannel extends DatabaseModel { @Override public String toString() { - return String.format("Gallery: [server id: %s, server name: %s, channel id: %s, tag: %s, emoji: %s]", - serverId, serverName, channelId, tag, emoji); + return String.format("Gallery: [server id: %s, channel id: %s, tag: %s, emoji: %s]", + serverId, channelId, tag, emoji); } public static class GalleryBuilder { private String serverId; - private String serverName; private String channelId; private String tag; private String emoji; @@ -76,11 +68,6 @@ public class GalleryChannel extends DatabaseModel { return this; } - public GalleryBuilder setServerName(String serverName) { - this.serverName = serverName; - return this; - } - public GalleryBuilder setChannelId(String channelId) { this.channelId = channelId; return this; From a72a49be022a8255f35f961e31dc01cb01866a2a Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:41:50 -0400 Subject: [PATCH 153/157] Remove debug messages --- .../java/dev/salmonllama/fsbot/guthix/PermissionManager.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java index 039f33d..fb2bc9e 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java @@ -57,7 +57,6 @@ public class PermissionManager { } private boolean staticHandler(String staticPerm, CommandContext ctx) { - System.out.println(staticPerm); AtomicBoolean ret = new AtomicBoolean(false); StaticPermissionController.getByUser(ctx.getAuthor().getIdAsString()).thenAccept(possiblePerms -> { @@ -67,11 +66,9 @@ public class PermissionManager { ret.set(true); } } - staticPermissions.forEach(System.out::println); }); }).join(); // TODO: Figure out a way to have this not join - System.out.println(ret.get()); return ret.get(); } From 114630ead5d2956b6283b8024c422108a2ea50b4 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 22:42:21 -0400 Subject: [PATCH 154/157] Fix logging on missing meta --- .../java/dev/salmonllama/fsbot/listeners/ImageListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index cb8154f..5a82e6c 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -75,7 +75,7 @@ public class ImageListener implements MessageCreateListener { .setUrl(outfit.getLink()) .addField("Uploaded:", outfit.getCreated().toString()); - if (outfit.getMeta() != null) { + if (!outfit.getMeta().equals("")) { response.addField("Meta:", outfit.getMeta()); } @@ -84,7 +84,7 @@ public class ImageListener implements MessageCreateListener { // Add the reaction to the original message GalleryController.getEmoji(channel.getIdAsString()).thenAcceptAsync(emoji -> { event.getMessage().addReaction(EmojiParser.parseToUnicode(emoji)); - }); + }).exceptionally(ExceptionLogger.get()); }, () -> { // Fallback error message to me event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync(user -> { From 3a1fbd57fcba9e0bcefabd2570efb29b9ddb0a4d Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 23:04:37 -0400 Subject: [PATCH 155/157] Fix outfit sending --- .../fsbot/commands/general/OutfitCommand.java | 127 +++++++++++++++--- 1 file changed, 110 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java index c436cf8..4540ecd 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/general/OutfitCommand.java @@ -6,15 +6,19 @@ package dev.salmonllama.fsbot.commands.general; import dev.salmonllama.fsbot.database.controllers.OutfitController; +import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; +import org.javacord.api.entity.message.Message; +import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.util.logging.ExceptionLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.concurrent.CompletableFuture; public class OutfitCommand extends Command { private final int MAX_OUTFITS = 5; @@ -36,7 +40,7 @@ public class OutfitCommand extends Command { String[] args = ctx.getArgs(); OutfitController.getDistinctTags().thenAccept(tags -> { - if (tags.contains(command)) { // TODO: Hey uh, test casing + if (tags.contains(command)) { // args parsing and command logic with tag as caller handleTagCommand(command, args, ctx); } else if (NON_TAG_ALIASES.contains(command)) { @@ -50,17 +54,45 @@ public class OutfitCommand extends Command { switch (args.length) { case 0: // Send one single random outfit of the given tag - OutfitController.findRandomByTag(command).thenAccept(outfit -> { - ctx.reply(outfit.toString()); - }).exceptionally(ExceptionLogger.get()); // TODO: Exception logging + OutfitController.findRandomByTag(command).thenAccept(possibleOutfit -> { // TODO: Add an orElse case + possibleOutfit.ifPresent(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); + }).exceptionally(ExceptionLogger.get()); case 1: // Send the given number of outfits, not to exceed 5 for ratelimit reasons if (isNumeric(args[0])) { int num = Math.min(Integer.parseInt(args[0]), MAX_OUTFITS); - OutfitController.findRandomByTag(command, num).thenAccept(outfitsOpt -> { - outfitsOpt.ifPresent(outfits -> { - outfits.forEach(outfit -> ctx.reply(outfit.toString())); + OutfitController.findRandomByTag(command, num).thenAccept(possibleOutfits -> { + possibleOutfits.ifPresent(outfits -> { + outfits.forEach(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); }); }); } else { @@ -73,24 +105,66 @@ public class OutfitCommand extends Command { switch (args.length) { case 0: // Send one truly random outfit - OutfitController.findRandom().thenAccept(outfit -> { - ctx.reply(outfit.toString()); + OutfitController.findRandom().thenAccept(possibleOutfit -> { + possibleOutfit.ifPresent(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); }); case 1: // Send the given number of outfits, not to exceed 5 for ratelimit reasons if (isNumeric(args[0])) { int num = Math.min(Integer.parseInt(args[0]), MAX_OUTFITS); - OutfitController.findRandom(num).thenAccept(outfitsOpt -> { - outfitsOpt.ifPresent(outfits -> { - outfits.forEach(outfit -> ctx.reply(outfit.toString())); + OutfitController.findRandom(num).thenAccept(possibleOutfits -> { + possibleOutfits.ifPresent(outfits -> { + outfits.forEach(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); }); }); } else { // First arg is not a number, send an outfit of the given tag String tag = args[0]; - OutfitController.findRandomByTag(tag).thenAccept(outfitOpt -> { - outfitOpt.ifPresent(outfit -> ctx.reply(outfit.toString())); + OutfitController.findRandomByTag(tag).thenAccept(possibleOutfit -> { + possibleOutfit.ifPresent(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); }); } case 2: @@ -98,9 +172,23 @@ public class OutfitCommand extends Command { if (isNumeric(args[1])) { int num = Math.min(Integer.parseInt(args[1]), MAX_OUTFITS); - OutfitController.findRandomByTag(args[0], num).thenAccept(outfitsOpt -> { - outfitsOpt.ifPresent(outfits -> { - outfits.forEach(outfit -> ctx.reply(outfit.toString())); + OutfitController.findRandomByTag(args[0], num).thenAccept(possibleOutfits -> { + possibleOutfits.ifPresent(outfits -> { + outfits.forEach(outfit -> { + ctx.getApi().getUserById(outfit.getSubmitter()).thenAcceptAsync(user -> { + EmbedBuilder response = new EmbedBuilder() + .setTitle(user.getDiscriminatedName()) + .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) + .setImage(outfit.getLink()) + .setUrl(outfit.getLink()); + + if (!outfit.getMeta().equals("")) { + response.setDescription(outfit.getMeta()); + } + + ctx.reply(response); + }); + }); }); }); } @@ -125,4 +213,9 @@ public class OutfitCommand extends Command { } return true; } + + private CompletableFuture sendOutfit(Outfit outfit) { + // TODO: Replace sending with this + return null; + } } From 948204ac49e67782711b460b5f0b666c304981af Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 23:13:15 -0400 Subject: [PATCH 156/157] Change staff commands' permission to static:staff --- .../dev/salmonllama/fsbot/commands/staff/AddColorCommand.java | 2 +- .../dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java | 2 +- .../salmonllama/fsbot/commands/staff/OutfitInfoCommand.java | 2 +- .../dev/salmonllama/fsbot/commands/staff/RetagCommand.java | 2 +- .../dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java | 2 +- .../fsbot/commands/staff/WelcomeMessageCommand.java | 3 +-- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java index aa274d6..0e7536f 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/AddColorCommand.java @@ -20,7 +20,7 @@ public class AddColorCommand extends Command { @Override public String description() { return "adds the provided role to the toggleable cosmetic roles."; } @Override public String usage() { return "addcolor "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("addcolor", "addcolour", "addclr")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java index 8e0ee51..0354f51 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetOutfitCommand.java @@ -21,7 +21,7 @@ public class GetOutfitCommand extends Command { // TODO: This command also needs @Override public String description() { return "Shows the outfit, given an ID"; } @Override public String usage() { return "getoutfit "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("getoutfit", "get")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java index ad58b0a..607d36c 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/OutfitInfoCommand.java @@ -22,7 +22,7 @@ public class OutfitInfoCommand extends Command { @Override public String description() { return "Shows all related info about the outfit"; } @Override public String usage() { return "outfitinfo "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("outfitinfo", "oinfo")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java index ac202d1..11a72ff 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RetagCommand.java @@ -27,7 +27,7 @@ public class RetagCommand extends Command { @Override public String description() { return "Changes the tag of the given outfit"; } @Override public String usage() { return "retag "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("retag")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java index 8ab296c..785371a 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/SetStatusCommand.java @@ -23,7 +23,7 @@ public class SetStatusCommand extends Command { @Override public String description() { return "Updates the bot's current status"; } @Override public String usage() { return "updatestatus "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("setstatus", "status")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java index 54333d5..0c2904d 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/WelcomeMessageCommand.java @@ -12,7 +12,6 @@ import dev.salmonllama.fsbot.guthix.Command; import dev.salmonllama.fsbot.guthix.CommandContext; import dev.salmonllama.fsbot.guthix.CommandPermission; import dev.salmonllama.fsbot.guthix.PermissionType; -import org.javacord.api.entity.message.embed.Embed; import org.javacord.api.entity.message.embed.EmbedBuilder; import java.util.ArrayList; @@ -24,7 +23,7 @@ public class WelcomeMessageCommand extends Command { @Override public String description() { return "View or update the server welcome message. Options: get|set|getchannel|setchannel."; } @Override public String usage() { return "welcomemessage [String newMessage]"; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("welcomemessage", "wmsg")); } @Override From f7905047e24a6049bdf61e729e48b4a7215bc878 Mon Sep 17 00:00:00 2001 From: Salmonllama Date: Mon, 27 Jul 2020 23:13:28 -0400 Subject: [PATCH 157/157] Change staff commands' permission to static:staff --- .../java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java | 2 +- .../dev/salmonllama/fsbot/commands/staff/GetServersCommand.java | 2 +- .../salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java index 0ee01d5..a2dee70 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/EchoCommand.java @@ -20,7 +20,7 @@ public class EchoCommand extends Command { @Override public String description() { return "Echos your message. Typical bash"; } @Override public String usage() { return "echo "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Collections.singletonList("echo")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java index 938f2a9..54be113 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/GetServersCommand.java @@ -24,7 +24,7 @@ public class GetServersCommand extends Command { @Override public String description() { return "Lists all the servers the bot is in"; } @Override public String usage() { return "getservers"; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("getservers", "servers")); } @Override diff --git a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java index f056a1d..0508bad 100644 --- a/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java +++ b/src/main/java/dev/salmonllama/fsbot/commands/staff/RemoveOutfitCommand.java @@ -24,7 +24,7 @@ public class RemoveOutfitCommand extends Command { @Override public String description() { return "Removes an outfit from the database given an id"; } @Override public String usage() { return "remove "; } @Override public String category() { return "Staff"; } - @Override public CommandPermission permission() { return new CommandPermission(PermissionType.ROLE, BotConfig.STAFF_ROLE); } + @Override public CommandPermission permission() { return new CommandPermission(PermissionType.STATIC, "staff"); } @Override public Collection aliases() { return new ArrayList<>(Arrays.asList("removeoutfit", "remove")); } @Override