Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

380 lines
13 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package discord;
import engine.Enum;
import engine.gameManager.ConfigManager;
import org.pmw.tinylog.Logger;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Database {
public String sqlURI;
public static Boolean online;
// Load and instance the JDBC Driver
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
} catch (InstantiationException | ClassNotFoundException | IllegalAccessException e) {
// TODO Auto-generated catch block
Logger.error(e.toString());
;
online = false;
}
}
public void configureDatabase() {
// Build connection string from JSON object.
sqlURI = "jdbc:mysql://";
sqlURI += ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':' + ConfigManager.MB_DATABASE_PORT.getValue();
sqlURI += '/' + (String) ConfigManager.MB_DATABASE_NAME.getValue() + '?';
sqlURI += "useServerPrepStmts=true";
sqlURI += "&cachePrepStmts=false";
sqlURI += "&cacheCallableStmts=true";
sqlURI += "&characterEncoding=utf8";
online = true;
}
public boolean updateAccountPassword(String discordAccountID, String newPassword) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
CallableStatement updatePassword = connection.prepareCall("call discordUpdatePassword(?, ?)");
updatePassword.setString(1, discordAccountID);
updatePassword.setString(2, newPassword);
updatePassword.executeUpdate();
updatePassword.close();
return true;
} catch (SQLException e) {
Logger.error(e.toString());
;
this.online = false;
return false;
}
}
public boolean updateAccountStatus(String discordAccountID, Enum.AccountStatus accountStatus) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
PreparedStatement updateAccountStatus = connection.prepareCall("update obj_account set `status` = ? where `discordAccount` = ?");
updateAccountStatus.setString(1, accountStatus.name());
updateAccountStatus.setString(2, discordAccountID);
updateAccountStatus.executeUpdate();
updateAccountStatus.close();
return true;
} catch (SQLException e) {
Logger.error(e.toString());
;
this.online = false;
return false;
}
}
public boolean registerDiscordAccount(String discordAccountID, String discordUserName, String discordPassword) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
CallableStatement registerAccount = connection.prepareCall("call discordAccountRegister(?, ?, ?)");
registerAccount.setString(1, discordAccountID);
registerAccount.setString(2, discordUserName);
registerAccount.setString(3, discordPassword);
registerAccount.execute();
registerAccount.close();
return true;
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
return false;
}
}
public List<DiscordAccount> getDiscordAccounts(String discordAccountID) {
DiscordAccount discordAccount;
List<DiscordAccount> discordAccounts = new ArrayList<>();
String queryString = "SELECT * FROM obj_account where discordAccount = ?";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement accountQuery = connection.prepareStatement(queryString);
accountQuery.setString(1, discordAccountID);
ResultSet rs = accountQuery.executeQuery();
while (rs.next()) {
discordAccount = new DiscordAccount();
discordAccount.discordAccount = rs.getString("discordAccount");
discordAccount.gameAccountName = rs.getString("acct_uname");
discordAccount.status = Enum.AccountStatus.valueOf(rs.getString("status"));
discordAccount.isDiscordAdmin = rs.getByte("discordAdmin"); // Registration date cannot be null
Timestamp registrationDate = rs.getTimestamp("registrationDate");
discordAccount.registrationDate = registrationDate.toLocalDateTime();
// Load last Update Request datetime
Timestamp lastUpdateRequest = rs.getTimestamp("lastUpdateRequest");
if (lastUpdateRequest != null)
discordAccount.lastUpdateRequest = lastUpdateRequest.toLocalDateTime();
else
discordAccount.lastUpdateRequest = null;
discordAccounts.add(discordAccount);
}
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
return discordAccounts;
}
public String getTrashDetail() {
String outString = "accountName characterName machineID ip count\n";
outString += "---------------------------------------------\n";
String queryString = "SELECT * FROM dyn_trash_detail;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery();
while (rs.next()) {
outString += rs.getString("accountName") + " ";
outString += rs.getString("characterName") + " ";
outString += rs.getString("machineID") + " ";
outString += rs.getString("ip") + " ";
outString += rs.getInt("count") + "\n";
}
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
return outString;
}
public String getTrashList() {
String outString = "";
String queryString = "SELECT DISTINCT `characterName` FROM dyn_trash_detail;";
int counter = 0;
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery();
while (rs.next()) {
outString += rs.getString("characterName");
counter++;
if (counter > 2) {
outString += "\n";
counter = 0; }
else
outString += " ";
}
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
if (outString.length() > 1500)
return outString.substring(0, 1500);
else
return outString;
}
public int getTrashCount() {
int trashCount = 0;
String queryString = "SELECT count(distinct characterName) FROM dyn_trash_detail;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery();
while (rs.next()) {
trashCount = rs.getInt(1);
}
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
return trashCount;
}
public String getTrashFile() {
String outString = "machineID : count\n";
String queryString = "SELECT * FROM dyn_trash;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery();
while (rs.next()) {
outString += rs.getString("machineID") + " : ";
outString += rs.getInt("count") + "\n";
}
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
return outString;
}
public List<DiscordAccount> getAccountsByDiscordName(String accountName, Boolean exact) {
DiscordAccount discordAccount;
List<DiscordAccount> discordAccounts = new ArrayList<>();
String searchString;
String queryString;
if (exact.equals(true))
searchString = accountName + "#%";
else
searchString = accountName + "%#%";
queryString = "SELECT * FROM obj_account where `acct_uname` LIKE ?";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
PreparedStatement nameQuery = connection.prepareStatement(queryString);
nameQuery.setString(1, searchString);
ResultSet rs = nameQuery.executeQuery();
while (rs.next()) {
discordAccount = new DiscordAccount();
discordAccount.discordAccount = rs.getString("discordAccount");
discordAccount.gameAccountName = rs.getString("acct_uname");
discordAccount.status = Enum.AccountStatus.valueOf(rs.getString("status"));
// Registration date cannot be null
Timestamp registrationDate = rs.getTimestamp("registrationDate");
discordAccount.registrationDate = registrationDate.toLocalDateTime();
// Load last Update Request datetime
Timestamp lastUpdateRequest = rs.getTimestamp("lastUpdateRequest");
if (lastUpdateRequest != null)
discordAccount.lastUpdateRequest = lastUpdateRequest.toLocalDateTime();
else
discordAccount.lastUpdateRequest = null;
discordAccounts.add(discordAccount);
}
} catch (SQLException e) {
Logger.error(e.toString());
;
this.online = false;
}
return discordAccounts;
}
public String getPopulationSTring() {
String popString = "";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
// Discord account name based lookup
CallableStatement getPopString = connection.prepareCall("CALL GET_POPULATION_STRING()");
ResultSet rs = getPopString.executeQuery();
if (rs.next())
popString = rs.getString("popstring");
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
return popString;
}
public void invalidateLoginCache(String discordAccountID) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) {
String queryString = "INSERT IGNORE INTO login_cachelist (`UID`) SELECT `UID` from `obj_account` WHERE `discordAccount` = ?";
PreparedStatement invalidateAccounts = connection.prepareStatement(queryString);
invalidateAccounts.setString(1, discordAccountID);
invalidateAccounts.executeUpdate();
} catch (SQLException e) {
Logger.error(e.toString());
this.online = false;
}
}
}