fix(communication): read trailing totalBadges int in UserProfileParser

UserProfileComposer appends getTotalBadges() as the final int of the profile
packet, but UserProfileParser returned after displayOrder and never read it, so
the _totalBadges getter always returned its flush default 0. The extended-profile
summary (UserContainerView) reads userProfile.totalBadges with a
`?? userBadges.length` fallback, but since the getter returned 0 (not undefined)
the fallback never triggered and the badge count rendered 0.

Add a 5th optional-trailing tier reading the int (bytesAvailable-guarded so older
servers that don't emit it still parse cleanly).
This commit is contained in:
simoleo89
2026-06-13 15:43:20 +02:00
parent a49c835870
commit e1465f665a
@@ -89,6 +89,7 @@ export class UserProfileParser implements IMessageParser
// block 2: card background (1 int) // block 2: card background (1 int)
// block 3: nick icon (1 string) // block 3: nick icon (1 string)
// block 4: prefix decoration set (6 strings) // block 4: prefix decoration set (6 strings)
// block 5: total badge count (1 int)
// Each tier early-returns to keep the parser tolerant of older // Each tier early-returns to keep the parser tolerant of older
// servers that don't ship the later blocks. Defaults set by flush(). // servers that don't ship the later blocks. Defaults set by flush().
if(!wrapper.bytesAvailable) return true; if(!wrapper.bytesAvailable) return true;
@@ -114,6 +115,10 @@ export class UserProfileParser implements IMessageParser
this._prefixFont = wrapper.readString(); this._prefixFont = wrapper.readString();
this._displayOrder = wrapper.readString(); this._displayOrder = wrapper.readString();
if(!wrapper.bytesAvailable) return true;
this._totalBadges = wrapper.readInt();
return true; return true;
} }