From 56204f38192409796d452dfc578d76c7956c6cd6 Mon Sep 17 00:00:00 2001 From: James Mortemore Date: Sat, 18 Apr 2026 13:58:37 +0100 Subject: [PATCH 1/3] chore: drop Sponge7 support, bump to Java 17, extend CI to release/v7 BanManager v8 dropped the legacy Sponge API 7 (MC 1.12.2 / Java 8) module because its bundled ASM cannot parse Java 17 bytecode. Mirror that here: - Remove sponge-api7/ source module (build.gradle.kts, plugin sources, bundled assets symlink). - Remove e2e/platforms/sponge7/ Docker compose + bundled configs. - Drop :BanManagerWebEnhancerSponge7 from settings.gradle.kts. - Strip Sponge7 jar copy/test/debug tasks from e2e/build.gradle.kts and drop "sponge7" from the e2e clean platform list. - Remove the Sponge7-1.12.2 entry from the e2e workflow matrix. Bump non-Fabric modules from Java 1.8 -> 17 in CommonConfig.kt so they can resolve the Java 17 BanManager v8 artifacts (Sponge already overrides to Java 21; CI already uses JDK 21 by default). Also extend Java CI / E2E workflow triggers to push events on release/v7 so cherry-picked maintenance commits run the same checks that branch protection requires. --- .github/workflows/build.yml | 1 + .github/workflows/e2e.yml | 8 +- buildSrc/src/main/kotlin/CommonConfig.kt | 6 +- e2e/build.gradle.kts | 64 +-- .../configs/banmanager-webenhancer/config.yml | 19 - .../banmanager-webenhancer/messages.yml | 5 - .../sponge7/configs/banmanager/config.yml | 138 ------- .../sponge7/configs/banmanager/console.yml | 4 - .../sponge7/configs/banmanager/discord.yml | 255 ------------ .../sponge7/configs/banmanager/exemptions.yml | 16 - .../sponge7/configs/banmanager/geoip.yml | 10 - .../sponge7/configs/banmanager/messages.yml | 366 ------------------ .../sponge7/configs/banmanager/reasons.yml | 4 - .../sponge7/configs/banmanager/schedules.yml | 30 -- e2e/platforms/sponge7/docker-compose.yml | 90 ----- settings.gradle.kts | 2 - sponge-api7/build.gradle.kts | 137 ------- .../webenhancer/sponge/SpongeCommand.java | 109 ------ .../webenhancer/sponge/SpongeMetrics.java | 12 - .../webenhancer/sponge/SpongePlugin.java | 158 -------- .../sponge/listeners/LogServerAppender.java | 63 --- .../sponge/listeners/ReportListener.java | 99 ----- .../resources/assets/banmanager-webenhancer | 1 - 23 files changed, 6 insertions(+), 1591 deletions(-) delete mode 100644 e2e/platforms/sponge7/configs/banmanager-webenhancer/config.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager-webenhancer/messages.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/config.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/console.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/discord.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/exemptions.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/geoip.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/messages.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/reasons.yml delete mode 100644 e2e/platforms/sponge7/configs/banmanager/schedules.yml delete mode 100644 e2e/platforms/sponge7/docker-compose.yml delete mode 100644 sponge-api7/build.gradle.kts delete mode 100644 sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java delete mode 100644 sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeMetrics.java delete mode 100644 sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java delete mode 100644 sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/LogServerAppender.java delete mode 100644 sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java delete mode 120000 sponge-api7/src/main/resources/assets/banmanager-webenhancer diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7c5549a..fe0ba4e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: push: branches: - master + - release/v7 schedule: - cron: "0 0 * * 0" diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 768eca2..0527511 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -8,6 +8,7 @@ on: push: branches: - master + - release/v7 workflow_dispatch: jobs: @@ -79,13 +80,6 @@ jobs: mc_version: "1.21.3" java_image: "java21" spongeversion: "1.21.3-13.0.0" - # Sponge API 7 (Legacy - MC 1.12.2, Java 8) - - platform: Sponge7-1.12.2 - task: testSponge7 - build_task: ":BanManagerSponge7:shadowJar" - compose_dir: platforms/sponge7 - mc_version: "1.12.2" - java_image: "java8" # Velocity Proxy - platform: Velocity task: testVelocity diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index 897697a..24948b4 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -30,12 +30,12 @@ fun Project.applyCommonConfiguration() { } } - // Only set Java 1.8 for non-Fabric modules + // Set Java 17 for non-Fabric modules (aligns with BanManager v8 baseline) // Fabric uses toolchain configuration in its build.gradle.kts plugins.withId("java") { if (!plugins.hasPlugin("fabric-loom")) { - the().setSourceCompatibility("1.8") - the().setTargetCompatibility("1.8") + the().setSourceCompatibility("17") + the().setTargetCompatibility("17") } } } diff --git a/e2e/build.gradle.kts b/e2e/build.gradle.kts index 19bd470..0ab6eed 100644 --- a/e2e/build.gradle.kts +++ b/e2e/build.gradle.kts @@ -47,14 +47,6 @@ tasks.register("copyBanManagerSpongeJar") { from(file("${banManagerDir.absolutePath}/sponge/build/libs/BanManagerSponge.jar")) } -tasks.register("copyBanManagerSponge7Jar") { - group = "verification" - description = "Copy BanManager Sponge7 shadow JAR to e2e/jars" - - into(file("jars")) - from(file("${banManagerDir.absolutePath}/sponge-api7/build/libs/BanManagerSponge7.jar")) -} - tasks.register("copyWebEnhancerBukkitJar") { group = "verification" description = "Copy WebEnhancer Bukkit JAR to e2e/jars" @@ -98,18 +90,6 @@ tasks.register("copyWebEnhancerSpongeJar") { } } -tasks.register("copyWebEnhancerSponge7Jar") { - group = "verification" - description = "Copy WebEnhancer Sponge7 JAR to e2e/jars" - - dependsOn(":BanManagerWebEnhancerSponge7:shadowJar") - - into(file("jars")) - from(project(":BanManagerWebEnhancerSponge7").tasks.named("shadowJar")) { - rename { "BanManagerWebEnhancerSponge7.jar" } - } -} - // Velocity JAR copy tasks tasks.register("copyBanManagerVelocityJar") { group = "verification" @@ -314,20 +294,6 @@ tasks.register("testSpongeAll") { } } -// Sponge7 (Legacy API 7 / MC 1.12.2) E2E tests -tasks.register("prepareSponge7Jars") { - group = "verification" - description = "Prepare Sponge7 (legacy) plugin JARs for E2E tests" - dependsOn("copyBanManagerSponge7Jar", "copyWebEnhancerSponge7Jar") -} - -createPlatformTestTask( - "testSponge7", - "sponge7", - "prepareSponge7Jars", - "Run Sponge7 (legacy API 7 / MC 1.12.2) E2E tests in Docker" -) - // Velocity E2E tests tasks.register("prepareVelocityJars") { group = "verification" @@ -543,34 +509,6 @@ tasks.register("logsSponge") { commandLine("docker", "compose", "logs", "-f", "sponge") } -// Sponge7 debug tasks -tasks.register("startSponge7") { - group = "verification" - description = "Start the Sponge7 (legacy) test server without running tests (for debugging)" - - dependsOn("prepareSponge7Jars") - - workingDir = file("platforms/sponge7") - commandLine("docker", "compose", "up", "-d", "mariadb", "sponge7") -} - -tasks.register("stopSponge7") { - group = "verification" - description = "Stop the Sponge7 test server" - - workingDir = file("platforms/sponge7") - commandLine("docker", "compose", "down", "-v") - isIgnoreExitValue = true -} - -tasks.register("logsSponge7") { - group = "verification" - description = "Show Sponge7 server logs" - - workingDir = file("platforms/sponge7") - commandLine("docker", "compose", "logs", "-f", "sponge7") -} - // Velocity debug tasks tasks.register("startVelocity") { group = "verification" @@ -629,7 +567,7 @@ tasks.register("logsBungee") { tasks.named("clean") { doLast { - listOf("bukkit", "fabric", "sponge", "sponge7", "velocity", "bungee").forEach { platform -> + listOf("bukkit", "fabric", "sponge", "velocity", "bungee").forEach { platform -> ProcessBuilder("docker", "compose", "down", "-v", "--rmi", "local") .directory(file("platforms/$platform")) .inheritIO() diff --git a/e2e/platforms/sponge7/configs/banmanager-webenhancer/config.yml b/e2e/platforms/sponge7/configs/banmanager-webenhancer/config.yml deleted file mode 100644 index 4b850df..0000000 --- a/e2e/platforms/sponge7/configs/banmanager-webenhancer/config.yml +++ /dev/null @@ -1,19 +0,0 @@ -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' -- '[BanManager]' -- '[PlugMan]' -- 'Metrics' -- 'For help, type "help"' -- 'HikariDataSource' -- 'TableUtils' - diff --git a/e2e/platforms/sponge7/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/sponge7/configs/banmanager-webenhancer/messages.yml deleted file mode 100644 index 5738200..0000000 --- a/e2e/platforms/sponge7/configs/banmanager-webenhancer/messages.yml +++ /dev/null @@ -1,5 +0,0 @@ -messages: - pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' - diff --git a/e2e/platforms/sponge7/configs/banmanager/config.yml b/e2e/platforms/sponge7/configs/banmanager/config.yml deleted file mode 100644 index edbbd1c..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/config.yml +++ /dev/null @@ -1,138 +0,0 @@ -# -# Aliases will be found and blocked automatically, e.g. msg will block tell -debug: false -databases: - local: - storageType: mariadb - host: mariadb - port: 3306 - name: banmanager - user: banmanager - password: banmanager - maxConnections: 10 - useSSL: false - allowPublicKeyRetrieval: true - verifyServerCertificate: false - maxLifetime: 1800000 - connectionTimeout: 30000 - tables: - players: bm_players - playerBans: bm_player_bans - playerBanRecords: bm_player_ban_records - playerMutes: bm_player_mutes - playerMuteRecords: bm_player_mute_records - playerKicks: bm_player_kicks - playerNotes: bm_player_notes - playerHistory: bm_player_history - playerReports: bm_player_reports - playerReportLocations: bm_player_report_locations - playerReportStates: bm_player_report_states - playerReportCommands: bm_player_report_commands - playerReportComments: bm_player_report_comments - playerWarnings: bm_player_warnings - ipBans: bm_ip_bans - ipBanRecords: bm_ip_ban_records - ipMutes: bm_ip_mutes - ipMuteRecords: bm_ip_mute_records - ipRangeBans: bm_ip_range_bans - ipRangeBanRecords: bm_ip_range_ban_records - rollbacks: bm_rollbacks - nameBans: bm_name_bans - nameBanRecords: bm_name_ban_records - global: - enabled: false - storageType: mysql - host: 127.0.0.1 - port: 3306 - name: global_bans - user: root - password: '' - maxConnections: 10 - useSSL: false - allowPublicKeyRetrieval: false - verifyServerCertificate: false - leakDetection: 3000 - maxLifetime: 1800000 - connectionTimeout: 30000 - tables: - playerBans: bm_player_ban_all - playerUnbans: bm_player_unban_all - playerMutes: bm_player_mute_all - playerUnmutes: bm_player_unmute_all - playerNotes: bm_player_note_all - ipBans: bm_ip_ban_all - ipUnbans: bm_ip_unban_all -mutedCommandBlacklist: -- msg -softMutedCommandBlacklist: -- msg -duplicateIpCheck: false -bypassDuplicateChecks: -- 0.0.0.0 -- 127.0.0.1 -logKicks: false -logIps: true -displayNotifications: true -broadcastOnSync: false -timeLimits: - playerMutes: {} - playerBans: {} - playerWarnings: {} - ipBans: {} - ipMutes: {} - rollbacks: {} - nameBans: {} -cooldowns: - ban: 0 - tempban: 0 - mute: 0 - tempmute: 0 - banip: 0 - tempbanip: 0 - warn: 0 - tempwarn: 0 - report: 0 -warningActions: - enabled: true - actions: - 3: - - cmd: "say warning-action-triggered-[player]" - delay: 0 -warningMute: false -hooks: - enabled: true - events: - mute: - post: - - cmd: say hook-fired-mute - delay: 2 -checkForUpdates: false -offlineAutoComplete: true -punishAlts: false -denyAlts: false -timeAssociatedAlts: 0 -cleanUp: - kicks: 0 - banRecords: 0 - ipBanRecords: 0 - ipMuteRecords: 0 - muteRecords: 0 - readWarnings: 0 - unreadWarnings: 0 - playerHistory: 0 -maxOnlinePerIp: 0 -maxMultiaccountsRecently: 0 -multiaccountsTime: 300 -checkOnJoin: false -createNoteReasons: false -onlineMode: false -chatPriority: normal -blockInvalidReasons: false -uuidFetcher: - idToName: - url: https://sessionserver.mojang.com/session/minecraft/profile/[uuid] - key: name - nameToId: - url: https://api.mojang.com/users/profiles/minecraft/[name] - key: id -geyserPrefix: . diff --git a/e2e/platforms/sponge7/configs/banmanager/console.yml b/e2e/platforms/sponge7/configs/banmanager/console.yml deleted file mode 100644 index 6eea2c4..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/console.yml +++ /dev/null @@ -1,4 +0,0 @@ -# This is used to identify the server when it makes bans etc -# Do not change the uuid, it is generated automatically! -name: Console -uuid: 390f29f5-9773-43c0-b729-930927098048 diff --git a/e2e/platforms/sponge7/configs/banmanager/discord.yml b/e2e/platforms/sponge7/configs/banmanager/discord.yml deleted file mode 100644 index f0988a2..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/discord.yml +++ /dev/null @@ -1,255 +0,0 @@ -# More info at https://banmanagement.com/docs/banmanager/configuration/discord-yml -hooks: - enabled: false - punishments: - ban: - url: https://discord.com/api/webhooks/changeMe - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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/sponge7/configs/banmanager/exemptions.yml b/e2e/platforms/sponge7/configs/banmanager/exemptions.yml deleted file mode 100644 index 463a5f0..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/exemptions.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Example: -# The following player is exempt from bans, mutes and warnings. True means exempt. -# uuid-here: -# ban: true -# tempban: true -# baniprange: true -# tempbaniprange: true -# mute: true -# tempmute: true -# warn: true -# tempwarn: true -# alts: true -# deniedNotify: true - -47d8e47b-11c1-393b-8611-7c34449ba1b1: - deniedNotify: true diff --git a/e2e/platforms/sponge7/configs/banmanager/geoip.yml b/e2e/platforms/sponge7/configs/banmanager/geoip.yml deleted file mode 100644 index 93006a5..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/geoip.yml +++ /dev/null @@ -1,10 +0,0 @@ -# -# Allow only certain countries on the server -enabled: false -download: - city: https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=[licenseKey]&suffix=tar.gz - country: https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=[licenseKey]&suffix=tar.gz - lastUpdated: 0 - licenseKey: '' -countries: - type: deny diff --git a/e2e/platforms/sponge7/configs/banmanager/messages.yml b/e2e/platforms/sponge7/configs/banmanager/messages.yml deleted file mode 100644 index 459dab6..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/messages.yml +++ /dev/null @@ -1,366 +0,0 @@ -# BanManager messages configuration for E2E testing -# Modified to include [pin] placeholder for WebEnhancer testing - -messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - - none: 'none' - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - - alts: - header: 'Possible alts found:' - - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked [kicks] times and warned [warns] times ([warnPoints] Points), has [notes] notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - website: - player: 'https://yourdomain.com/player/[uuid]' - ip: 'http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0' - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: 'All players have been kicked by [actor]' - reason: 'All players have been kicked by [actor] for &4[reason]' - - # Modified for WebEnhancer E2E testing - includes [pin] placeholder - ban: - player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' - - tempban: - player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - - unbanall: - notify: '&6[player] will be unbanned by [actor]' - - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - - unmute: - notify: '&6[player] has been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - - unmuteip: - notify: '&6[ip] ([players]) have been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - - warn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor]' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - cooldown: '&cThis player was warned too recently, try again later' - - tempwarn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor] which expires in [expires]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - - warnall: - notify: '&6[player] will be warned by [actor] for &4[reason]' - - addnote: - notify: '&6Note added for [player] by [actor]' - error: - cooldown: '&cA note was added for this player too recently, try again later' - - notes: - error: - noResults: '&cNo notes for [player]' - noResults.uuid: '&cNo notes for player' - header: '&6Notes for [player]' - row: '&6[created] &f[message]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - bmactivity: - error: - noResults: '&cNo activity found' - header: '&6Activity for [player]' - row: '&7#[id] &a[&f[type]&a] &6[player]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - banip: - ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - notify: '&6[ip] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' - - tempbanip: - ip: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - notify: '&6[ip] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - - baniprange: - notify: '&6[from] - [to] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[from] - [to] is already banned' - cooldown: '&cThis ip range was banned too recently, try again later' - - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - error: - noExists: '&c[from] - [to] is not banned' - notOwn: '&c[from] - [to] was not banned by you, unable to unban' - - banname: - disallowed: '&6You may not use the name [name] on this server' - notify: '&6[name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[name] is already banned' - - tempbanname: - notify: '&6[name] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanname: - notify: '&6[name] has been unbanned by [actor]' - error: - noExists: '&c[name] is not banned' - notOwn: '&c[name] was not banned by you, unable to unban' - - report: - error: - notOnline: '&cPlayer must be online to report' - cooldown: '&cToo many reports, please wait a while' - notify: '&6[player] has been reported by [actor] for &4[reason]' - success: '&a[player] has been reported' - created: '&6[actor] has reported [player] for &4[reason]' - - reports: - error: - noResults: '&cNo reports for [player]' - header: '&6Reports for [player]' - list: - row: '&e[id] [player] &6[reason] [created] &e[actor]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - deleterecord: - error: - noExists: '&c[id] does not exist' - deleted: '&a[id] has been deleted' - - clear: - header: - all: '&6Clearing [type] for [player]' - single: '&6Clearing [type]' - error: - noResults: '&cNothing found to delete' - notifyDelete: '&6Deleted [sum] [type] for [player]' - - sync: - error: - inProgress: '&cA sync is already in progress, please wait' - started: '&aSync started' - finished: '&aSync finished' - - external: - error: - notAllowed: '&cExternally synced servers cannot perform this action' - - rollback: - error: - inProgress: '&cA rollback is already in progress, please wait' - noResults: '&cNo results found to rollback' - started: '&aRollback started' - finished: '&aRollback finished, [sum] rows affected' - - dwarn: - notOwn: '&c[id] was not created by you, unable to delete' - noExists: '&c[id] does not exist' - deleted: '&aWarning deleted' - - findAlts: - header: 'Possible alts found:' - noResults: 'No possible alts found' - - update: - notify: 'A new version of BanManager is now available' diff --git a/e2e/platforms/sponge7/configs/banmanager/reasons.yml b/e2e/platforms/sponge7/configs/banmanager/reasons.yml deleted file mode 100644 index 32f826f..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/reasons.yml +++ /dev/null @@ -1,4 +0,0 @@ -# Example: -# hacking: "Using a hacked client" -# /ban confuser #hacking - diff --git a/e2e/platforms/sponge7/configs/banmanager/schedules.yml b/e2e/platforms/sponge7/configs/banmanager/schedules.yml deleted file mode 100644 index c03e2a8..0000000 --- a/e2e/platforms/sponge7/configs/banmanager/schedules.yml +++ /dev/null @@ -1,30 +0,0 @@ -# Scheduler intervals in seconds, recommended to leave as default values. -# Setting to 0 disables the scheduler from running. -# Only change if you know what you are doing! -scheduler: - expiresCheck: 5 - playerBans: 5 - playerMutes: 5 - playerWarnings: 5 - ipBans: 5 - ipRangeBans: 5 - rollbacks: 30 - nameBans: 5 - externalPlayerBans: 5 - externalPlayerMutes: 5 - externalPlayerNotes: 5 - externalIpBans: 5 - saveLastChecked: 60 -lastChecked: - playerMutes: 0 - expiresCheck: 0 - nameBans: 0 - playerBans: 0 - playerWarnings: 0 - externalPlayerNotes: 0 - ipRangeBans: 0 - externalPlayerMutes: 0 - rollbacks: 0 - externalPlayerBans: 0 - externalIpBans: 0 - ipBans: 0 diff --git a/e2e/platforms/sponge7/docker-compose.yml b/e2e/platforms/sponge7/docker-compose.yml deleted file mode 100644 index c3bca1b..0000000 --- a/e2e/platforms/sponge7/docker-compose.yml +++ /dev/null @@ -1,90 +0,0 @@ -# Sponge API 7 (Minecraft 1.12.2) E2E testing for BanManager-WebEnhancer -# Note: This is a legacy platform for backwards compatibility testing - -name: bm-webenhancer-sponge7 - -services: - mariadb: - image: mariadb:10.11 - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: banmanager - MYSQL_USER: banmanager - MYSQL_PASSWORD: banmanager - healthcheck: - test: ["CMD", "mariadb", "-uroot", "-proot", "-e", "SELECT 1"] - interval: 5s - timeout: 5s - retries: 10 - networks: - - banmanager - - sponge7: - image: itzg/minecraft-server:java8 - environment: - EULA: "TRUE" - TYPE: "CUSTOM" - # SpongeVanilla 1.12.2-7.3.0 is the latest stable for API 7 - CUSTOM_SERVER: "https://repo.spongepowered.org/repository/legacy-transfer/org/spongepowered/spongevanilla/1.12.2-7.3.0/spongevanilla-1.12.2-7.3.0.jar" - ONLINE_MODE: "false" - SKIP_SERVER_JAR_HASH_CHECK: "true" - ENABLE_RCON: "true" - RCON_PASSWORD: "testing" - RCON_PORT: 25575 - MEMORY: "2G" - SPAWN_PROTECTION: 0 - VIEW_DISTANCE: 4 - MAX_WORLD_SIZE: 100 - LEVEL_TYPE: "flat" - GENERATE_STRUCTURES: "false" - COPY_MODS_SRC: "/mods-src" - COPY_MODS_DEST: "/data/mods" - COPY_CONFIG_SRC: "/config-src" - COPY_CONFIG_DEST: "/data/config" - SYNC_SKIP_NEWER_IN_DESTINATION: "false" - volumes: - - ../../jars/BanManagerSponge7.jar:/mods-src/BanManager.jar:ro - - ../../jars/BanManagerWebEnhancerSponge7.jar:/mods-src/BanManagerWebEnhancer.jar:ro - - ./configs/banmanager:/config-src/banmanager:ro - - ./configs/banmanager-webenhancer:/config-src/banmanager-webenhancer:ro - - ./configs/sponge:/config-src/sponge:ro - - sponge7-data:/data - depends_on: - mariadb: - condition: service_healthy - healthcheck: - test: ["CMD", "rcon-cli", "--password", "testing", "list"] - interval: 10s - timeout: 5s - retries: 30 - start_period: 180s - networks: - - banmanager - - tests: - build: - context: ../.. - dockerfile: Dockerfile.tests - depends_on: - sponge7: - condition: service_healthy - environment: - SERVER_HOST: sponge7 - SERVER_PORT: 25565 - RCON_HOST: sponge7 - RCON_PORT: 25575 - RCON_PASSWORD: testing - MC_VERSION: "1.12.2" - volumes: - - jest-cache:/tmp/jest_cache - networks: - - banmanager - -networks: - banmanager: - driver: bridge - -volumes: - sponge7-data: - jest-cache: - diff --git a/settings.gradle.kts b/settings.gradle.kts index 13f909c..222320a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,7 +18,6 @@ include(":BanManagerWebEnhancerCommon") include(":BanManagerWebEnhancerBukkit") include(":BanManagerWebEnhancerBungee") include(":BanManagerWebEnhancerSponge") -include(":BanManagerWebEnhancerSponge7") include(":BanManagerWebEnhancerLibs") include(":BanManagerWebEnhancerVelocity") include(":BanManagerWebEnhancerE2E") @@ -27,7 +26,6 @@ project(":BanManagerWebEnhancerCommon").projectDir = file("common") project(":BanManagerWebEnhancerBukkit").projectDir = file("bukkit") project(":BanManagerWebEnhancerBungee").projectDir = file("bungee") project(":BanManagerWebEnhancerSponge").projectDir = file("sponge") -project(":BanManagerWebEnhancerSponge7").projectDir = file("sponge-api7") project(":BanManagerWebEnhancerLibs").projectDir = file("libs") project(":BanManagerWebEnhancerVelocity").projectDir = file("velocity") project(":BanManagerWebEnhancerE2E").projectDir = file("e2e") diff --git a/sponge-api7/build.gradle.kts b/sponge-api7/build.gradle.kts deleted file mode 100644 index 248497b..0000000 --- a/sponge-api7/build.gradle.kts +++ /dev/null @@ -1,137 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.spongepowered.gradle.plugin.config.PluginLoaders -import org.spongepowered.plugin.metadata.model.PluginDependency - - -plugins { - `java-library` - id("org.spongepowered.gradle.plugin") - id("net.kyori.blossom") version "2.2.0" -} - -applyPlatformAndCoreConfiguration() -applyShadowConfiguration() - -sourceSets { - main { - blossom { - resources { - property("@projectVersion@", (project.ext["internalVersion"] as String)) - } - } - } -} - -sponge { - apiVersion("7.2.0") - loader { - name(PluginLoaders.JAVA_PLAIN) - version("1.0") - } - - license("MIT License") - - plugin("banmanager-webenhancer") { - displayName("BanManager-WebEnhancer") - entrypoint("me.confuser.banmanager.webenhancer.sponge.SpongePlugin") - description("An addon required by the BanManager WebUI") - links { - homepage("https://banmanagement.com/") - source("https://github.com/BanManagment/BanManager-WebEnhancer") - issues("https://github.com/BanManagment/BanManager-WebEnhancer") - } - contributor("confuser") { - description("Lead Developer") - } - dependency("spongeapi") { - loadOrder(PluginDependency.LoadOrder.AFTER) - optional(false) - version("7.2.0") - } - dependency("banmanager") { - loadOrder(PluginDependency.LoadOrder.AFTER) - optional(false) - version("7.7.0") - } - } -} - -repositories { - maven { - name = "sponge" - url = uri("https://repo.spongepowered.org/maven/") - } -} - -configurations { - compileClasspath.get().extendsFrom(create("shadeOnly")) -} - -dependencies { - compileOnly("org.spongepowered:spongeapi:7.2.0") - compileOnly("me.confuser.banmanager:BanManagerSponge7:8.0.0-SNAPSHOT") - compileOnly("org.apache.logging.log4j:log4j-core:2.17.0") - - api(project(":BanManagerWebEnhancerCommon")) { - isTransitive = true - } - - "shadeOnly"("org.bstats:bstats-sponge:2.2.1") -} - -val javaTarget = 8 // Sponge targets a minimum of Java 8 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) -} - -tasks.named("processResources") { - val internalVersion = project.ext["internalVersion"] - - inputs.property("internalVersion", internalVersion) - - filesMatching("plugin.yml") { - expand(mapOf("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.webenhancer.sponge.SpongePlugin")) - } -} - -tasks.named("jar") { - val projectVersion = project.version - inputs.property("projectVersion", projectVersion) - manifest { - attributes("Implementation-Version" to projectVersion) - } -} - -tasks.named("shadowJar") { - configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) - - archiveBaseName.set("BanManagerWebEnhancerSponge7") - archiveClassifier.set("") - archiveVersion.set("") - - dependencies { - include(dependency(":BanManagerWebEnhancerCommon")) - include(dependency(":BanManagerWebEnhancerLibs")) - include(dependency("org.bstats:.*:.*")) - } - - relocate("org.bstats", "me.confuser.banmanager.webenhancer.common.bstats") - - exclude("GradleStart**") - exclude(".cache"); - exclude("LICENSE*") - exclude("META-INF/services/**") - exclude("META-INF/maven/**") - exclude("META-INF/versions/**") - exclude("org/intellij/**") - exclude("org/jetbrains/**") - exclude("**/module-info.class") - exclude("*.yml") - - minimize() -} - -tasks.named("assemble").configure { - dependsOn("shadowJar") -} diff --git a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java b/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java deleted file mode 100644 index 1a26e1b..0000000 --- a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeCommand.java +++ /dev/null @@ -1,109 +0,0 @@ -package me.confuser.banmanager.webenhancer.sponge; - -import me.confuser.banmanager.common.BanManagerPlugin; -import me.confuser.banmanager.common.commands.CommonCommand; -import me.confuser.banmanager.common.commands.CommonSender; -import me.confuser.banmanager.sponge.SpongePlayer; -import me.confuser.banmanager.sponge.SpongeSender; - -import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.command.args.parsing.InputTokenizer; -import org.spongepowered.api.command.args.parsing.SingleArg; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.world.Location; -import org.spongepowered.api.world.World; - -import java.lang.reflect.InvocationTargetException; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -public class SpongeCommand implements CommandCallable { - - private SpongePlugin plugin; - private CommonCommand command; - private static final InputTokenizer tokeniser = InputTokenizer.spaceSplitString(); - - public SpongeCommand(SpongePlugin plugin, CommonCommand command) { - this.plugin = plugin; - this.command = command; - - register(); - } - - public void register() { - Sponge.getCommandManager().register(plugin, this, command.getCommandName()); - } - - @Override - public CommandResult process(CommandSource source, String arguments) { - CommonSender sender = getSender(source); - boolean result = execute(sender, arguments); - - if (!result) { - sender.sendMessage(command.getUsage()); - return CommandResult.empty(); - } - - return CommandResult.success(); - } - - private boolean execute(CommonSender sender, String arguments) { - try { - if (sender.hasPermission(command.getPermission())) { - return this.command.onCommand(sender, this.command.getParser(parseArgs(arguments))); - } else { - sender.sendMessage("&cYou do not have permission to use this command"); - return true; - } - } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException | ArgumentParseException e) { - e.printStackTrace(); - } - - return false; - } - - private String[] parseArgs(String arguments) throws ArgumentParseException { - return tokeniser.tokenize(arguments, false).stream().map(SingleArg::getValue).toArray(String[]::new); - } - - @Override - public List getSuggestions(CommandSource source, String arguments, Location targetPosition) { - if (!command.isEnableTabCompletion()) return Collections.emptyList(); - - return command.handlePlayerNameTabComplete(getSender(source), arguments.split(" ")); - } - - private CommonSender getSender(CommandSource source) { - if (source instanceof Player) { - return new SpongePlayer((Player) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); - } else { - return new SpongeSender(BanManagerPlugin.getInstance(), source); - } - } - - @Override - public boolean testPermission(CommandSource source) { - return source.hasPermission(command.getPermission()); - } - - @Override - public Optional getShortDescription(CommandSource source) { - return Optional.empty(); - } - - @Override - public Optional getHelp(CommandSource source) { - return Optional.empty(); - } - - @Override - public Text getUsage(CommandSource source) { - return Text.of(command.getUsage()); - } -} diff --git a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeMetrics.java b/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeMetrics.java deleted file mode 100644 index 6ba2fef..0000000 --- a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongeMetrics.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.confuser.banmanager.webenhancer.sponge; - -import org.bstats.sponge.Metrics; -import me.confuser.banmanager.webenhancer.common.CommonMetrics; - -public class SpongeMetrics implements CommonMetrics { - private final Metrics metrics; - - public SpongeMetrics(Metrics metrics) { - this.metrics = metrics; - } -} diff --git a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java b/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java deleted file mode 100644 index b5e19d2..0000000 --- a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/SpongePlugin.java +++ /dev/null @@ -1,158 +0,0 @@ -package me.confuser.banmanager.webenhancer.sponge; - -import lombok.Getter; -import com.google.inject.Inject; -import me.confuser.banmanager.sponge.SpongeScheduler; -import me.confuser.banmanager.sponge.PluginLogger; -import org.bstats.sponge.Metrics; -import org.slf4j.Logger; - -import me.confuser.banmanager.common.CommonLogger; -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.sponge.listeners.ReportListener; -import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.sponge.listeners.LogServerAppender; -import org.apache.logging.log4j.LogManager; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.config.ConfigDir; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.game.state.GameInitializationEvent; -import org.spongepowered.api.event.game.state.GameStoppingServerEvent; -import org.spongepowered.api.plugin.Plugin; -import org.spongepowered.api.plugin.PluginContainer; -import org.spongepowered.api.plugin.Dependency; - -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.file.Path; - -@Plugin( - id = "banmanager-webenhancer", - name = "BanManager-WebEnhancer", - version = "@projectVersion@", - authors = "confuser", - description = "An addon required by the BanManager WebUI", - url = "https://banmanagement.com", - dependencies = { - @Dependency(id = "banmanager"), - } -) -public class SpongePlugin { - private CommonLogger logger; - @Getter - private WebEnhancerPlugin plugin; - - @Inject - @ConfigDir(sharedRoot = false) - private Path dataFolder; - - @Inject - private PluginContainer pluginContainer; - - private String[] configs = new String[]{ - "config.yml", - "messages.yml" - }; - private Metrics metrics; - @Getter - private LogServerAppender appender; - - @Inject - public SpongePlugin(Logger logger, Metrics.Factory metrics) { - this.logger = new PluginLogger(logger); - this.metrics = metrics.make(14039); - } - - @Listener - public void onDisable(GameStoppingServerEvent event) { - // @TODO Disable scheduled tasks somehow - - if (appender == null) return; - - ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).removeAppender(appender); - } - - @Listener - public void onEnable(GameInitializationEvent event) { - PluginInfo pluginInfo; - - try { - pluginInfo = setupConfigs(); - } catch (IOException e) { - e.printStackTrace(); - return; - } - - this.plugin = new WebEnhancerPlugin(pluginInfo, this.logger, dataFolder.toFile(), new SpongeScheduler(this), new SpongeMetrics(metrics)); - - try { - plugin.enable(); - } catch (Exception e) { - logger.severe("Unable to start BanManager-WebEnhancer"); - e.printStackTrace(); - return; - } - - - setupListeners(); - setupCommands(); - } - - public CommonLogger getLogger() { - return logger; - } - - private PluginInfo setupConfigs() throws IOException { - for (String name : configs) { - File file = new File(dataFolder.toFile(), name); - if (file.exists()) { - // YAMLConfigurationLoader messes with format and makes it unreadable - Reader defConfigStream = new InputStreamReader(pluginContainer.getAsset(name).get().getUrl().openStream()); - - YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); - YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); - conf.setDefaults(defConfig); - conf.options().copyDefaults(true); - conf.save(file); - } else { - pluginContainer.getAsset(name).get().copyToDirectory(dataFolder); - } - } - - // Load plugin.yml - PluginInfo pluginInfo = new PluginInfo(); - Reader defConfigStream = new InputStreamReader(pluginContainer.getAsset("plugin.yml").get().getUrl().openStream()); - YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); - ConfigurationSection commands = conf.getConfigurationSection("commands"); - - for (String command : commands.getKeys(false)) { - ConfigurationSection cmd = commands.getConfigurationSection(command); - - pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); - } - - return pluginInfo; - } - - public void setupCommands() { - for (CommonCommand cmd : plugin.getCommands()) { - new SpongeCommand(this, cmd); - } - } - - public void setupListeners() { - appender = new LogServerAppender(plugin); - ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); - - registerEvent(new ReportListener(this)); - } - - private void registerEvent(Object listener) { - Sponge.getEventManager().registerListeners(this, listener); - } -} diff --git a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/LogServerAppender.java b/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/LogServerAppender.java deleted file mode 100644 index c499dd6..0000000 --- a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/LogServerAppender.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.confuser.banmanager.webenhancer.sponge.listeners; - -import com.google.common.collect.EvictingQueue; -import com.google.common.collect.Queues; -import lombok.Getter; -import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin; -import me.confuser.banmanager.webenhancer.common.data.LogData; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.layout.PatternLayout; - -import java.util.regex.Pattern; -import java.util.Queue; - -public class LogServerAppender extends AbstractAppender { - - private WebEnhancerPlugin plugin; - @Getter - private Queue queue; - - public LogServerAppender(WebEnhancerPlugin plugin) { - super("Log4JAppender", null, - PatternLayout.newBuilder().withPattern("[%d{HH:mm:ss} %level]: %msg").build(), false); - - this.plugin = plugin; - this.queue = Queues.synchronizedQueue(EvictingQueue.create(plugin.getConfig().getAmount())); - } - - @Override - public boolean isStarted() { - return true; - } - - @Override - public void append(LogEvent log) { - String message = log.getMessage().getFormattedMessage(); - - if (message == null) return; - - boolean ignore = false; - - for (String check : plugin.getConfig().getContains()) { - if (message.contains(check)) { - ignore = true; - break; - } - } - - if (!ignore) { - for (Pattern pattern : plugin.getConfig().getPatterns()) { - if (pattern.matcher(message).matches()) { - ignore = true; - break; - } - } - } - - if (!ignore) { - // Not thread safe, sync this if causes issues - queue.add(new LogData(message, log.getTimeMillis() / 1000L)); - } - } -} diff --git a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java b/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java deleted file mode 100644 index 8272850..0000000 --- a/sponge-api7/src/main/java/me/confuser/banmanager/webenhancer/sponge/listeners/ReportListener.java +++ /dev/null @@ -1,99 +0,0 @@ -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.common.data.PlayerReportData; -import me.confuser.banmanager.webenhancer.sponge.SpongePlugin; -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 org.spongepowered.api.event.filter.IsCancelled; -import org.spongepowered.api.util.Tristate; - -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 { - private final SpongePlugin plugin; - private CommonPlayerDeniedListener listener; - - public ReportListener(SpongePlugin plugin) { - this.plugin = plugin; - this.listener = new CommonPlayerDeniedListener(plugin.getPlugin()); - } - - @IsCancelled(Tristate.UNDEFINED) - @Listener(order = Order.POST) - public void notifyOnReport(PlayerReportedEvent event) { - List logs; - Queue queue = plugin.getAppender().getQueue(); - synchronized (queue) { - logs = new ArrayList<>(queue); - } - - final int reportId = event.getReport().getId(); - - BanManagerPlugin.getInstance().getScheduler().runAsync(() -> { - try { - PlayerReportData report = BanManagerPlugin.getInstance() - .getPlayerReportStorage().queryForId(reportId); - - if (report == null) return; - - for (LogData log : logs) { - plugin.getPlugin().getLogStorage().createIfNotExists(log); - plugin.getPlugin().getReportLogStorage().create(new ReportLogData(report, log)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - }); - } - - @IsCancelled(Tristate.UNDEFINED) - @Listener(order = Order.POST) - public void reportDeleted(PlayerReportDeletedEvent event) { - int id = event.getReport().getId(); - - DeleteBuilder builder = plugin.getPlugin().getReportLogStorage().deleteBuilder(); - - try { - 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/sponge-api7/src/main/resources/assets/banmanager-webenhancer b/sponge-api7/src/main/resources/assets/banmanager-webenhancer deleted file mode 120000 index c1bc36e..0000000 --- a/sponge-api7/src/main/resources/assets/banmanager-webenhancer +++ /dev/null @@ -1 +0,0 @@ -../../../../../common/src/main/resources \ No newline at end of file From ef04874d25a8f04d966b53e5f3339da5c97b2bfe Mon Sep 17 00:00:00 2001 From: James Mortemore Date: Sat, 18 Apr 2026 14:26:36 +0100 Subject: [PATCH 2/3] fix: migrate pin feature + e2e fixtures to BanManager v8 placeholder syntax BanManager v8 dropped legacy [token] placeholders in favour of MiniMessage tags, and rejects messages containing legacy & colour codes outright. Without this migration the pin feature silently no-ops and every e2e ban / tempban kick test sees the unsubstituted "" template (or, after rejection, the bundled defaults that have no pin placeholder at all). - CommonPlayerDeniedListener: detect via Message.getRawTemplate() (the resolved string is a Component-backed legacy render and never contains the raw template token after v8). Bail when the template has no . - Bundled common/src/main/resources/messages.yml: rewrite pin.notify / pin.pin / pin.rateLimited in MiniMessage format with , , . - e2e fixtures (bukkit / bungee / fabric / sponge / velocity): - banmanager-webenhancer/messages.yml: same MiniMessage rewrite. - banmanager/messages.yml: shrink from a full clone of the legacy messages.yml to a minimal MiniMessage override of just ban / tempban / banip / tempbanip kick + disallowed templates so the WebEnhancer pin feature has a token to substitute. Everything else falls through to BanManager v8's bundled defaults. - Update CommonPlayerDeniedListenerTest to mock getRawTemplate() and add a null-template case. --- .../listeners/CommonPlayerDeniedListener.java | 4 +- common/src/main/resources/messages.yml | 9 +- .../CommonPlayerDeniedListenerTest.java | 22 +- .../banmanager-webenhancer/messages.yml | 6 +- .../bukkit/configs/banmanager/messages.yml | 365 +-------------- .../banmanager-webenhancer/messages.yml | 5 +- .../bungee/configs/banmanager/messages.yml | 422 +---------------- .../banmanager-webenhancer/messages.yml | 6 +- .../fabric/configs/banmanager/messages.yml | 434 +----------------- .../banmanager-webenhancer/messages.yml | 6 +- .../sponge/configs/banmanager/messages.yml | 365 +-------------- .../banmanager-webenhancer/messages.yml | 5 +- .../velocity/configs/banmanager/messages.yml | 422 +---------------- 13 files changed, 117 insertions(+), 1954 deletions(-) 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 5640166..cee7fa8 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 @@ -13,11 +13,11 @@ public CommonPlayerDeniedListener(WebEnhancerPlugin plugin) { } public void handlePin(PlayerData player, Message message) { - if (!message.toString().contains("[pin]")) return; + String template = message.getRawTemplate(); + if (template == null || !template.contains("")) return; PlayerPinData pin = plugin.getPlayerPinStorage().getValidPin(player); - if (pin != null) { message.set("pin", String.valueOf(pin.getGeneratedPin())); } diff --git a/common/src/main/resources/messages.yml b/common/src/main/resources/messages.yml index 023dec2..9c7e905 100644 --- a/common/src/main/resources/messages.yml +++ b/common/src/main/resources/messages.yml @@ -1,5 +1,8 @@ +# Message templates use MiniMessage formatting: https://docs.advntr.dev/minimessage/format.html +# Placeholders use angle brackets, e.g. , , + messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' - rateLimited: '&cPlease wait [seconds] seconds before generating a new pin' + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' 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 04aeaee..142f971 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 @@ -39,13 +39,11 @@ public void setUp() { @Test public void handlePin_replacesPlaceholderWithPin() { - // Setup when(playerPinStorage.getValidPin(player)).thenReturn(pinData); when(pinData.getGeneratedPin()).thenReturn(123456); - // Create a mocked message with [pin] placeholder Message message = mock(Message.class); - when(message.toString()).thenReturn("Your login pin is: [pin]"); + when(message.getRawTemplate()).thenReturn("Your login pin is: "); listener.handlePin(player, message); @@ -54,9 +52,19 @@ public void handlePin_replacesPlaceholderWithPin() { @Test public void handlePin_ignoresMessagesWithoutPlaceholder() { - // Create a mocked message without [pin] placeholder Message message = mock(Message.class); - when(message.toString()).thenReturn("You have been banned!"); + when(message.getRawTemplate()).thenReturn("You have been banned!"); + + listener.handlePin(player, message); + + verify(playerPinStorage, never()).getValidPin(any()); + verify(message, never()).set(anyString(), anyString()); + } + + @Test + public void handlePin_ignoresMessagesWithNullTemplate() { + Message message = mock(Message.class); + when(message.getRawTemplate()).thenReturn(null); listener.handlePin(player, message); @@ -66,12 +74,10 @@ public void handlePin_ignoresMessagesWithoutPlaceholder() { @Test public void handlePin_handlesNullPinGracefully() { - // Setup - getValidPin returns null when(playerPinStorage.getValidPin(player)).thenReturn(null); - // Create a mocked message with [pin] placeholder Message message = mock(Message.class); - when(message.toString()).thenReturn("Your login pin is: [pin]"); + when(message.getRawTemplate()).thenReturn("Your login pin is: "); listener.handlePin(player, message); diff --git a/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml index 5738200..4ea98a0 100644 --- a/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/bukkit/configs/banmanager-webenhancer/messages.yml @@ -1,5 +1,5 @@ messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' - + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' diff --git a/e2e/platforms/bukkit/configs/banmanager/messages.yml b/e2e/platforms/bukkit/configs/banmanager/messages.yml index 459dab6..92e8951 100644 --- a/e2e/platforms/bukkit/configs/banmanager/messages.yml +++ b/e2e/platforms/bukkit/configs/banmanager/messages.yml @@ -1,366 +1,29 @@ -# BanManager messages configuration for E2E testing -# Modified to include [pin] placeholder for WebEnhancer testing +# BanManager messages overrides for WebEnhancer E2E testing. +# Only the ban / tempban / banip / tempbanip kick + disallowed templates are +# overridden so the WebEnhancer pin feature can substitute . All other +# message keys fall through to BanManager v8's bundled defaults. +# +# Templates use MiniMessage syntax: https://docs.advntr.dev/minimessage/format.html messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - - none: 'none' - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - - alts: - header: 'Possible alts found:' - - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked [kicks] times and warned [warns] times ([warnPoints] Points), has [notes] notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - website: - player: 'https://yourdomain.com/player/[uuid]' - ip: 'http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0' - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: 'All players have been kicked by [actor]' - reason: 'All players have been kicked by [actor] for &4[reason]' - - # Modified for WebEnhancer E2E testing - includes [pin] placeholder ban: player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' tempban: player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - - unbanall: - notify: '&6[player] will be unbanned by [actor]' - - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - - unmute: - notify: '&6[player] has been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - - unmuteip: - notify: '&6[ip] ([players]) have been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - - warn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor]' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - cooldown: '&cThis player was warned too recently, try again later' - - tempwarn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor] which expires in [expires]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - - warnall: - notify: '&6[player] will be warned by [actor] for &4[reason]' - - addnote: - notify: '&6Note added for [player] by [actor]' - error: - cooldown: '&cA note was added for this player too recently, try again later' - - notes: - error: - noResults: '&cNo notes for [player]' - noResults.uuid: '&cNo notes for player' - header: '&6Notes for [player]' - row: '&6[created] &f[message]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - bmactivity: - error: - noResults: '&cNo activity found' - header: '&6Activity for [player]' - row: '&7#[id] &a[&f[type]&a] &6[player]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' banip: ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - notify: '&6[ip] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for ' tempbanip: ip: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - notify: '&6[ip] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - - baniprange: - notify: '&6[from] - [to] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[from] - [to] is already banned' - cooldown: '&cThis ip range was banned too recently, try again later' - - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - error: - noExists: '&c[from] - [to] is not banned' - notOwn: '&c[from] - [to] was not banned by you, unable to unban' - - banname: - disallowed: '&6You may not use the name [name] on this server' - notify: '&6[name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[name] is already banned' - - tempbanname: - notify: '&6[name] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanname: - notify: '&6[name] has been unbanned by [actor]' - error: - noExists: '&c[name] is not banned' - notOwn: '&c[name] was not banned by you, unable to unban' - - report: - error: - notOnline: '&cPlayer must be online to report' - cooldown: '&cToo many reports, please wait a while' - notify: '&6[player] has been reported by [actor] for &4[reason]' - success: '&a[player] has been reported' - created: '&6[actor] has reported [player] for &4[reason]' - - reports: - error: - noResults: '&cNo reports for [player]' - header: '&6Reports for [player]' - list: - row: '&e[id] [player] &6[reason] [created] &e[actor]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - deleterecord: - error: - noExists: '&c[id] does not exist' - deleted: '&a[id] has been deleted' - - clear: - header: - all: '&6Clearing [type] for [player]' - single: '&6Clearing [type]' - error: - noResults: '&cNothing found to delete' - notifyDelete: '&6Deleted [sum] [type] for [player]' - - sync: - error: - inProgress: '&cA sync is already in progress, please wait' - started: '&aSync started' - finished: '&aSync finished' - - external: - error: - notAllowed: '&cExternally synced servers cannot perform this action' - - rollback: - error: - inProgress: '&cA rollback is already in progress, please wait' - noResults: '&cNo results found to rollback' - started: '&aRollback started' - finished: '&aRollback finished, [sum] rows affected' - - dwarn: - notOwn: '&c[id] was not created by you, unable to delete' - noExists: '&c[id] does not exist' - deleted: '&aWarning deleted' - - findAlts: - header: 'Possible alts found:' - noResults: 'No possible alts found' - - update: - notify: 'A new version of BanManager is now available' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for ' diff --git a/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml index 59fdb26..4ea98a0 100644 --- a/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/bungee/configs/banmanager-webenhancer/messages.yml @@ -1,4 +1,5 @@ messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' diff --git a/e2e/platforms/bungee/configs/banmanager/messages.yml b/e2e/platforms/bungee/configs/banmanager/messages.yml index 5bacf5c..92e8951 100644 --- a/e2e/platforms/bungee/configs/banmanager/messages.yml +++ b/e2e/platforms/bungee/configs/banmanager/messages.yml @@ -1,413 +1,29 @@ -# Variables -# [reason] = Ban/Mute reason -# [player] = The name of the player -# [ip] = The banned ip -# [actor] = Who banned/muted -# [expires] = How long until the ban/mute ends +# BanManager messages overrides for WebEnhancer E2E testing. +# Only the ban / tempban / banip / tempbanip kick + disallowed templates are +# overridden so the WebEnhancer pin feature can substitute . All other +# message keys fall through to BanManager v8's bundled defaults. +# +# Templates use MiniMessage syntax: https://docs.advntr.dev/minimessage/format.html messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to - &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - none: none - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please - check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline - player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - alts: - header: 'Possible alts found:' - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player - by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked - [kicks] times and warned [warns] times ([warnPoints] Points), has [notes] - notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned - [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] - which expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - website: - player: https://yourdomain.com/player/[uuid] - ip: http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0 - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: All players have been kicked by [actor] - reason: All players have been kicked by [actor] for &4[reason] ban: player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your - appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for . Your appeal pin is ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + tempban: player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] - \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - unbanall: - notify: '&6[player] will be unbanned by [actor]' - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which - expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which - expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] - for &4[reason]' - error: - exists: '&c[ip] is already muted' - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - unmute: - notify: '&6[player] has been unmuted by [actor]' - player: '&6You have been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - unmuteip: - notify: '&6[ip] has been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - banname: - name: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6Name [name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&cName [name] is already banned' - tempbanname: - name: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires - in [expires]' - kick: '&6You have been temporarily banned for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6Name [name] has been temporarily banned for [expires] by [actor] for - &4[reason]' - unbanname: - notify: '&6Name [name] has been unbanned by [actor]' - error: - noExists: '&cName [name] is not banned' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for . Your appeal pin is ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + banip: ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your - appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[ip] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' - baniprange: - error: - invalid: '&cInvalid range, please use cidr notation 192.168.0.1/16 or wildcard - 192.168.*.*' - minMax: '&cRange must be lowest to highest' - exists: '&cA ban containing those ranges already exists' - ip: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[from] - [to] have been banned by [actor]' - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor]' - ip: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires - in [expires]' - kick: '&6You have been temporarily banned for [expires] by [actor] for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - banipall: - notify: '&6[ip] will be permanently banned by [actor] for &4[reason]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for ' + tempbanip: ip: - disallowed: '&6You have been temporarily banned from this server for &4[reason] - \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[ip] has been temporarily banned for [expires] by [actor] for &4[reason]' - tempbanipall: - notify: '&6[ip] will be temporarily banned for [expires] by [actor] for &4[reason]' - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - unbanipall: - notify: '&6[ip] will be unbanned by [actor]' - warn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor]' - disallowed: - header: '&cYou may not speak until you have accepted your most recent warning. - Please type the following:' - reason: '&6[reason]' - removed: '&aThank you for your understanding, you may now speak again' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - cooldown: '&cThis player was warned too recently, try again later' - exists: '&c[player] has already been warned for that reason' - tempwarn: - player: - warned: '&6You have been warned for [expires] by [actor] for &4[reason]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - dwarn: - player: - notify: '&6Your most recent warning has been deleted by &4[actor]' - notify: '&cThe most recent warning for [player] has been deleted' - error: - noWarnings: '&c[player] has no warnings to delete' - bmclear: - notify: '&c[player] has had their [type] cleared' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, - notes or warnings' - bmutils: - missingplayers: - notify: '&c[amount] missing players added' - noneFound: '&a0 missing players found' - found: '&c[amount] missing player data found. Fixing...' - error: - failedLookup: '&cFailed to lookup player [uuid], check server logs' - complete: '&a[amount] players resolved, please restart your server for failed - punishments to take affect' - duplicates: - lookup: - notFound: '&aNo duplicate player names found' - error: - invalidName: '&cInvalid name, must be 16 characters or less and contain only - letters, numbers and an underscore' - nameExists: '&cA player with that name already exists' - success: '&aPlayer name set to [player] successfully' - bmrollback: - notify: '&c[player] has had their [type] actions undone' - error: - invalid: '&cInvalid type [type], please choose between [types]' - sync: - player: - started: '&aStarting force [type] synchronisation' - finished: '&aForced [type] synchronisation complete' - update: - notify: '&6[BanManager] &aAn update is available' - notes: - header: '&6[player] has the following notes:' - joinAmount: '&6[player] has &e[amount] &6notes, click to view them' - note: '&6[[player]] &e[message] - &e[created]' - playerNote: '&a[[player]] &6[[actor]] &e[message] - &e[created]' - dateTimeFormat: dd-MM-yyyy - notify: '[player] has a new note attached by [actor]: [message]' - error: - noNotes: '&c[player] has no notes' - noOnlineNotes: '&cNo online players have notes' - report: - notify: '&6[player] has been reported by [actor] for &4[reason]' - error: - cooldown: '&cToo many reports, please wait a while' - notOnline: '&cPlayer must be online to report' - assign: - player: '&aReport [id] assigned to [player]' - notify: '&aYou have been assigned report [id] by [actor]' - unassign: - player: '&aReport [id] unassigned' - close: - notify: - closed: '&aReport [id] closed by [actor]' - command: '&aReport [id] closed by [actor] with [command]' - comment: '&aReport [id] closed by [actor] with [comment]' - dispatch: Executing command [command] - list: - noResults: '&cNo reports found' - error: - invalidState: '&cReport state [state] not found' - row: - dateTimeFormat: yyyy-MM-dd HH:mm:ss - header: '&e-- Reports ([count]) -- Page ([page]/[maxPage])' - all: '&7#[id] &e[[state]] &6- [created] - [player]' - tp: - error: - notFound: '&cReport not found' - worldNotFound: '&cWorld [world] could not be found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - info: - error: - notFound: '&cReport not found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - success: '&a[player] has been reported' - created: '&6[actor] has reported [player] for &4[reason]' - addnoteall: - notify: '&c[player] will have a new attached by [actor]: [message]' - banlist: - header: '&6There are [bans] [type] bans:' - bmactivity: - row: - all: '&a[&f[type]&a] &6[player]&f - &6[actor]&f - &e[created]' - player: '&a[&f[type]&a] &6[player]&f - &e[created]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - noResults: '&cNo results found' - bmdelete: - notify: '&a[rows] rows deleted' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, - notes or warnings' - invalidId: '&c[id] is not a valid number' - denyalts: - player: - disallowed: '&cThe IP address you are joining from is linked to a banned player' - reasons: - row: '[hashtag] = [reason]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for ' diff --git a/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml index 5738200..4ea98a0 100644 --- a/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/fabric/configs/banmanager-webenhancer/messages.yml @@ -1,5 +1,5 @@ messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' - + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' diff --git a/e2e/platforms/fabric/configs/banmanager/messages.yml b/e2e/platforms/fabric/configs/banmanager/messages.yml index 8a833ce..92e8951 100644 --- a/e2e/platforms/fabric/configs/banmanager/messages.yml +++ b/e2e/platforms/fabric/configs/banmanager/messages.yml @@ -1,435 +1,29 @@ -# Variables -# [reason] = Ban/Mute reason -# [player] = The name of the player -# [ip] = The banned ip -# [actor] = Who banned/muted -# [expires] = How long until the ban/mute ends +# BanManager messages overrides for WebEnhancer E2E testing. +# Only the ban / tempban / banip / tempbanip kick + disallowed templates are +# overridden so the WebEnhancer pin feature can substitute . All other +# message keys fall through to BanManager v8's bundled defaults. +# +# Templates use MiniMessage syntax: https://docs.advntr.dev/minimessage/format.html messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - - none: 'none' - # General command text - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - # Commands - alts: - header: 'Possible alts found:' - - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked [kicks] times and warned [warns] - times ([warnPoints] Points), has [notes] notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - website: - player: 'https://yourdomain.com/player/[uuid]' - ip: 'http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0' - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: 'All players have been kicked by [actor]' - reason: 'All players have been kicked by [actor] for &4[reason]' - - # Modified for WebEnhancer E2E testing - includes [pin] placeholder ban: player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' tempban: player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - - unbanall: - notify: '&6[player] will be unbanned by [actor]' - - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - - unmute: - notify: '&6[player] has been unmuted by [actor]' - player: '&6You have been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - - unmuteip: - notify: '&6[ip] has been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - - banname: - name: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6Name [name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&cName [name] is already banned' - - tempbanname: - name: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]' - kick: '&6You have been temporarily banned for &4[reason]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6Name [name] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanname: - notify: '&6Name [name] has been unbanned by [actor]' - error: - noExists: '&cName [name] is not banned' banip: ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[ip] ([players]) has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' - - baniprange: - error: - invalid: '&cInvalid range, please use cidr notation 192.168.0.1/16 or wildcard 192.168.*.*' - minMax: '&cRange must be lowest to highest' - exists: '&cA ban containing those ranges already exists' - ip: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[from] - [to] have been banned by [actor]' - - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor]' - ip: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]' - kick: '&6You have been temporarily banned for [expires] by [actor] for &4[reason]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - - banipall: - notify: '&6[ip] will be permanently banned by [actor] for &4[reason]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for ' tempbanip: ip: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[ip] ([players]) has been temporarily banned for [expires] by [actor] for &4[reason]' - - tempbanipall: - notify: '&6[ip] will be temporarily banned for [expires] by [actor] for &4[reason]' - - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - - unbanipall: - notify: '&6[ip] will be unbanned by [actor]' - - warn: - player: - warned: '&6You have been warned by [actor] for &4[reason]' - disallowed: - header: '&cYou may not speak until you have accepted your most recent warning. Please type the following:' - reason: '&6[reason]' - removed: '&aThank you for your understanding, you may now speak again' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - cooldown: '&cThis player was warned too recently, try again later' - - tempwarn: - player: - warned: '&6You have been warned for [expires] by [actor] for &4[reason]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - - dwarn: - player: - notify: '&6Your most recent warning has been deleted by &4[actor]' - notify: '&cThe most recent warning for [player] has been deleted' - error: - noWarnings: '&c[player] has no warnings to delete' - - bmclear: - notify: '&c[player] has had their [type] cleared' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, notes or warnings' - - bmutils: - missingplayers: - notify: '&c[amount] missing players added' - noneFound: '&a0 missing players found' - found: '&c[amount] missing player data found. Fixing...' - error: - failedLookup: '&cFailed to lookup player [uuid], check server logs' - complete: '&a[amount] players resolved, please restart your server for failed punishments to take affect' - duplicates: - lookup: - notFound: '&aNo duplicate player names found' - error: - invalidName: '&cInvalid name, must be 16 characters or less and contain only letters, numbers and an underscore' - nameExists: '&cA player with that name already exists' - success: '&aPlayer name set to [player] successfully' - - bmrollback: - notify: '&c[player] has had their [type] actions undone' - error: - invalid: '&cInvalid type [type], please choose between [types]' - - sync: - player: - started: '&aStarting force [type] synchronisation' - finished: '&aForced [type] synchronisation complete' - - update: - notify: '&6[BanManager] &aAn update is available' - - notes: - header: '&6[player] has the following notes:' - joinAmount: '&6[player] has &e[amount] &6notes, click to view them' - note: '&6[[player]] &e[message] - &e[created]' - playerNote: '&a[[player]] &6[[actor]] &e[message] - &e[created]' - dateTimeFormat: 'dd-MM-yyyy' - notify: '[player] has a new note attached by [actor]: [message]' - error: - noNotes: '&c[player] has no notes' - noOnlineNotes: '&cNo online players have notes' - - report: - notify: '&6[player] has been reported by [actor] for &4[reason]' - error: - cooldown: '&cThis player was reported too recently, try again later' - assign: - player: '&aReport [id] assigned to [player]' - notify: '&aYou have been assigned report [id] by [actor]' - unassign: - player: '&aReport [id] unassigned' - close: - notify: - closed: '&aReport [id] closed by [actor]' - command: '&aReport [id] closed by [actor] with [command]' - comment: '&aReport [id] closed by [actor] with [comment]' - dispatch: 'Executing command [command]' - list: - noResults: '&cNo reports found' - error: - invalidState: '&cReport state [state] not found' - row: - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - header: '&e-- Reports ([count]) -- Page ([page]/[maxPage])' - all: '&7#[id] &e[[state]] &6- [created] - [player]' - tp: - error: - notFound: '&cReport not found' - worldNotFound: '&cWorld [world] could not be found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - info: - error: - notFound: '&cReport not found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - - addnoteall: - notify: '&c[player] will have a new attached by [actor]: [message]' - - banlist: - header: '&6There are [bans] [type] bans:' - - bmactivity: - row: - all: '&a[&f[type]&a] &6[player]&f - &6[actor]&f - &e[created]' - player: '&a[&f[type]&a] &6[player]&f - &e[created]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - noResults: '&cNo results found' - - bmdelete: - notify: '&a[rows] rows deleted' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, notes or warnings' - invalidId: '&c[id] is not a valid number' - - denyalts: - player: - disallowed: '&cThe IP address you are joining from is linked to a banned player' - - reasons: - row: '[hashtag] = [reason]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for ' diff --git a/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml index 5738200..4ea98a0 100644 --- a/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/sponge/configs/banmanager-webenhancer/messages.yml @@ -1,5 +1,5 @@ messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' - + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' diff --git a/e2e/platforms/sponge/configs/banmanager/messages.yml b/e2e/platforms/sponge/configs/banmanager/messages.yml index 459dab6..92e8951 100644 --- a/e2e/platforms/sponge/configs/banmanager/messages.yml +++ b/e2e/platforms/sponge/configs/banmanager/messages.yml @@ -1,366 +1,29 @@ -# BanManager messages configuration for E2E testing -# Modified to include [pin] placeholder for WebEnhancer testing +# BanManager messages overrides for WebEnhancer E2E testing. +# Only the ban / tempban / banip / tempbanip kick + disallowed templates are +# overridden so the WebEnhancer pin feature can substitute . All other +# message keys fall through to BanManager v8's bundled defaults. +# +# Templates use MiniMessage syntax: https://docs.advntr.dev/minimessage/format.html messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - - none: 'none' - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - - alts: - header: 'Possible alts found:' - - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked [kicks] times and warned [warns] times ([warnPoints] Points), has [notes] notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - website: - player: 'https://yourdomain.com/player/[uuid]' - ip: 'http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0' - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' - - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: 'All players have been kicked by [actor]' - reason: 'All players have been kicked by [actor] for &4[reason]' - - # Modified for WebEnhancer E2E testing - includes [pin] placeholder ban: player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' tempban: player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for . Your appeal pin is ' dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - - unbanall: - notify: '&6[player] will be unbanned by [actor]' - - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - - unmute: - notify: '&6[player] has been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - - unmuteip: - notify: '&6[ip] ([players]) have been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - - warn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor]' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - cooldown: '&cThis player was warned too recently, try again later' - - tempwarn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor] which expires in [expires]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] has already been warned for that reason' - - warnall: - notify: '&6[player] will be warned by [actor] for &4[reason]' - - addnote: - notify: '&6Note added for [player] by [actor]' - error: - cooldown: '&cA note was added for this player too recently, try again later' - - notes: - error: - noResults: '&cNo notes for [player]' - noResults.uuid: '&cNo notes for player' - header: '&6Notes for [player]' - row: '&6[created] &f[message]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - bmactivity: - error: - noResults: '&cNo activity found' - header: '&6Activity for [player]' - row: '&7#[id] &a[&f[type]&a] &6[player]&f [meta] [reason] - &e[created]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' banip: ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - notify: '&6[ip] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for ' tempbanip: ip: - disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - notify: '&6[ip] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - - baniprange: - notify: '&6[from] - [to] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[from] - [to] is already banned' - cooldown: '&cThis ip range was banned too recently, try again later' - - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - error: - noExists: '&c[from] - [to] is not banned' - notOwn: '&c[from] - [to] was not banned by you, unable to unban' - - banname: - disallowed: '&6You may not use the name [name] on this server' - notify: '&6[name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[name] is already banned' - - tempbanname: - notify: '&6[name] has been temporarily banned for [expires] by [actor] for &4[reason]' - - unbanname: - notify: '&6[name] has been unbanned by [actor]' - error: - noExists: '&c[name] is not banned' - notOwn: '&c[name] was not banned by you, unable to unban' - - report: - error: - notOnline: '&cPlayer must be online to report' - cooldown: '&cToo many reports, please wait a while' - notify: '&6[player] has been reported by [actor] for &4[reason]' - success: '&a[player] has been reported' - created: '&6[actor] has reported [player] for &4[reason]' - - reports: - error: - noResults: '&cNo reports for [player]' - header: '&6Reports for [player]' - list: - row: '&e[id] [player] &6[reason] [created] &e[actor]' - dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' - - deleterecord: - error: - noExists: '&c[id] does not exist' - deleted: '&a[id] has been deleted' - - clear: - header: - all: '&6Clearing [type] for [player]' - single: '&6Clearing [type]' - error: - noResults: '&cNothing found to delete' - notifyDelete: '&6Deleted [sum] [type] for [player]' - - sync: - error: - inProgress: '&cA sync is already in progress, please wait' - started: '&aSync started' - finished: '&aSync finished' - - external: - error: - notAllowed: '&cExternally synced servers cannot perform this action' - - rollback: - error: - inProgress: '&cA rollback is already in progress, please wait' - noResults: '&cNo results found to rollback' - started: '&aRollback started' - finished: '&aRollback finished, [sum] rows affected' - - dwarn: - notOwn: '&c[id] was not created by you, unable to delete' - noExists: '&c[id] does not exist' - deleted: '&aWarning deleted' - - findAlts: - header: 'Possible alts found:' - noResults: 'No possible alts found' - - update: - notify: 'A new version of BanManager is now available' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for ' diff --git a/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml b/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml index 59fdb26..4ea98a0 100644 --- a/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml +++ b/e2e/platforms/velocity/configs/banmanager-webenhancer/messages.yml @@ -1,4 +1,5 @@ messages: pin: - notify: '&6Your pin expires in [expires]' - pin: '[pin]' + notify: 'Your pin expires in ' + pin: '' + rateLimited: 'Please wait seconds before generating a new pin' diff --git a/e2e/platforms/velocity/configs/banmanager/messages.yml b/e2e/platforms/velocity/configs/banmanager/messages.yml index 5bacf5c..92e8951 100644 --- a/e2e/platforms/velocity/configs/banmanager/messages.yml +++ b/e2e/platforms/velocity/configs/banmanager/messages.yml @@ -1,413 +1,29 @@ -# Variables -# [reason] = Ban/Mute reason -# [player] = The name of the player -# [ip] = The banned ip -# [actor] = Who banned/muted -# [expires] = How long until the ban/mute ends +# BanManager messages overrides for WebEnhancer E2E testing. +# Only the ban / tempban / banip / tempbanip kick + disallowed templates are +# overridden so the WebEnhancer pin feature can substitute . All other +# message keys fall through to BanManager v8's bundled defaults. +# +# Templates use MiniMessage syntax: https://docs.advntr.dev/minimessage/format.html messages: - duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' - duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' - configReloaded: '&aConfiguration reloaded successfully!' - deniedNotify: - player: '&cWarning: [player] attempted to join the server but was denied due to - &4[reason]' - ip: '&cWarning: [ip] attempted to join the server but was denied due to &4[reason]' - deniedMaxIp: '&cToo many players with your ip address online' - deniedMultiaccounts: '&cToo many players with your ip address logged in recently' - deniedCountry: '&cYou 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: '&cYour time length is invalid' - limit: '&cYou cannot perform this action for that length of time' - none: none - sender: - error: - notFound: '&c[player] not found, are you sure they exist?' - offline: '&c[player] is offline' - noSelf: '&cYou cannot perform that action on yourself!' - exception: '&cAn error occured whilst attempting to perform this command. Please - check the console for further details.' - invalidIp: '&cInvalid IP address, expecting w.x.y.z format' - offlinePermission: '&cYou are not allowed to perform this action on an offline - player' - exempt: '&c[player] is exempt from that action' - noPermission: '&cYou do not have permission to perform that action' - invalidReason: '&c[reason] is no valid reason.' - alts: - header: 'Possible alts found:' - export: - error: - inProgress: '&cAn export is already in progress, please wait' - player: - started: '&aPlayer ban export started' - finished: '&aPlayer ban export finished, file [file] created' - ip: - started: '&aIP ban export started' - finished: '&aIP ban export finished, file [file] created' - import: - error: - inProgress: '&cAn import is already in progress, please wait' - player: - started: '&aPlayer ban import started' - finished: '&aPlayer ban import finished' - ip: - started: '&aIP ban import started' - finished: '&aIP ban import finished' - advancedban: - started: '&aAdvancedBan import started' - finished: '&aAdvancedBan import finished' - h2: - started: '&aH2 import started' - finished: '&aH2 import finished, please restart the server' - info: - error: - invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name] found, please select a player - by providing an index between 1 and [size], e.g. /bminfo [name] 1' - index: '&7#[index] - &6[name] - &4[uuid]' - stats: - player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked - [kicks] times and warned [warns] times ([warnPoints] Points), has [notes] - notes and been reported [reports] times' - ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned - [rangebans] times' - connection: '&6Their last connection was with [ip] on [lastSeen]' - geoip: 'Country: [country] City: [city]' - ban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - ipban: - permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - iprangeban: - permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' - temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] - which expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - ipmute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - mute: - permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' - temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which - expires in [expires]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - website: - player: https://yourdomain.com/player/[uuid] - ip: http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0 - history: - row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - noResults: '&cNo results found' - ips: - row: '&e[ip] - &6[join] - [leave]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - kick: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: '&6[player] has been kicked by [actor]' - reason: '&6[player] has been kicked by [actor] for &4[reason]' - kickall: - player: - noReason: '&6You have been kicked' - reason: '&6You have been kicked for &4[reason]' - notify: - noReason: All players have been kicked by [actor] - reason: All players have been kicked by [actor] for &4[reason] ban: player: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your - appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[player] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[player] is already banned' - cooldown: '&cThis player was banned too recently, try again later' - banall: - notify: '&6[player] will be permanently banned by [actor] for &4[reason]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for . Your appeal pin is ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + tempban: player: - disallowed: '&6You have been temporarily banned from this server for &4[reason] - \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' - tempbanall: - notify: '&6[player] will be temporarily banned for [expires] by [actor] for &4[reason]' - unban: - notify: '&6[player] has been unbanned by [actor]' - error: - noExists: '&c[player] is not banned' - notOwn: '&c[player] was not banned by you, unable to unban' - unbanall: - notify: '&6[player] will be unbanned by [actor]' - mute: - player: - blocked: '&cYou may not use the [command] command whilst muted!' - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[player] has been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - cooldown: '&cThis player was muted too recently, try again later' - muteip: - ip: - disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted] [player]&7 [message]' - notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' - error: - exists: '&c[ip] is already muted' - muteall: - notify: '&6[player] will be permanently muted by [actor] for &4[reason]' - tempmute: - player: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which - expires in [expires]' - notify: '&6[player] has been temporarily muted for [expires] by [actor] for &4[reason]' - error: - exists: '&c[player] is already muted' - tempmuteip: - ip: - disallowed: '&6You have been temporarily muted for &4[reason] &6by [actor] which - expires in [expires]' - notify: '&6[ip] ([players]) have been temporarily muted for [expires] by [actor] - for &4[reason]' - error: - exists: '&c[ip] is already muted' - tempmuteall: - notify: '&6[player] will be temporarily muted for [expires] by [actor] for &4[reason]' - unmute: - notify: '&6[player] has been unmuted by [actor]' - player: '&6You have been unmuted by [actor]' - error: - noExists: '&c[player] is not muted' - notOwn: '&c[player] was not muted by you, unable to unmute' - unmuteip: - notify: '&6[ip] has been unmuted by [actor]' - error: - noExists: '&c[ip] is not muted' - notOwn: '&c[ip] was not muted by you, unable to unmute' - unmuteall: - notify: '&6[player] will be unmuted by [actor]' - banname: - name: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6Name [name] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&cName [name] is already banned' - tempbanname: - name: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires - in [expires]' - kick: '&6You have been temporarily banned for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6Name [name] has been temporarily banned for [expires] by [actor] for - &4[reason]' - unbanname: - notify: '&6Name [name] has been unbanned by [actor]' - error: - noExists: '&cName [name] is not banned' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for . Your appeal pin is ' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' + banip: ip: - disallowed: '&6You have been banned from this server for &4[reason]&6. Your - appeal pin is [pin]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[ip] has been permanently banned by [actor] for &4[reason]' - error: - exists: '&c[ip] is already banned' - cooldown: '&cThis ip was banned too recently, try again later' - baniprange: - error: - invalid: '&cInvalid range, please use cidr notation 192.168.0.1/16 or wildcard - 192.168.*.*' - minMax: '&cRange must be lowest to highest' - exists: '&cA ban containing those ranges already exists' - ip: - disallowed: '&6You have been banned from this server for &4[reason]' - kick: '&6You have been banned permanently for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[from] - [to] have been banned by [actor]' - tempbaniprange: - notify: '&6[from] - [to] has been temporarily banned for [expires] by [actor]' - ip: - disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires - in [expires]' - kick: '&6You have been temporarily banned for [expires] by [actor] for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - unbaniprange: - notify: '&6[from] - [to] has been unbanned by [actor]' - banipall: - notify: '&6[ip] will be permanently banned by [actor] for &4[reason]' + disallowed: 'You have been banned from this server for . Your appeal pin is ' + kick: 'You have been banned permanently for ' + tempbanip: ip: - disallowed: '&6You have been temporarily banned from this server for &4[reason] - \n&6It expires in [expires]. Your appeal pin is [pin]' - kick: '&6You have been temporarily banned for &4[reason]' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: '&6[ip] has been temporarily banned for [expires] by [actor] for &4[reason]' - tempbanipall: - notify: '&6[ip] will be temporarily banned for [expires] by [actor] for &4[reason]' - unbanip: - notify: '&6[ip] has been unbanned by [actor]' - error: - noExists: '&c[ip] is not banned' - notOwn: '&c[ip] was not banned by you, unable to unban' - unbanipall: - notify: '&6[ip] will be unbanned by [actor]' - warn: - player: - warned: '&cYou have been warned for &4[reason] &cby [actor]' - disallowed: - header: '&cYou may not speak until you have accepted your most recent warning. - Please type the following:' - reason: '&6[reason]' - removed: '&aThank you for your understanding, you may now speak again' - notify: '&6[player] has been warned by [actor] for &4[reason]' - error: - cooldown: '&cThis player was warned too recently, try again later' - exists: '&c[player] has already been warned for that reason' - tempwarn: - player: - warned: '&6You have been warned for [expires] by [actor] for &4[reason]' - notify: '&6[player] has been warned for [expires] by [actor] for &4[reason]' - dwarn: - player: - notify: '&6Your most recent warning has been deleted by &4[actor]' - notify: '&cThe most recent warning for [player] has been deleted' - error: - noWarnings: '&c[player] has no warnings to delete' - bmclear: - notify: '&c[player] has had their [type] cleared' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, - notes or warnings' - bmutils: - missingplayers: - notify: '&c[amount] missing players added' - noneFound: '&a0 missing players found' - found: '&c[amount] missing player data found. Fixing...' - error: - failedLookup: '&cFailed to lookup player [uuid], check server logs' - complete: '&a[amount] players resolved, please restart your server for failed - punishments to take affect' - duplicates: - lookup: - notFound: '&aNo duplicate player names found' - error: - invalidName: '&cInvalid name, must be 16 characters or less and contain only - letters, numbers and an underscore' - nameExists: '&cA player with that name already exists' - success: '&aPlayer name set to [player] successfully' - bmrollback: - notify: '&c[player] has had their [type] actions undone' - error: - invalid: '&cInvalid type [type], please choose between [types]' - sync: - player: - started: '&aStarting force [type] synchronisation' - finished: '&aForced [type] synchronisation complete' - update: - notify: '&6[BanManager] &aAn update is available' - notes: - header: '&6[player] has the following notes:' - joinAmount: '&6[player] has &e[amount] &6notes, click to view them' - note: '&6[[player]] &e[message] - &e[created]' - playerNote: '&a[[player]] &6[[actor]] &e[message] - &e[created]' - dateTimeFormat: dd-MM-yyyy - notify: '[player] has a new note attached by [actor]: [message]' - error: - noNotes: '&c[player] has no notes' - noOnlineNotes: '&cNo online players have notes' - report: - notify: '&6[player] has been reported by [actor] for &4[reason]' - error: - cooldown: '&cToo many reports, please wait a while' - notOnline: '&cPlayer must be online to report' - assign: - player: '&aReport [id] assigned to [player]' - notify: '&aYou have been assigned report [id] by [actor]' - unassign: - player: '&aReport [id] unassigned' - close: - notify: - closed: '&aReport [id] closed by [actor]' - command: '&aReport [id] closed by [actor] with [command]' - comment: '&aReport [id] closed by [actor] with [comment]' - dispatch: Executing command [command] - list: - noResults: '&cNo reports found' - error: - invalidState: '&cReport state [state] not found' - row: - dateTimeFormat: yyyy-MM-dd HH:mm:ss - header: '&e-- Reports ([count]) -- Page ([page]/[maxPage])' - all: '&7#[id] &e[[state]] &6- [created] - [player]' - tp: - error: - notFound: '&cReport not found' - worldNotFound: '&cWorld [world] could not be found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - info: - error: - notFound: '&cReport not found' - invalidId: '&c[id] is not a valid report id' - dateTimeFormat: yyyy-MM-dd HH:mm:ss - notify: - report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' - location: '[world] - [x], [y], [z]' - success: '&a[player] has been reported' - created: '&6[actor] has reported [player] for &4[reason]' - addnoteall: - notify: '&c[player] will have a new attached by [actor]: [message]' - banlist: - header: '&6There are [bans] [type] bans:' - bmactivity: - row: - all: '&a[&f[type]&a] &6[player]&f - &6[actor]&f - &e[created]' - player: '&a[&f[type]&a] &6[player]&f - &e[created]' - dateTimeFormat: dd-MM-yyyy HH:mm:ss - noResults: '&cNo results found' - bmdelete: - notify: '&a[rows] rows deleted' - error: - invalid: '&cInvalid type, please choose between banrecords, muterecords, kicks, - notes or warnings' - invalidId: '&c[id] is not a valid number' - denyalts: - player: - disallowed: '&cThe IP address you are joining from is linked to a banned player' - reasons: - row: '[hashtag] = [reason]' + disallowed: 'You have been temporarily banned from this server for \nIt expires in . Your appeal pin is ' + kick: 'You have been temporarily banned for ' From 3497ac103bf48b6e30e039a4a64e0a4074c888ba Mon Sep 17 00:00:00 2001 From: James Mortemore Date: Sat, 18 Apr 2026 14:52:57 +0100 Subject: [PATCH 3/3] fix(e2e): recurse into nested extra when extracting kick reason text MiniMessage renders nested-color templates like `ABC` as nested (not flat) chat components, so the NBT compound disconnect packets Paper 1.20.3+ / newer Fabric versions send contain nested `extra` lists that our helper was not traversing. The result: online kick reasons (and even login-denied kicks on Fabric 1.21.11) got truncated at the first nested segment, hiding the `. Your appeal pin is ` tail and failing the Online Kick Pin Placeholder tests on every platform except Fabric-1.20.1 (which still uses the legacy JSON disconnect format). - `extractNbtText` now recurses into each `extra[*]` list item so nested `text`/`extra` pairs are concatenated in order. - New `extractJsonText` helper mirrors that behaviour for JSON chat components, replacing the previous shallow `extra.map(e => e.text)` that had the same truncation bug for nested JSON payloads (e.g. Velocity/Sponge login-denied kicks). --- e2e/tests/src/helpers/bot.ts | 51 ++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/e2e/tests/src/helpers/bot.ts b/e2e/tests/src/helpers/bot.ts index 539fbec..574799c 100644 --- a/e2e/tests/src/helpers/bot.ts +++ b/e2e/tests/src/helpers/bot.ts @@ -6,11 +6,16 @@ const SERVER_PORT = parseInt(process.env.SERVER_PORT ?? '25565', 10) const MC_VERSION = process.env.MC_VERSION ?? undefined /** - * Extract text from an NBT compound chat component (Paper 1.20.5+ sends kick - * reasons as PrismarineNBT compounds instead of JSON chat components). + * Recursively extract text from an NBT compound chat component (Paper 1.20.5+ + * sends kick reasons as PrismarineNBT compounds instead of JSON chat + * components). Nested children inside `extra[*].extra` must be traversed so + * MiniMessage-rendered nested components (e.g. `ABC`) + * don't get truncated at the first nesting level. */ function extractNbtText (nbt: Record): string { - const value = nbt.value as Record + const value = nbt.value as Record | undefined + if (value == null) return '' + let result = '' const textField = value.text as Record | undefined @@ -25,10 +30,9 @@ function extractNbtText (nbt: Record): string { if (Array.isArray(items)) { for (const item of items) { if (typeof item === 'object' && item != null) { - const t = (item as Record).text as Record | undefined - if (t?.type === 'string' && typeof t.value === 'string') { - result += t.value - } + // Each list item is itself an NBT compound-like value; recurse so we + // pick up nested text/extra fields. + result += extractNbtText({ value: item }) } } } @@ -37,6 +41,27 @@ function extractNbtText (nbt: Record): string { return result } +/** + * Recursively extract text from a JSON chat component, traversing nested + * `extra` arrays so nested MiniMessage output isn't truncated. + */ +function extractJsonText (component: unknown): string { + if (typeof component === 'string') return component + if (component == null || typeof component !== 'object') return '' + + const obj = component as Record + let result = '' + + if (typeof obj.text === 'string') result += obj.text + if (Array.isArray(obj.extra)) { + for (const child of obj.extra) { + result += extractJsonText(child) + } + } + + return result +} + /** * Extract text from a kick reason (string on Bukkit, ChatMessage object on * Fabric, or NBT compound on newer Paper). @@ -61,16 +86,8 @@ function extractKickReason (reason: unknown): string { if (typeof reasonObj.toMotd === 'function') { return reasonObj.toMotd() as string } - if ('text' in reasonObj && typeof reasonObj.text === 'string') { - return reasonObj.text - } - if ('extra' in reasonObj && Array.isArray(reasonObj.extra)) { - return reasonObj.extra.map((e: unknown) => { - if (typeof e === 'object' && e != null && 'text' in e) { - return (e as Record).text ?? '' - } - return '' - }).join('') + if ('text' in reasonObj || 'extra' in reasonObj) { + return extractJsonText(reasonObj) } return JSON.stringify(reason) }