Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,10 @@ public final void disable() {
}

if (localConn != null) {
// Save all player histories
if (playerStorage != null) {
playerStorage.shutdown();
}

if (config.isLogIpsEnabled() && playerHistoryStorage != null) {
playerHistoryStorage.save();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ public interface CommonScheduler {
void runSync(Runnable task);
void runSyncLater(Runnable task, Duration delay);
void runAsyncRepeating(Runnable task, Duration initialDelay, Duration period);
default void cancelAll() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
import me.confuser.banmanager.common.util.IPUtils;
import me.confuser.banmanager.common.util.Message;


import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;

public class FindAltsCommand extends CommonCommand {

Expand Down Expand Up @@ -84,28 +85,46 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {

public static TextComponent alts(List<PlayerData> players) {
TextComponent.Builder message = Component.text();
int index = 0;

List<PlayerData> unbanned = new ArrayList<>();
Map<UUID, TextColor> colours = new HashMap<>();

for (PlayerData player : players) {
TextColor colour = NamedTextColor.GREEN;
PlayerBanData ban = BanManagerPlugin.getInstance().getPlayerBanStorage().getBan(player.getUUID());

if (BanManagerPlugin.getInstance().getPlayerBanStorage().isBanned(player.getUUID())) {
PlayerBanData ban = BanManagerPlugin.getInstance().getPlayerBanStorage().getBan(player.getUUID());
if (ban != null) {
colours.put(player.getUUID(), ban.getExpires() == 0 ? NamedTextColor.RED : NamedTextColor.GOLD);
} else {
unbanned.add(player);
}
}

if (ban.getExpires() == 0) {
colour = NamedTextColor.RED;
} else {
colour = NamedTextColor.GOLD;
if (!unbanned.isEmpty()) {
try {
Set<UUID> withRecords = BanManagerPlugin.getInstance().getPlayerBanRecordStorage()
.queryBuilder()
.selectColumns("player_id")
.where().in("player_id", unbanned.stream().map(PlayerData::getId).collect(Collectors.toList()))
.query()
.stream()
.map(r -> r.getPlayer().getUUID())
.collect(Collectors.toSet());

for (PlayerData player : unbanned) {
colours.put(player.getUUID(), withRecords.contains(player.getUUID()) ? NamedTextColor.YELLOW : NamedTextColor.GREEN);
}
} else {
try {
if (BanManagerPlugin.getInstance().getPlayerBanRecordStorage().getCount(player) != 0) {
colour = NamedTextColor.YELLOW;
}
} catch (SQLException e) {
BanManagerPlugin.getInstance().getLogger().warning("Failed to execute findalts command", e);
} catch (SQLException e) {
BanManagerPlugin.getInstance().getLogger().warning("Failed to execute findalts command", e);
for (PlayerData player : unbanned) {
colours.put(player.getUUID(), NamedTextColor.GREEN);
}
}
}

int index = 0;

for (PlayerData player : players) {
TextColor colour = colours.getOrDefault(player.getUUID(), NamedTextColor.GREEN);

message
.append(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
import me.confuser.banmanager.common.kyori.text.format.NamedTextColor;
import me.confuser.banmanager.common.maxmind.db.model.CountryResponse;
import me.confuser.banmanager.common.ormlite.dao.CloseableIterator;
import me.confuser.banmanager.common.ormlite.field.SqlType;
import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder;
import me.confuser.banmanager.common.ormlite.support.CompiledStatement;
import me.confuser.banmanager.common.ormlite.support.DatabaseConnection;
import me.confuser.banmanager.common.ormlite.support.DatabaseResults;
import me.confuser.banmanager.common.util.DateUtils;
import me.confuser.banmanager.common.util.IPUtils;
import me.confuser.banmanager.common.util.Message;
Expand All @@ -21,7 +26,6 @@
import java.net.InetAddress;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class InfoCommand extends CommonCommand {
Expand Down Expand Up @@ -109,30 +113,29 @@ public void ipInfo(CommonSender sender, IPAddress ip, InfoCommandParser parser)
return;
}

ArrayList<HashMap<String, Object>> results;
List<HistoryEntry> results;

if (parser.getTime() != null && !parser.getTime().isEmpty()) {
results = getPlugin().getHistoryStorage().getSince(ip, since, parser);
} else {
results = getPlugin().getHistoryStorage().getAll(ip, parser);
}

if (results == null || results.size() == 0) {
if (results == null || results.isEmpty()) {
Message.get("info.history.noResults").sendTo(sender);
return;
}

String dateTimeFormat = Message.getString("info.history.dateTimeFormat");

for (HashMap<String, Object> result : results) {
for (HistoryEntry result : results) {
Message message = Message.get("info.history.row")
.set("id", (int) result.get("id"))
.set("reason", (String) result.get("reason"))
.set("type", (String) result.get("type"))
.set("created", DateUtils
.format(dateTimeFormat, (long) result.get("created")))
.set("actor", (String) result.get("actor"))
.set("meta", (String) result.get("meta"));
.set("id", result.getId())
.set("reason", result.getReason())
.set("type", result.getType())
.set("created", DateUtils.format(dateTimeFormat, result.getCreated()))
.set("actor", result.getActor())
.set("meta", result.getMeta());

messages.add(message.toString());
}
Expand Down Expand Up @@ -369,30 +372,29 @@ public void playerInfo(CommonSender sender, String name, Integer index, InfoComm
handleIpHistory(messages, player, since, page);
} else {

ArrayList<HashMap<String, Object>> results;
List<HistoryEntry> results;

if (parser.getTime() != null && !parser.getTime().isEmpty()) {
results = getPlugin().getHistoryStorage().getSince(player, since, parser);
} else {
results = getPlugin().getHistoryStorage().getAll(player, parser);
}

if (results == null || results.size() == 0) {
if (results == null || results.isEmpty()) {
Message.get("info.history.noResults").sendTo(sender);
return;
}

String dateTimeFormat = Message.getString("info.history.dateTimeFormat");

for (HashMap<String, Object> result : results) {
for (HistoryEntry result : results) {
Message message = Message.get("info.history.row")
.set("id", (int) result.get("id"))
.set("reason", (String) result.get("reason"))
.set("type", (String) result.get("type"))
.set("created", DateUtils
.format(dateTimeFormat, (long) result.get("created")))
.set("actor", (String) result.get("actor"))
.set("meta", (String) result.get("meta"));
.set("id", result.getId())
.set("reason", result.getReason())
.set("type", result.getType())
.set("created", DateUtils.format(dateTimeFormat, result.getCreated()))
.set("actor", result.getActor())
.set("meta", result.getMeta());

messages.add(message.toString());
}
Expand All @@ -401,13 +403,55 @@ public void playerInfo(CommonSender sender, String name, Integer index, InfoComm
} else {

if (sender.hasPermission("bm.command.bminfo.playerstats")) {
long banTotal = getPlugin().getPlayerBanRecordStorage().getCount(player);
long muteTotal = getPlugin().getPlayerMuteRecordStorage().getCount(player);
long warnTotal = getPlugin().getPlayerWarnStorage().getCount(player);
double warnPointsTotal = getPlugin().getPlayerWarnStorage().getPointsCount(player);
long kickTotal = getPlugin().getPlayerKickStorage().getCount(player);
long noteTotal = getPlugin().getPlayerNoteStorage().getCount(player);
long reportTotal = getPlugin().getPlayerReportStorage().getCount(player);
String banRecordsTable = getPlugin().getPlayerBanRecordStorage().getTableInfo().getTableName();
String muteRecordsTable = getPlugin().getPlayerMuteRecordStorage().getTableInfo().getTableName();
String warningsTable = getPlugin().getPlayerWarnStorage().getTableName();
String kicksTable = getPlugin().getPlayerKickStorage().getTableInfo().getTableName();
String notesTable = getPlugin().getPlayerNoteStorage().getTableInfo().getTableName();
String reportsTable = getPlugin().getPlayerReportStorage().getTableName();

String sql = "SELECT 'bans' AS type, COUNT(*) AS cnt, 0 AS pts FROM `" + banRecordsTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'mutes', COUNT(*), 0 FROM `" + muteRecordsTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'warns', COUNT(*), 0 FROM `" + warningsTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'warnPoints', 0, COALESCE(SUM(`points`), 0) FROM `" + warningsTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'kicks', COUNT(*), 0 FROM `" + kicksTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'notes', COUNT(*), 0 FROM `" + notesTable + "` WHERE `player_id` = ?"
+ " UNION ALL SELECT 'reports', COUNT(*), 0 FROM `" + reportsTable + "` WHERE `player_id` = ?";

long banTotal = 0, muteTotal = 0, warnTotal = 0, kickTotal = 0, noteTotal = 0, reportTotal = 0;
double warnPointsTotal = 0;

try (DatabaseConnection conn = getPlugin().getLocalConn().getReadOnlyConnection("")) {
CompiledStatement stmt = conn.compileStatement(sql,
StatementBuilder.StatementType.SELECT, null,
DatabaseConnection.DEFAULT_RESULT_FLAGS, false);
try {
for (int i = 0; i < 7; i++) {
stmt.setObject(i, player.getId(), SqlType.BYTE_ARRAY);
}
DatabaseResults results = stmt.runQuery(null);
try {
while (results.next()) {
String type = results.getString(0);
switch (type) {
case "bans": banTotal = results.getLong(1); break;
case "mutes": muteTotal = results.getLong(1); break;
case "warns": warnTotal = results.getLong(1); break;
case "warnPoints": warnPointsTotal = results.getDouble(2); break;
case "kicks": kickTotal = results.getLong(1); break;
case "notes": noteTotal = results.getLong(1); break;
case "reports": reportTotal = results.getLong(1); break;
}
}
} finally {
try { results.close(); } catch (IOException ignored) { }
}
} finally {
try { stmt.close(); } catch (IOException ignored) { }
}
} catch (IOException e) {
throw new SQLException("Failed to query player stats", e);
}

messages.add(Message.get("info.stats.player")
.set("player", player.getName())
Expand Down Expand Up @@ -516,8 +560,9 @@ public void playerInfo(CommonSender sender, String name, Integer index, InfoComm
.set("rangebans", Long.toString(ipRangeBanTotal))
.toString());

if (getPlugin().getIpBanStorage().isBanned(player.getIp())) {
IpBanData ban = getPlugin().getIpBanStorage().getBan(player.getIp());
IpBanData ipBan = getPlugin().getIpBanStorage().getBan(player.getIp());
if (ipBan != null) {
IpBanData ban = ipBan;

Message message;

Expand All @@ -539,8 +584,9 @@ public void playerInfo(CommonSender sender, String name, Integer index, InfoComm
}
}

if (getPlugin().getPlayerBanStorage().isBanned(player.getUUID())) {
PlayerBanData ban = getPlugin().getPlayerBanStorage().getBan(player.getUUID());
PlayerBanData playerBan = getPlugin().getPlayerBanStorage().getBan(player.getUUID());
if (playerBan != null) {
PlayerBanData ban = playerBan;

Message message;

Expand All @@ -562,8 +608,9 @@ public void playerInfo(CommonSender sender, String name, Integer index, InfoComm
.toString());
}

if (getPlugin().getPlayerMuteStorage().isMuted(player.getUUID())) {
PlayerMuteData mute = getPlugin().getPlayerMuteStorage().getMute(player.getUUID());
PlayerMuteData playerMute = getPlugin().getPlayerMuteStorage().getMute(player.getUUID());
if (playerMute != null) {
PlayerMuteData mute = playerMute;

Message message;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import me.confuser.banmanager.common.util.Message;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class KickAllCommand extends CommonCommand {

Expand Down Expand Up @@ -40,20 +42,28 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
CommonPlayer[] onlinePlayers = getPlugin().getServer().getOnlinePlayers();

if (getPlugin().getConfig().isKickLoggingEnabled()) {
List<PlayerKickData> kicks = new ArrayList<>();

for (CommonPlayer player : onlinePlayers) {
if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) {
continue;
}

PlayerData playerData = player.getData();

if (playerData == null) continue;

PlayerKickData data = new PlayerKickData(playerData, actor, reason);
kicks.add(new PlayerKickData(playerData, actor, reason));
}

if (!kicks.isEmpty()) {
try {
getPlugin().getPlayerKickStorage().addKick(data, isSilent);
} catch (SQLException e) {
getPlugin().getPlayerKickStorage().callBatchTasks(() -> {
for (PlayerKickData data : kicks) {
getPlugin().getPlayerKickStorage().addKick(data, isSilent);
}
return null;
});
} catch (Exception e) {
sender.sendMessage(Message.get("sender.error.exception").toString());
getPlugin().getLogger().warning("Failed to execute kickall command", e);
}
Expand Down
Loading
Loading