This commit is contained in:
2026-06-13 18:45:07 -04:00
commit b6cb260635
29 changed files with 1204 additions and 0 deletions
@@ -0,0 +1,333 @@
package com.dirtbagmc.dirtreferrals;
import java.io.File;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class DatabaseManager {
private final DirtReferralsPlugin plugin;
private Connection connection;
public DatabaseManager(DirtReferralsPlugin plugin) {
this.plugin = plugin;
}
public void initialize() {
try {
if (!plugin.getDataFolder().exists()) {
plugin.getDataFolder().mkdirs();
}
String fileName = plugin.getConfig().getString("database.file", "referrals.db");
File dbFile = new File(plugin.getDataFolder(), fileName);
connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getAbsolutePath());
createTables();
} catch (SQLException e) {
plugin.getLogger().severe("Failed to initialize SQLite database.");
e.printStackTrace();
}
}
private void createTables() throws SQLException {
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("""
CREATE TABLE IF NOT EXISTS players (
uuid TEXT PRIMARY KEY,
name TEXT NOT NULL,
referral_count INTEGER NOT NULL DEFAULT 0
)
""");
statement.executeUpdate("""
CREATE TABLE IF NOT EXISTS referrals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
referrer_uuid TEXT NOT NULL,
referred_uuid TEXT NOT NULL,
referred_name TEXT NOT NULL,
join_host TEXT,
ip_address TEXT,
counted INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL
)
""");
statement.executeUpdate("""
CREATE TABLE IF NOT EXISTS player_ips (
id INTEGER PRIMARY KEY AUTOINCREMENT,
player_uuid TEXT NOT NULL,
ip_address TEXT NOT NULL,
created_at INTEGER NOT NULL
)
""");
statement.executeUpdate("""
CREATE TABLE IF NOT EXISTS claimed_rewards (
referrer_uuid TEXT NOT NULL,
milestone INTEGER NOT NULL,
claimed_at INTEGER NOT NULL,
PRIMARY KEY (referrer_uuid, milestone)
)
""");
}
}
public void close() {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
plugin.getLogger().severe("Failed to close database connection.");
e.printStackTrace();
}
}
}
public void upsertPlayer(UUID uuid, String name) {
String sql = """
INSERT INTO players (uuid, name, referral_count)
VALUES (?, ?, 0)
ON CONFLICT(uuid) DO UPDATE SET name = excluded.name
""";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, uuid.toString());
ps.setString(2, name);
ps.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Failed to upsert player " + name);
e.printStackTrace();
}
}
public String getPlayerName(UUID uuid) {
String sql = "SELECT name FROM players WHERE uuid = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, uuid.toString());
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getString("name");
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed to get player name.");
e.printStackTrace();
}
return null;
}
public UUID getPlayerUuidByName(String name) {
String sql = "SELECT uuid FROM players WHERE LOWER(name) = LOWER(?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, name);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return UUID.fromString(rs.getString("uuid"));
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed to get UUID by player name.");
e.printStackTrace();
}
return null;
}
public int getReferralCount(UUID uuid) {
String sql = "SELECT referral_count FROM players WHERE uuid = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, uuid.toString());
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt("referral_count");
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed to get referral count.");
e.printStackTrace();
}
return 0;
}
public void setReferralCount(UUID uuid, int count) {
String sql = "UPDATE players SET referral_count = ? WHERE uuid = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, count);
ps.setString(2, uuid.toString());
ps.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Failed to set referral count.");
e.printStackTrace();
}
}
public void addReferralCount(UUID uuid, int amount) {
setReferralCount(uuid, Math.max(0, getReferralCount(uuid) + amount));
}
public boolean hasReferralRecord(UUID referrerUuid, UUID referredUuid) {
String sql = "SELECT 1 FROM referrals WHERE referrer_uuid = ? AND referred_uuid = ? LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referrerUuid.toString());
ps.setString(2, referredUuid.toString());
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking referral record.");
e.printStackTrace();
}
return false;
}
public boolean hasAnyReferralRecordForReferred(UUID referredUuid) {
String sql = "SELECT 1 FROM referrals WHERE referred_uuid = ? LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referredUuid.toString());
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking referred player history.");
e.printStackTrace();
}
return false;
}
public void insertReferral(UUID referrerUuid, UUID referredUuid, String referredName, String joinHost, String ipAddress, boolean counted) {
String sql = """
INSERT INTO referrals (referrer_uuid, referred_uuid, referred_name, join_host, ip_address, counted, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referrerUuid.toString());
ps.setString(2, referredUuid.toString());
ps.setString(3, referredName);
ps.setString(4, joinHost);
ps.setString(5, ipAddress);
ps.setInt(6, counted ? 1 : 0);
ps.setLong(7, System.currentTimeMillis());
ps.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Failed to insert referral.");
e.printStackTrace();
}
}
public void addPlayerIp(UUID playerUuid, String ipAddress) {
String checkSql = "SELECT 1 FROM player_ips WHERE player_uuid = ? AND ip_address = ? LIMIT 1";
String insertSql = "INSERT INTO player_ips (player_uuid, ip_address, created_at) VALUES (?, ?, ?)";
try (PreparedStatement check = connection.prepareStatement(checkSql)) {
check.setString(1, playerUuid.toString());
check.setString(2, ipAddress);
try (ResultSet rs = check.executeQuery()) {
if (rs.next()) {
return;
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking existing player IP.");
e.printStackTrace();
return;
}
try (PreparedStatement insert = connection.prepareStatement(insertSql)) {
insert.setString(1, playerUuid.toString());
insert.setString(2, ipAddress);
insert.setLong(3, System.currentTimeMillis());
insert.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Failed storing player IP.");
e.printStackTrace();
}
}
public boolean playerHasIp(UUID playerUuid, String ipAddress) {
String sql = "SELECT 1 FROM player_ips WHERE player_uuid = ? AND ip_address = ? LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, playerUuid.toString());
ps.setString(2, ipAddress);
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking player IP.");
e.printStackTrace();
}
return false;
}
public boolean anyReferralUsesIpForReferrer(UUID referrerUuid, String ipAddress) {
String sql = "SELECT 1 FROM referrals WHERE referrer_uuid = ? AND ip_address = ? LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referrerUuid.toString());
ps.setString(2, ipAddress);
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking referral IP reuse.");
e.printStackTrace();
}
return false;
}
public boolean hasClaimedReward(UUID referrerUuid, int milestone) {
String sql = "SELECT 1 FROM claimed_rewards WHERE referrer_uuid = ? AND milestone = ? LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referrerUuid.toString());
ps.setInt(2, milestone);
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed checking claimed reward.");
e.printStackTrace();
}
return false;
}
public void setRewardClaimed(UUID referrerUuid, int milestone) {
String sql = """
INSERT OR IGNORE INTO claimed_rewards (referrer_uuid, milestone, claimed_at)
VALUES (?, ?, ?)
""";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, referrerUuid.toString());
ps.setInt(2, milestone);
ps.setLong(3, System.currentTimeMillis());
ps.executeUpdate();
} catch (SQLException e) {
plugin.getLogger().severe("Failed marking reward as claimed.");
e.printStackTrace();
}
}
public List<TopEntry> getTopReferrers(int limit) {
List<TopEntry> results = new ArrayList<>();
String sql = "SELECT uuid, name, referral_count FROM players ORDER BY referral_count DESC, name ASC LIMIT ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, limit);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
results.add(new TopEntry(
UUID.fromString(rs.getString("uuid")),
rs.getString("name"),
rs.getInt("referral_count")
));
}
}
} catch (SQLException e) {
plugin.getLogger().severe("Failed loading top referrers.");
e.printStackTrace();
}
return results;
}
}