- Start the indefinite ban system, currently working with manually adding to the configuration.

- /plex reload reloads the indefinite bans
- Fixed bug where AdminChat showed up with symbols still and not colorized in adminchat
This commit is contained in:
Taah 2022-02-27 22:28:00 -08:00
parent fea21195da
commit 8550240754
10 changed files with 166 additions and 43 deletions

View File

@ -35,6 +35,7 @@ public class Plex extends JavaPlugin
private static Plex plugin; private static Plex plugin;
public Config config; public Config config;
public Config messages; public Config messages;
public Config indefBans;
private StorageType storageType = StorageType.SQLITE; private StorageType storageType = StorageType.SQLITE;
private SQLConnection sqlConnection; private SQLConnection sqlConnection;
@ -64,6 +65,7 @@ public class Plex extends JavaPlugin
plugin = this; plugin = this;
config = new Config(this, "config.yml"); config = new Config(this, "config.yml");
messages = new Config(this, "messages.yml"); messages = new Config(this, "messages.yml");
indefBans = new Config(this, "indefbans.yml");
sqlConnection = new SQLConnection(); sqlConnection = new SQLConnection();
mongoConnection = new MongoConnection(); mongoConnection = new MongoConnection();
@ -75,6 +77,7 @@ public class Plex extends JavaPlugin
{ {
config.load(); config.load();
messages.load(); messages.load();
indefBans.load();
system = config.getString("commands.permissions"); system = config.getString("commands.permissions");
try try
@ -122,6 +125,7 @@ public class Plex extends JavaPlugin
PlexLog.log("Rank Manager initialized"); PlexLog.log("Rank Manager initialized");
punishmentManager = new PunishmentManager(); punishmentManager = new PunishmentManager();
punishmentManager.mergeIndefiniteBans();
// banManager = new BanManager(); // banManager = new BanManager();
PlexLog.log("Punishment System initialized"); PlexLog.log("Punishment System initialized");

View File

@ -31,12 +31,20 @@ public class PlexCMD extends PlexCommand
if (args[0].equalsIgnoreCase("reload")) if (args[0].equalsIgnoreCase("reload"))
{ {
checkRank(sender, Rank.SENIOR_ADMIN, "plex.reload"); checkRank(sender, Rank.SENIOR_ADMIN, "plex.reload");
Plex.get().config.load(); Plex.get().config.load();
send(sender, "Reloaded config file"); send(sender, "Reloaded config file");
Plex.get().messages.load(); Plex.get().messages.load();
send(sender, "Reloaded messages file"); send(sender, "Reloaded messages file");
Plex.get().indefBans.load();
Plex.get().getPunishmentManager().mergeIndefiniteBans();
send(sender, "Reloaded indefinite bans");
Plex.get().getRankManager().importDefaultRanks(); Plex.get().getRankManager().importDefaultRanks();
send(sender, "Imported ranks"); send(sender, "Imported ranks");
send(sender, "Plex successfully reloaded."); send(sender, "Plex successfully reloaded.");
} }
else if (args[0].equalsIgnoreCase("redis")) else if (args[0].equalsIgnoreCase("redis"))

View File

@ -13,6 +13,27 @@ public class BanListener extends PlexListener
@EventHandler @EventHandler
public void onPreLogin(AsyncPlayerPreLoginEvent event) public void onPreLogin(AsyncPlayerPreLoginEvent event)
{ {
if (plugin.getPunishmentManager().isIndefUUIDBanned(event.getUniqueId()))
{
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED,
Punishment.generateIndefBanMessage("UUID"));
return;
}
if (plugin.getPunishmentManager().isIndefIPBanned(event.getAddress().getHostAddress()))
{
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED,
Punishment.generateIndefBanMessage("IP"));
return;
}
if (plugin.getPunishmentManager().isIndefUserBanned(event.getName()))
{
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED,
Punishment.generateIndefBanMessage("username"));
return;
}
if (plugin.getPunishmentManager().isBanned(event.getUniqueId())) if (plugin.getPunishmentManager().isBanned(event.getUniqueId()))
{ {
PunishedPlayer player = PlayerCache.getPunishedPlayer(event.getUniqueId()); PunishedPlayer player = PlayerCache.getPunishedPlayer(event.getUniqueId());

View File

@ -49,6 +49,11 @@ public class Punishment
DATE_FORMAT.format(punishment.getEndDate()), punishment.getPunisher() == null ? "CONSOLE" : MojangUtils.getInfo(punishment.getPunisher().toString()).getUsername()); DATE_FORMAT.format(punishment.getEndDate()), punishment.getPunisher() == null ? "CONSOLE" : MojangUtils.getInfo(punishment.getPunisher().toString()).getUsername());
} }
public static Component generateIndefBanMessage(String type)
{
return PlexUtils.messageComponent("indefBanMessage", type, banUrl);
}
public static Punishment fromJson(String json) public static Punishment fromJson(String json)
{ {
return new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer()).create().fromJson(json, Punishment.class); return new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer()).create().fromJson(json, Punishment.class);

View File

@ -2,9 +2,12 @@ package dev.plex.punishment;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.PlexBase; import dev.plex.PlexBase;
import dev.plex.cache.PlayerCache; import dev.plex.cache.PlayerCache;
import dev.plex.player.PlexPlayer;
import dev.plex.player.PunishedPlayer; import dev.plex.player.PunishedPlayer;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
@ -12,6 +15,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
@ -21,6 +25,7 @@ import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.json.JSONObject; import org.json.JSONObject;
import org.json.JSONTokener; import org.json.JSONTokener;
@ -28,6 +33,77 @@ import redis.clients.jedis.Jedis;
public class PunishmentManager extends PlexBase public class PunishmentManager extends PlexBase
{ {
private final List<String> bannedIPs = Lists.newArrayList();
private final List<String> bannedUsernames = Lists.newArrayList();
private final List<UUID> bannedUUIDs = Lists.newArrayList();
public void mergeIndefiniteBans()
{
this.bannedUsernames.clear();
this.bannedIPs.clear();
this.bannedUUIDs.clear();
this.bannedUUIDs.addAll(Plex.get().indefBans.getStringList("uuids").stream().filter(string ->
{
try
{
UUID uuid = UUID.fromString(string);
return true;
} catch (IllegalArgumentException e)
{
return false;
}
}).map(UUID::fromString).toList());
this.bannedIPs.addAll(Plex.get().indefBans.getStringList("ips"));
this.bannedUsernames.addAll(Plex.get().indefBans.getStringList("usernames"));
PlexLog.log("Loaded {0} UUID(s), {1} IP(s), and {2} username(s) into the indefinite banned list", this.bannedUUIDs.size(), this.bannedIPs.size(), this.bannedUsernames.size());
if (Plex.get().getRedisConnection().isEnabled())
{
PlexLog.log("Resetting redis indefinite bans lists and asynchronously uploading from configuration");
Plex.get().getRedisConnection().runAsync(jedis -> {
jedis.set("indefbanned-uuids", new Gson().toJson(this.bannedUUIDs));
jedis.set("indefbanned-ips", new Gson().toJson(this.bannedIPs));
jedis.set("indefbanned-users", new Gson().toJson(this.bannedUsernames));
this.bannedIPs.clear();
this.bannedUsernames.clear();
this.bannedUUIDs.clear();
});
}
}
public boolean isIndefUUIDBanned(UUID uuid)
{
if (Plex.get().getRedisConnection().isEnabled())
{
List<UUID> uuids = new Gson().fromJson(Plex.get().getRedisConnection().getJedis().get("indefbanned-uuids"), new TypeToken<List<UUID>>(){}.getType());
return uuids.contains(uuid);
}
return this.bannedUUIDs.contains(uuid);
}
public boolean isIndefIPBanned(String ip)
{
if (Plex.get().getRedisConnection().isEnabled())
{
List<String> ips = new Gson().fromJson(Plex.get().getRedisConnection().getJedis().get("indefbanned-ips"), new TypeToken<List<String>>(){}.getType());
return ips.contains(ip);
}
return this.bannedIPs.contains(ip);
}
public boolean isIndefUserBanned(String username)
{
if (Plex.get().getRedisConnection().isEnabled())
{
List<String> users = new Gson().fromJson(Plex.get().getRedisConnection().getJedis().get("indefbanned-users"), new TypeToken<List<String>>(){}.getType());
return users.contains(username);
}
return this.bannedUsernames.contains(username);
}
public void insertPunishment(PunishedPlayer player, Punishment punishment) public void insertPunishment(PunishedPlayer player, Punishment punishment)
{ {
File file = player.getPunishmentsFile(); File file = player.getPunishmentsFile();
@ -123,7 +199,7 @@ public class PunishmentManager extends PlexBase
} }
}); });
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException ignored)
{ {
} }
@ -195,12 +271,6 @@ public class PunishmentManager extends PlexBase
private void issuePunishment(PunishedPlayer player, Punishment punishment) private void issuePunishment(PunishedPlayer player, Punishment punishment)
{ {
/*if (punishment.getType() == PunishmentType.BAN)
{
// Ban ban = new Ban(punishment.getPunished(), (punishment.getPunisher() == null ? null : punishment.getPunisher()), "", punishment.getReason(), punishment.getEndDate());
// Plex.get().getBanManager().executeBan(ban);
}
else*/
if (punishment.getType() == PunishmentType.FREEZE) if (punishment.getType() == PunishmentType.FREEZE)
{ {
player.setFrozen(true); player.setFrozen(true);

View File

@ -4,42 +4,12 @@ import dev.plex.PlexBase;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import redis.clients.jedis.Jedis; import redis.clients.jedis.Jedis;
import java.util.function.Consumer;
public class RedisConnection extends PlexBase public class RedisConnection extends PlexBase
{ {
private Jedis jedis; private Jedis jedis;
/*public JedisPool openPool()
{
JedisPoolConfig jedisConfig = new JedisPoolConfig();
//jedisConfig.setMaxIdle(10);
//jedisConfig.setMaxTotal(100);
ClassLoader previous = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(RedisConnection.class.getClassLoader());
this.pool = new JedisPool(jedisConfig, plugin.config.getString("data.side.hostname"),
plugin.config.getInt("data.side.port"));
Thread.currentThread().setContextClassLoader(previous);
PlexLog.log("Connected to Redis!");
return pool;
}
public Jedis getJedis()
{
try
{
this.jedis = pool.getResource();
}
catch (Exception ex)
{
PlexLog.error("An error occurred with Redis.");
ex.printStackTrace();
}
if (plugin.config.getBoolean("data.side.auth"))
{
jedis.auth(plugin.config.getString("data.side.password"));
}
return jedis;
}*/
public Jedis getJedis() public Jedis getJedis()
{ {
try try
@ -60,6 +30,16 @@ public class RedisConnection extends PlexBase
return jedis; return jedis;
} }
public void runAsync(Consumer<Jedis> jedisConsumer)
{
new Thread(() -> {
try (Jedis jedis = getJedis())
{
jedisConsumer.accept(jedis);
}
}).start();
}
public final boolean isEnabled() public final boolean isEnabled()
{ {
return plugin.config.getBoolean("data.side.enabled"); return plugin.config.getBoolean("data.side.enabled");

View File

@ -8,18 +8,39 @@ public class PlexLog extends PlexBase
{ {
private static final boolean debugEnabled = plugin.config.getBoolean("debug"); private static final boolean debugEnabled = plugin.config.getBoolean("debug");
public static void log(String message) public static void log(String message, Object... strings)
{ {
for (int i = 0; i < strings.length; i++)
{
if (message.contains("{" + i + "}"))
{
message = message.replace("{" + i + "}", strings[i].toString());
}
}
Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.YELLOW + "[Plex] " + ChatColor.GRAY + "%s", message)); Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.YELLOW + "[Plex] " + ChatColor.GRAY + "%s", message));
} }
public static void error(String message) public static void error(String message, Object... strings)
{ {
for (int i = 0; i < strings.length; i++)
{
if (message.contains("{" + i + "}"))
{
message = message.replace("{" + i + "}", strings[i].toString());
}
}
Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.RED + "[Plex Error] " + ChatColor.GOLD + "%s", message)); Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.RED + "[Plex Error] " + ChatColor.GOLD + "%s", message));
} }
public static void debug(String message) public static void debug(String message, Object... strings)
{ {
for (int i = 0; i < strings.length; i++)
{
if (message.contains("{" + i + "}"))
{
message = message.replace("{" + i + "}", strings[i].toString());
}
}
if (debugEnabled) if (debugEnabled)
{ {
Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.DARK_PURPLE + "[Plex Debug] " + ChatColor.GOLD + "%s", message)); Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.DARK_PURPLE + "[Plex Debug] " + ChatColor.GOLD + "%s", message));

View File

@ -158,7 +158,7 @@ public class PlexUtils extends PlexBase
public static Component messageComponent(String entry, Object... objects) public static Component messageComponent(String entry, Object... objects)
{ {
return MiniMessage.miniMessage().parse(messageString(entry, objects)); return MiniMessage.miniMessage().parse(LegacyComponentSerializer.legacySection().serialize(LegacyComponentSerializer.legacyAmpersand().deserialize(messageString(entry, objects))));
} }
public static String messageString(String entry, Object... objects) public static String messageString(String entry, Object... objects)

View File

@ -0,0 +1,13 @@
# Plex Indefinite Bans File
# Players with their UUID / IP / Usernames in here will be indefinitely banned until removed
# List of permanently banned UUIDs
# If you want to get someone's UUID, use https://api.ashcon.app/mojang/v2/user/<username>
uuids: []
# List of permanently banned IP addresses
ips: []
# List of permanently banned UUIDs
# If you want to get someone's username, use https://api.ashcon.app/mojang/v2/user/<uuid>, or just remember it
usernames: []

View File

@ -15,6 +15,7 @@
# 3. Expiry # 3. Expiry
# 4. Punisher # 4. Punisher
banMessage: "<red>You have been banned! You may appeal at <gold><v>.\n<red>Reason: <gold><v>\n<red>End date: <gold><v>\n<red>Banned by: <gold><v>" banMessage: "<red>You have been banned! You may appeal at <gold><v>.\n<red>Reason: <gold><v>\n<red>End date: <gold><v>\n<red>Banned by: <gold><v>"
indefBanMessage: "<red>Your <v> is currently banned! You may appeal at <gold><v>."
test: "this is a test message!" test: "this is a test message!"
# 1. The command sender's username # 1. The command sender's username
variableTest: "variable test with <v>!" variableTest: "variable test with <v>!"