Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@
<id>placeholderapi</id>
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
</repositories>

<dependencies>
Expand All @@ -63,6 +67,12 @@
<version>2.9.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.4</version>
<scope>compile</scope>
</dependency>
</dependencies>

</project>
52 changes: 35 additions & 17 deletions src/main/java/com/gmail/mezymc/stats/StatsManager.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.gmail.mezymc.stats;

import com.gmail.mezymc.stats.database.DatabaseColumn;
import com.gmail.mezymc.stats.database.DatabaseConnector;
import com.gmail.mezymc.stats.database.MySqlConnector;
import com.gmail.mezymc.stats.database.Position;
import com.gmail.mezymc.stats.database.*;
import com.gmail.mezymc.stats.listeners.ConnectionListener;
import com.gmail.mezymc.stats.listeners.GuiListener;
import com.gmail.mezymc.stats.listeners.StatCommandListener;
Expand Down Expand Up @@ -43,6 +40,7 @@ public class StatsManager{
private boolean isUhcServer;
private boolean onlineMode;
private GameMode serverGameMode;
private int leaderBoardsUpdateInterval;

public StatsManager(){
statsManager = this;
Expand Down Expand Up @@ -180,19 +178,28 @@ boolean loadConfig(){
return false;
}

// SQL Details not yet set, disable plugin
if (cfg.getString("sql.password", "password123").equals("password123")){
Bukkit.getLogger().warning("[UhcStats] SQL details not set! Disabling plugin!");
boolean useMySql = cfg.getBoolean ("use-mysql-database");

// If need to use MySQL but database connection details are not yet set, disable plugin
if (useMySql && cfg.getString("sql.password", "password123").equals("password123")){
Bukkit.getLogger().severe("[UhcStats] MySQL database details not set! Disabling plugin since stats cannot be saved!");
return false;
}

databaseConnector = new MySqlConnector(
cfg.getString("sql.ip", "localhost"),
cfg.getString("sql.username", "localhost"),
cfg.getString("sql.password", "password123"),
cfg.getString("sql.database", "minecraft"),
cfg.getInt("sql.port", 3306)
);
// Connect to MySQL database if configured to do so and details are set
if(useMySql) {
databaseConnector = new MySqlConnector(
cfg.getString("sql.ip", "localhost"),
cfg.getString("sql.username", "localhost"),
cfg.getString("sql.password", "password123"),
cfg.getString("sql.database", "minecraft"),
cfg.getInt("sql.port", 3306)
);
}
// Connect to local SQLite database if configured to do so
else {
databaseConnector = new SQLiteConnector();
}

onlineMode = cfg.getBoolean("online-mode", true);

Expand Down Expand Up @@ -239,9 +246,14 @@ boolean loadConfig(){

Bukkit.getLogger().info("[UhcStats] Loaded " + gameModes.size() + " GameModes!");

Bukkit.getScheduler().runTaskLater(UhcStats.getPlugin(), () -> loadLeaderBoards(cfg), 10);
}
// If this is not a UHC server (but a lobby server with this plugin installed on it),
// load the leader-boards right away since we do not need to wait for the UHC game world(s) to pre-generate
if(!isUhcServer) {
Bukkit.getScheduler().runTaskLater(UhcStats.getPlugin(), () -> loadLeaderBoards(), 10);
}
// Otherwise, they will be loaded when the game is ready

}

// Load server GameMode
if (isUhcServer){
Expand All @@ -254,6 +266,8 @@ boolean loadConfig(){
Bukkit.getLogger().info("[UhcStats] Server GameMode is: " + serverGameMode.getKey());
}

leaderBoardsUpdateInterval = cfg.getInt("leaderboards-update-interval", 60);

return true;
}

Expand Down Expand Up @@ -380,7 +394,7 @@ private void pushGameModeStats(StatsPlayer statsPlayer, GameMode gameMode){
databaseConnector.pushStats(statsPlayer.getId(), gameMode, statsPlayer.getGameModeStats(gameMode));
}

private void loadLeaderBoards(YamlConfiguration cfg){
public void loadLeaderBoards(){
ConfigurationSection cfgSection = cfg.getConfigurationSection("leaderboards");
leaderBoards = new HashSet<>();

Expand Down Expand Up @@ -413,4 +427,8 @@ public Set<LeaderBoard> getLeaderBoards(){
return leaderBoards;
}

public int getLeaderBoardsUpdateInterval() { return leaderBoardsUpdateInterval; }

public boolean getIsUhcServer() { return isUhcServer; }

}
8 changes: 6 additions & 2 deletions src/main/java/com/gmail/mezymc/stats/UhcStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ public void onEnable(){

@Override
public void onDisable() {
for (LeaderBoard leaderBoard : StatsManager.getStatsManager().getLeaderBoards()){
leaderBoard.unload();
if(StatsManager.getStatsManager().getLeaderBoards() != null) {
for (LeaderBoard leaderBoard : StatsManager.getStatsManager().getLeaderBoards()) {
if(leaderBoard != null) {
leaderBoard.unload();
}
}
}
}

Expand Down
224 changes: 224 additions & 0 deletions src/main/java/com/gmail/mezymc/stats/database/SQLiteConnector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
package com.gmail.mezymc.stats.database;

import com.gmail.mezymc.stats.GameMode;
import com.gmail.mezymc.stats.StatType;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;

import java.io.File;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;

import static com.gmail.mezymc.stats.UhcStats.getPlugin;

public class SQLiteConnector implements DatabaseConnector {

private Connection connection;

public SQLiteConnector() {
connection = null;
}

@Override
public List<Position> getTop10(StatType statType, GameMode gameMode) {
try {
Connection connection = getSqlConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT `id`, `" + statType.getColumnName() + "` FROM `" + gameMode.getTableName() + "` ORDER BY `" + statType.getColumnName() + "` DESC LIMIT 10");
List<Position> positions = new ArrayList<>();

int pos = 1;
while (resultSet.next()) {
Position position = new Position(
pos,
resultSet.getString("id"),
resultSet.getInt(statType.getColumnName())
);

positions.add(position);
pos++;
}

resultSet.close();
statement.close();

return positions;
} catch (SQLException ex) {
ex.printStackTrace();
return new ArrayList<>();
}
}

@Override
public boolean doesTableExists(String tableName) {
Connection connection;
Statement statement;
try {
connection = getSqlConnection();
statement = connection.createStatement();
} catch (SQLException ex) {
ex.printStackTrace();
throw new RuntimeException("Failed to create statement!");
}

try {
statement.executeQuery("SELECT 1 FROM `" + tableName + "` LIMIT 1;").close();
statement.close();
return true;
} catch (SQLException ex) {
return false;
}
}

@Override
public void createTable(String name, DatabaseColumn... databaseColumns) {
StringBuilder sb = new StringBuilder("CREATE TABLE `" + name + "` (");
boolean first = true;

for (DatabaseColumn databaseColumn : databaseColumns) {
if (first) {
first = false;
} else {
sb.append(", ");
}

sb.append(databaseColumn.toString());
}
sb.append(");");

try {
Connection connection = getSqlConnection();
Statement statement = connection.createStatement();
statement.execute(sb.toString());
statement.close();
} catch (SQLException ex) {
Bukkit.getLogger().warning("[UhcStats] Failed to create table!");
ex.printStackTrace();
}
}

@Override
public void pushStats(String playerId, GameMode gameMode, Map<StatType, Integer> stats) {
try {
Connection connection = getSqlConnection();
Statement statement = connection.createStatement();
for (StatType statType : stats.keySet()) {
statement.executeUpdate(
"UPDATE `" + gameMode.getTableName() + "` SET `" + statType.getColumnName() + "`=" + stats.get(statType) + " WHERE `id`='" + playerId + "'"
);
}
statement.close();
} catch (SQLException ex) {
Bukkit.getLogger().warning("[UhcStats] Failed to push stats for: " + playerId);
ex.printStackTrace();
}
}

@Override
public Map<StatType, Integer> loadStats(String playerId, GameMode gameMode) {
Map<StatType, Integer> stats = getEmptyStatMap();

try {
Connection connection = getSqlConnection();
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("SELECT * FROM `" + gameMode.getTableName() + "` WHERE `id`='" + playerId + "'");

if (result.next()) {
// collect stats
for (StatType statType : StatType.values()) {
stats.put(statType, result.getInt(statType.getColumnName()));
}
} else {
// Player not found, insert player to table.
insertPlayerToTable(connection, playerId, gameMode);
}

result.close();
statement.close();
} catch (SQLException ex) {
ex.printStackTrace();
}

return stats;
}

@Override
public boolean checkConnection() {
try {
getSqlConnection();
return true;
} catch (SQLException ex) {
ex.printStackTrace();
return false;
}
}

private Connection getSqlConnection() throws SQLException {
Validate.isTrue(!Bukkit.isPrimaryThread(), "You may only open an connection to the database on a asynchronous thread!");

// Open connection to local SQLite database "database.db"
File dataFile = new File(getPlugin().getDataFolder(), "database.db");
if (!dataFile.exists()) {
try {
dataFile.createNewFile();
} catch (IOException e) {
Bukkit.getLogger().log(Level.SEVERE, "File write error: database.db");
}
}
try {
if (connection != null && !connection.isClosed()) {
return connection;
}
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:" + dataFile);
return connection;
} catch (SQLException ex) {
Bukkit.getLogger().log(Level.SEVERE, "SQLite exception on initialize", ex);
} catch (ClassNotFoundException ex) {
Bukkit.getLogger().log(Level.SEVERE, "You need the SQLite JBDC library.");
}

return null;
}

private void insertPlayerToTable(Connection connection, String playerId, GameMode gameMode) {
try {
StringBuilder sb = new StringBuilder("INSERT INTO `" + gameMode.getTableName() + "` (`id`");
for (StatType statType : StatType.values()) {
sb.append(", `" + statType.getColumnName() + "`");
}

sb.append(") VALUES ('" + playerId + "'");

for (int i = 0; i < StatType.values().length; i++) {
sb.append(", 0");
}

sb.append(")");

Statement statement = connection.createStatement();
statement.execute(sb.toString());

statement.close();
} catch (SQLException ex) {
Bukkit.getLogger().warning("[UhcStats] Failed to update stats for: " + playerId);
ex.printStackTrace();
}
}

private Map<StatType, Integer> getEmptyStatMap() {
Map<StatType, Integer> stats = new HashMap<>();

for (StatType statType : StatType.values()) {
stats.put(statType, 0);
}

return stats;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.gmail.mezymc.stats.listeners;

import com.gmail.mezymc.stats.*;
import com.gmail.val59000mc.events.UhcGameStateChangedEvent;
import com.gmail.val59000mc.events.UhcWinEvent;
import com.gmail.val59000mc.game.GameState;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -46,4 +48,17 @@ public void onGameWin(UhcWinEvent e){
Bukkit.getScheduler().runTaskAsynchronously(UhcStats.getPlugin(), () -> statsManager.pushAllStats());
}

@EventHandler
public void onGameStateChangedEvent(UhcGameStateChangedEvent e){
// If this is a UHC server (and not a lobby server with this plugin installed on it),
// load the leader-boards only after the the UHC game world(s) are pre-generated
if(StatsManager.getStatsManager().getIsUhcServer()) {
// When the game is waiting for players (world(s) have finished being pre-generated), load the leaderboards
// This is so that the leaderboards can go in the correct world if the default lobby is used
if (e.getNewGameState() == GameState.WAITING) {
Bukkit.getScheduler().runTaskLater(UhcStats.getPlugin(), () -> StatsManager.getStatsManager().loadLeaderBoards(), 10);
}
}
}

}
Loading