diff --git a/src/pkg/deepCurse/nopalmo/command/GuildCommand.java b/src/pkg/deepCurse/nopalmo/command/GuildCommand.java index b163baf..81ec544 100644 --- a/src/pkg/deepCurse/nopalmo/command/GuildCommand.java +++ b/src/pkg/deepCurse/nopalmo/command/GuildCommand.java @@ -1,14 +1,13 @@ package pkg.deepCurse.nopalmo.command; -import java.util.List; - import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import pkg.deepCurse.nopalmo.manager.CommandBlob; import pkg.deepCurse.nopalmo.manager.GuildCommandManager; public abstract class GuildCommand { - public abstract void run(List args, GuildMessageReceivedEvent guildMessage, GuildCommandManager commandManager) throws Exception; + public abstract void run(CommandBlob blob, GuildMessageReceivedEvent guildMessage, GuildCommandManager commandManager) throws Exception; public abstract String[] getCommandCalls(); diff --git a/src/pkg/deepCurse/nopalmo/command/guildCommand/Ping.java b/src/pkg/deepCurse/nopalmo/command/guildCommand/Ping.java index f59a26a..79c0b80 100644 --- a/src/pkg/deepCurse/nopalmo/command/guildCommand/Ping.java +++ b/src/pkg/deepCurse/nopalmo/command/guildCommand/Ping.java @@ -1,19 +1,18 @@ package pkg.deepCurse.nopalmo.command.guildCommand; -import java.util.List; - import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import pkg.deepCurse.nopalmo.command.GuildCommand; import pkg.deepCurse.nopalmo.database.DatabaseTools; +import pkg.deepCurse.nopalmo.manager.CommandBlob; import pkg.deepCurse.nopalmo.manager.GuildCommandManager; public class Ping extends GuildCommand { @Override - public void run(List args, GuildMessageReceivedEvent guildMessage, GuildCommandManager commandManager) + public void run(CommandBlob blob, GuildMessageReceivedEvent guildMessage, GuildCommandManager commandManager) throws Exception { - DatabaseTools.Tools.Guild.Prefix.createPrefix(guildMessage.getGuild().getIdLong(), args.get(0)); + DatabaseTools.Tools.Guild.Prefix.createPrefix(guildMessage.getGuild().getIdLong(), blob.getArgs().get(0)); } diff --git a/src/pkg/deepCurse/nopalmo/core/Boot.java b/src/pkg/deepCurse/nopalmo/core/Boot.java index 634cea1..293580e 100644 --- a/src/pkg/deepCurse/nopalmo/core/Boot.java +++ b/src/pkg/deepCurse/nopalmo/core/Boot.java @@ -1,5 +1,7 @@ package pkg.deepCurse.nopalmo.core; +import java.sql.SQLException; + import javax.security.auth.login.LoginException; import net.dv8tion.jda.api.JDA; @@ -8,18 +10,43 @@ import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.utils.ChunkingFilter; import net.dv8tion.jda.api.utils.MemberCachePolicy; +import pkg.deepCurse.nopalmo.database.DatabaseTools; +import pkg.deepCurse.nopalmo.global.Reactions; import pkg.deepCurse.nopalmo.listener.GuildMessageReceivedListener; +import pkg.deepCurse.nopalmo.manager.GuildCommandManager; import pkg.deepCurse.simpleLoggingGarbage.core.Log; public class Boot { public static JDA bot; + public static DatabaseTools databaseTools = null; + public static GuildCommandManager guildCommandManager = new GuildCommandManager(); // move to master manager + public static boolean isProd = false; public static void main(String[] args) { Log.boot("Booting. . ."); long preBootTime = System.currentTimeMillis(); - + + isProd = args[2].contentEquals("prod"); + + Log.boot("Connecting to mariadb:nopalmo"); + try { + databaseTools = new DatabaseTools(args[1]); + Log.boot("Connected. . ."); + } catch (SQLException e1) { + e1.printStackTrace(); + Log.boot("Failed to connect. . .\nShutting down. . ."); + System.exit(4); + } + + Log.boot("Init reaction/emote list"); + Reactions.init(); + Log.boot("Initialized reaction/emote list. . ."); + Log.boot("Init commands list"); + guildCommandManager.init(); + Log.boot("Initialized commands list. . ."); + try { bot = JDABuilder.createDefault(args[0]).setChunkingFilter(ChunkingFilter.NONE) .setMemberCachePolicy(MemberCachePolicy.NONE).enableIntents(GatewayIntent.GUILD_MEMBERS) @@ -32,7 +59,8 @@ public class Boot { } long bootTime = System.currentTimeMillis() - preBootTime; - + + System.out.println("Taken "+bootTime+"ms to boot"); + } - } diff --git a/src/pkg/deepCurse/nopalmo/database/DatabaseTools.java b/src/pkg/deepCurse/nopalmo/database/DatabaseTools.java index 7173180..3dd18f3 100644 --- a/src/pkg/deepCurse/nopalmo/database/DatabaseTools.java +++ b/src/pkg/deepCurse/nopalmo/database/DatabaseTools.java @@ -11,20 +11,26 @@ import javax.annotation.Nonnull; import org.jetbrains.annotations.Nullable; +import pkg.deepCurse.nopalmo.core.Boot; +import pkg.deepCurse.nopalmo.database.DatabaseTools.Tools.Global; import pkg.deepCurse.simpleLoggingGarbage.core.Log; public class DatabaseTools { - private static Connection connection; + private static Connection connection = null; - public DatabaseTools(String password) { + public DatabaseTools(String password) throws SQLException { connection = createConnection(password); + Global.updatePrefix(); } - public static Connection createConnection(String password) { + public static Connection createConnection(String password) throws SQLException { + + String dbName = Boot.isProd ? "nopalmo" : "chaos"; + String driver = "com.mysql.cj.jdbc.Driver"; - String url = "jdbc:mysql://localhost/nopalmo"; - String username = "u1d"; + String url = "jdbc:mysql://localhost/" + dbName; + String username = "nopalmo"; try { Class.forName(driver); } catch (ClassNotFoundException e) { @@ -35,14 +41,17 @@ public class DatabaseTools { return DriverManager.getConnection(url, username, password); } catch (SQLException e) { sqlTranslate("Generate connection", e); + throw new SQLException(e); } - return null; } private static void sqlTranslate(String action, int errorCode) { switch (errorCode) { case 1062: - System.err.println("Failed to execute; errorCode=1062; Duplicate ID; On action " + action); + System.err.println("Failed to execute; errorCode=" + errorCode + "; ER_DUP_ENTRY; On action " + action); + break; + case 1054: + System.err.println("Failed to execute; errorCode=" + errorCode + "; ER_BAD_FIELD_ERROR; On action " + action); break; default: System.err.println("Failed to execute; errorCode=" + errorCode + "; Unknown code; On action " + action); @@ -78,6 +87,8 @@ public class DatabaseTools { public class Tools { + // these sub classes will represent tables and the methods therein will be for actions within said table + public class Guild { public class Prefix { @@ -96,32 +107,19 @@ public class DatabaseTools { // throw new SQLException(null, null, 33); // we need a real catcher here System.err.println( "Failed to execute; errorCode=NO_ROW_FOUND; No row found; On action " + query); - return null; + return createPrefix(guildID, Global.prefix); } - } catch (SQLException e) { sqlTranslate(query, e.getErrorCode()); - // System.out.println("eeeeee"); return null; - } finally { - try { - if (rs != null) - rs.close(); - } catch (Exception e) { - } - - try { - if (st != null) - st.close(); - } catch (Exception e) { - } - - // try { if (conn != null) conn.close(); } catch (Exception e) {}; + } finally { // @formatter:off + try {if (rs != null)rs.close();} catch (Exception e) {} + try {if (st != null)st.close();} catch (Exception e) {} + // @formatter:on } - // return null; } - public static void createPrefix(@Nonnull long guildID, @Nullable String prefix) + public static String createPrefix(@Nonnull long guildID, @Nullable String prefix) throws IllegalArgumentException { if (prefix == null || prefix.isEmpty()) { @@ -142,27 +140,25 @@ public class DatabaseTools { int[] updateCounts = pstmt.executeBatch(); checkUpdateCounts(pstmt, updateCounts); pstmt.close(); - connection.commit(); + // connection.commit(); + return prefix; } catch (SQLException e) { sqlTranslate(pstmt, e); - for (int i : new int[] { 1062 }) { if (i == e.getErrorCode()) { - setPrefix(connection, guildID, prefix); - break; + return setPrefix(connection, guildID, prefix); } } - try { connection.rollback(); } catch (Exception e2) { e.printStackTrace(); } - + return null; } } - public static void setPrefix(Connection conn, long guildID, String prefix) + public static String setPrefix(Connection conn, long guildID, String prefix) throws IllegalArgumentException { if (prefix.isEmpty()) { @@ -183,6 +179,7 @@ public class DatabaseTools { checkUpdateCounts(pstmt, updateCounts); pstmt.close(); conn.commit(); + return prefix; } catch (SQLException e) { sqlTranslate(pstmt, e); try { @@ -190,7 +187,7 @@ public class DatabaseTools { } catch (Exception e2) { e.printStackTrace(); } - + return null; } } } @@ -239,27 +236,30 @@ public class DatabaseTools { } public class Global { + + public static String prefix = null; - public static String getPrefix() { + public static void updatePrefix() throws SQLException { Statement st = null; ResultSet rs = null; String query = "select * from global where id = 'prefix'"; + String msg = "Failed to execute; errorCode=NO_ROW_FOUND; No row found; On action " + query; try { st = connection.createStatement(); rs = st.executeQuery(query); if (rs.next()) { - return rs.getString("val"); + prefix = rs.getString("value"); } else { // throw new SQLException(null, null, 33); // we need a real catcher here - System.err - .println("Failed to execute; errorCode=NO_ROW_FOUND; No row found; On action " + query); - return null; + + System.err.println(msg); + throw new NullPointerException(msg); } } catch (SQLException e) { sqlTranslate(query, e.getErrorCode()); // System.out.println("eeeeee"); - return null; + throw new SQLException(e); } finally { try { if (rs != null) @@ -277,6 +277,7 @@ public class DatabaseTools { } // return null; } + } // public class Reaction { // started off as a good idea but it sucks diff --git a/src/pkg/deepCurse/nopalmo/global/Reactions.java b/src/pkg/deepCurse/nopalmo/global/Reactions.java index 857359b..002a4aa 100644 --- a/src/pkg/deepCurse/nopalmo/global/Reactions.java +++ b/src/pkg/deepCurse/nopalmo/global/Reactions.java @@ -7,7 +7,11 @@ public class Reactions { private static HashMap reactionMap = new HashMap(); public static void init() { - reactionMap.put("galaxyThumb", 801657838358495232L); + insert("galaxyThumb", 801657838358495232L); + } + + public static void insert(String input, long id) { + reactionMap.put(input, id); } public static String getReaction(String id) { diff --git a/src/pkg/deepCurse/nopalmo/global/Tools.java b/src/pkg/deepCurse/nopalmo/global/Tools.java index 977cce7..68ec254 100644 --- a/src/pkg/deepCurse/nopalmo/global/Tools.java +++ b/src/pkg/deepCurse/nopalmo/global/Tools.java @@ -1,7 +1,5 @@ package pkg.deepCurse.nopalmo.global; -import net.dv8tion.jda.api.entities.Member; - public class Tools { } diff --git a/src/pkg/deepCurse/nopalmo/listener/GuildMessageReceivedListener.java b/src/pkg/deepCurse/nopalmo/listener/GuildMessageReceivedListener.java index db3ccd9..731197b 100644 --- a/src/pkg/deepCurse/nopalmo/listener/GuildMessageReceivedListener.java +++ b/src/pkg/deepCurse/nopalmo/listener/GuildMessageReceivedListener.java @@ -6,14 +6,13 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.events.ReadyEvent; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import pkg.deepCurse.nopalmo.core.Boot; import pkg.deepCurse.nopalmo.database.DatabaseTools; import pkg.deepCurse.nopalmo.database.DatabaseTools.Tools.Global; import pkg.deepCurse.nopalmo.global.Reactions; import pkg.deepCurse.nopalmo.manager.GuildCommandManager; public class GuildMessageReceivedListener extends ListenerAdapter { - - public static GuildCommandManager m = new GuildCommandManager(); @Override public void onReady(@Nonnull ReadyEvent event) { @@ -36,9 +35,9 @@ public class GuildMessageReceivedListener extends ListenerAdapter { } } - if (messageRaw.contentEquals(Global.getPrefix() + Global.getPrefix()) + if (messageRaw.contentEquals(Global.prefix + Global.prefix) && DatabaseTools.Tools.Developers.canPowerOffBot(event.getAuthor().getIdLong())) { - message.addReaction(Reactions.getReaction("galaxyThumb")).queue(); + message.addReaction(Reactions.getReaction("galaxyThumb")).complete(); System.out.println("Shutting down; id " + event.getAuthor().getIdLong() + " used"); @@ -55,7 +54,7 @@ public class GuildMessageReceivedListener extends ListenerAdapter { } if (!event.getAuthor().isBot()) { - m.startCommand(event); + Boot.guildCommandManager.startCommand(event); } } diff --git a/src/pkg/deepCurse/nopalmo/manager/CommandBlob.java b/src/pkg/deepCurse/nopalmo/manager/CommandBlob.java new file mode 100644 index 0000000..05752ed --- /dev/null +++ b/src/pkg/deepCurse/nopalmo/manager/CommandBlob.java @@ -0,0 +1,24 @@ +package pkg.deepCurse.nopalmo.manager; + +import java.util.ArrayList; + +public class CommandBlob { + + private String modifiedRaw = null; + private String modified = null; + + private ArrayList args = null; + + public String getModifiedMessageContents() { + return this.modified; + } + + public String getModifiedRawMessageContents() { + return this.modifiedRaw; + } + + public ArrayList getArgs() { + return args; + } + +} diff --git a/src/pkg/deepCurse/nopalmo/manager/GuildCommandManager.java b/src/pkg/deepCurse/nopalmo/manager/GuildCommandManager.java index 4b82f9f..c8e9cb2 100644 --- a/src/pkg/deepCurse/nopalmo/manager/GuildCommandManager.java +++ b/src/pkg/deepCurse/nopalmo/manager/GuildCommandManager.java @@ -1,5 +1,8 @@ package pkg.deepCurse.nopalmo.manager; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -10,22 +13,23 @@ import java.util.regex.Pattern; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import pkg.deepCurse.nopalmo.command.GuildCommand; import pkg.deepCurse.nopalmo.command.guildCommand.Ping; -import pkg.deepCurse.nopalmo.database.DatabaseTools.Tools.Global; +import pkg.deepCurse.nopalmo.core.Boot; +import pkg.deepCurse.nopalmo.database.DatabaseTools; public class GuildCommandManager { - + private final Map guildCommandMap = new HashMap<>(); Executor executor = null; - + public GuildCommandManager() { init(); executor = Executors.newSingleThreadExecutor(); } - + public void init() { addCommand(new Ping()); } - + private void addCommand(GuildCommand c) { if (!guildCommandMap.containsKey(c.getCommandName())) { guildCommandMap.put(c.getCommandName(), c); @@ -34,31 +38,62 @@ public class GuildCommandManager { guildCommandMap.put(c.getCommandName(), c); } } - + public Collection getguildCommandMap() { return guildCommandMap.values(); } - + public GuildCommand getCommand(String commandName) { if (commandName != null) { return guildCommandMap.get(commandName); } return null; } - + public void startCommand(GuildMessageReceivedEvent guildMessage) { - + final String message = guildMessage.getMessage().getContentRaw(); - - final String[] split = message.replaceFirst("(?i)" + Pattern.quote(Global.getPrefix()), "").split("\\s+"); + + final String[] split = message.replaceFirst("(?i)" + Pattern.quote(DatabaseTools.Tools.Global.prefix), "") + .split("\\s+"); final String command = split[0].toLowerCase(); - + executor.execute(() -> { long commandStartTime = System.currentTimeMillis(); - - + + try { + + ArrayList newArguments = new ArrayList(); + + ArrayList extractedFlags = new ArrayList(); + + } catch (Exception e) { + if (Boot.isProd) { + guildMessage.getChannel().sendMessage("```\n" + e + "```").queue(); + } else { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + guildMessage.getChannel().sendMessage("```\n" + sw.toString() + "```").queue(); + System.err.println("Exception caught in: " + e.toString()); + e.printStackTrace(); + } + } catch (Throwable t) { + + if (Boot.isProd) { + guildMessage.getChannel().sendMessage("```\n" + t + "```").queue(); + } else { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + guildMessage.getChannel().sendMessage("```\n" + sw.toString() + "```").queue(); + System.err.println("Error caught in: " + t.toString()); + t.printStackTrace(); + } + + } + }); - } - + }