feat(housekeeping): find-user-by-id packet + acc_housekeeping gate

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).
This commit is contained in:
simoleo89
2026-05-24 10:47:54 +02:00
committed by simoleo89
parent 7726691cde
commit 655e039df7
5 changed files with 39 additions and 1 deletions
@@ -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";
@@ -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);
}
}
@@ -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;
}
@@ -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));
}
}
@@ -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;
}