Skip to content

Commit 3239eed

Browse files
authored
feat: replace [pin] on initial kick and fix pinCheck boot warning (#33)
* feat: replace [pin] on initial kick and fix pinCheck boot warning Listen to PlayerBannedEvent on all 6 platforms to call handlePin when a kickMessage is present, enabling [pin] replacement on the first kick of an online player (not just reconnect denial). Change ExpiresSync from extends BmRunnable to implements Runnable to eliminate the spurious "unknown last checked pinCheck" log on every boot. Add e2e tests verifying the kick message contains a 6-digit pin when banning/tempbanning an online player. Add waitForKick() helper to TestBot with proper listener cleanup and race-safe settlement. * fix: add [pin] placeholder to ban/tempban kick message templates The e2e message configs only had [pin] in the disallowed (reconnect denial) templates but not in the kick (online player) templates, causing the Online Kick Pin tests to fail. * fix: improve e2e test resilience for kick and denial tests - Handle NBT compound chat components in kick reasons (Paper 1.20.5+) - Add delay in waitForKick end handler to avoid socketClosed race - Increase denial retry attempts and sleeps for async ban persistence - Disconnect bot before unban in afterEach to avoid stale kick on reconnect * fix: prevent stale SNAPSHOT dependencies in CI - Add --refresh-dependencies to build step to force fresh SNAPSHOT resolution - Use run_id in Loom cache key to prevent serving stale remapped dependency JARs * fix: compile against BanManager from source and clean up bot on kick - Checkout BanManager and publishToMavenLocal in both CI workflows so WebEnhancer always compiles against the latest API (Fabric Stonecutter artifacts are not reliably published to Maven Central snapshots) - Clean up mineflayer bot (removeAllListeners + end) on kick/error during connect() and waitForKick() to prevent physics timers running after Jest teardown * fix: force fresh BanManager dependency resolution and await bot cleanup - Clear BanManager artifacts from Gradle and Loom caches before build so publishToMavenLocal takes priority over stale cached SNAPSHOTs - Add --refresh-dependencies to Gradle build commands to bypass dependency resolution cache entirely - Wait for mineflayer 'end' event before resolving waitForKick() and connect() cleanup, so the physics timer is cleared before Jest teardown begins (prevents prismarine-physics ReferenceError) - Stop calling removeAllListeners() before bot.end() which stripped mineflayer's internal cleanup handlers * chore: bump version to 7.11.0-SNAPSHOT to match BanManager * fix: remove --refresh-dependencies from Fabric remapJar step to avoid OOM Dependencies are already freshly resolved by the preceding build step. The redundant --refresh-dependencies on the memory-intensive Loom remapping step caused OutOfMemoryError. * fix: improve denied-pin test cleanup and timing for Fabric - Clear both permanent and temp bans in afterEach (bmunban + bmuntempban) - Disconnect bot before unban to avoid stale state - Add 2s sleep after cleanup for async processing to settle - Increase sleep after bmtempban from 3s to 5s for Fabric enforcement lag * fix: use short connect timeout in denied connection checks On Fabric 1.21.4, tempbanned players sometimes enter a limbo state (connected but neither spawned nor kicked) consuming the full 30s connect timeout per attempt. Use a 10s timeout with 8 retries instead, and increase the test timeout to 120s for headroom.
1 parent 5a592d9 commit 3239eed

18 files changed

Lines changed: 309 additions & 44 deletions

File tree

.github/workflows/build.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ jobs:
2626
steps:
2727
- uses: actions/checkout@v4
2828

29+
- uses: actions/checkout@v4
30+
with:
31+
repository: BanManagement/BanManager
32+
path: BanManager
33+
ref: master
34+
2935
- name: Set up JDK 17
3036
uses: actions/setup-java@v4
3137
with:
@@ -50,10 +56,19 @@ jobs:
5056
key: ${{ runner.os }}-loom-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }}
5157
restore-keys: ${{ runner.os }}-loom-
5258

59+
- name: Publish BanManager to Maven Local
60+
working-directory: BanManager
61+
run: ./gradlew publishToMavenLocal --build-cache
62+
63+
- name: Clear stale BanManager dependency caches
64+
run: |
65+
find ~/.gradle/caches -path "*/me.confuser.banmanager*" -exec rm -rf {} + 2>/dev/null || true
66+
find .gradle/loom-cache -path "*/BanManager*" -exec rm -rf {} + 2>/dev/null || true
67+
5368
- name: Execute Gradle build
5469
env:
5570
STORAGE_TYPE: ${{ matrix.storageType }}
56-
run: ./gradlew build --build-cache --info
71+
run: ./gradlew build --build-cache --refresh-dependencies --info
5772

5873
- name: Build all Fabric versions
5974
run: ./gradlew :fabric:1.20.1:remapJar :fabric:1.21.1:remapJar :fabric:1.21.4:remapJar :fabric:1.21.11:remapJar --build-cache

.github/workflows/e2e.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ jobs:
135135
key: ${{ runner.os }}-loom-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }}
136136
restore-keys: ${{ runner.os }}-loom-
137137

138+
- name: Publish BanManager to Maven Local
139+
working-directory: BanManager
140+
run: ./gradlew publishToMavenLocal --build-cache
141+
142+
- name: Clear stale BanManager dependency caches
143+
run: |
144+
find ~/.gradle/caches -path "*/me.confuser.banmanager*" -exec rm -rf {} + 2>/dev/null || true
145+
find .gradle/loom-cache -path "*/BanManager*" -exec rm -rf {} + 2>/dev/null || true
146+
138147
# Docker Buildx for better caching
139148
- name: Set up Docker Buildx
140149
uses: docker/setup-buildx-action@v3
@@ -171,7 +180,7 @@ jobs:
171180
run: ./gradlew ${{ matrix.build_task }} --build-cache
172181

173182
- name: Run E2E tests
174-
run: ./gradlew :BanManagerWebEnhancerE2E:${{ matrix.task }} --build-cache -PbanManagerPath=BanManager
183+
run: ./gradlew :BanManagerWebEnhancerE2E:${{ matrix.task }} --build-cache --refresh-dependencies -PbanManagerPath=BanManager
175184
timeout-minutes: 15
176185
env:
177186
MC_VERSION: ${{ matrix.mc_version }}

bukkit/src/main/java/me/confuser/banmanager/webenhancer/bukkit/listeners/ReportListener.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package me.confuser.banmanager.webenhancer.bukkit.listeners;
22

33
import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder;
4+
import me.confuser.banmanager.bukkit.api.events.PlayerBannedEvent;
45
import me.confuser.banmanager.bukkit.api.events.PlayerReportDeletedEvent;
56
import me.confuser.banmanager.bukkit.api.events.PlayerReportedEvent;
67
import me.confuser.banmanager.bukkit.api.events.PlayerDeniedEvent;
78
import me.confuser.banmanager.bukkit.api.events.PluginReloadedEvent;
9+
import me.confuser.banmanager.common.util.Message;
810
import me.confuser.banmanager.common.data.PlayerReportData;
911
import me.confuser.banmanager.webenhancer.bukkit.BukkitPlugin;
1012
import me.confuser.banmanager.webenhancer.common.data.LogData;
@@ -76,6 +78,17 @@ public void onDeny(PlayerDeniedEvent event) {
7678
listener.handlePin(event.getPlayer(), event.getMessage());
7779
}
7880

81+
@EventHandler(priority = EventPriority.MONITOR)
82+
public void onBanned(PlayerBannedEvent event) {
83+
try {
84+
Message kickMessage = event.getKickMessage();
85+
if (kickMessage != null) {
86+
listener.handlePin(event.getBan().getPlayer(), kickMessage);
87+
}
88+
} catch (NoSuchMethodError ignored) {
89+
}
90+
}
91+
7992
@EventHandler
8093
public void onReload(PluginReloadedEvent event) {
8194
plugin.getPlugin().setupConfigs();

bungee/src/main/java/me/confuser/banmanager/webenhancer/bungee/listeners/BanListener.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package me.confuser.banmanager.webenhancer.bungee.listeners;
22

3+
import me.confuser.banmanager.bungee.api.events.PlayerBannedEvent;
34
import me.confuser.banmanager.bungee.api.events.PlayerDeniedEvent;
45
import me.confuser.banmanager.bungee.api.events.PluginReloadedEvent;
6+
import me.confuser.banmanager.common.util.Message;
57
import me.confuser.banmanager.webenhancer.bungee.BungeePlugin;
68
import net.md_5.bungee.api.plugin.Listener;
79
import net.md_5.bungee.event.EventHandler;
@@ -21,6 +23,17 @@ public void onDeny(PlayerDeniedEvent event) {
2123
listener.handlePin(event.getPlayer(), event.getMessage());
2224
}
2325

26+
@EventHandler
27+
public void onBanned(PlayerBannedEvent event) {
28+
try {
29+
Message kickMessage = event.getKickMessage();
30+
if (kickMessage != null) {
31+
listener.handlePin(event.getBan().getPlayer(), kickMessage);
32+
}
33+
} catch (NoSuchMethodError ignored) {
34+
}
35+
}
36+
2437
@EventHandler
2538
public void onReload(PluginReloadedEvent event) {
2639
plugin.getPlugin().setupConfigs();

common/src/main/java/me/confuser/banmanager/webenhancer/common/runnables/ExpiresSync.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package me.confuser.banmanager.webenhancer.common.runnables;
22

33
import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder;
4-
import me.confuser.banmanager.common.BanManagerPlugin;
5-
import me.confuser.banmanager.common.runnables.BmRunnable;
64
import me.confuser.banmanager.common.util.DateUtils;
75
import me.confuser.banmanager.webenhancer.common.WebEnhancerPlugin;
86
import me.confuser.banmanager.webenhancer.common.data.PlayerPinData;
97
import me.confuser.banmanager.webenhancer.common.storage.PlayerPinStorage;
108

119
import java.sql.SQLException;
1210

13-
public class ExpiresSync extends BmRunnable {
11+
public class ExpiresSync implements Runnable {
1412
private PlayerPinStorage pinStorage;
1513

1614
public ExpiresSync(WebEnhancerPlugin plugin) {
17-
super(BanManagerPlugin.getInstance(), "pinCheck");
18-
1915
pinStorage = plugin.getPlayerPinStorage();
2016
}
2117

e2e/platforms/bukkit/configs/banmanager/messages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ messages:
136136
ban:
137137
player:
138138
disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]'
139-
kick: '&6You have been banned permanently for &4[reason]'
139+
kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]'
140140
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
141141
notify: '&6[player] has been permanently banned by [actor] for &4[reason]'
142142
error:
@@ -149,7 +149,7 @@ messages:
149149
tempban:
150150
player:
151151
disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]'
152-
kick: '&6You have been temporarily banned for &4[reason]'
152+
kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]'
153153
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
154154
notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]'
155155

e2e/platforms/bungee/configs/banmanager/messages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ messages:
143143
player:
144144
disallowed: '&6You have been banned from this server for &4[reason]&6. Your
145145
appeal pin is [pin]'
146-
kick: '&6You have been banned permanently for &4[reason]'
146+
kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]'
147147
dateTimeFormat: yyyy-MM-dd HH:mm:ss
148148
notify: '&6[player] has been permanently banned by [actor] for &4[reason]'
149149
error:
@@ -155,7 +155,7 @@ messages:
155155
player:
156156
disallowed: '&6You have been temporarily banned from this server for &4[reason]
157157
\n&6It expires in [expires]. Your appeal pin is [pin]'
158-
kick: '&6You have been temporarily banned for &4[reason]'
158+
kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]'
159159
dateTimeFormat: yyyy-MM-dd HH:mm:ss
160160
notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]'
161161
tempbanall:

e2e/platforms/fabric/configs/banmanager/messages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ messages:
142142
ban:
143143
player:
144144
disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]'
145-
kick: '&6You have been banned permanently for &4[reason]'
145+
kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]'
146146
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
147147
notify: '&6[player] has been permanently banned by [actor] for &4[reason]'
148148
error:
@@ -155,7 +155,7 @@ messages:
155155
tempban:
156156
player:
157157
disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]'
158-
kick: '&6You have been temporarily banned for &4[reason]'
158+
kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]'
159159
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
160160
notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]'
161161

e2e/platforms/sponge/configs/banmanager/messages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ messages:
136136
ban:
137137
player:
138138
disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]'
139-
kick: '&6You have been banned permanently for &4[reason]'
139+
kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]'
140140
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
141141
notify: '&6[player] has been permanently banned by [actor] for &4[reason]'
142142
error:
@@ -149,7 +149,7 @@ messages:
149149
tempban:
150150
player:
151151
disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]'
152-
kick: '&6You have been temporarily banned for &4[reason]'
152+
kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]'
153153
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
154154
notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]'
155155

e2e/platforms/sponge7/configs/banmanager/messages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ messages:
136136
ban:
137137
player:
138138
disallowed: '&6You have been banned from this server for &4[reason]&6. Your appeal pin is [pin]'
139-
kick: '&6You have been banned permanently for &4[reason]'
139+
kick: '&6You have been banned permanently for &4[reason]&6. Your appeal pin is [pin]'
140140
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
141141
notify: '&6[player] has been permanently banned by [actor] for &4[reason]'
142142
error:
@@ -149,7 +149,7 @@ messages:
149149
tempban:
150150
player:
151151
disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]. Your appeal pin is [pin]'
152-
kick: '&6You have been temporarily banned for &4[reason]'
152+
kick: '&6You have been temporarily banned for &4[reason]&6. Your appeal pin is [pin]'
153153
dateTimeFormat: 'yyyy-MM-dd HH:mm:ss'
154154
notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]'
155155

0 commit comments

Comments
 (0)