From 655e039df7c1b04c073fe26144d2987e66b66d94 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:47:54 +0200 Subject: [PATCH] feat(housekeeping): find-user-by-id packet + acc_housekeeping gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds Incoming 9101 HousekeepingFindUserByIdEvent, which replies on the existing HousekeepingUserDetailComposer (Outgoing 9200) — the composer is shape-agnostic about how the lookup was issued, so the two find-* handlers share the same response packet. The by-id handler uses HabboManager.getHabboInfo(int) directly, which already covers both the online (in-memory hashmap) and offline (SQL LIMIT 1 on users) branches in one call. The by-name path still has to do online + offline manually because the equivalent String overload doesn't exist as an instance method, only as a static. Also introduces Permission.ACC_HOUSEKEEPING ("acc_housekeeping") so the in-client housekeeping panel doesn't piggyback on ACC_SUPPORTTOOL. Both HK handlers now gate on the new permission; the toolbar UI on the client side was already checking `acc_housekeeping`, so this closes the loop. Operators must add the permission to permission_definitions for the desired rank: INSERT INTO permission_definitions (permission_key, max_value, comment, rank_1, rank_2, rank_3, rank_4, rank_5, rank_6, rank_7) VALUES ('acc_housekeeping', 1, 'Allows access to the in-client Housekeeping admin panel ...', 0, 0, 0, 0, 0, 0, 1) ON DUPLICATE KEY UPDATE rank_7 = 1, comment = VALUES(comment); `mvn package` clean (Habbo-4.2.12-jar-with-dependencies.jar). --- .../habbohotel/permissions/Permission.java | 1 + .../com/eu/habbo/messages/PacketManager.java | 1 + .../eu/habbo/messages/incoming/Incoming.java | 1 + .../HousekeepingFindUserByIdEvent.java | 35 +++++++++++++++++++ .../HousekeepingFindUserByNameEvent.java | 2 +- 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByIdEvent.java diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java index 11e042e2..674c6909 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java @@ -8,6 +8,7 @@ public class Permission { public static String ACC_SEE_WHISPERS = "acc_see_whispers"; public static String ACC_SEE_TENTCHAT = "acc_see_tentchat"; public static String ACC_SUPERWIRED = "acc_superwired"; + public static String ACC_HOUSEKEEPING = "acc_housekeeping"; public static String ACC_SUPPORTTOOL = "acc_supporttool"; public static String ACC_UNKICKABLE = "acc_unkickable"; public static String ACC_GUILDGATE = "acc_guildgate"; 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 9b421f10..3edb7266 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -719,5 +719,6 @@ public class PacketManager { // Housekeeping (in-client admin panel) this.registerHandler(Incoming.HousekeepingFindUserByNameEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingFindUserByNameEvent.class); + this.registerHandler(Incoming.HousekeepingFindUserByIdEvent, com.eu.habbo.messages.incoming.housekeeping.HousekeepingFindUserByIdEvent.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 5264de12..07cb7617 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 @@ -463,4 +463,5 @@ public class Incoming { // Housekeeping (in-client admin panel) — IDs 9100..9199 reserved public static final int HousekeepingFindUserByNameEvent = 9100; + public static final int HousekeepingFindUserByIdEvent = 9101; } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByIdEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByIdEvent.java new file mode 100644 index 00000000..c78735a9 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByIdEvent.java @@ -0,0 +1,35 @@ +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.HousekeepingUserDetailComposer; + +public class HousekeepingFindUserByIdEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 500; + } + + @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 HousekeepingUserDetailComposer(null)); + return; + } + + // HabboManager.getHabboInfo(int) returns the in-memory record for + // online users and falls through to the offline SQL lookup + // otherwise, so a single call covers both branches. + HabboInfo info = Emulator.getGameEnvironment().getHabboManager().getHabboInfo(userId); + + this.client.sendResponse(new HousekeepingUserDetailComposer(info)); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByNameEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByNameEvent.java index acae3c6e..070733c6 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByNameEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/housekeeping/HousekeepingFindUserByNameEvent.java @@ -16,7 +16,7 @@ public class HousekeepingFindUserByNameEvent extends MessageHandler { @Override public void handle() throws Exception { - if (!this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { + if (!this.client.getHabbo().hasPermission(Permission.ACC_HOUSEKEEPING)) { return; }