package moe.oko.Kiafumi.model; import net.dv8tion.jda.api.entities.Guild; import java.sql.*; import java.util.ArrayList; import java.util.List; import static moe.oko.Kiafumi.Kiafumi.error; import static moe.oko.Kiafumi.Kiafumi.info; /** * Kiafumi DB Class * Basically our helpful MySQL functions that pertain to data persistence. */ public class KiafumiDB { //Our actual MySQL Connection, this is created on class construction. private Connection connection; //The prepared statement strings private final String CREATE_SERVERINFO_TABLE = "CREATE TABLE IF NOT EXISTS `serverInfo`" + "(`id` LONGTEXT NOT NULL,`welcomeEnabled` TINYINT NOT NULL,`welcomeChannel` LONGTEXT NULL, joinRole LONGTEXT NULL, `serverProtected` TINYINT NOT NULL);"; private final String INSERT_SERVERINFO_DEFAULT = "INSERT INTO serverInfo(id,welcomeEnabled,welcomeChannel, joinRole, serverProtected) values (?,?,?,?,?)"; private final String SERVERINFO_EXISTS = "select * from serverInfo where id = ?"; private final String SERVER_INFO_LOAD = "select * from serverInfo"; /** * KiafumiDB Config Constructor * @param username - username to access database * @param password - password to access database * @param host - host for server * @param port - port for server (3306 is default) * @param db - database name */ 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(); } /** * Table initialization function, ran on every startup. */ 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."); } } /** * Creates the default server information when the bot joins a discord. * @param guild - the guild that the bot joined * @return whether the function succeeded. */ 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.setNull(4, Types.LONGVARCHAR); ps.setInt(5, 0); //Falseeeee ps.execute(); return true; } catch (Exception ex) { error("Failed to create default server info for guild " + guild.getId()); ex.printStackTrace(); return false; } } /** * Loads all the server information from MySQL into memory. * @return - a list of all servers loaded from MySQL. */ public List loadServerInformation() { List servers = new ArrayList<>(); try { PreparedStatement ps = connection.prepareStatement(SERVER_INFO_LOAD); ResultSet rs = ps.executeQuery(); while(rs.next()) { info("Starting new load for server: " + rs.getString(1)); String id = rs.getString(1); boolean welcomeEnabled = false; switch(rs.getInt(2)) { case 0: welcomeEnabled = false; case 1: welcomeEnabled = true; } String welcomeChannel = rs.getString(3); String joinRole = rs.getString(4); boolean protectionEnabled = false; switch(rs.getInt(5)) { case 0: protectionEnabled = false; case 1: protectionEnabled = true; } Server server = new Server(id, welcomeEnabled, welcomeChannel, joinRole, protectionEnabled); info("Loaded: " + server); servers.add(server); } return servers; } catch (Exception ex) { ex.printStackTrace(); error("Failed to load server information, check stack."); return null; } } }