You've already forked Nitro_Render_V3
mirror of
https://github.com/duckietm/Nitro_Render_V3.git
synced 2026-06-19 23:16:20 +00:00
a599e0cf89
Extends the v2.1.0 React-friendly snapshot pattern (originally on SessionDataManager / RoomSessionManager) to two more session-state holders the React client reads frequently: - IgnoredUsersManager.getIgnoredUsersSnapshot(): ReadonlyArray<string> - GroupInformationManager.getGroupBadgesSnapshot(): ReadonlyMap<number, string> Both follow the same shape: lazy-frozen snapshot, cached until the underlying state mutates, then invalidated and a dispatched event lets the React client rebuild via useSyncExternalStore. Two new NitroEventType members carry the invalidation signal: - IGNORED_USERS_UPDATED — dispatched by IgnoredUsersManager whenever the list changes (initial load, add, remove, queue-truncate case 2). - GROUP_BADGES_UPDATED — dispatched by GroupInformationManager only when the incoming HabboGroupBadges payload contains at least one new or changed mapping (no-op refresh stays quiet). This lets the user-info popup, profile page, friend/guild filtering, and any other consumer share a single read through useSyncExternalStore instead of each subscribing to the underlying message events independently. API additions are interface-respecting and backwards-compatible — the existing `isIgnored(name)` / `getGroupBadge(groupId)` accessors stay untouched.
59 lines
2.0 KiB
TypeScript
59 lines
2.0 KiB
TypeScript
import { IGroupInformationManager } from '@nitrots/api';
|
|
import { GetCommunication, GetHabboGroupBadgesMessageComposer, HabboGroupBadgesMessageEvent, RoomReadyMessageEvent } from '@nitrots/communication';
|
|
import { GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events';
|
|
|
|
export class GroupInformationManager implements IGroupInformationManager
|
|
{
|
|
private _groupBadges: Map<number, string> = new Map();
|
|
private _groupBadgesSnapshot: ReadonlyMap<number, string> | null = null;
|
|
|
|
public init(): void
|
|
{
|
|
GetCommunication().registerMessageEvent(new RoomReadyMessageEvent(this.onRoomReadyMessageEvent.bind(this)));
|
|
GetCommunication().registerMessageEvent(new HabboGroupBadgesMessageEvent(this.onGroupBadgesEvent.bind(this)));
|
|
}
|
|
|
|
private onRoomReadyMessageEvent(event: RoomReadyMessageEvent): void
|
|
{
|
|
GetCommunication().connection.send(new GetHabboGroupBadgesMessageComposer());
|
|
}
|
|
|
|
private onGroupBadgesEvent(event: HabboGroupBadgesMessageEvent): void
|
|
{
|
|
const parser = event.getParser();
|
|
|
|
let didChange = false;
|
|
|
|
for(const [ groupId, badgeId ] of parser.badges.entries())
|
|
{
|
|
if(this._groupBadges.get(groupId) === badgeId) continue;
|
|
|
|
this._groupBadges.set(groupId, badgeId);
|
|
didChange = true;
|
|
}
|
|
|
|
if(didChange) this.invalidateGroupBadgesSnapshot();
|
|
}
|
|
|
|
private invalidateGroupBadgesSnapshot(): void
|
|
{
|
|
this._groupBadgesSnapshot = null;
|
|
|
|
GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.GROUP_BADGES_UPDATED));
|
|
}
|
|
|
|
public getGroupBadge(groupId: number): string
|
|
{
|
|
return this._groupBadges.get(groupId) ?? '';
|
|
}
|
|
|
|
public getGroupBadgesSnapshot(): ReadonlyMap<number, string>
|
|
{
|
|
if(this._groupBadgesSnapshot) return this._groupBadgesSnapshot;
|
|
|
|
this._groupBadgesSnapshot = new Map(this._groupBadges) as ReadonlyMap<number, string>;
|
|
|
|
return this._groupBadgesSnapshot;
|
|
}
|
|
}
|