Skip to content

Commit cfe1e6d

Browse files
committed
Fixed DB connection issues, added CommandTabCompleter, added permissions.
1 parent 63a5378 commit cfe1e6d

File tree

10 files changed

+192
-28
lines changed

10 files changed

+192
-28
lines changed

Diff for: pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>me.k4m1s</groupId>
88
<artifactId>deathcounter</artifactId>
9-
<version>1.0.1</version>
9+
<version>1.0.2</version>
1010
<packaging>jar</packaging>
1111

1212
<name>Deathcounter</name>

Diff for: src/main/java/me/k4m1s/deathcounter/Commands/DeathCounterCommand.java

+63-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.bukkit.command.Command;
1010
import org.bukkit.command.CommandExecutor;
1111
import org.bukkit.command.CommandSender;
12+
import org.bukkit.entity.Player;
1213
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
1314

1415
import java.text.SimpleDateFormat;
@@ -21,6 +22,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
2122

2223
switch(args[0]) {
2324
case "add":
25+
if (sender instanceof Player) {
26+
if ( !( sender.hasPermission("deathcounter.add")) ) {
27+
Messages.sendMessage(sender, "&cYou do not have access to this command.");
28+
return true;
29+
}
30+
}
2431
if (args.length < 3) return this.cmdHelp(sender);
2532
String playerName = args[1];
2633
String method = args[2];
@@ -79,6 +86,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
7986
}
8087
return this.cmdAdd(sender, player, damageCause, killer, mobName);
8188
case "remove":
89+
if (sender instanceof Player) {
90+
if ( !( sender.hasPermission("deathcounter.remove")) ) {
91+
Messages.sendMessage(sender, "&cYou do not have access to this command.");
92+
return true;
93+
}
94+
}
8295
if (args.length < 2) return this.cmdHelp(sender);
8396
try {
8497
int ID = Integer.parseInt(args[1]);
@@ -88,6 +101,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
88101
return false;
89102
}
90103
case "list":
104+
if (sender instanceof Player) {
105+
if ( !( sender.hasPermission("deathcounter.list")) ) {
106+
Messages.sendMessage(sender, "&cYou do not have access to this command.");
107+
return true;
108+
}
109+
}
91110
int page = 1;
92111
if (args.length >= 2) {
93112
try {
@@ -99,6 +118,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
99118
}
100119
return this.cmdList(sender, page);
101120
case "details":
121+
if (sender instanceof Player) {
122+
if ( !( sender.hasPermission("deathcounter.details")) ) {
123+
Messages.sendMessage(sender, "&cYou do not have access to this command.");
124+
return true;
125+
}
126+
}
102127
if (args.length < 2) return this.cmdHelp(sender);
103128
OfflinePlayer dPlayer = null;
104129
for(OfflinePlayer p : Bukkit.getOfflinePlayers()) {
@@ -117,6 +142,25 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
117142
}
118143
}
119144
return this.cmdDetails(sender, dPlayer, dPage);
145+
case "me":
146+
if (sender instanceof Player) {
147+
if ( !( sender.hasPermission("deathcounter.me")) ) {
148+
Messages.sendMessage(sender, "&cYou do not have access to this command.");
149+
return true;
150+
}
151+
}
152+
if (args.length < 2) return this.cmdHelp(sender);
153+
int mPage = 1;
154+
if (args.length >= 3) {
155+
try {
156+
mPage = Integer.parseInt(args[2]);
157+
} catch(NumberFormatException e) {
158+
Messages.sendMessage(sender, "&cPage is not valid");
159+
return false;
160+
}
161+
}
162+
return this.cmdDetails(sender, (OfflinePlayer) sender, mPage);
163+
120164
default:
121165
return this.cmdHelp(sender);
122166
}
@@ -177,13 +221,19 @@ private boolean cmdList(final CommandSender sender, final int page) {
177221
DatabaseHelper.getPlayersCount(result -> {
178222
if (result < 0) return;
179223
int offset = 0;
180-
if (page > 1) offset = 6;
181-
offset *= page;
182-
final int maxPages = ((int) Math.floor(result / 6D) > 0? (int) Math.floor(result / 6D) : 1);
224+
if (page > 1) {
225+
offset = 6;
226+
offset *= (page - 1);
227+
}
228+
final int maxPages = ((int) Math.ceil(result / 6D) > 0? (int) Math.ceil(result / 6D) : 1);
229+
if (page > maxPages) {
230+
Messages.sendMessage(sender, "&cThis page does not exists.");
231+
return;
232+
}
183233
DatabaseHelper.getPlayersDeathCount(offset, 6, playerDeathCount -> {
184234
Messages.sendHeader(sender, "Page " + page + "/" + maxPages);
185235
for(PlayerDeathCount pdc : playerDeathCount) {
186-
Messages.sendMessage(sender, pdc.getPlayer().getName() + ": &c" + pdc.getCount());
236+
Messages.sendMessage(sender, pdc.getPlayer().getName() + ": &c" + pdc.getCount(), false);
187237
}
188238
Messages.sendFooter(sender);
189239
});
@@ -203,9 +253,15 @@ private boolean cmdDetails(CommandSender sender, OfflinePlayer player, int page)
203253
DatabaseHelper.getPlayerDeathCount(player, playerDeathCount -> {
204254
if (playerDeathCount == null) return;
205255
int offset = 0;
206-
if (page > 1) offset = 6;
207-
offset *= page;
208-
final int maxPages = (int) Math.floor(playerDeathCount.getCount() / 6D);
256+
if (page > 1) {
257+
offset = 6;
258+
offset *= (page - 1);
259+
}
260+
final int maxPages = ((int) Math.ceil(playerDeathCount.getCount() / 6D) > 0? (int) Math.ceil(playerDeathCount.getCount() / 6D) : 1);
261+
if (page > maxPages) {
262+
Messages.sendMessage(sender, "&cThis page does not exists.");
263+
return;
264+
}
209265
DatabaseHelper.getPlayerDeaths(player, offset, 6, playerDeath -> {
210266
Messages.sendHeader(sender, "Page " + page + "/" + maxPages);
211267
for(PlayerDeath pd : playerDeath) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package me.k4m1s.deathcounter.Commands;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.OfflinePlayer;
5+
import org.bukkit.command.Command;
6+
import org.bukkit.command.CommandSender;
7+
import org.bukkit.command.TabCompleter;
8+
import org.bukkit.entity.EntityType;
9+
import org.bukkit.entity.Monster;
10+
import org.bukkit.entity.Player;
11+
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class DeathCounterTabCompleter implements TabCompleter {
17+
18+
private final List<String> methods;
19+
private final List<String> damageCauses;
20+
private final List<String> killerType;
21+
private final List<String> mobNames;
22+
23+
public DeathCounterTabCompleter() {
24+
methods = new ArrayList<>();
25+
methods.add("help"); methods.add("add"); methods.add("remove"); methods.add("list"); methods.add("details"); methods.add("me");
26+
27+
damageCauses = new ArrayList<>();
28+
for (DamageCause dc : DamageCause.values()) {
29+
damageCauses.add(dc.toString());
30+
}
31+
32+
killerType = new ArrayList<>();
33+
killerType.add("player"); killerType.add("mob");
34+
35+
mobNames = new ArrayList<>();
36+
for(EntityType ent : EntityType.values()) {
37+
if (ent.getEntityClass() == null) continue;
38+
if (!Monster.class.isAssignableFrom(ent.getEntityClass())) continue;
39+
mobNames.add(ent.toString());
40+
}
41+
}
42+
43+
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
44+
List<String> result = new ArrayList<>();
45+
if (sender instanceof Player && args.length >= 1 && !sender.hasPermission("deathcounter." + args[0])) return result;
46+
47+
48+
if (args.length == 1) {
49+
for(String m : methods) {
50+
if (m.toLowerCase().contains(args[0].toLowerCase())) {
51+
result.add(m);
52+
}
53+
}
54+
}
55+
56+
if (args.length == 2) {
57+
switch (args[0]) {
58+
case "add":
59+
case "details":
60+
for(OfflinePlayer ply : Bukkit.getOfflinePlayers()) {
61+
if (ply.getName() == null) break;
62+
if (ply.getName().toLowerCase().contains(args[1].toLowerCase())) {
63+
result.add(ply.getName());
64+
}
65+
}
66+
break;
67+
}
68+
}
69+
70+
if (args.length == 3) {
71+
if (args[0].equalsIgnoreCase("add")) {
72+
for(String dc : damageCauses) {
73+
if (dc.toLowerCase().contains(args[2].toLowerCase())) {
74+
result.add(dc);
75+
}
76+
}
77+
}
78+
}
79+
80+
if (args.length == 4) {
81+
if (args[0].equalsIgnoreCase("add")) {
82+
for(String killer : killerType) {
83+
if (killer.toLowerCase().contains(args[3].toLowerCase())) {
84+
result.add(killer);
85+
}
86+
}
87+
}
88+
}
89+
90+
if (args.length == 5) {
91+
if (args[0].equalsIgnoreCase("add")) {
92+
switch(args[3]) {
93+
case "player":
94+
for(OfflinePlayer ply : Bukkit.getOfflinePlayers()) {
95+
if (ply.getName() == null) break;
96+
if (ply.getName().toLowerCase().contains(args[4].toLowerCase())) {
97+
result.add(ply.getName());
98+
}
99+
}
100+
break;
101+
case "mob":
102+
for (String mob : mobNames) {
103+
if (mob.toLowerCase().contains(args[4])) {
104+
result.add(mob);
105+
}
106+
}
107+
break;
108+
}
109+
}
110+
}
111+
return result;
112+
}
113+
}

Diff for: src/main/java/me/k4m1s/deathcounter/Database/DatabaseHelper.java

-4
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ public static void updatePlayerNick(final OfflinePlayer player, final IDatabaseB
9999
public static void addPlayerToDatabase(final Player player, final IDatabaseBool callback) {
100100
Bukkit.getScheduler().runTaskAsynchronously(DeathCounter.getPlugin(), () -> {
101101
try {
102-
DeathCounter.getDatabaseManager().openConnection();
103102
PreparedStatement nameUpdate = DeathCounter.getDatabaseManager().getConnection().prepareStatement("INSERT INTO `deathcounter_players`(`UUID`, `playerName`) VALUES (?,?)");
104103
nameUpdate.setString(1, player.getUniqueId().toString());
105104
nameUpdate.setString(2, player.getName());
@@ -116,7 +115,6 @@ public static void addPlayerToDatabase(final Player player, final IDatabaseBool
116115
public static void addPlayerToDatabase(final OfflinePlayer player, final IDatabaseBool callback) {
117116
Bukkit.getScheduler().runTaskAsynchronously(DeathCounter.getPlugin(), () -> {
118117
try {
119-
DeathCounter.getDatabaseManager().openConnection();
120118
PreparedStatement nameUpdate = DeathCounter.getDatabaseManager().getConnection().prepareStatement("INSERT INTO `deathcounter_players`(`UUID`, `playerName`) VALUES (?,?)");
121119
nameUpdate.setString(1, player.getUniqueId().toString());
122120
nameUpdate.setString(2, player.getName());
@@ -133,7 +131,6 @@ public static void addPlayerToDatabase(final OfflinePlayer player, final IDataba
133131
public static void addPlayerDeath(final String playerUUID, final String deathCause, final String killerUUID, final String mobName, IDatabaseBool callback) {
134132
Bukkit.getScheduler().runTaskAsynchronously(DeathCounter.getPlugin(), () -> {
135133
try {
136-
DeathCounter.getDatabaseManager().openConnection();
137134
PreparedStatement deathInsert = DeathCounter.getDatabaseManager().getConnection().prepareStatement("INSERT INTO `deathcounter_deaths`(`playerUUID`, `method`, `initiator`, `mobName`) VALUES (?, ?, ?, ?)");
138135
deathInsert.setString(1, playerUUID);
139136
deathInsert.setString(2, deathCause);
@@ -168,7 +165,6 @@ public static void removePlayerDeath(final int ID, IDatabaseBool callback) {
168165
public static void getPlayersCount(IDatabaseInt callback) {
169166
Bukkit.getScheduler().runTaskAsynchronously(DeathCounter.getPlugin(), () -> {
170167
try {
171-
DeathCounter.getDatabaseManager().openConnection();
172168
PreparedStatement playersCount = DeathCounter.getDatabaseManager().getConnection().prepareStatement("SELECT count(*) as count FROM deathcounter_players GROUP BY UUID");
173169
ResultSet result = playersCount.executeQuery();
174170
result.next();

Diff for: src/main/java/me/k4m1s/deathcounter/Database/DatabaseManager.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,15 @@ public void closeConnection() {
5656
* @return Connection
5757
* MySQL database connection.
5858
*/
59-
public Connection getConnection() { return connection; }
59+
public Connection getConnection() {
60+
try {
61+
if (this.connection == null || !this.connection.isValid(2)) this.openConnection();
62+
return connection;
63+
} catch (SQLException e) {
64+
e.printStackTrace();
65+
}
66+
return connection;
67+
}
6068

6169
/**
6270
* Creates required tables in MySQL database.

Diff for: src/main/java/me/k4m1s/deathcounter/Database/Models/PlayerDeath.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,19 @@ public PlayerDeath(String playerUUID, String sDamageCause, Timestamp lDeathTime,
7676
* List of players and their death count.
7777
*/
7878
public static List<PlayerDeath> getPlayerDeaths(OfflinePlayer player, int offset, int limit) {
79-
DeathCounter.getDatabaseManager().openConnection();
8079
try {
81-
PreparedStatement playerDeaths = DeathCounter.getDatabaseManager().getConnection().prepareStatement("SELECT `ID`, `playerUUID`, `method`, `initiator`, `createdAt`, `mobName` FROM `deathcounter_deaths` WHERE playerUUID=? LIMIT " + offset + ", " + limit);
80+
PreparedStatement playerDeaths = DeathCounter.getDatabaseManager().getConnection().prepareStatement("SELECT `ID`, `playerUUID`, `method`, `initiator`, `createdAt`, `mobName` FROM `deathcounter_deaths` WHERE playerUUID=? ORDER BY createdAt DESC LIMIT " + offset + ", " + limit);
8281
playerDeaths.setString(1, player.getUniqueId().toString());
8382
ResultSet result = playerDeaths.executeQuery();
8483
List<PlayerDeath> data = new ArrayList<>();
8584
while(result.next()) {
8685
data.add(new PlayerDeath(result.getString("playerUUID"), result.getString("method"), result.getTimestamp("createdAt"), result.getString("initiator"), result.getString("mobName")));
8786
}
88-
DeathCounter.getDatabaseManager().closeConnection();
8987
return data;
9088
} catch(SQLException e) {
9189
Messages.sendMessage("&cError has occurred while getting players death count.");
9290
e.printStackTrace();
9391
}
94-
DeathCounter.getDatabaseManager().closeConnection();
9592
return null;
9693
}
9794

@@ -102,7 +99,6 @@ public static List<PlayerDeath> getPlayerDeaths(OfflinePlayer player, int offset
10299
* True if success, False otherwise.
103100
*/
104101
public static boolean removePlayerDeath(int ID) {
105-
DeathCounter.getDatabaseManager().openConnection();
106102
try {
107103
PreparedStatement removeDeath = DeathCounter.getDatabaseManager().getConnection().prepareStatement("DELETE FROM deathcounter_deaths WHERE ID=?");
108104
removeDeath.setInt(1, ID);

Diff for: src/main/java/me/k4m1s/deathcounter/Database/Models/PlayerDeathCount.java

-6
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,18 @@ public PlayerDeathCount(String playerUUID, int count) {
4242
* List of players and their death count.
4343
*/
4444
public static List<PlayerDeathCount> getPlayersDeathCount(int offset, int limit) {
45-
DeathCounter.getDatabaseManager().openConnection();
4645
try {
4746
PreparedStatement playersDeathCount = DeathCounter.getDatabaseManager().getConnection().prepareStatement("SELECT playerUUID, count(*) count FROM deathcounter_deaths GROUP BY playerUUID ORDER BY count(*) DESC LIMIT " + offset + ", " + limit);
4847
ResultSet result = playersDeathCount.executeQuery();
4948
List<PlayerDeathCount> data = new ArrayList<>();
5049
while(result.next()) {
5150
data.add(new PlayerDeathCount(result.getString("playerUUID"), result.getInt("count")));
5251
}
53-
DeathCounter.getDatabaseManager().closeConnection();
5452
return data;
5553
} catch(SQLException e) {
5654
Messages.sendMessage("&cError has occurred while getting players death count.");
5755
e.printStackTrace();
5856
}
59-
DeathCounter.getDatabaseManager().closeConnection();
6057
return null;
6158
}
6259

@@ -68,21 +65,18 @@ public static List<PlayerDeathCount> getPlayersDeathCount(int offset, int limit)
6865
* Player death count.
6966
*/
7067
public static PlayerDeathCount getPlayerDeathCount(OfflinePlayer player) {
71-
DeathCounter.getDatabaseManager().openConnection();
7268
try {
7369
PreparedStatement playerDeathCount = DeathCounter.getDatabaseManager().getConnection().prepareStatement("SELECT playerUUID, count(*) count FROM deathcounter_deaths WHERE playerUUID=? GROUP BY playerUUID ORDER BY count(*)");
7470
playerDeathCount.setString(1, player.getUniqueId().toString());
7571
ResultSet result = playerDeathCount.executeQuery();
7672
if (result.next()) {
7773
PlayerDeathCount pdc = new PlayerDeathCount(result.getString("playerUUID"), result.getInt("count"));
78-
DeathCounter.getDatabaseManager().closeConnection();
7974
return pdc;
8075
}
8176
} catch(SQLException e) {
8277
Messages.sendMessage("&cError has occurred while getting players death count.");
8378
e.printStackTrace();
8479
}
85-
DeathCounter.getDatabaseManager().closeConnection();
8680
return null;
8781
}
8882
}

Diff for: src/main/java/me/k4m1s/deathcounter/DeathCounter.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import me.k4m1s.deathcounter.Chat.Messages;
44
import me.k4m1s.deathcounter.Commands.DeathCounterCommand;
5+
import me.k4m1s.deathcounter.Commands.DeathCounterTabCompleter;
56
import me.k4m1s.deathcounter.Config.ConfigManager;
67
import me.k4m1s.deathcounter.Database.DatabaseHelper;
78
import me.k4m1s.deathcounter.Database.DatabaseManager;
@@ -55,6 +56,7 @@ public void onEnable() {
5556
PluginCommand deathcounter = this.getCommand("deathcounter");
5657
if (deathcounter != null) {
5758
deathcounter.setExecutor(new DeathCounterCommand());
59+
deathcounter.setTabCompleter(new DeathCounterTabCompleter());
5860
}
5961

6062
if (DeathCounter.getPlugin().getConfig().getBoolean("displaySidebar")) {

0 commit comments

Comments
 (0)