685 Commits

Author SHA1 Message Date
DuckieTM f5bf4baa79 🆙 move SQL 2026-06-07 08:54:43 +02:00
DuckieTM 4a02d22061 Merge pull request #157 from simoleo89/fix/messenger-offline-friend-look
fix(messenger): send friend look for offline friends in friend list
2026-06-07 08:23:17 +02:00
DuckieTM 14854efaeb Merge pull request #156 from simoleo89/feat/furni-editor
feat(furni): server-authoritative furni names + in-client Furni Editor (edit/search/sort/import)
2026-06-07 08:23:00 +02:00
simoleo89 564c8d647e fix(messenger): send friend look for offline friends in friend list
FriendsComposer only serialized a buddy's look when online, sending an
empty string for offline friends. The look is already loaded from the DB
for every friend in Messenger.loadFriends (SELECT users.look), so the
gate just discarded valid data: offline friends rendered with the
anonymous/standard avatar in the friend list and messenger, while their
profile (fetched separately) showed the real figure.

Always serialize row.getLook(). StaffChatBuddy keeps a non-null look
("ADM") so there is no NPE risk, and UpdateFriendComposer already sent
the look unconditionally, so this only aligns the initial friend list.
2026-06-07 00:34:50 +02:00
simoleo89 0e7138a721 feat(furnidata): seed furnidata feature config keys (021 migration)
The names-server + watch + import config keys read by FurnitureTextProvider /
FurnidataWatcher / FurniEditorImportTextEvent were never seeded — a fresh
install logged 'Config key not found' for each and they were not DB-editable.
Seed portable defaults (items.furnidata.path empty → derives from
furni.editor.asset.base.path; booleans true/false; import URL = habbo.it).
2026-06-06 18:27:12 +02:00
simoleo89 76eb1ecd05 fix(furnidata): furnidata_edit_log charset utf8mb3 -> utf8mb4
utf8mb3 is deprecated (removed in MySQL 9.0) and can lose data on
emoji / 4-byte characters in audited furni names/descriptions. Use
utf8mb4/utf8mb4_unicode_ci (live table converted via ALTER).
2026-06-06 17:31:13 +02:00
simoleo89 4621ed62b7 feat(furni-editor): server-side Habbo furnidata import (packet 10049)
FurniEditorImportTextEvent (incoming 10049, ACC_CATALOGFURNI): resolves
the classname, fetches the admin-configured furnidata URL via HttpClient
with a TTL cache (furni.editor.import.url / .cache.ms, default habbo.it),
finds name/description by classname and returns them via
FurniEditorImportTextResultComposer (outgoing 10049). URL is DB-configured
only (no client-supplied URL -> no SSRF); serves stale cache on failure.
2026-06-06 17:31:13 +02:00
simoleo89 2b8ce3cd91 feat(furni-editor): server-side sort for the editor search
Read sortField/sortDir from the search packet and ORDER BY a whitelisted
items_base column (id/sprite_id/item_name/public_name/type/interaction_type)
with a stable id tie-break, so sorting orders the whole result set instead
of just the page the client received. Column names come from a fixed
whitelist (never raw input) so the dynamic ORDER BY stays injection-safe.
2026-06-06 17:31:12 +02:00
simoleo89 57c36da795 feat(furni-editor): mirror furnidata display name into items_base.public_name
On a successful furnidata name update (10046), after the JSON write +
10047 broadcast, also UPDATE items_base.public_name to the new
(sanitized) name and refresh the in-memory Item cache via loadItems()
so Item.getFullName() stays consistent without a restart. Guarded by
name != null (description-only edits never blank the column), runs only
on the success path, outside FurnidataLock, with a parameterized
statement.
2026-06-06 17:31:12 +02:00
simoleo89 17629c210c feat(furnieditor): search also matches furnidata display names 2026-06-06 17:31:12 +02:00
simoleo89 50444003bb fix(furnidata): correct revert audit enum, sanitize audit values, config-driven maxBytes 2026-06-06 17:31:12 +02:00
simoleo89 f55b182d8e feat(furnieditor): make item_name immutable (remove from DB update whitelist) 2026-06-06 17:31:12 +02:00
simoleo89 1416cd7464 feat(furnieditor): FurniEditorRevertFurnidataEvent — restore last furnidata backup + rebroadcast 2026-06-06 17:31:12 +02:00
simoleo89 392d24b9c5 feat(furnieditor): FurniEditorUpdateFurnidataEvent — write furnidata + reindex + broadcast 10047 2026-06-06 17:31:12 +02:00
simoleo89 9dcd58d027 feat(furnidata): audit-log writer for editor furnidata edits 2026-06-06 17:31:12 +02:00
simoleo89 3b85d5fa34 feat(furnidata): expose source kind, maxBytes, reindexFromSource on the provider 2026-06-06 17:31:12 +02:00
simoleo89 43c2c2b0f1 feat(furnidata): split-tier write to winning tier with path-traversal guard 2026-06-06 17:31:12 +02:00
simoleo89 a815c1b99d feat(furnidata): FurnidataWriter single-file comment-preserving atomic write + backup 2026-06-06 17:31:12 +02:00
simoleo89 caf6ad35fa feat(furnidata): shared lock serializing watcher reindex and editor writes 2026-06-06 17:31:11 +02:00
simoleo89 258a95a269 feat(furnidata): add furnidata_edit_log audit table + editor write config keys 2026-06-06 17:31:11 +02:00
simoleo89 4944d41410 fix(items): watcher registers split-tier subdirs, real stop()/close, key.reset guard 2026-06-06 17:31:11 +02:00
simoleo89 8fb117ae73 feat(items): furnidata file watcher — debounce, throttle, delta cap to reload-hint, broadcast 2026-06-06 17:31:11 +02:00
simoleo89 7f4f7d6da9 feat(items): reindex returns sanitized furnidata delta 2026-06-06 17:31:11 +02:00
simoleo89 0cf46471f2 feat(items): FurnitureDataReloadComposer (header 10047, delta + reload-hint) 2026-06-06 17:31:11 +02:00
simoleo89 3a505cd559 fix(items): null-safe getDisplayName + log missing items.furnidata.path 2026-06-06 17:31:11 +02:00
simoleo89 f2e0f6e2d5 feat(items): source server-pronounced furni names from furnidata (6 sites) 2026-06-06 17:31:11 +02:00
simoleo89 d73573e7c5 feat(items): Item.getDisplayName() — furnidata name with public_name fallback 2026-06-06 17:31:11 +02:00
simoleo89 efb88e5957 feat(items): construct FurnitureTextProvider after ItemManager load 2026-06-06 17:31:11 +02:00
simoleo89 e7e75a285b feat(items): config-driven furnidata source resolution + init 2026-06-06 17:31:11 +02:00
simoleo89 28c3e93945 fix(items): Locale.ROOT case-folding + document sanitize cap unit + tighten cap test 2026-06-06 17:31:11 +02:00
simoleo89 5bf1d42cfb feat(items): FurnitureTextProvider — volatile index, sanitize, toggle 2026-06-06 17:31:10 +02:00
simoleo89 b162b3f4d8 fix(items): guard oversized manifest NPE in FurnidataReader + document JSON5 trailing-comma limit 2026-06-06 17:31:10 +02:00
simoleo89 86498b6b4c feat(items): FurnidataReader (single + split JSON5, path-guard, size-cap, fail-safe) 2026-06-06 17:31:10 +02:00
simoleo89 964f388594 feat(items): FurnidataEntry record 2026-06-06 17:31:10 +02:00
simoleo89 f9644d83b7 test: add JUnit 5 + surefire harness 2026-06-06 17:31:10 +02:00
github-actions[bot] 0b142d184c 🆙 Bump version to 4.2.37 [skip ci] v4.2.37 2026-06-05 19:21:31 +00:00
DuckieTM 867c8ff857 Merge pull request #155 from duckietm/dev
🆙 Fix the Admin Catalogue stuff
2026-06-05 21:20:31 +02:00
duckietm 5094d6ce4f 🆙 Fix the Admin Catalogue stuff 2026-06-05 14:23:05 +02:00
github-actions[bot] 2c0ef9873c 🆙 Bump version to 4.2.36 [skip ci] v4.2.36 2026-06-04 08:44:19 +00:00
DuckieTM dadc1b8aaf Merge pull request #153 from duckietm/dev
Dev
2026-06-04 10:43:21 +02:00
duckietm 85758b53fa 🆙 Updates Mention 2026-06-04 10:43:05 +02:00
DuckieTM 2171b5f2ec Merge pull request #152 from medievalshell/feat/mentions-hotelwide-figure
feat(mentions): hotel-wide @nick delivery + sender figure + disable-m…
2026-06-04 08:50:49 +02:00
medievalshell 46306c8205 feat(mentions): hotel-wide @nick delivery + sender figure + disable-mention persistence
- resolveHabbo() falls back to a hotel-wide online lookup so a direct @nick
  mention reaches the target even when they are in a different room (was
  resolved only within the sender's room).
- HabboMention now carries the sender figure (live from the sender Habbo,
  history from a users.look JOIN); MentionReceived/MentionsList composers
  append it so the client can render the sender avatar in the notification.
- 009: add users_settings.mentions_enabled / mass_mentions_enabled columns
  so :disablementions / :disablemassmentions actually persist.
2026-06-04 01:27:45 +02:00
github-actions[bot] fadec887cd 🆙 Bump version to 4.2.35 [skip ci] v4.2.35 2026-06-03 14:45:16 +00:00
DuckieTM e614c1d64f Merge pull request #150 from duckietm/dev
Merge pull request #149 from duckietm/main
2026-06-03 16:44:04 +02:00
DuckieTM e7deea7d9d Merge pull request #149 from duckietm/main
sync to dev
2026-06-03 16:39:01 +02:00
github-actions[bot] 44ea3abd4e 🆙 Bump version to 4.2.34 [skip ci] v4.2.34 2026-06-03 14:37:38 +00:00
DuckieTM 609cd20ab2 Merge pull request #143 from simoleo89/feat/command-autocomplete-refactor
Structure commands alert output
2026-06-03 16:36:33 +02:00
github-actions[bot] 717a7f184f 🆙 Bump version to 4.2.33 [skip ci] v4.2.33 2026-06-03 14:23:40 +00:00
DuckieTM 2862446686 Merge pull request #148 from duckietm/dev
🆙 More updates mentions
2026-06-03 16:22:39 +02:00