diff --git a/pom.xml b/pom.xml index 8699882..85f9726 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,11 @@ lavaplayer 1.3.53 + + mysql + mysql-connector-java + 8.0.28 + diff --git a/src/main/java/moe/oko/Kiafumi/Kiafumi.java b/src/main/java/moe/oko/Kiafumi/Kiafumi.java index 300a248..1ae50d0 100644 --- a/src/main/java/moe/oko/Kiafumi/Kiafumi.java +++ b/src/main/java/moe/oko/Kiafumi/Kiafumi.java @@ -1,5 +1,8 @@ package moe.oko.Kiafumi; +import moe.oko.Kiafumi.listener.MainListener; +import moe.oko.Kiafumi.model.KiafumiDB; +import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; @@ -15,12 +18,15 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.time.temporal.TemporalAccessor; public class Kiafumi { private File CONFIG_FILE = new File("config.yml"); - public YamlConfiguration yamlConfiguration; + public YamlConfiguration yamlConfiguration = new YamlConfiguration(); public Logger logger = LoggerFactory.getLogger("Kiafumi"); @@ -32,10 +38,12 @@ public class Kiafumi { public KiafumiConfig config; + public KiafumiDB database; + public static void main(String[] args) { try { - Kiafumi shiki = new Kiafumi(); - shiki.start(); + Kiafumi kia = new Kiafumi(); + kia.start(); } catch (Exception ex) { System.out.println("Failed to start Kiafumi Instance, check your Java installation."); ex.printStackTrace(); @@ -51,21 +59,23 @@ public class Kiafumi { logger.info("Config load start..."); if (!CONFIG_FILE.exists()) { - try { - CONFIG_FILE.createNewFile(); - } catch (IOException ex) { - logger.warn("Failed to create the configuration file. Stopping. (Try creating configuration directory.)"); + try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("config.yml")) { + //Save the default cfg + Files.copy(is, CONFIG_FILE.toPath()); + } catch (Exception ex) { + logger.warn("Failed to create the configuration file. Stopping. (" + CONFIG_FILE.getAbsolutePath() + ")"); + ex.printStackTrace(); return; } } try { - yamlConfiguration.load(CONFIG_FILE); + yamlConfiguration.load("config.yml"); } catch (FileNotFoundException e) { e.printStackTrace(); - logger.warn("File not found, attempting to create."); - - } catch (IOException | InvalidConfigurationException e) { + logger.warn("File not found, must've failed to create..."); + } catch (Exception e) { + logger.warn("Ensure all values are inputted properly."); e.printStackTrace(); } @@ -81,6 +91,8 @@ public class Kiafumi { PREFIX = config.getPrefix(); + database = config.createDb(); + //Makes our JDA instance. startDiscord(); } @@ -92,16 +104,20 @@ public class Kiafumi { try { JDA = JDABuilder.create(config.getToken(), GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_MESSAGES, - GatewayIntent.DIRECT_MESSAGES) + GatewayIntent.DIRECT_MESSAGES, GatewayIntent.GUILD_PRESENCES) .setChunkingFilter(ChunkingFilter.ALL) .setMemberCachePolicy(MemberCachePolicy.ALL) .setActivity(Activity.of(Activity.ActivityType.valueOf(config.getActivityType()), config.getActivityMsg())) .setStatus(OnlineStatus.valueOf(config.getStatusType())) - .addEventListeners().build().awaitReady(); + .addEventListeners(new MainListener()).build().awaitReady(); } catch(Exception ex) { error("Initialization broke..."); ex.printStackTrace(); + return; } + EmbedBuilder eb = new EmbedBuilder().setTitle("Kiafumi Online") + .setAuthor("Created by Oko, Laika, and Tiddy"); + JDA.getTextChannelById(config.getLogChannel()).sendMessage(eb.build()).queue(); } /* @@ -117,4 +133,6 @@ public class Kiafumi { public static void error(String str) { instance.logger.error(str); } + + public KiafumiDB getDatabase() { return database; } } diff --git a/src/main/java/moe/oko/Kiafumi/KiafumiConfig.java b/src/main/java/moe/oko/Kiafumi/KiafumiConfig.java index b28b72b..4e2b2b2 100644 --- a/src/main/java/moe/oko/Kiafumi/KiafumiConfig.java +++ b/src/main/java/moe/oko/Kiafumi/KiafumiConfig.java @@ -1,5 +1,6 @@ package moe.oko.Kiafumi; +import moe.oko.Kiafumi.model.KiafumiDB; import org.simpleyaml.configuration.ConfigurationSection; import org.simpleyaml.configuration.file.YamlConfiguration; @@ -29,6 +30,15 @@ public class KiafumiConfig { private String activityMsg; private String statusType; + /* + SQL Variable Section + */ + private String host; + private int port; + private String username; + private String password; + private String database; + public KiafumiConfig(YamlConfiguration configuration) { //Load config on class creation... this.configuration = configuration; @@ -58,6 +68,13 @@ public class KiafumiConfig { activityType = main.getString("activityType"); activityMsg = main.getString("activityMsg"); statusType = main.getString("statusType"); + //SQL loaders + ConfigurationSection sql = configuration.getConfigurationSection("sql"); + host = sql.getString("host"); + port = sql.getInt("port"); + username = sql.getString("username"); + password = sql.getString("password"); + database = sql.getString("database"); } catch(Exception ex) { ex.printStackTrace(); error("Failed to load configuration!"); @@ -82,4 +99,8 @@ public class KiafumiConfig { public String getActivityMsg() { return activityMsg; } public String getStatusType() { return statusType; } + + public String getLogChannel() { return logChannel; } + + public KiafumiDB createDb() { return new KiafumiDB(username, password, host, port, database); } } diff --git a/src/main/java/moe/oko/Kiafumi/listener/MainListener.java b/src/main/java/moe/oko/Kiafumi/listener/MainListener.java new file mode 100644 index 0000000..ae26049 --- /dev/null +++ b/src/main/java/moe/oko/Kiafumi/listener/MainListener.java @@ -0,0 +1,18 @@ +package moe.oko.Kiafumi.listener; + +import moe.oko.Kiafumi.Kiafumi; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; + +import static moe.oko.Kiafumi.Kiafumi.info; + +public class MainListener extends ListenerAdapter { + + @Override + public void onGuildJoin(GuildJoinEvent event) { + //Automatically create our default information for the server if we don't have it already. + info("Joined a new guild, NAME: " + event.getGuild().getName() + " ID: " + event.getGuild().getId()); + Kiafumi.instance.getDatabase().createServerInformation(event.getGuild()); + } + +} diff --git a/src/main/java/moe/oko/Kiafumi/model/KiafumiDB.java b/src/main/java/moe/oko/Kiafumi/model/KiafumiDB.java new file mode 100644 index 0000000..b3ebca7 --- /dev/null +++ b/src/main/java/moe/oko/Kiafumi/model/KiafumiDB.java @@ -0,0 +1,66 @@ +package moe.oko.Kiafumi.model; + +import com.mysql.cj.xdevapi.Type; +import net.dv8tion.jda.api.entities.Guild; + +import java.sql.*; + +import static moe.oko.Kiafumi.Kiafumi.error; +import static moe.oko.Kiafumi.Kiafumi.info; + +public class KiafumiDB { + private Connection connection; + + private final String CREATE_SERVERINFO_TABLE = "CREATE TABLE IF NOT EXISTS `serverInfo`" + + "(`id` LONGTEXT NOT NULL,`welcomeEnabled` TINYINT NOT NULL,`welcomeChannel` LONGTEXT NULL);"; + + private final String INSERT_SERVERINFO_DEFAULT = "INSERT INTO serverInfo(id,welcomeEnabled,welcomeChannel) values (?,?,?)"; + private final String SERVERINFO_EXISTS = "select * from serverInfo where id = ?"; + + public KiafumiDB(String username, String password, String host, int port, String db) { + try { + connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + db, username, password); + } catch (Exception ex) { + error("Failed to initialize the MySQL instance. Contact a developer."); + ex.printStackTrace(); + return; + } + + initializeTables(); + } + + private void initializeTables() { + try { + connection.prepareStatement(CREATE_SERVERINFO_TABLE).execute(); + } catch (Exception ex) { + ex.printStackTrace(); + error("Failed to initialize SQL tables. They may need to be created manually."); + } + } + + public boolean createServerInformation(Guild guild) { + try { + PreparedStatement prep = connection.prepareStatement(SERVERINFO_EXISTS); + prep.setInt(1, (int) guild.getIdLong()); + ResultSet rsCheck = prep.executeQuery(); + while (rsCheck.next()) { + //Server already exists, no need to initialize a section for it. + if(rsCheck.getInt(1) != 0) { + info("Server already existed. Skipping initialization."); + return true; + } + } + //Proceed with making defaults. + PreparedStatement ps = connection.prepareStatement(INSERT_SERVERINFO_DEFAULT); + ps.setString(1, guild.getId()); + ps.setInt(2, 0); //default is false. + ps.setNull(3, Types.LONGVARCHAR); + ps.execute(); + return true; + } catch (Exception ex) { + error("Failed to create default server info for guild " + guild.getId()); + ex.printStackTrace(); + return false; + } + } +} diff --git a/src/main/java/moe/oko/Kiafumi/model/Server.java b/src/main/java/moe/oko/Kiafumi/model/Server.java new file mode 100644 index 0000000..7d8b76d --- /dev/null +++ b/src/main/java/moe/oko/Kiafumi/model/Server.java @@ -0,0 +1,7 @@ +package moe.oko.Kiafumi.model; + +public class Server { + private String id; + private boolean welcomeEnabled; + private String welcomeChannel; +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6686902..c0f2aaa 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -33,4 +33,10 @@ main: #Activity Message activityMsg: "+help - gaaaaay" #Status type (ONLINE|IDLE|DO_NOT_DISTURB|INVISIBLE) - statusType: "IDLE" \ No newline at end of file + statusType: "IDLE" +sql: + host: "localhost" + port: 3306 + database: "kiafumi" + username: "alpine" + password: "squidlover42069" \ No newline at end of file