From 8419f118835cfbd8ba391c6e40968b0195d2f227 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:56:06 +0200 Subject: [PATCH] feat(housekeeping): unban-user packet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Incoming 9103 HousekeepingUnbanUserEvent — reads userId, resolves the username via HabboManager.getHabboInfo(int) (covers both online and offline paths in one call), then dispatches to ModToolManager.unban(username) which clears all active rows from the `bans` table for that user. Reuses HousekeepingActionResultComposer with actionKey `user.unban`. If the user never had an active ban the SQL UPDATE matches zero rows and the handler responds with `ok: false, message: 'no_active_ban'` — from a UI standpoint that's a no-op, not an error. `mvn compile` clean. --- .../com/eu/habbo/messages/PacketManager.java | 1 + .../eu/habbo/messages/incoming/Incoming.java | 1 + .../HousekeepingUnbanUserEvent.java | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingUnbanUserEvent.java diff --git a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java index a81b7e31..f5dfafa9 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -721,5 +721,6 @@ public class PacketManager { this.registerHandler(Incoming.HousekeepingFindUserByNameEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingFindUserByNameEvent.class); this.registerHandler(Incoming.HousekeepingFindUserByIdEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingFindUserByIdEvent.class); this.registerHandler(Incoming.HousekeepingBanUserEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingBanUserEvent.class); + this.registerHandler(Incoming.HousekeepingUnbanUserEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingUnbanUserEvent.class); } } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java index f0e29f46..aaafcf87 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java @@ -465,4 +465,5 @@ public class Incoming { public static final int HousekeepingFindUserByNameEvent = 9100; public static final int HousekeepingFindUserByIdEvent = 9101; public static final int HousekeepingBanUserEvent = 9102; + public static final int HousekeepingUnbanUserEvent = 9103; } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingUnbanUserEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingUnbanUserEvent.java new file mode 100644 index 00000000..e402a729 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingUnbanUserEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.housekeeping; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.permissions.Permission; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.housekeeping.HousekeepingActionResultComposer; + +public class HousekeepingUnbanUserEvent extends MessageHandler { + private static final String ACTION_KEY = "user.unban"; + + @Override + public int getRatelimit() { + return 1000; + } + + @Override + public void handle() throws Exception { + if (!this.client.getHabbo().hasPermission(Permission.ACC_HOUSEKEEPING)) { + return; + } + + int userId = this.packet.readInt(); + + if (userId <= 0) { + this.client.sendResponse(new HousekeepingActionResultComposer(ACTION_KEY, false, 0, "invalid_input")); + return; + } + + HabboInfo info = Emulator.getGameEnvironment().getHabboManager().getHabboInfo(userId); + + if (info == null) { + this.client.sendResponse(new HousekeepingActionResultComposer(ACTION_KEY, false, 0, "user_not_found")); + return; + } + + // ModToolManager.unban only takes a username; the SQL UPDATE + // happens against active bans (ban_expire > now), so calling it + // on a never-banned user is a benign no-op that returns false. + boolean cleared = Emulator.getGameEnvironment().getModToolManager().unban(info.getUsername()); + + this.client.sendResponse(new HousekeepingActionResultComposer(ACTION_KEY, cleared, cleared ? userId : 0, cleared ? "" : "no_active_ban")); + } +}