From ca8faa4a44ce699b3ab44a9ce164c6e42c1c6fce Mon Sep 17 00:00:00 2001 From: James Mortemore Date: Sat, 30 May 2026 14:50:28 +0100 Subject: [PATCH] feat!: migrate WebEnhancer to BanManager v8 public API Adapt the WebEnhancer across all platforms (bukkit, bungee, sponge, velocity, fabric, common) to the new BanManagerAPI service interfaces and event hierarchy: - Replace removed per-platform BanListener/EventListener wiring with the shared API event subscriptions; report listeners updated accordingly. - Update storage and CommonPlayerDeniedListener against the new service surface; refresh DefaultConfig and the e2e platform configs/messages. Part of the coordinated v7 -> v8 release alongside BanManager feat/v8-public-api. --- .../webenhancer/bukkit/BukkitPlugin.java | 29 +- .../bukkit/listeners/ReportListener.java | 75 ++- .../webenhancer/bungee/BungeeCommand.java | 5 +- .../webenhancer/bungee/BungeePlugin.java | 32 +- .../bungee/listeners/BanListener.java | 41 -- common/build.gradle.kts | 1 + .../webenhancer/common/WebEnhancerPlugin.java | 83 +-- .../common/configs/DefaultConfig.java | 13 +- .../listeners/CommonPlayerDeniedListener.java | 56 ++- .../common/storage/LogStorage.java | 12 +- .../common/storage/PlayerPinStorage.java | 21 +- .../common/storage/ReportLogStorage.java | 12 +- .../CommonPlayerDeniedListenerTest.java | 99 ++-- .../banmanager-webenhancer/messages.yml | 3 + .../configs/banmanager-webenhancer/config.yml | 12 +- .../banmanager-webenhancer/messages.yml | 3 + .../bungee/configs/banmanager/config.yml | 5 +- .../banmanager/messages/messages_en.yml | 474 ++++++++++++++++++ .../configs/banmanager/notifications.yml | 59 +++ .../bungee/configs/banmanager/schedules.yml | 20 +- .../bungee/configs/banmanager/webhooks.yml | 282 +++++++++++ .../translations/repository/id_ID.properties | 1 + .../translations/repository/pl_PL.properties | 4 +- .../translations/repository/status.json | 2 +- .../translations/repository/zh_CN.properties | 2 +- .../translations/repository/zh_TW.properties | 2 +- .../banmanager-webenhancer/messages.yml | 3 + .../banmanager-webenhancer/messages.yml | 3 + .../banmanager-webenhancer/messages.yml | 3 + .../webenhancer/fabric/FabricPlugin.java | 24 +- .../fabric/listeners/EventListener.java | 37 -- .../fabric/listeners/ReportListener.java | 44 +- gradle.properties | 2 +- .../webenhancer/sponge/SpongeCommand.java | 5 +- .../webenhancer/sponge/SpongePlugin.java | 17 +- .../sponge/listeners/ReportListener.java | 74 ++- .../webenhancer/VelocityCommand.java | 5 +- .../webenhancer/velocity/VelocityPlugin.java | 28 +- .../velocity/listener/BanListener.java | 42 -- 39 files changed, 1227 insertions(+), 408 deletions(-) delete mode 100644 bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/listeners/BanListener.java create mode 100644 e2e/platforms/bungee/configs/banmanager/messages/messages_en.yml create mode 100644 e2e/platforms/bungee/configs/banmanager/notifications.yml create mode 100644 e2e/platforms/bungee/configs/banmanager/webhooks.yml delete mode 100644 fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/EventListener.java delete mode 100644 velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/listener/BanListener.java diff --git a/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/BukkitPlugin.java b/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/BukkitPlugin.java index 1575722..7dddfe1 100644 --- a/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/BukkitPlugin.java +++ b/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/BukkitPlugin.java @@ -1,19 +1,20 @@ package me.confuser.banmanager.webenhancer.bukkit; import lombok.Getter; +import me.confuser.banmanager.bukkit.BMBukkitPlugin; import me.confuser.banmanager.bukkit.BukkitCommand; import me.confuser.banmanager.bukkit.BukkitScheduler; import me.confuser.banmanager.bukkit.PluginLogger; -import org.bstats.bukkit.Metrics; import me.confuser.banmanager.common.commands.CommonCommand; import me.confuser.banmanager.common.configs.PluginInfo; import me.confuser.banmanager.common.configuration.ConfigurationSection; import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.webenhancer.bukkit.listeners.LogServerAppender; import me.confuser.banmanager.webenhancer.bukkit.listeners.ReportListener; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.bukkit.listeners.LogServerAppender; import org.apache.logging.log4j.LogManager; -import org.bukkit.event.Listener; +import org.bstats.bukkit.Metrics; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -35,23 +36,31 @@ public class BukkitPlugin extends JavaPlugin { @Override public void onEnable() { + BMBukkitPlugin banManager = (BMBukkitPlugin) Bukkit.getPluginManager().getPlugin("BanManager"); + if (banManager == null || banManager.getPlugin() == null) { + getLogger().severe("BanManager is not enabled — cannot start BanManager-WebEnhancer."); + getPluginLoader().disablePlugin(this); + return; + } + PluginInfo pluginInfo; try { pluginInfo = setupConfigs(); } catch (IOException e) { getPluginLoader().disablePlugin(this); - e.printStackTrace(); + getLogger().log(java.util.logging.Level.WARNING, "Failed to set up plugin configuration", e); return; } metrics = new Metrics(this, 8838); - plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), new BukkitScheduler(this), new BukkitMetrics(metrics)); + plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), + new BukkitScheduler(this), new BukkitMetrics(metrics), banManager.getPlugin()); try { plugin.enable(); } catch (Exception e) { getPluginLoader().disablePlugin(this); - e.printStackTrace(); + getLogger().log(java.util.logging.Level.WARNING, "Failed to enable BanManager-WebEnhancer", e); return; } @@ -102,7 +111,7 @@ private PluginInfo setupConfigs() throws IOException { public void setupCommands() { for (CommonCommand cmd : plugin.getCommands()) { try { - getCommand(cmd.getCommandName()).setExecutor(new BukkitCommand(cmd)); + getCommand(cmd.getCommandName()).setExecutor(new BukkitCommand(plugin.getBanManagerPlugin(), cmd)); } catch (NullPointerException e) { plugin.getLogger().severe("Failed to register /" + cmd.getCommandName() + " command"); } @@ -113,10 +122,6 @@ public void setupListeners() { appender = new LogServerAppender(plugin); ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); - registerEvent(new ReportListener(this)); - } - - private void registerEvent(Listener listener) { - getServer().getPluginManager().registerEvents(listener, this); + new ReportListener(this); } } diff --git a/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/listeners/ReportListener.java b/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/listeners/ReportListener.java index 8dac0ea..bfe7fc5 100644 --- a/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/listeners/ReportListener.java +++ b/bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/listeners/ReportListener.java @@ -1,50 +1,54 @@ package me.confuser.banmanager.webenhancer.bukkit.listeners; -import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.bukkit.api.events.PlayerBannedEvent; -import me.confuser.banmanager.bukkit.api.events.PlayerReportDeletedEvent; -import me.confuser.banmanager.bukkit.api.events.PlayerReportedEvent; -import me.confuser.banmanager.bukkit.api.events.PlayerDeniedEvent; -import me.confuser.banmanager.bukkit.api.events.PluginReloadedEvent; -import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.api.event.player.PlayerReportDeletedEvent; +import me.confuser.banmanager.api.event.player.PlayerReportedEvent; +import me.confuser.banmanager.api.event.player.PluginReloadedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; import me.confuser.banmanager.webenhancer.bukkit.BukkitPlugin; import me.confuser.banmanager.webenhancer.common.data.LogData; import me.confuser.banmanager.webenhancer.common.data.ReportLogData; -import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Queue; -import me.confuser.banmanager.common.BanManagerPlugin; -public class ReportListener implements Listener { +/** + * Bridges Bukkit's report lifecycle into WebEnhancer storage. + * + *

Subscribes to the cross-platform {@link me.confuser.banmanager.api.event.EventBus} + * — the per-platform {@code PlayerDeniedEvent}/{@code PlayerBannedEvent} + * handlers that used to live here have been consolidated into + * {@link me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener}.

+ */ +public class ReportListener { private final BukkitPlugin plugin; - private CommonPlayerDeniedListener listener; + private final BanManagerPlugin banManagerPlugin; public ReportListener(BukkitPlugin plugin) { this.plugin = plugin; - this.listener = new CommonPlayerDeniedListener(plugin.getPlugin()); + this.banManagerPlugin = plugin.getPlugin().getBanManagerPlugin(); + + var events = plugin.getPlugin().getBanManagerService().events(); + events.subscribe(PlayerReportedEvent.class, this::notifyOnReport); + events.subscribe(PlayerReportDeletedEvent.class, this::reportDeleted); + events.subscribe(PluginReloadedEvent.class, e -> plugin.getPlugin().setupConfigs()); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnReport(PlayerReportedEvent event) { + private void notifyOnReport(PlayerReportedEvent event) { List logs; Queue queue = plugin.getAppender().getQueue(); synchronized (queue) { logs = new ArrayList<>(queue); } - final int reportId = event.getReport().getId(); + final int reportId = event.report().id(); - BanManagerPlugin.getInstance().getScheduler().runAsync(() -> { + banManagerPlugin.getScheduler().runAsync(() -> { try { - PlayerReportData report = BanManagerPlugin.getInstance() - .getPlayerReportStorage().queryForId(reportId); + PlayerReportData report = banManagerPlugin.getPlayerReportStorage().queryForId(reportId); if (report == null) return; @@ -53,14 +57,13 @@ public void notifyOnReport(PlayerReportedEvent event) { plugin.getPlugin().getReportLogStorage().create(new ReportLogData(report, log)); } } catch (SQLException e) { - e.printStackTrace(); + plugin.getPlugin().getLogger().warning("Failed to attach report logs: " + e.getMessage()); } }); } - @EventHandler - public void reportDeleted(PlayerReportDeletedEvent event) { - int id = event.getReport().getId(); + private void reportDeleted(PlayerReportDeletedEvent event) { + int id = event.report().id(); DeleteBuilder builder = plugin.getPlugin().getReportLogStorage().deleteBuilder(); @@ -68,29 +71,7 @@ public void reportDeleted(PlayerReportDeletedEvent event) { builder.where().eq("report_id", id); builder.delete(); } catch (SQLException e) { - e.printStackTrace(); plugin.getLogger().warning("Failed to delete report associations for " + id); } } - - @EventHandler - public void onDeny(PlayerDeniedEvent event) { - listener.handlePin(event.getPlayer(), event.getMessage()); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onBanned(PlayerBannedEvent event) { - try { - Message kickMessage = event.getKickMessage(); - if (kickMessage != null) { - listener.handlePin(event.getBan().getPlayer(), kickMessage); - } - } catch (NoSuchMethodError ignored) { - } - } - - @EventHandler - public void onReload(PluginReloadedEvent event) { - plugin.getPlugin().setupConfigs(); - } } diff --git a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeeCommand.java b/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeeCommand.java index 9b96c6a..cf86279 100644 --- a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeeCommand.java +++ b/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeeCommand.java @@ -45,10 +45,11 @@ public void execute(CommandSender sender, String[] args) { } private CommonSender getSender(CommandSender source) { + BanManagerPlugin banManagerPlugin = plugin.getPlugin().getBanManagerPlugin(); if (source instanceof ProxiedPlayer) { - return new BungeePlayer((ProxiedPlayer) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + return new BungeePlayer(banManagerPlugin, (ProxiedPlayer) source, banManagerPlugin.getConfig().isOnlineMode()); } else { - return new BungeeSender(BanManagerPlugin.getInstance(), source); + return new BungeeSender(banManagerPlugin, source); } } diff --git a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeePlugin.java b/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeePlugin.java index 6e2a7ca..286d337 100644 --- a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeePlugin.java +++ b/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/BungeePlugin.java @@ -1,20 +1,22 @@ package me.confuser.banmanager.webenhancer.bungee; import lombok.Getter; +import me.confuser.banmanager.bungee.BMBungeePlugin; import me.confuser.banmanager.bungee.BungeeScheduler; import me.confuser.banmanager.bungee.PluginLogger; import me.confuser.banmanager.common.commands.CommonCommand; import me.confuser.banmanager.common.configs.PluginInfo; import me.confuser.banmanager.common.configuration.ConfigurationSection; import me.confuser.banmanager.common.configuration.file.YamlConfiguration; -import me.confuser.banmanager.webenhancer.bungee.BungeeCommand; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import org.bstats.bungeecord.Metrics; -import me.confuser.banmanager.webenhancer.bungee.listeners.*; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.nio.file.Files; public class BungeePlugin extends Plugin { @@ -29,25 +31,31 @@ public class BungeePlugin extends Plugin { @Override public void onEnable() { + BMBungeePlugin banManager = (BMBungeePlugin) getProxy().getPluginManager().getPlugin("BanManager"); + if (banManager == null || banManager.getPlugin() == null) { + getLogger().severe("BanManager is not enabled — cannot start BanManager-WebEnhancer."); + return; + } + PluginInfo pluginInfo; try { pluginInfo = setupConfigs(); } catch (IOException e) { - e.printStackTrace(); + getLogger().log(java.util.logging.Level.WARNING, "Failed to set up plugin configuration", e); return; } metrics = new Metrics(this, 14539); - plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), new BungeeScheduler(this), new BungeeMetrics(metrics)); + plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), + new BungeeScheduler(this), new BungeeMetrics(metrics), banManager.getPlugin()); try { plugin.enable(); } catch (Exception e) { - e.printStackTrace(); + getLogger().log(java.util.logging.Level.WARNING, "Failed to enable BanManager-WebEnhancer", e); return; } - setupListeners(); setupCommands(); } @@ -101,12 +109,4 @@ private void setupCommands() { getLogger().info("Registered commands"); } - - public void setupListeners() { - registerEvent(new BanListener(this)); - } - - private void registerEvent(Listener listener) { - getProxy().getPluginManager().registerListener(this, listener); - } } diff --git a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/listeners/BanListener.java b/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/listeners/BanListener.java deleted file mode 100644 index 6f0e91f..0000000 --- a/bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/listeners/BanListener.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.confuser.banmanager.webenhancer.bungee.listeners; - -import me.confuser.banmanager.bungee.api.events.PlayerBannedEvent; -import me.confuser.banmanager.bungee.api.events.PlayerDeniedEvent; -import me.confuser.banmanager.bungee.api.events.PluginReloadedEvent; -import me.confuser.banmanager.common.util.Message; -import me.confuser.banmanager.webenhancer.bungee.BungeePlugin; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.event.EventHandler; -import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; - -public class BanListener implements Listener { - private final BungeePlugin plugin; - private final CommonPlayerDeniedListener listener; - - public BanListener(BungeePlugin plugin) { - this.plugin = plugin; - this.listener = new CommonPlayerDeniedListener(plugin.getPlugin()); - } - - @EventHandler - public void onDeny(PlayerDeniedEvent event) { - listener.handlePin(event.getPlayer(), event.getMessage()); - } - - @EventHandler - public void onBanned(PlayerBannedEvent event) { - try { - Message kickMessage = event.getKickMessage(); - if (kickMessage != null) { - listener.handlePin(event.getBan().getPlayer(), kickMessage); - } - } catch (NoSuchMethodError ignored) { - } - } - - @EventHandler - public void onReload(PluginReloadedEvent event) { - plugin.getPlugin().setupConfigs(); - } -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 09242c1..61949b4 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -8,6 +8,7 @@ applyPlatformAndCoreConfiguration() dependencies { api(project(":BanManagerWebEnhancerLibs")) + api("me.confuser.banmanager:BanManagerAPI:8.0.0-SNAPSHOT") api("me.confuser.banmanager:BanManagerCommon:8.0.0-SNAPSHOT") api("me.confuser.banmanager.BanManagerLibs:BanManagerLibs:8.0.0-SNAPSHOT") diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/WebEnhancerPlugin.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/WebEnhancerPlugin.java index bbed957..cfb9e40 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/WebEnhancerPlugin.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/WebEnhancerPlugin.java @@ -1,42 +1,59 @@ package me.confuser.banmanager.webenhancer.common; import lombok.Getter; +import me.confuser.banmanager.api.BanManager; +import me.confuser.banmanager.api.BanManagerService; +import me.confuser.banmanager.api.database.DatabaseKind; +import me.confuser.banmanager.api.database.MigrationService; import me.confuser.banmanager.common.*; -import me.confuser.banmanager.common.api.BmAPI; import me.confuser.banmanager.common.commands.CommonCommand; import me.confuser.banmanager.common.configs.Config; import me.confuser.banmanager.common.configs.PluginInfo; -import me.confuser.banmanager.common.storage.migration.MigrationRunner; import me.confuser.banmanager.webenhancer.common.commands.PinCommand; import me.confuser.banmanager.webenhancer.common.configs.DefaultConfig; import me.confuser.banmanager.webenhancer.common.configs.MessagesConfig; +import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; +import me.confuser.banmanager.webenhancer.common.runnables.ExpiresSync; import me.confuser.banmanager.webenhancer.common.storage.LogStorage; import me.confuser.banmanager.webenhancer.common.storage.PlayerPinStorage; import me.confuser.banmanager.webenhancer.common.storage.ReportLogStorage; -import me.confuser.banmanager.webenhancer.common.runnables.ExpiresSync; import java.io.File; import java.sql.SQLException; import java.time.Duration; +import java.util.Objects; +/** + * Common WebEnhancer entry point. Each platform's bootstrap looks up the + * already-enabled BanManager plugin instance and passes it here, alongside + * platform glue (logger, scheduler, metrics). + * + *

The {@link BanManagerPlugin} reference is required because WebEnhancer + * shares BanManager's shaded ORMLite + entity layer (e.g. + * {@link me.confuser.banmanager.common.data.PlayerData}); running them as + * fully-isolated plugins would force WebEnhancer to maintain duplicate + * entities. WebEnhancer uses {@link BanManager#get()} for everything that + * is covered by the public API (events, migrations).

+ */ public class WebEnhancerPlugin { - private static WebEnhancerPlugin self; @Getter - private PluginInfo pluginInfo; + private final PluginInfo pluginInfo; @Getter private final CommonLogger logger; @Getter private final CommonMetrics metrics; + @Getter + private final BanManagerPlugin banManagerPlugin; + @Getter + private final BanManagerService banManagerService; - // Configs @Getter - private File dataFolder; + private final File dataFolder; @Getter private DefaultConfig config; @Getter - private CommonScheduler scheduler; + private final CommonScheduler scheduler; - // Storage @Getter private LogStorage logStorage; @Getter @@ -44,42 +61,46 @@ public class WebEnhancerPlugin { @Getter private PlayerPinStorage playerPinStorage; - public WebEnhancerPlugin(PluginInfo pluginInfo, CommonLogger logger, File dataFolder, CommonScheduler scheduler, CommonMetrics metrics) { - this.pluginInfo = pluginInfo; - this.logger = logger; - this.dataFolder = dataFolder; - this.scheduler = scheduler; - this.metrics = metrics; - self = this; + public WebEnhancerPlugin(PluginInfo pluginInfo, + CommonLogger logger, + File dataFolder, + CommonScheduler scheduler, + CommonMetrics metrics, + BanManagerPlugin banManagerPlugin) { + this.pluginInfo = Objects.requireNonNull(pluginInfo, "pluginInfo"); + this.logger = Objects.requireNonNull(logger, "logger"); + this.dataFolder = Objects.requireNonNull(dataFolder, "dataFolder"); + this.scheduler = Objects.requireNonNull(scheduler, "scheduler"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + this.banManagerPlugin = Objects.requireNonNull(banManagerPlugin, "banManagerPlugin"); + this.banManagerService = BanManager.get(); } public final void enable() throws Exception { setupConfigs(); - MigrationRunner webMigrations = new MigrationRunner( - BanManagerPlugin.getInstance(), - BmAPI.getLocalConnection(), - BanManagerPlugin.getInstance().getConfig().getLocalDb(), + banManagerService.migrations().run(new MigrationService.MigrationConfig( + DatabaseKind.LOCAL, "webenhancer", - "logs", - WebEnhancerPlugin.class.getClassLoader()); - webMigrations.migrate(); + "db/webenhancer", + WebEnhancerPlugin.class.getClassLoader(), + "logs")); try { setupStorage(); } catch (SQLException e) { - e.printStackTrace(); - throw new Exception("An error occurred attempting to make a database connection, please see stack trace below"); + throw new Exception("An error occurred attempting to make a database connection", e); } - // Schedule pin cleanup every 60 seconds + new CommonPlayerDeniedListener(this).register(); + scheduler.runAsyncRepeating(new ExpiresSync(this), Duration.ofSeconds(60), Duration.ofSeconds(60)); } public void setupConfigs() { loadConfigCompat(new MessagesConfig(dataFolder, logger)); - config = new DefaultConfig(dataFolder, logger); + config = new DefaultConfig(dataFolder, logger, banManagerPlugin); loadConfigCompat(config); } @@ -96,14 +117,14 @@ private void loadConfigCompat(Config config) { } public void setupStorage() throws SQLException { - logStorage = new LogStorage(BmAPI.getLocalConnection()); - reportLogStorage = new ReportLogStorage(BmAPI.getLocalConnection()); - playerPinStorage = new PlayerPinStorage(BmAPI.getLocalConnection()); + logStorage = new LogStorage(banManagerPlugin); + reportLogStorage = new ReportLogStorage(banManagerPlugin); + playerPinStorage = new PlayerPinStorage(banManagerPlugin); } public CommonCommand[] getCommands() { return new CommonCommand[]{ - new PinCommand(BanManagerPlugin.getInstance(), this) + new PinCommand(banManagerPlugin, this) }; } } diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/configs/DefaultConfig.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/configs/DefaultConfig.java index 9bb2a15..9f28a73 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/configs/DefaultConfig.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/configs/DefaultConfig.java @@ -1,10 +1,10 @@ package me.confuser.banmanager.webenhancer.common.configs; -import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; import lombok.Getter; import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.CommonLogger; import me.confuser.banmanager.common.configs.Config; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; import me.confuser.banmanager.webenhancer.common.data.LogData; import me.confuser.banmanager.webenhancer.common.data.PlayerPinData; import me.confuser.banmanager.webenhancer.common.data.ReportLogData; @@ -18,12 +18,14 @@ public class DefaultConfig extends Config { - private static HashMap tables = new HashMap() {{ + private static final HashMap> TABLES = new HashMap<>() {{ put("logs", LogData.class); put("reportLogs", ReportLogData.class); put("playerPins", PlayerPinData.class); }}; + private final BanManagerPlugin banManagerPlugin; + @Getter private ArrayList patterns; @Getter @@ -31,14 +33,15 @@ public class DefaultConfig extends Config { @Getter private int amount; - public DefaultConfig(File dataFolder, CommonLogger logger) { + public DefaultConfig(File dataFolder, CommonLogger logger, BanManagerPlugin banManagerPlugin) { super(dataFolder, "config.yml", logger); + this.banManagerPlugin = banManagerPlugin; } @Override public void afterLoad() { - for (Map.Entry entry : tables.entrySet()) { - BanManagerPlugin.getInstance().getConfig().getLocalDb() + for (Map.Entry> entry : TABLES.entrySet()) { + banManagerPlugin.getConfig().getLocalDb() .addTable(entry.getKey(), new DatabaseTableConfig<>(entry.getValue(), conf.getString("tables." + entry.getKey()), null)); } diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListener.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListener.java index cee7fa8..183fc5b 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListener.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListener.java @@ -1,25 +1,65 @@ package me.confuser.banmanager.webenhancer.common.listeners; +import me.confuser.banmanager.api.event.EventBus; +import me.confuser.banmanager.api.event.player.PlayerBannedEvent; +import me.confuser.banmanager.api.event.player.PlayerDeniedEvent; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.UUIDUtils; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; import me.confuser.banmanager.webenhancer.common.data.PlayerPinData; -import me.confuser.banmanager.common.data.PlayerData; -import me.confuser.banmanager.common.util.Message; +import java.sql.SQLException; +import java.util.Map; +import java.util.UUID; + +/** + * Subscribes to BanManager's typed event bus and injects the {@code } + * placeholder into kick / deny messages so operators can recover access via + * the web UI. + * + *

BanManager applies any entries added to {@code event.placeholders()} to + * the kick message template before rendering, so this listener never needs + * to touch BanManager's internal {@code Message} class.

+ */ public class CommonPlayerDeniedListener { - private WebEnhancerPlugin plugin; + private final WebEnhancerPlugin plugin; public CommonPlayerDeniedListener(WebEnhancerPlugin plugin) { this.plugin = plugin; } - public void handlePin(PlayerData player, Message message) { - String template = message.getRawTemplate(); - if (template == null || !template.contains("")) return; + public void register() { + EventBus events = plugin.getBanManagerService().events(); + events.subscribe(PlayerDeniedEvent.class, this::onDenied); + events.subscribe(PlayerBannedEvent.class, this::onBanned); + } - PlayerPinData pin = plugin.getPlayerPinStorage().getValidPin(player); + private void onDenied(PlayerDeniedEvent event) { + if (event.uuid().isEmpty()) return; + PlayerData player = lookupPlayer(event.uuid().get()); + if (player == null) return; + injectPin(player, event.placeholders()); + } + private void onBanned(PlayerBannedEvent event) { + PlayerData player = lookupPlayer(event.ban().player().uuid()); + if (player == null) return; + injectPin(player, event.placeholders()); + } + + private PlayerData lookupPlayer(UUID uuid) { + try { + return plugin.getBanManagerPlugin().getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)); + } catch (SQLException e) { + plugin.getLogger().warning("Failed to look up player " + uuid + " for pin injection: " + e.getMessage()); + return null; + } + } + + private void injectPin(PlayerData player, Map placeholders) { + PlayerPinData pin = plugin.getPlayerPinStorage().getValidPin(player); if (pin != null) { - message.set("pin", String.valueOf(pin.getGeneratedPin())); + placeholders.put("pin", String.valueOf(pin.getGeneratedPin())); } } } diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/LogStorage.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/LogStorage.java index 9dff03d..2b833ae 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/LogStorage.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/LogStorage.java @@ -1,11 +1,10 @@ package me.confuser.banmanager.webenhancer.common.storage; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; -import me.confuser.banmanager.common.ormlite.support.ConnectionSource; import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; import me.confuser.banmanager.common.ormlite.table.TableUtils; -import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.webenhancer.common.data.LogData; import java.sql.SQLException; @@ -13,12 +12,13 @@ public class LogStorage extends BaseDaoImpl { - public LogStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManagerPlugin.getInstance().getConfig().getLocalDb() - .getTable("logs")); + @SuppressWarnings("unchecked") + public LogStorage(BanManagerPlugin banManagerPlugin) throws SQLException { + super(banManagerPlugin.getLocalConn(), + (DatabaseTableConfig) banManagerPlugin.getConfig().getLocalDb().getTable("logs")); if (!isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(banManagerPlugin.getLocalConn(), tableConfig); } } diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/PlayerPinStorage.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/PlayerPinStorage.java index 023c274..1d084bd 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/PlayerPinStorage.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/PlayerPinStorage.java @@ -1,15 +1,14 @@ package me.confuser.banmanager.webenhancer.common.storage; -import me.confuser.banmanager.webenhancer.common.google.guava.cache.Cache; -import me.confuser.banmanager.webenhancer.common.google.guava.cache.CacheBuilder; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.common.ormlite.support.ConnectionSource; import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; import me.confuser.banmanager.common.ormlite.table.TableUtils; -import me.confuser.banmanager.common.BanManagerPlugin; -import me.confuser.banmanager.common.data.PlayerData; import me.confuser.banmanager.webenhancer.common.data.PlayerPinData; +import me.confuser.banmanager.webenhancer.common.google.guava.cache.Cache; +import me.confuser.banmanager.webenhancer.common.google.guava.cache.CacheBuilder; import java.security.NoSuchAlgorithmException; import java.sql.SQLException; @@ -19,18 +18,18 @@ public class PlayerPinStorage extends BaseDaoImpl { private static final int RATE_LIMIT_SECONDS = 30; - private Cache rateLimitCache = CacheBuilder.newBuilder() + private final Cache rateLimitCache = CacheBuilder.newBuilder() .expireAfterWrite(RATE_LIMIT_SECONDS, TimeUnit.SECONDS) .maximumSize(200) .build(); - public PlayerPinStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManagerPlugin.getInstance().getConfig() - .getLocalDb() - .getTable("playerPins")); + @SuppressWarnings("unchecked") + public PlayerPinStorage(BanManagerPlugin banManagerPlugin) throws SQLException { + super(banManagerPlugin.getLocalConn(), + (DatabaseTableConfig) banManagerPlugin.getConfig().getLocalDb().getTable("playerPins")); if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(banManagerPlugin.getLocalConn(), tableConfig); } } diff --git a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/ReportLogStorage.java b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/ReportLogStorage.java index eb1e878..aaa6af8 100644 --- a/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/ReportLogStorage.java +++ b/common/src/main/java/me/confuser/banmanager/webenhancer/common/storage/ReportLogStorage.java @@ -1,22 +1,22 @@ package me.confuser.banmanager.webenhancer.common.storage; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; -import me.confuser.banmanager.common.ormlite.support.ConnectionSource; import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; import me.confuser.banmanager.common.ormlite.table.TableUtils; -import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.webenhancer.common.data.ReportLogData; import java.sql.SQLException; public class ReportLogStorage extends BaseDaoImpl { - public ReportLogStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManagerPlugin.getInstance().getConfig().getLocalDb() - .getTable("reportLogs")); + @SuppressWarnings("unchecked") + public ReportLogStorage(BanManagerPlugin banManagerPlugin) throws SQLException { + super(banManagerPlugin.getLocalConn(), + (DatabaseTableConfig) banManagerPlugin.getConfig().getLocalDb().getTable("reportLogs")); if (!isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(banManagerPlugin.getLocalConn(), tableConfig); } } diff --git a/common/src/test/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListenerTest.java b/common/src/test/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListenerTest.java index 1bbcb1f..5b03399 100644 --- a/common/src/test/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListenerTest.java +++ b/common/src/test/java/me/confuser/banmanager/webenhancer/common/listeners/CommonPlayerDeniedListenerTest.java @@ -1,24 +1,51 @@ package me.confuser.banmanager.webenhancer.common.listeners; +import me.confuser.banmanager.api.event.player.PlayerDeniedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.data.PlayerData; -import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.storage.PlayerStorage; +import me.confuser.banmanager.common.util.UUIDUtils; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; import me.confuser.banmanager.webenhancer.common.data.PlayerPinData; import me.confuser.banmanager.webenhancer.common.storage.PlayerPinStorage; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.Mockito.*; - +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Verifies the WebEnhancer listener mutates the API event's + * {@link PlayerDeniedEvent#placeholders()} map rather than touching + * BanManager's internal {@code Message} class — BanManager itself applies + * those placeholders to the kick template before rendering. + */ @ExtendWith(MockitoExtension.class) public class CommonPlayerDeniedListenerTest { @Mock private WebEnhancerPlugin plugin; + @Mock + private BanManagerPlugin banManagerPlugin; + + @Mock + private PlayerStorage playerStorage; + @Mock private PlayerPinStorage playerPinStorage; @@ -30,56 +57,66 @@ public class CommonPlayerDeniedListenerTest { private CommonPlayerDeniedListener listener; - @BeforeEach - public void setUp() { + private final UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000001"); + + private void wireMocks() throws Exception { + lenient().when(plugin.getBanManagerPlugin()).thenReturn(banManagerPlugin); lenient().when(plugin.getPlayerPinStorage()).thenReturn(playerPinStorage); + lenient().when(banManagerPlugin.getPlayerStorage()).thenReturn(playerStorage); + lenient().when(playerStorage.queryForId(any(byte[].class))).thenReturn(player); listener = new CommonPlayerDeniedListener(plugin); } + /** Reflection: the {@code onDenied} method is package-private. */ + private void invokeOnDenied(PlayerDeniedEvent event) throws Exception { + Method m = CommonPlayerDeniedListener.class + .getDeclaredMethod("onDenied", PlayerDeniedEvent.class); + m.setAccessible(true); + m.invoke(listener, event); + } + @Test - public void handlePin_replacesPlaceholderWithPin() { + public void onDenied_addsPinPlaceholder() throws Exception { + wireMocks(); when(playerPinStorage.getValidPin(player)).thenReturn(pinData); when(pinData.getGeneratedPin()).thenReturn(123456); - Message message = mock(Message.class); - when(message.getRawTemplate()).thenReturn("Your login pin is: "); + Map placeholders = new HashMap<>(); + PlayerDeniedEvent event = mock(PlayerDeniedEvent.class); + when(event.uuid()).thenReturn(Optional.of(uuid)); + when(event.placeholders()).thenReturn(placeholders); - listener.handlePin(player, message); + invokeOnDenied(event); - verify(message).set("pin", "123456"); + assertEquals("123456", placeholders.get("pin")); } @Test - public void handlePin_ignoresMessagesWithoutPlaceholder() { - Message message = mock(Message.class); - when(message.getRawTemplate()).thenReturn("You have been banned!"); - - listener.handlePin(player, message); - - verify(playerPinStorage, never()).getValidPin(any()); - verify(message, never()).set(anyString(), anyString()); - } + public void onDenied_skipsWhenNoUuid() throws Exception { + wireMocks(); - @Test - public void handlePin_ignoresMessagesWithNullTemplate() { - Message message = mock(Message.class); - when(message.getRawTemplate()).thenReturn(null); + Map placeholders = new HashMap<>(); + PlayerDeniedEvent event = mock(PlayerDeniedEvent.class); + when(event.uuid()).thenReturn(Optional.empty()); - listener.handlePin(player, message); + invokeOnDenied(event); verify(playerPinStorage, never()).getValidPin(any()); - verify(message, never()).set(anyString(), anyString()); + assertTrue(placeholders.isEmpty()); } @Test - public void handlePin_handlesNullPinGracefully() { + public void onDenied_skipsWhenNoPin() throws Exception { + wireMocks(); when(playerPinStorage.getValidPin(player)).thenReturn(null); - Message message = mock(Message.class); - when(message.getRawTemplate()).thenReturn("Your login pin is: "); + Map placeholders = new HashMap<>(); + PlayerDeniedEvent event = mock(PlayerDeniedEvent.class); + when(event.uuid()).thenReturn(Optional.of(uuid)); + when(event.placeholders()).thenReturn(placeholders); - listener.handlePin(player, message); + invokeOnDenied(event); - verify(message, never()).set(anyString(), anyString()); + assertTrue(placeholders.isEmpty()); } } diff --git a/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml index 4ea98a0..9c7e905 100644 --- a/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml @@ -1,3 +1,6 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: notify: 'Your pin expires in ' diff --git a/e2e/platforms/bungee/configs/banmanager-webenhancer/config.yml b/e2e/platforms/bungee/configs/banmanager-webenhancer/config.yml index 58c055b..3dd1a91 100644 --- a/e2e/platforms/bungee/configs/banmanager-webenhancer/config.yml +++ b/e2e/platforms/bungee/configs/banmanager-webenhancer/config.yml @@ -1,16 +1,18 @@ -# -# Number of lines to log with each report tables: logs: bm_server_logs reportLogs: bm_report_logs playerPins: bm_player_pins +# Number of lines to log with each report lines: 30 +# Allows using regex to filter logs +ignorePatterns: +# Basic contain checks ignoreContains: - 'issued server command: /report' -- has been reported by +- 'has been reported by' - '[BanManager]' - '[PlugMan]' -- Metrics -- For help, type "help" +- 'Metrics' +- 'For help, type "help"' - 'HikariDataSource' - 'TableUtils' diff --git a/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml index 4ea98a0..9c7e905 100644 --- a/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml @@ -1,3 +1,6 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: notify: 'Your pin expires in ' diff --git a/e2e/platforms/bungee/configs/banmanager/config.yml b/e2e/platforms/bungee/configs/banmanager/config.yml index 6f77dac..115a2f2 100644 --- a/e2e/platforms/bungee/configs/banmanager/config.yml +++ b/e2e/platforms/bungee/configs/banmanager/config.yml @@ -1,5 +1,8 @@ -# +# # Aliases will be found and blocked automatically, e.g. msg will block tell +locale: + default: en + perPlayer: true debug: false databases: local: diff --git a/e2e/platforms/bungee/configs/banmanager/messages/messages_en.yml b/e2e/platforms/bungee/configs/banmanager/messages/messages_en.yml new file mode 100644 index 0000000..1930ce4 --- /dev/null +++ b/e2e/platforms/bungee/configs/banmanager/messages/messages_en.yml @@ -0,0 +1,474 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , , , + +tokens: + appeal_url: 'https://yourdomain.com/appeal' + server_name: 'My Server' + discord_url: 'https://discord.gg/example' + rules_url: 'https://yourdomain.com/rules' + +messages: + duplicateIP: 'Warning: has the same IP as the following banned players:\n' + duplicateIPAlts: 'Warning: has the same IP as the following players:\n' + configReloaded: 'Configuration reloaded successfully!' + deniedNotify: + player: 'Warning: attempted to join the server but was denied due to ' + ip: 'Warning: attempted to join the server but was denied due to ' + deniedMaxIp: 'Too many players with your ip address online' + deniedMultiaccounts: 'Too many players with your ip address logged in recently' + deniedCountry: 'You may not connect from your region' + + time: + now: 'now' + year: 'year' + years: 'years' + month: 'month' + months: 'months' + week: 'week' + weeks: 'weeks' + day: 'day' + days: 'days' + hour: 'hour' + hours: 'hours' + minute: 'minute' + minutes: 'minutes' + second: 'second' + seconds: 'seconds' + never: 'never' + error: + invalid: 'Your time length is invalid' + limit: 'You cannot perform this action for that length of time' + + none: 'none' + # General command text + sender: + error: + notFound: ' not found, are you sure they exist?' + offline: ' is offline' + noSelf: 'You cannot perform that action on yourself!' + exception: 'An error occurred whilst attempting to perform this command. Please check the console for further details.' + invalidIp: 'Invalid IP address, expecting w.x.y.z format' + offlinePermission: 'You are not allowed to perform this action on an offline player' + ambiguousPlayer: 'Multiple players match "". Please use their full name.' + exempt: ' is exempt from that action' + noPermission: 'You do not have permission to perform that action' + noConsole: 'This command cannot be used from console' + invalidReason: ' is not a valid reason.' + # Commands + alts: + header: 'Possible alts found:' + entry: '">' + separator: ', ' + + names: + header: 'Known names for :' + row: ' (first: , last: )' + interactive: ' (first: , last: )">">' + separator: ', ' + dateTimeFormat: 'dd-MM-yyyy' + none: 'No name history found' + + export: + error: + inProgress: 'An export is already in progress, please wait' + player: + started: 'Player ban export started' + finished: 'Player ban export finished, file created' + ip: + started: 'IP ban export started' + finished: 'IP ban export finished, file created' + + import: + error: + inProgress: 'An import is already in progress, please wait' + player: + started: 'Player ban import started' + finished: 'Player ban import finished' + ip: + started: 'IP ban import started' + finished: 'IP ban import finished' + advancedban: + started: 'AdvancedBan import started' + finished: 'AdvancedBan import finished' + h2: + started: 'H2 import started' + finished: 'H2 import finished, please restart the server' + litebans: + started: 'LiteBans import started' + finished: 'LiteBans import finished' + + info: + error: + invalidIndex: 'Invalid player option used' + indexRequired: 'Multiple players named found, please select a player by providing an index between 1 and , e.g. /bminfo 1' + index: '# - - ' + stats: + player: ' has been banned times, muted times, kicked times and warned + times ( Points), has notes and been reported times' + ip: 'This ip has been banned times, muted times and range banned times' + connection: 'Their last connection was with on ' + geoip: 'Country: City: ' + ban: + permanent: 'Currently banned for by at ' + temporary: 'Currently banned for by at which expires in ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + ipban: + permanent: 'Currently banned for by at ' + temporary: 'Currently banned for by at which expires in ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + iprangeban: + permanent: ' - banned for by at ' + temporary: ' - banned for by at which expires in ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + ipmute: + permanent: 'Currently muted for by at ' + temporary: 'Currently muted for by at which expires in ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + mute: + permanent: 'Currently muted for by at ' + temporary: 'Currently muted for by at which expires in ' + temporaryOnline: 'Currently muted for by at which expires in (online time)' + temporaryOnlinePaused: 'Currently muted for by at with remaining (online time, paused)' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + website: + player: 'https://yourdomain.com/player/' + ip: 'http://yourdomain.com/index.php?action=viewip&ip=&server=0' + history: + row: '# [] - ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + noResults: 'No results found' + ips: + row: ' - - ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + + kick: + player: + noReason: 'You have been kicked' + reason: 'You have been kicked for ' + notify: + noReason: ' has been kicked by ">View player info">[Info]' + reason: ' has been kicked by for ">View player info">[Info]' + + kickall: + player: + noReason: 'You have been kicked' + reason: 'You have been kicked for ' + notify: + noReason: 'All players have been kicked by ' + reason: 'All players have been kicked by for ' + + ban: + player: + disallowed: 'You are banned from this server\n \nReason: \nBanned by: \nDate: \n \nAppeal at ' + kick: 'You have been banned\n \nReason: \nBanned by: \nDate: \n \nAppeal at ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: ' has been permanently banned by for ">View player info">[Info] ">Unban player">[Unban]' + error: + exists: ' is already banned' + cooldown: 'This player was banned too recently, try again later' + + banall: + notify: ' will be permanently banned by for ' + + tempban: + player: + disallowed: 'You are temporarily banned from this server\n \nReason: \nBanned by: \nExpires: \nDate: \n \nAppeal at ' + kick: 'You have been temporarily banned\n \nReason: \nBanned by: \nExpires: \nDate: \n \nAppeal at ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: ' has been temporarily banned for by for ">View player info">[Info] ">Unban player">[Unban]' + + tempbanall: + notify: ' will be temporarily banned for by for ' + + unban: + notify: ' has been unbanned by ' + error: + noExists: ' is not banned' + notOwn: ' was not banned by you, unable to unban' + + unbanall: + notify: ' will be unbanned by ' + + mute: + player: + blocked: 'You may not use the command whilst muted!' + disallowed: 'You have been permanently muted for by ' + broadcast: '[Muted] ' + notify: ' has been permanently muted by for ">View player info">[Info] ">Unmute player">[Unmute]' + error: + exists: ' is already muted' + cooldown: 'This player was muted too recently, try again later' + + muteip: + ip: + disallowed: 'You have been permanently muted for by ' + broadcast: '[Muted] ' + notify: ' () have been permanently muted by for ' + error: + exists: ' is already muted' + + muteall: + notify: ' will be permanently muted by for ' + + tempmute: + player: + disallowed: 'You have been temporarily muted for by which expires in ' + disallowedOnline: 'You have been temporarily muted for by which expires in (online time)' + notify: ' has been temporarily muted for by for ">View player info">[Info] ">Unmute player">[Unmute]' + notifyOnline: ' has been temporarily muted for (online time) by for ' + error: + exists: ' is already muted' + + tempmuteip: + ip: + disallowed: 'You have been temporarily muted for by which expires in ' + notify: ' () have been temporarily muted for by for ' + error: + exists: ' is already muted' + + tempmuteall: + notify: ' will be temporarily muted for by for ' + + unmute: + notify: ' has been unmuted by ' + player: 'You have been unmuted by ' + error: + noExists: ' is not muted' + notOwn: ' was not muted by you, unable to unmute' + + unmuteip: + notify: ' has been unmuted by ' + error: + noExists: ' is not muted' + notOwn: ' was not muted by you, unable to unmute' + + unmuteall: + notify: ' will be unmuted by ' + + banname: + name: + disallowed: 'You have been banned from this server for ' + kick: 'You have been banned permanently for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: 'Name has been permanently banned by for ' + error: + exists: 'Name is already banned' + + tempbanname: + name: + disallowed: 'You have been banned from this server for \nIt expires in ' + kick: 'You have been temporarily banned for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: 'Name has been temporarily banned for by for ' + + unbanname: + notify: 'Name has been unbanned by ' + error: + noExists: 'Name is not banned' + + banip: + ip: + disallowed: 'You have been banned from this server for ' + kick: 'You have been banned permanently for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: ' () has been permanently banned by for ' + error: + exists: ' is already banned' + cooldown: 'This ip was banned too recently, try again later' + + baniprange: + error: + invalid: 'Invalid range, please use cidr notation 192.168.0.1/16 or wildcard 192.168.*.*' + minMax: 'Range must be lowest to highest' + exists: 'A ban containing those ranges already exists' + ip: + disallowed: 'You have been banned from this server for ' + kick: 'You have been banned permanently for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: ' - have been banned by ' + + tempbaniprange: + notify: ' - has been temporarily banned for by ' + ip: + disallowed: 'You have been banned from this server for \nIt expires in ' + kick: 'You have been temporarily banned for by for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + + unbaniprange: + notify: ' - has been unbanned by ' + + banipall: + notify: ' will be permanently banned by for ' + + tempbanip: + ip: + disallowed: 'You have been banned from this server for \nIt expires in ' + kick: 'You have been temporarily banned for ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: ' () has been temporarily banned for by for ' + + tempbanipall: + notify: ' will be temporarily banned for by for ' + + unbanip: + notify: ' has been unbanned by ' + error: + noExists: ' is not banned' + notOwn: ' was not banned by you, unable to unban' + + unbanipall: + notify: ' will be unbanned by ' + + warn: + player: + warned: 'You have been warned by for ' + disallowed: + header: 'You may not speak until you have accepted your most recent warning. Please type the following:' + reason: '' + removed: 'Thank you for your understanding, you may now speak again' + notify: ' has been warned by for ">View player info">[Info]' + error: + cooldown: 'This player was warned too recently, try again later' + + tempwarn: + player: + warned: 'You have been warned for by for ' + notify: ' has been warned for by for ">View player info">[Info]' + + dwarn: + player: + notify: 'Your most recent warning has been deleted by ' + notify: 'The most recent warning for has been deleted' + error: + noWarnings: ' has no warnings to delete' + + bmclear: + notify: ' has had their cleared' + error: + invalid: 'Invalid type, please choose between banrecords, muterecords, kicks, notes or warnings' + + bmutils: + missingplayers: + notify: ' missing players added' + noneFound: '0 missing players found' + found: ' missing player data found. Fixing...' + error: + failedLookup: 'Failed to lookup player , check server logs' + complete: ' players resolved, please restart your server for failed punishments to take affect' + duplicates: + lookup: + notFound: 'No duplicate player names found' + error: + invalidName: 'Invalid name, must be 16 characters or less and contain only letters, numbers and an underscore' + nameExists: 'A player with that name already exists' + success: 'Player name set to successfully' + + bmrollback: + notify: ' has had their actions undone' + error: + invalid: 'Invalid type , please choose between ' + + sync: + player: + started: 'Starting force synchronisation' + finished: 'Forced synchronisation complete' + + update: + notify: '[BanManager] An update is available' + + notes: + header: ' has the following notes:' + joinAmount: '"> has notes, click to view them' + note: '[] - ' + playerNote: '[] [] - ' + dateTimeFormat: 'dd-MM-yyyy' + notify: ' has a new note attached by : ' + error: + noNotes: ' has no notes' + noOnlineNotes: 'No online players have notes' + + report: + notify: ' has been reported by for ' + error: + cooldown: 'This player was reported too recently, try again later' + assign: + player: 'Report assigned to ' + notify: 'You have been assigned report by ' + unassign: + player: 'Report unassigned' + close: + notify: + closed: 'Report closed by ' + command: 'Report closed by with ' + comment: 'Report closed by with ' + dispatch: 'Executing command ' + list: + noResults: 'No reports found' + error: + invalidState: 'Report state not found' + row: + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + header: '-- Reports () -- Page (/)' + all: '">Click to view details"># [] - - ' + tp: + error: + notFound: 'Report not found' + worldNotFound: 'World could not be found' + invalidId: ' is not a valid report id' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: + report: '# reported for at ' + location: ' - , , ' + info: + error: + notFound: 'Report not found' + invalidId: ' is not a valid report id' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + notify: + report: '# reported for at ' + location: ' - , , ' + actions: + assign: '">Assign to yourself">[Assign]' + close: '">Close this report">[Close]' + tp: '">Teleport to location">[TP]' + feedback: + assigned: 'Your report # has been assigned to ' + closed: 'Your report # has been closed by ' + + addnoteall: + notify: ' will have a new note attached by : ' + + banlist: + header: 'There are bans:' + row: + player: '">Click for info"> - ' + ip: ' - ' + iprange: ' - - ' + + bmactivity: + row: + all: '[] - - ' + player: '[] - ' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + noResults: 'No results found' + + bmdelete: + notify: ' rows deleted' + error: + invalid: 'Invalid type, please choose between banrecords, muterecords, kicks, notes or warnings' + invalidId: ' is not a valid number' + + denyalts: + player: + disallowed: 'The IP address you are joining from is linked to a banned player' + + reasons: + row: ' = ' + + dashboard: + header: ' Staff Dashboard ' + activeBans: 'Active Bans: ' + activeMutes: 'Active Mutes: ' + openReports: 'Open Reports: View reports">[View]' + recentActivity: 'Recent Activity (24h): ' + footer: ' ' diff --git a/e2e/platforms/bungee/configs/banmanager/notifications.yml b/e2e/platforms/bungee/configs/banmanager/notifications.yml new file mode 100644 index 0000000..89ac64c --- /dev/null +++ b/e2e/platforms/bungee/configs/banmanager/notifications.yml @@ -0,0 +1,59 @@ +# Notifications Configuration +# Controls how punishment notifications are delivered to staff and players +staff: + ban: + chat: true + actionbar: false + title: false + sound: entity.experience_orb.pickup + soundVolume: 1.0 + soundPitch: 1.0 + tempban: + chat: true + actionbar: false + title: false + sound: entity.experience_orb.pickup + soundVolume: 1.0 + soundPitch: 1.0 + mute: + chat: true + actionbar: false + title: false + sound: '' + soundVolume: 1.0 + soundPitch: 1.0 + tempmute: + chat: true + actionbar: false + title: false + sound: '' + soundVolume: 1.0 + soundPitch: 1.0 + warn: + chat: true + actionbar: false + title: false + sound: entity.experience_orb.pickup + soundVolume: 1.0 + soundPitch: 1.0 + report: + chat: true + actionbar: false + title: false + sound: block.note_block.pling + soundVolume: 1.0 + soundPitch: 1.0 + duplicateIp: + chat: true + actionbar: false + title: false + sound: '' + soundVolume: 1.0 + soundPitch: 1.0 +player: + muted: + actionbar: true + warned: + sound: entity.villager.no + soundVolume: 1.0 + soundPitch: 1.0 diff --git a/e2e/platforms/bungee/configs/banmanager/schedules.yml b/e2e/platforms/bungee/configs/banmanager/schedules.yml index ab55a12..01ce05a 100644 --- a/e2e/platforms/bungee/configs/banmanager/schedules.yml +++ b/e2e/platforms/bungee/configs/banmanager/schedules.yml @@ -16,15 +16,15 @@ scheduler: externalIpBans: 5 saveLastChecked: 60 lastChecked: - playerMutes: 1767059851 - expiresCheck: 1767059851 - nameBans: 1767059851 - playerBans: 1767059851 - playerWarnings: 1767059851 - externalPlayerNotes: 0 - ipRangeBans: 1767059851 - externalPlayerMutes: 0 - rollbacks: 1767059846 + playerBans: 1776621252 + playerMutes: 1776621247 + playerWarnings: 1776621252 + ipBans: 1776621252 + ipRangeBans: 1776621252 + expiresCheck: 1776621252 + rollbacks: 1776621241 + nameBans: 1776621252 externalPlayerBans: 0 + externalPlayerMutes: 0 + externalPlayerNotes: 0 externalIpBans: 0 - ipBans: 1767059851 diff --git a/e2e/platforms/bungee/configs/banmanager/webhooks.yml b/e2e/platforms/bungee/configs/banmanager/webhooks.yml new file mode 100644 index 0000000..24427eb --- /dev/null +++ b/e2e/platforms/bungee/configs/banmanager/webhooks.yml @@ -0,0 +1,282 @@ +# Webhooks Configuration +# More info at https://banmanagement.com/docs/banmanager/configuration/webhooks-yml +hooks: + enabled: false + punishments: + ban: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] banned' + description: '[reason]' + color: 10033947 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + tempban: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] banned' + description: '[reason]' + color: 15680580 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + unban: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] unbanned' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + banip: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[ip] Banned' + description: '[reason]' + color: 10033947 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + tempbanip: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[ip] banned' + description: '[reason]' + color: 15680580 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + unbanip: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[ip] Unbanned' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + kick: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] kicked' + description: '[reason]' + color: 16776960 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + mute: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] muted' + description: '[reason]' + color: 3616931 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + tempmute: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] muted' + description: '[reason]' + color: 6514417 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + unmute: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] unmuted' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + tempwarning: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] warned' + description: '[reason]' + color: 16096779 + fields: + - name: Duration + value: '[expires]' + inline: true + - name: Points + value: '[points]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + warning: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] warned' + description: '[reason]' + color: 9584654 + fields: + - name: Points + value: '[points]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 + report: + url: https://discord.com/api/webhooks/changeMe + method: POST + headers: {} + ignoreSilent: true + payload: + embeds: + - title: '[player] reported' + description: '[reason]' + color: 16737894 + fields: + - name: '[player] location' + value: '[playerX] [playerY] [playerZ] [playerPitch] [playerYaw] [playerWorld]' + inline: true + - name: '[actor] location' + value: '[actorX] [actorY] [actorZ] [actorPitch] [actorYaw] [actorWorld]' + inline: true + author: + name: BanManager + url: https://banmanagement.com + icon_url: https://banmanagement.com/images/banmanager-icon.png + footer: + text: 'By: [actor]' + icon_url: https://crafthead.net/helm/[actorId]/128 + thumbnail: + url: https://crafthead.net/helm/[playerId]/128 diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties index 45780bf..5d319a7 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties @@ -464,6 +464,7 @@ luckperms.usage.parent-info.argument.sort-mode=bagaimana cara mengurutkan entri luckperms.usage.parent-set.argument.group=kelompok ditetapkan ke luckperms.usage.parent-remove.argument.group=kelompok untuk dihapus luckperms.usage.parent-remove-temp.argument.group=kelompok untuk dihapus +luckperms.usage.parent-remove-temp.argument.duration=durasi untuk mengurangi luckperms.usage.parent-clear.argument.context=konteks untuk difilter berdasarkan luckperms.usage.parent-clear-track.argument.context=konteks untuk difilter berdasarkan luckperms.usage.meta-info.description=Menampilkan semua meta chat diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/pl_PL.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/pl_PL.properties index 68822cf..e5a9c75 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/pl_PL.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/pl_PL.properties @@ -10,9 +10,9 @@ luckperms.commandsystem.usage.sub-commands-header=Pod komendą luckperms.commandsystem.usage.usage-header=Użycie komend luckperms.commandsystem.usage.arguments-header=Argumenty luckperms.first-time.no-permissions-setup=Wygląda na to, że żadne uprawnienia nie zostały jeszcze skonfigurowane\! -luckperms.first-time.use-console-to-give-access=Zanim będziesz mógł użyć jakichkolwiek poleceń LuckPerms w grze, musisz użyć konsoli aby dać sobie dostęp +luckperms.first-time.use-console-to-give-access=Zanim będziesz mógł użyć jakichkolwiek poleceń LuckPerms w grze, musisz użyć konsoli, aby dać sobie dostęp luckperms.first-time.console-command-prompt=Otwórz konsolę i uruchom -luckperms.first-time.next-step=Po tym jak to zrobisz, możesz zacząć definiować uprawnienia i grupy +luckperms.first-time.next-step=Po tym, jak to zrobisz, możesz zacząć definiować uprawnienia i grupy luckperms.first-time.wiki-prompt=Nie wiesz gdzie zacząć? Sprawdź tutaj\: {0} luckperms.login.try-again=Spróbuj ponownie później luckperms.login.loading-database-error=Wystąpił błąd bazy danych podczas wczytywania uprawnień diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json b/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json index be95207..4059943 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json @@ -1,3 +1,3 @@ { - "lastRefresh": 1767059572795 + "lastRefresh": 1776621127167 } \ No newline at end of file diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_CN.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_CN.properties index e6eba6c..e41e648 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_CN.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_CN.properties @@ -283,7 +283,7 @@ luckperms.command.track.error-ambiguous=无法确定其位置 luckperms.command.track.already-contains={0} 已经包含 {1} luckperms.command.track.doesnt-contain={0} 没有包含 {1} luckperms.command.log.load-error=无法加载日志 -luckperms.command.log.invalid-page=页码无效 +luckperms.command.log.invalid-page=无效的页码 luckperms.command.log.invalid-page-range=请输入一个介于 {0} 和 {1} 之间的值 luckperms.command.log.empty=没有可显示的日志条目 luckperms.command.log.notify.error-console=无法切换控制台的通知 diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties index ae14ac7..b1bd9da 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties @@ -499,7 +499,7 @@ luckperms.usage.meta-set.argument.value=要設定的值 luckperms.usage.meta-set.argument.context=要增加中繼資料的環境 luckperms.usage.meta-unset.description=解除設定一個元值 luckperms.usage.meta-unset.argument.key=要解除設定的金鑰 -luckperms.usage.meta-unset.argument.context=要移除元資料的環境 +luckperms.usage.meta-unset.argument.context=要移除中繼資料的環境 luckperms.usage.meta-settemp.description=設定一個臨時元值 luckperms.usage.meta-settemp.argument.key=要設定的金鑰 luckperms.usage.meta-settemp.argument.value=要設定的值 diff --git a/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml index 4ea98a0..9c7e905 100644 --- a/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml @@ -1,3 +1,6 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: notify: 'Your pin expires in ' diff --git a/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml index 4ea98a0..9c7e905 100644 --- a/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml @@ -1,3 +1,6 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: notify: 'Your pin expires in ' diff --git a/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml index 4ea98a0..9c7e905 100644 --- a/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml @@ -1,3 +1,6 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: notify: 'Your pin expires in ' diff --git a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/FabricPlugin.java b/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/FabricPlugin.java index 60ad833..946ea55 100644 --- a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/FabricPlugin.java +++ b/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/FabricPlugin.java @@ -13,12 +13,12 @@ import lombok.Getter; import me.confuser.banmanager.common.commands.CommonCommand; import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.fabric.BMFabricPlugin; import me.confuser.banmanager.fabric.FabricScheduler; import me.confuser.banmanager.common.configuration.ConfigurationSection; import me.confuser.banmanager.common.configuration.file.YamlConfiguration; import me.confuser.banmanager.fabric.FabricCommand; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.fabric.listeners.EventListener; import me.confuser.banmanager.webenhancer.fabric.listeners.LogServerAppender; import me.confuser.banmanager.webenhancer.fabric.listeners.ReportListener; import net.fabricmc.api.DedicatedServerModInitializer; @@ -41,27 +41,36 @@ public class FabricPlugin implements DedicatedServerModInitializer { @Override public void onInitializeServer() { + BMFabricPlugin banManager = BMFabricPlugin.getInstance(); + if (banManager == null || banManager.getPlugin() == null) { + LogManager.getLogger("BanManager-WebEnhancer").warn( + "BanManager is not enabled — cannot start BanManager-WebEnhancer."); + return; + } + try { pluginInfo = setupConfigs(); } catch (IOException e) { - e.printStackTrace(); + LogManager.getLogger("BanManager-WebEnhancer").warn("Failed to set up plugin configuration", e); return; } - scheduler = new FabricScheduler(); + org.apache.logging.log4j.Logger log4j = LogManager.getLogger("BanManager-WebEnhancer"); + scheduler = new FabricScheduler(log4j); plugin = new WebEnhancerPlugin( pluginInfo, - new PluginLogger(LogManager.getLogger("BanManager-WebEnhancer")), + new PluginLogger(log4j), getDataFolder(), scheduler, - new FabricMetrics() + new FabricMetrics(), + banManager.getPlugin() ); try { plugin.enable(); } catch (Exception e) { - e.printStackTrace(); + LogManager.getLogger("BanManager-WebEnhancer").warn("Failed to enable BanManager-WebEnhancer", e); return; } @@ -83,7 +92,7 @@ private void onServerStopping(MinecraftServer server) { private void setupCommands() { for (CommonCommand cmd : plugin.getCommands()) { - new FabricCommand(cmd).register(); + new FabricCommand(plugin.getBanManagerPlugin(), cmd).register(); } } @@ -153,7 +162,6 @@ public void setupListeners() { ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); new ReportListener(this); - new EventListener(plugin); } private InputStream getResourceAsStream(String resource) { diff --git a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/EventListener.java b/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/EventListener.java deleted file mode 100644 index 449cf02..0000000 --- a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/EventListener.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.confuser.banmanager.webenhancer.fabric.listeners; - -import me.confuser.banmanager.common.data.PlayerBanData; -import me.confuser.banmanager.common.data.PlayerData; -import me.confuser.banmanager.common.util.Message; -import me.confuser.banmanager.fabric.BanManagerEvents; -import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; - -public class EventListener { - - private final WebEnhancerPlugin plugin; - private final CommonPlayerDeniedListener deniedListener; - - public EventListener(WebEnhancerPlugin plugin) { - this.plugin = plugin; - this.deniedListener = new CommonPlayerDeniedListener(plugin); - - BanManagerEvents.PLAYER_DENIED_EVENT.register(this::onPlayerDenied); - BanManagerEvents.PLAYER_BANNED_EVENT.register(this::onPlayerBanned); - BanManagerEvents.PLUGIN_RELOADED_EVENT.register(this::onReload); - } - - private void onPlayerDenied(PlayerData player, Message message) { - deniedListener.handlePin(player, message); - } - - private void onPlayerBanned(PlayerBanData banData, boolean silent, Message kickMessage) { - if (kickMessage != null) { - deniedListener.handlePin(banData.getPlayer(), kickMessage); - } - } - - private void onReload(PlayerData actor) { - plugin.setupConfigs(); - } -} diff --git a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/ReportListener.java b/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/ReportListener.java index 208d0a3..2c9c2d7 100644 --- a/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/ReportListener.java +++ b/fabric/src/main/java/me/confuser/banmanager/webenhancer/fabric/listeners/ReportListener.java @@ -4,55 +4,68 @@ import java.util.ArrayList; import java.util.List; import java.util.Queue; -import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.api.event.player.PlayerReportDeletedEvent; +import me.confuser.banmanager.api.event.player.PlayerReportedEvent; +import me.confuser.banmanager.api.event.player.PluginReloadedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.data.PlayerReportData; import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.fabric.BanManagerEvents; -import me.confuser.banmanager.fabric.BanManagerEvents.SilentValue; import me.confuser.banmanager.webenhancer.common.data.LogData; import me.confuser.banmanager.webenhancer.common.data.ReportLogData; import me.confuser.banmanager.webenhancer.fabric.FabricPlugin; +/** + * Bridges Fabric's report lifecycle into WebEnhancer storage. + * + *

Subscribes to the cross-platform {@link me.confuser.banmanager.api.event.EventBus} + * — the per-platform {@code PlayerDeniedEvent}/{@code PlayerBannedEvent} + * handlers that used to live here have been consolidated into + * {@link me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener}.

+ */ public class ReportListener { private final FabricPlugin fabricPlugin; + private final BanManagerPlugin banManagerPlugin; public ReportListener(FabricPlugin fabricPlugin) { this.fabricPlugin = fabricPlugin; + this.banManagerPlugin = fabricPlugin.getPlugin().getBanManagerPlugin(); - BanManagerEvents.PLAYER_REPORTED_EVENT.register(this::notifyOnReport); - BanManagerEvents.PLAYER_REPORT_DELETED_EVENT.register(this::reportDeleted); + var events = fabricPlugin.getPlugin().getBanManagerService().events(); + events.subscribe(PlayerReportedEvent.class, this::notifyOnReport); + events.subscribe(PlayerReportDeletedEvent.class, this::reportDeleted); + events.subscribe(PluginReloadedEvent.class, e -> fabricPlugin.getPlugin().setupConfigs()); } - private void notifyOnReport(PlayerReportData report, boolean silent) { + private void notifyOnReport(PlayerReportedEvent event) { List logs; Queue queue = fabricPlugin.getAppender().getQueue(); synchronized (queue) { logs = new ArrayList<>(queue); } - final int reportId = report.getId(); + final int reportId = event.report().id(); - BanManagerPlugin.getInstance().getScheduler().runAsync(() -> { + banManagerPlugin.getScheduler().runAsync(() -> { try { - PlayerReportData reportReloaded = BanManagerPlugin.getInstance() - .getPlayerReportStorage().queryForId(reportId); + PlayerReportData report = banManagerPlugin.getPlayerReportStorage().queryForId(reportId); - if (reportReloaded == null) return; + if (report == null) return; for (LogData log : logs) { fabricPlugin.getPlugin().getLogStorage().createIfNotExists(log); - fabricPlugin.getPlugin().getReportLogStorage().create(new ReportLogData(reportReloaded, log)); + fabricPlugin.getPlugin().getReportLogStorage().create(new ReportLogData(report, log)); } } catch (SQLException e) { - e.printStackTrace(); + fabricPlugin.getPlugin().getLogger() + .warning("Failed to attach report logs: " + e.getMessage()); } }); } - private void reportDeleted(PlayerReportData report) { - int id = report.getId(); + private void reportDeleted(PlayerReportDeletedEvent event) { + int id = event.report().id(); DeleteBuilder builder = fabricPlugin.getPlugin().getReportLogStorage().deleteBuilder(); @@ -60,7 +73,6 @@ private void reportDeleted(PlayerReportData report) { builder.where().eq("report_id", id); builder.delete(); } catch (SQLException e) { - e.printStackTrace(); fabricPlugin.getPlugin().getLogger().warning("Failed to delete report associations for " + id); } } diff --git a/gradle.properties b/gradle.properties index 0325f6e..c64ef66 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ group=me.confuser.banmanager.webenhancer version=8.0.0-SNAPSHOT org.gradle.parallel=true -org.gradle.jvmargs=-Xmx2G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication +org.gradle.jvmargs=-Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication diff --git a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java index 79eb0aa..b60c002 100644 --- a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java +++ b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java @@ -88,11 +88,12 @@ private CommandResult execute(CommandContext context, Parameter.Value ar } private CommonSender getSender(CommandCause cause) { + BanManagerPlugin banManager = plugin.getBanManagerPlugin(); Object root = cause.root(); if (root instanceof ServerPlayer) { - return new SpongePlayer((ServerPlayer) root, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + return new SpongePlayer(banManager, (ServerPlayer) root, banManager.getConfig().isOnlineMode()); } else { - return new SpongeSender(BanManagerPlugin.getInstance(), cause); + return new SpongeSender(banManager, cause); } } } diff --git a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java index 1205d28..db76a15 100644 --- a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java +++ b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java @@ -8,6 +8,7 @@ import me.confuser.banmanager.common.configuration.ConfigurationSection; import me.confuser.banmanager.common.configuration.InvalidConfigurationException; import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.sponge.BMSpongePlugin; import me.confuser.banmanager.sponge.PluginLogger; import me.confuser.banmanager.sponge.SpongeScheduler; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; @@ -25,6 +26,8 @@ import org.spongepowered.plugin.PluginContainer; import org.spongepowered.plugin.builtin.jvm.Plugin; +import java.util.Optional; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -66,6 +69,14 @@ public SpongePlugin(Logger logger) { @Listener(order = Order.LATE) public void onServerStarted(StartedEngineEvent event) { + Optional banManagerContainer = Sponge.pluginManager().plugin("banmanager"); + if (banManagerContainer.isEmpty() + || !(banManagerContainer.get().instance() instanceof BMSpongePlugin banManager) + || banManager.getPlugin() == null) { + this.logger.severe("BanManager is not enabled — cannot start BanManager-WebEnhancer."); + return; + } + this.scheduler = new SpongeScheduler(pluginContainer); PluginInfo pluginInfo; @@ -73,11 +84,11 @@ public void onServerStarted(StartedEngineEvent event) { pluginInfo = setupConfigs(); } catch (IOException e) { this.logger.severe("Failed to setup configs: " + e.getMessage()); - e.printStackTrace(); return; } - this.plugin = new WebEnhancerPlugin(pluginInfo, this.logger, dataFolder.toFile(), scheduler, new SpongeMetrics()); + this.plugin = new WebEnhancerPlugin(pluginInfo, this.logger, dataFolder.toFile(), + scheduler, new SpongeMetrics(), banManager.getPlugin()); try { plugin.enable(); @@ -173,7 +184,7 @@ public void setupListeners() { scheduler.runAsyncRepeating(() -> fileLogReader.readNewEntries(), Duration.ofSeconds(1), Duration.ofSeconds(1)); - Sponge.eventManager().registerListeners(pluginContainer, new ReportListener(this)); + new ReportListener(this); } private String loadLogFilePath() { diff --git a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java index 480d215..42a187c 100644 --- a/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java +++ b/sponge/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java @@ -1,37 +1,43 @@ package me.confuser.banmanager.webenhancer.sponge.listeners; -import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.sponge.api.events.PlayerBannedEvent; -import me.confuser.banmanager.sponge.api.events.PlayerReportDeletedEvent; -import me.confuser.banmanager.sponge.api.events.PlayerReportedEvent; -import me.confuser.banmanager.sponge.api.events.PlayerDeniedEvent; -import me.confuser.banmanager.sponge.api.events.PluginReloadedEvent; -import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.api.event.player.PlayerReportDeletedEvent; +import me.confuser.banmanager.api.event.player.PlayerReportedEvent; +import me.confuser.banmanager.api.event.player.PluginReloadedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; import me.confuser.banmanager.common.data.PlayerReportData; -import me.confuser.banmanager.webenhancer.sponge.SpongePlugin; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; import me.confuser.banmanager.webenhancer.common.data.LogData; import me.confuser.banmanager.webenhancer.common.data.ReportLogData; -import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.Order; +import me.confuser.banmanager.webenhancer.sponge.SpongePlugin; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Queue; -import me.confuser.banmanager.common.BanManagerPlugin; +/** + * Bridges Sponge's report lifecycle into WebEnhancer storage. + * + *

Subscribes to the cross-platform {@link me.confuser.banmanager.api.event.EventBus} + * — the per-platform {@code PlayerDeniedEvent}/{@code PlayerBannedEvent} + * handlers that used to live here have been consolidated into + * {@link me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener}.

+ */ public class ReportListener { private final SpongePlugin plugin; - private CommonPlayerDeniedListener listener; + private final BanManagerPlugin banManagerPlugin; public ReportListener(SpongePlugin plugin) { this.plugin = plugin; - this.listener = new CommonPlayerDeniedListener(plugin.getPlugin()); + this.banManagerPlugin = plugin.getPlugin().getBanManagerPlugin(); + + var events = plugin.getPlugin().getBanManagerService().events(); + events.subscribe(PlayerReportedEvent.class, this::notifyOnReport); + events.subscribe(PlayerReportDeletedEvent.class, this::reportDeleted); + events.subscribe(PluginReloadedEvent.class, e -> plugin.getPlugin().setupConfigs()); } - @Listener(order = Order.POST) - public void notifyOnReport(PlayerReportedEvent event) { + private void notifyOnReport(PlayerReportedEvent event) { plugin.getFileLogReader().readNewEntries(); List logs; @@ -40,12 +46,11 @@ public void notifyOnReport(PlayerReportedEvent event) { logs = new ArrayList<>(queue); } - final int reportId = event.getReport().getId(); + final int reportId = event.report().id(); - BanManagerPlugin.getInstance().getScheduler().runAsync(() -> { + banManagerPlugin.getScheduler().runAsync(() -> { try { - PlayerReportData report = BanManagerPlugin.getInstance() - .getPlayerReportStorage().queryForId(reportId); + PlayerReportData report = banManagerPlugin.getPlayerReportStorage().queryForId(reportId); if (report == null) return; @@ -54,14 +59,13 @@ public void notifyOnReport(PlayerReportedEvent event) { plugin.getPlugin().getReportLogStorage().create(new ReportLogData(report, log)); } } catch (SQLException e) { - e.printStackTrace(); + plugin.getLogger().warning("Failed to attach report logs: " + e.getMessage()); } }); } - @Listener(order = Order.POST) - public void reportDeleted(PlayerReportDeletedEvent event) { - int id = event.getReport().getId(); + private void reportDeleted(PlayerReportDeletedEvent event) { + int id = event.report().id(); DeleteBuilder builder = plugin.getPlugin().getReportLogStorage().deleteBuilder(); @@ -69,29 +73,7 @@ public void reportDeleted(PlayerReportDeletedEvent event) { builder.where().eq("report_id", id); builder.delete(); } catch (SQLException e) { - e.printStackTrace(); plugin.getLogger().warning("Failed to delete report associations for " + id); } } - - @Listener(order = Order.BEFORE_POST) - public void onDeny(final PlayerDeniedEvent event) { - listener.handlePin(event.getPlayer(), event.getMessage()); - } - - @Listener(order = Order.POST) - public void onBanned(PlayerBannedEvent event) { - try { - Message kickMessage = event.getKickMessage(); - if (kickMessage != null) { - listener.handlePin(event.getBan().getPlayer(), kickMessage); - } - } catch (NoSuchMethodError ignored) { - } - } - - @Listener - public void onReload(PluginReloadedEvent event) { - plugin.getPlugin().setupConfigs(); - } } diff --git a/velocity/src/main/java/me/confuser/banmanager/webenhancer/VelocityCommand.java b/velocity/src/main/java/me/confuser/banmanager/webenhancer/VelocityCommand.java index 1d6b39c..fa0773d 100644 --- a/velocity/src/main/java/me/confuser/banmanager/webenhancer/VelocityCommand.java +++ b/velocity/src/main/java/me/confuser/banmanager/webenhancer/VelocityCommand.java @@ -55,10 +55,11 @@ public void execute(final Invocation invocation) { } private CommonSender getSender(CommandSource source) { + BanManagerPlugin banManager = plugin.getPlugin().getBanManagerPlugin(); if (source instanceof Player) { - return new VelocityPlayer((Player) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + return new VelocityPlayer(banManager, (Player) source, banManager.getConfig().isOnlineMode()); } else { - return new VelocitySender(BanManagerPlugin.getInstance(), source); + return new VelocitySender(banManager, source); } } diff --git a/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/VelocityPlugin.java b/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/VelocityPlugin.java index 85832dd..db8314f 100644 --- a/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/VelocityPlugin.java +++ b/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/VelocityPlugin.java @@ -5,6 +5,7 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.Dependency; import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; @@ -13,12 +14,11 @@ import me.confuser.banmanager.common.configs.PluginInfo; import me.confuser.banmanager.common.configuration.ConfigurationSection; import me.confuser.banmanager.common.configuration.file.YamlConfiguration; -import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.BMVelocityPlugin; import me.confuser.banmanager.velocity.PluginLogger; import me.confuser.banmanager.velocity.VelocityScheduler; import me.confuser.banmanager.webenhancer.VelocityCommand; import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.velocity.listener.BanListener; import org.bstats.velocity.Metrics; import org.slf4j.Logger; @@ -67,26 +67,33 @@ public VelocityPlugin(ProxyServer server, Logger logger, @DataDirectory final Pa @Subscribe public void onProxyInitialisation(ProxyInitializeEvent event) { + PluginContainer container = server.getPluginManager().getPlugin("banmanager").orElse(null); + if (container == null || !(container.getInstance().orElse(null) instanceof BMVelocityPlugin banManager) + || banManager.getPlugin() == null) { + logger.error("BanManager is not enabled — cannot start BanManager-WebEnhancer."); + return; + } + PluginInfo pluginInfo; try { pluginInfo = setupConfigs(); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to set up plugin configuration", e); return; } - plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(logger), dataDirectory, new VelocityScheduler(this, server), new VelocityMetrics(metrics.make(this, 14539))); + plugin = new WebEnhancerPlugin(pluginInfo, new PluginLogger(logger), dataDirectory, + new VelocityScheduler(this, server), new VelocityMetrics(metrics.make(this, 14539)), + banManager.getPlugin()); try { plugin.enable(); } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to enable BanManager-WebEnhancer", e); return; } - setupListeners(); setupCommands(); - } private PluginInfo setupConfigs() throws IOException { @@ -144,11 +151,4 @@ private void setupCommands() { logger.info("Registered commands"); } - public void setupListeners() { - registerEvent(new BanListener(this)); - } - - private void registerEvent(Listener listener) { - server.getEventManager().register(this, listener); - } } diff --git a/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/listener/BanListener.java b/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/listener/BanListener.java deleted file mode 100644 index 29e1548..0000000 --- a/velocity/src/main/java/me/confuser/banmanager/webenhancer/velocity/listener/BanListener.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.confuser.banmanager.webenhancer.velocity.listener; - -import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.proxy.ProxyReloadEvent; -import me.confuser.banmanager.common.util.Message; -import me.confuser.banmanager.velocity.Listener; -import me.confuser.banmanager.velocity.api.events.PlayerBannedEvent; -import me.confuser.banmanager.velocity.api.events.PlayerDeniedEvent; -import me.confuser.banmanager.webenhancer.common.listeners.CommonPlayerDeniedListener; -import me.confuser.banmanager.webenhancer.velocity.VelocityPlugin; - -public class BanListener extends Listener { - private final VelocityPlugin velocityPlugin; - private final CommonPlayerDeniedListener listener; - - public BanListener(VelocityPlugin velocityPlugin) { - this.velocityPlugin = velocityPlugin; - this.listener = new CommonPlayerDeniedListener(velocityPlugin.getPlugin()); - } - - @Subscribe - public void onDeny(PlayerDeniedEvent event) { - listener.handlePin(event.getPlayer(), event.getMessage()); - } - - @Subscribe - public void onBanned(PlayerBannedEvent event) { - try { - Message kickMessage = event.getKickMessage(); - if (kickMessage != null) { - listener.handlePin(event.getBan().getPlayer(), kickMessage); - } - } catch (NoSuchMethodError ignored) { - } - } - - @Subscribe - public void onReload(ProxyReloadEvent event) { - velocityPlugin.getPlugin().setupConfigs(); - } - -}