From ec7e122e74e573c2c38b6b32c2caf5980e082eaa Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:39:20 +0200 Subject: [PATCH 01/10] feat(communication): add housekeeping find-user-by-name packet pair MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TS counterparts to Arcturus' new HK packet pair. Adds HousekeepingFindUserByNameComposer (OutgoingHeader 9100) and HousekeepingUserDetailEvent (IncomingHeader 9200) with a parser that wraps an optional HousekeepingUserDetailData. The data class follows the flat optional-trailing-field pattern (isMuted / isTradeLocked read under bytesAvailable guards) so the renderer stays compatible with a server that hasn't surfaced those manager APIs offline yet. The parser exposes `found: boolean` and `user: HousekeepingUserDetailData | null` so a callsite that gets a "user not found" reply can branch without having to read into an unpopulated data object — the composer writes `appendBoolean(false)` and stops, the parser sees the false and leaves `user` null. Headers 9100..9199 / 9200..9299 reserved for the rest of the HK packet surface. Composer + event registered in NitroMessages alongside the existing YouTube-room overrides. `yarn compile:fast` clean, vitest 138/138 green. --- packages/communication/src/NitroMessages.ts | 7 +++ .../src/messages/incoming/IncomingHeader.ts | 3 + .../HousekeepingUserDetailEvent.ts | 16 +++++ .../messages/incoming/housekeeping/index.ts | 1 + .../src/messages/incoming/index.ts | 1 + .../src/messages/outgoing/OutgoingHeader.ts | 3 + .../HousekeepingFindUserByNameComposer.ts | 21 +++++++ .../messages/outgoing/housekeeping/index.ts | 1 + .../src/messages/outgoing/index.ts | 1 + .../HousekeepingUserDetailData.ts | 61 +++++++++++++++++++ .../HousekeepingUserDetailParser.ts | 30 +++++++++ .../src/messages/parser/housekeeping/index.ts | 2 + .../src/messages/parser/index.ts | 1 + 13 files changed, 148 insertions(+) create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingUserDetailEvent.ts create mode 100644 packages/communication/src/messages/incoming/housekeeping/index.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByNameComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/index.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailData.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailParser.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/index.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 3caca87..c91d3f7 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,6 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; +import { HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -505,6 +506,9 @@ export class NitroMessages implements IMessageConfiguration this._events.set(IncomingHeader.YOUTUBE_ROOM_BROADCAST, YouTubeRoomBroadcastEvent); this._events.set(IncomingHeader.YOUTUBE_ROOM_SETTINGS, YouTubeRoomSettingsEvent); this._events.set(IncomingHeader.YOUTUBE_ROOM_WATCHERS, YouTubeRoomWatchersEvent); + + // Housekeeping (in-client admin panel) + this._events.set(IncomingHeader.HOUSEKEEPING_USER_DETAIL, HousekeepingUserDetailEvent); this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent); this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent); this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent); @@ -1255,6 +1259,9 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.YOUTUBE_ROOM_PLAY, YouTubeRoomPlayComposer); this._composers.set(OutgoingHeader.YOUTUBE_ROOM_SETTINGS, YouTubeRoomSettingsComposer); this._composers.set(OutgoingHeader.YOUTUBE_ROOM_WATCHING, YouTubeRoomWatchingComposer); + + // Housekeeping (in-client admin panel) + this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_NAME, HousekeepingFindUserByNameComposer); } public get events(): Map diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts index 70dbad3..5433111 100644 --- a/packages/communication/src/messages/incoming/IncomingHeader.ts +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -503,4 +503,7 @@ export class IncomingHeader public static YOUTUBE_ROOM_BROADCAST = 8001; public static YOUTUBE_ROOM_WATCHERS = 8002; public static YOUTUBE_ROOM_SETTINGS = 8003; + + // Housekeeping (in-client admin panel) — IDs 9200..9299 reserved + public static HOUSEKEEPING_USER_DETAIL = 9200; } diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingUserDetailEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingUserDetailEvent.ts new file mode 100644 index 0000000..2db1e82 --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingUserDetailEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingUserDetailParser } from '../../parser'; + +export class HousekeepingUserDetailEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingUserDetailParser); + } + + public getParser(): HousekeepingUserDetailParser + { + return this.parser as HousekeepingUserDetailParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/index.ts b/packages/communication/src/messages/incoming/housekeeping/index.ts new file mode 100644 index 0000000..1b31bba --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/index.ts @@ -0,0 +1 @@ +export * from './HousekeepingUserDetailEvent'; diff --git a/packages/communication/src/messages/incoming/index.ts b/packages/communication/src/messages/incoming/index.ts index 5584383..8620b9e 100644 --- a/packages/communication/src/messages/incoming/index.ts +++ b/packages/communication/src/messages/incoming/index.ts @@ -24,6 +24,7 @@ export * from './group'; export * from './groupforums'; export * from './handshake'; export * from './help'; +export * from './housekeeping'; export * from './inventory'; export * from './inventory/achievements'; export * from './inventory/avatareffect'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 80dc117..58e5471 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -522,4 +522,7 @@ export class OutgoingHeader public static YOUTUBE_ROOM_PLAY = 8001; public static YOUTUBE_ROOM_WATCHING = 8002; public static YOUTUBE_ROOM_SETTINGS = 8003; + + // Housekeeping (in-client admin panel) — IDs 9100..9199 reserved + public static HOUSEKEEPING_FIND_USER_BY_NAME = 9100; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByNameComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByNameComposer.ts new file mode 100644 index 0000000..82bcfd6 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByNameComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingFindUserByNameComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(username: string) + { + this._data = [username]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts new file mode 100644 index 0000000..c38ee13 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -0,0 +1 @@ +export * from './HousekeepingFindUserByNameComposer'; diff --git a/packages/communication/src/messages/outgoing/index.ts b/packages/communication/src/messages/outgoing/index.ts index 10e3549..131d0dd 100644 --- a/packages/communication/src/messages/outgoing/index.ts +++ b/packages/communication/src/messages/outgoing/index.ts @@ -21,6 +21,7 @@ export * from './group'; export * from './groupforums'; export * from './handshake'; export * from './help'; +export * from './housekeeping'; export * from './inventory'; export * from './inventory/avatareffect'; export * from './inventory/badges'; diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailData.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailData.ts new file mode 100644 index 0000000..f387dd2 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailData.ts @@ -0,0 +1,61 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class HousekeepingUserDetailData +{ + private _id: number = 0; + private _username: string = ''; + private _motto: string = ''; + private _figure: string = ''; + private _rank: number = 0; + private _rankName: string = ''; + private _online: boolean = false; + private _lastOnlineAt: number = 0; + private _creditsBalance: number = 0; + private _ducketsBalance: number = 0; + private _diamondsBalance: number = 0; + private _email: string = ''; + private _ipLast: string = ''; + private _isBanned: boolean = false; + private _isMuted: boolean = false; + private _isTradeLocked: boolean = false; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._username = wrapper.readString(); + this._motto = wrapper.readString(); + this._figure = wrapper.readString(); + this._rank = wrapper.readInt(); + this._rankName = wrapper.readString(); + this._online = wrapper.readBoolean(); + this._lastOnlineAt = wrapper.readInt(); + this._creditsBalance = wrapper.readInt(); + this._ducketsBalance = wrapper.readInt(); + this._diamondsBalance = wrapper.readInt(); + this._email = wrapper.readString(); + this._ipLast = wrapper.readString(); + this._isBanned = wrapper.readBoolean(); + + if(wrapper.bytesAvailable) this._isMuted = wrapper.readBoolean(); + if(wrapper.bytesAvailable) this._isTradeLocked = wrapper.readBoolean(); + } + + public get id(): number { return this._id; } + public get username(): string { return this._username; } + public get motto(): string { return this._motto; } + public get figure(): string { return this._figure; } + public get rank(): number { return this._rank; } + public get rankName(): string { return this._rankName; } + public get online(): boolean { return this._online; } + public get lastOnlineAt(): number { return this._lastOnlineAt; } + public get creditsBalance(): number { return this._creditsBalance; } + public get ducketsBalance(): number { return this._ducketsBalance; } + public get diamondsBalance(): number { return this._diamondsBalance; } + public get email(): string { return this._email; } + public get ipLast(): string { return this._ipLast; } + public get isBanned(): boolean { return this._isBanned; } + public get isMuted(): boolean { return this._isMuted; } + public get isTradeLocked(): boolean { return this._isTradeLocked; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailParser.ts new file mode 100644 index 0000000..d20e5fd --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingUserDetailParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HousekeepingUserDetailData } from './HousekeepingUserDetailData'; + +export class HousekeepingUserDetailParser implements IMessageParser +{ + private _found: boolean = false; + private _user: HousekeepingUserDetailData | null = null; + + public flush(): boolean + { + this._found = false; + this._user = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._found = wrapper.readBoolean(); + + if(this._found) this._user = new HousekeepingUserDetailData(wrapper); + + return true; + } + + public get found(): boolean { return this._found; } + public get user(): HousekeepingUserDetailData | null { return this._user; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/index.ts b/packages/communication/src/messages/parser/housekeeping/index.ts new file mode 100644 index 0000000..571cbe2 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/index.ts @@ -0,0 +1,2 @@ +export * from './HousekeepingUserDetailData'; +export * from './HousekeepingUserDetailParser'; diff --git a/packages/communication/src/messages/parser/index.ts b/packages/communication/src/messages/parser/index.ts index 7a7fc3b..d695022 100644 --- a/packages/communication/src/messages/parser/index.ts +++ b/packages/communication/src/messages/parser/index.ts @@ -24,6 +24,7 @@ export * from './group/utils'; export * from './groupforums'; export * from './handshake'; export * from './help'; +export * from './housekeeping'; export * from './inventory'; export * from './inventory/achievements'; export * from './inventory/avatareffect'; From 3113baf55972d7229a24c2a1d2ae6ff04e709585 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:47:59 +0200 Subject: [PATCH 02/10] feat(communication): housekeeping find-user-by-id composer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID = 9101 with a one-int payload. The response side reuses HousekeepingUserDetailEvent (no new parser) — find-by-id and find-by-name converge on the same shape because the server has nothing different to say about a user found via numeric id vs. via username lookup. vitest 138/138, `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 3 ++- .../src/messages/outgoing/OutgoingHeader.ts | 1 + .../HousekeepingFindUserByIdComposer.ts | 21 +++++++++++++++++++ .../messages/outgoing/housekeeping/index.ts | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByIdComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index c91d3f7..2b4f35c 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1262,6 +1262,7 @@ export class NitroMessages implements IMessageConfiguration // Housekeeping (in-client admin panel) this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_NAME, HousekeepingFindUserByNameComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID, HousekeepingFindUserByIdComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 58e5471..bdc599d 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -525,4 +525,5 @@ export class OutgoingHeader // Housekeeping (in-client admin panel) — IDs 9100..9199 reserved public static HOUSEKEEPING_FIND_USER_BY_NAME = 9100; + public static HOUSEKEEPING_FIND_USER_BY_ID = 9101; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByIdComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByIdComposer.ts new file mode 100644 index 0000000..243a261 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindUserByIdComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingFindUserByIdComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index c38ee13..4eaf71f 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1 +1,2 @@ +export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; From 31598b8883c2fd8731c5fa57cb41ed5fd148a939 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:53:46 +0200 Subject: [PATCH 03/10] feat(communication): housekeeping ban-user + generic action-result MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HousekeepingBanUserComposer (OutgoingHeader 9102): (userId, reason, hours). * HousekeepingActionResultEvent + Parser (IncomingHeader 9201): generic ack carrying (actionKey, ok, actionId, message). Same parser will back mute / kick / give-credits / room-close / etc. callers — adding a new HK action only needs a new outgoing composer plus the right ACTION_KEY constant on the server side. vitest 138/138, `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 4 +- .../src/messages/incoming/IncomingHeader.ts | 1 + .../HousekeepingActionResultEvent.ts | 16 +++++++ .../messages/incoming/housekeeping/index.ts | 1 + .../src/messages/outgoing/OutgoingHeader.ts | 1 + .../HousekeepingBanUserComposer.ts | 21 ++++++++++ .../messages/outgoing/housekeeping/index.ts | 1 + .../HousekeepingActionResultParser.ts | 42 +++++++++++++++++++ .../src/messages/parser/housekeeping/index.ts | 1 + 9 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingActionResultEvent.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingBanUserComposer.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingActionResultParser.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 2b4f35c..5dec50b 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -509,6 +509,7 @@ export class NitroMessages implements IMessageConfiguration // Housekeeping (in-client admin panel) this._events.set(IncomingHeader.HOUSEKEEPING_USER_DETAIL, HousekeepingUserDetailEvent); + this._events.set(IncomingHeader.HOUSEKEEPING_ACTION_RESULT, HousekeepingActionResultEvent); this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent); this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent); this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent); @@ -1263,6 +1264,7 @@ export class NitroMessages implements IMessageConfiguration // Housekeeping (in-client admin panel) this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_NAME, HousekeepingFindUserByNameComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID, HousekeepingFindUserByIdComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_BAN_USER, HousekeepingBanUserComposer); } public get events(): Map diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts index 5433111..78db29a 100644 --- a/packages/communication/src/messages/incoming/IncomingHeader.ts +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -506,4 +506,5 @@ export class IncomingHeader // Housekeeping (in-client admin panel) — IDs 9200..9299 reserved public static HOUSEKEEPING_USER_DETAIL = 9200; + public static HOUSEKEEPING_ACTION_RESULT = 9201; } diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionResultEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionResultEvent.ts new file mode 100644 index 0000000..cf197ff --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionResultEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingActionResultParser } from '../../parser'; + +export class HousekeepingActionResultEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingActionResultParser); + } + + public getParser(): HousekeepingActionResultParser + { + return this.parser as HousekeepingActionResultParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/index.ts b/packages/communication/src/messages/incoming/housekeeping/index.ts index 1b31bba..0b9a86a 100644 --- a/packages/communication/src/messages/incoming/housekeeping/index.ts +++ b/packages/communication/src/messages/incoming/housekeeping/index.ts @@ -1 +1,2 @@ +export * from './HousekeepingActionResultEvent'; export * from './HousekeepingUserDetailEvent'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index bdc599d..2d03ba4 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -526,4 +526,5 @@ export class OutgoingHeader // Housekeeping (in-client admin panel) — IDs 9100..9199 reserved public static HOUSEKEEPING_FIND_USER_BY_NAME = 9100; public static HOUSEKEEPING_FIND_USER_BY_ID = 9101; + public static HOUSEKEEPING_BAN_USER = 9102; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingBanUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingBanUserComposer.ts new file mode 100644 index 0000000..e5d31db --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingBanUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingBanUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, reason: string, hours: number) + { + this._data = [userId, reason, hours]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 4eaf71f..3b1550c 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,2 +1,3 @@ +export * from './HousekeepingBanUserComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingActionResultParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionResultParser.ts new file mode 100644 index 0000000..57ef31f --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionResultParser.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +/** + * Generic ack for any housekeeping action (ban, mute, kick, give-credits, + * room-close, …). Carries an `actionKey` string so a single event handler + * can multiplex over many in-flight actions and resolve the right Promise + * via an `accept` predicate. + */ +export class HousekeepingActionResultParser implements IMessageParser +{ + private _actionKey: string = ''; + private _ok: boolean = false; + private _actionId: number = 0; + private _message: string = ''; + + public flush(): boolean + { + this._actionKey = ''; + this._ok = false; + this._actionId = 0; + this._message = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._actionKey = wrapper.readString(); + this._ok = wrapper.readBoolean(); + this._actionId = wrapper.readInt(); + this._message = wrapper.readString(); + + return true; + } + + public get actionKey(): string { return this._actionKey; } + public get ok(): boolean { return this._ok; } + public get actionId(): number { return this._actionId; } + public get message(): string { return this._message; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/index.ts b/packages/communication/src/messages/parser/housekeeping/index.ts index 571cbe2..6dbabb1 100644 --- a/packages/communication/src/messages/parser/housekeeping/index.ts +++ b/packages/communication/src/messages/parser/housekeeping/index.ts @@ -1,2 +1,3 @@ +export * from './HousekeepingActionResultParser'; export * from './HousekeepingUserDetailData'; export * from './HousekeepingUserDetailParser'; From c9d8f32e62bef0b61ff6eb3a15cbd4930615e2fe Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 10:56:11 +0200 Subject: [PATCH 04/10] feat(communication): housekeeping unban-user composer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HousekeepingUnbanUserComposer (OutgoingHeader 9103) carrying a single userId int. Response side reuses HousekeepingActionResultEvent — no new parser needed because the ack shape is action-agnostic. `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 3 ++- .../src/messages/outgoing/OutgoingHeader.ts | 1 + .../HousekeepingUnbanUserComposer.ts | 21 +++++++++++++++++++ .../messages/outgoing/housekeeping/index.ts | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingUnbanUserComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 5dec50b..8ea871e 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1265,6 +1265,7 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_NAME, HousekeepingFindUserByNameComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID, HousekeepingFindUserByIdComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_BAN_USER, HousekeepingBanUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_UNBAN_USER, HousekeepingUnbanUserComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 2d03ba4..511afe9 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -527,4 +527,5 @@ export class OutgoingHeader public static HOUSEKEEPING_FIND_USER_BY_NAME = 9100; public static HOUSEKEEPING_FIND_USER_BY_ID = 9101; public static HOUSEKEEPING_BAN_USER = 9102; + public static HOUSEKEEPING_UNBAN_USER = 9103; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingUnbanUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingUnbanUserComposer.ts new file mode 100644 index 0000000..eee3f38 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingUnbanUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingUnbanUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 3b1550c..7b9da73 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,3 +1,4 @@ export * from './HousekeepingBanUserComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; +export * from './HousekeepingUnbanUserComposer'; From 370b1fc10067f1613e127bfc5956a4c6eefbbc29 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:00:05 +0200 Subject: [PATCH 05/10] feat(communication): housekeeping mute-user + kick-user composers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutgoingHeader 9104 HousekeepingMuteUserComposer — (userId, reason, minutes). 9105 HousekeepingKickUserComposer — (userId, reason). Both ride the existing HousekeepingActionResultEvent for the ack, so no new parser is needed. vitest 138/138, `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 4 +++- .../src/messages/outgoing/OutgoingHeader.ts | 2 ++ .../HousekeepingKickUserComposer.ts | 21 +++++++++++++++++++ .../HousekeepingMuteUserComposer.ts | 21 +++++++++++++++++++ .../messages/outgoing/housekeeping/index.ts | 2 ++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickUserComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteUserComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 8ea871e..3eee3fe 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1266,6 +1266,8 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID, HousekeepingFindUserByIdComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_BAN_USER, HousekeepingBanUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_UNBAN_USER, HousekeepingUnbanUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_MUTE_USER, HousekeepingMuteUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_KICK_USER, HousekeepingKickUserComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 511afe9..5c34a6d 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -528,4 +528,6 @@ export class OutgoingHeader public static HOUSEKEEPING_FIND_USER_BY_ID = 9101; public static HOUSEKEEPING_BAN_USER = 9102; public static HOUSEKEEPING_UNBAN_USER = 9103; + public static HOUSEKEEPING_MUTE_USER = 9104; + public static HOUSEKEEPING_KICK_USER = 9105; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickUserComposer.ts new file mode 100644 index 0000000..30b3d36 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingKickUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, reason: string) + { + this._data = [userId, reason]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteUserComposer.ts new file mode 100644 index 0000000..d8c268b --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingMuteUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, reason: string, minutes: number) + { + this._data = [userId, reason, minutes]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 7b9da73..a7058b3 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,4 +1,6 @@ export * from './HousekeepingBanUserComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; +export * from './HousekeepingKickUserComposer'; +export * from './HousekeepingMuteUserComposer'; export * from './HousekeepingUnbanUserComposer'; From fbe8a02a72c9b6e77f5a2893018a51222c87e7e5 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:03:41 +0200 Subject: [PATCH 06/10] feat(communication): housekeeping force-disconnect-user composer OutgoingHeader 9106 HousekeepingForceDisconnectUserComposer carrying (userId, reason). Reuses HousekeepingActionResultEvent for the ack. --- packages/communication/src/NitroMessages.ts | 3 ++- .../src/messages/outgoing/OutgoingHeader.ts | 1 + ...HousekeepingForceDisconnectUserComposer.ts | 21 +++++++++++++++++++ .../messages/outgoing/housekeeping/index.ts | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingForceDisconnectUserComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 3eee3fe..b9759a3 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1268,6 +1268,7 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_UNBAN_USER, HousekeepingUnbanUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_MUTE_USER, HousekeepingMuteUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_KICK_USER, HousekeepingKickUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_FORCE_DISCONNECT_USER, HousekeepingForceDisconnectUserComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 5c34a6d..81176ea 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -530,4 +530,5 @@ export class OutgoingHeader public static HOUSEKEEPING_UNBAN_USER = 9103; public static HOUSEKEEPING_MUTE_USER = 9104; public static HOUSEKEEPING_KICK_USER = 9105; + public static HOUSEKEEPING_FORCE_DISCONNECT_USER = 9106; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingForceDisconnectUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingForceDisconnectUserComposer.ts new file mode 100644 index 0000000..6e4b38a --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingForceDisconnectUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingForceDisconnectUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, reason: string) + { + this._data = [userId, reason]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index a7058b3..2c9022b 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,6 +1,7 @@ export * from './HousekeepingBanUserComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; +export * from './HousekeepingForceDisconnectUserComposer'; export * from './HousekeepingKickUserComposer'; export * from './HousekeepingMuteUserComposer'; export * from './HousekeepingUnbanUserComposer'; From c6c6cfe04b404c030a7691264d4e2e1629e810b1 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:17:47 +0200 Subject: [PATCH 07/10] feat(communication): housekeeping set-rank + trade-lock + reset-password composers Three composers closing out the users-domain HK actions: * OutgoingHeader 9107 HousekeepingSetUserRankComposer (userId, rankId) * OutgoingHeader 9108 HousekeepingTradeLockUserComposer (userId, hours, reason) * OutgoingHeader 9109 HousekeepingResetUserPasswordComposer (userId) All three ride the existing HousekeepingActionResultEvent for the ack. --- packages/communication/src/NitroMessages.ts | 5 ++++- .../src/messages/outgoing/OutgoingHeader.ts | 3 +++ .../HousekeepingResetUserPasswordComposer.ts | 21 +++++++++++++++++++ .../HousekeepingSetUserRankComposer.ts | 21 +++++++++++++++++++ .../HousekeepingTradeLockUserComposer.ts | 21 +++++++++++++++++++ .../messages/outgoing/housekeeping/index.ts | 3 +++ 6 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingResetUserPasswordComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetUserRankComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingTradeLockUserComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index b9759a3..0a6abc5 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1269,6 +1269,9 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_MUTE_USER, HousekeepingMuteUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_KICK_USER, HousekeepingKickUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_FORCE_DISCONNECT_USER, HousekeepingForceDisconnectUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_SET_USER_RANK, HousekeepingSetUserRankComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_TRADE_LOCK_USER, HousekeepingTradeLockUserComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_RESET_USER_PASSWORD, HousekeepingResetUserPasswordComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 81176ea..ee7e229 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -531,4 +531,7 @@ export class OutgoingHeader public static HOUSEKEEPING_MUTE_USER = 9104; public static HOUSEKEEPING_KICK_USER = 9105; public static HOUSEKEEPING_FORCE_DISCONNECT_USER = 9106; + public static HOUSEKEEPING_SET_USER_RANK = 9107; + public static HOUSEKEEPING_TRADE_LOCK_USER = 9108; + public static HOUSEKEEPING_RESET_USER_PASSWORD = 9109; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingResetUserPasswordComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingResetUserPasswordComposer.ts new file mode 100644 index 0000000..f7a0bb8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingResetUserPasswordComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingResetUserPasswordComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number) + { + this._data = [userId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetUserRankComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetUserRankComposer.ts new file mode 100644 index 0000000..5b2fe5c --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetUserRankComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingSetUserRankComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, rankId: number) + { + this._data = [userId, rankId]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTradeLockUserComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTradeLockUserComposer.ts new file mode 100644 index 0000000..244f660 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTradeLockUserComposer.ts @@ -0,0 +1,21 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingTradeLockUserComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, hours: number, reason: string) + { + this._data = [userId, hours, reason]; + } + + public getMessageArray() + { + return this._data; + } + + public dispose(): void + { + return; + } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 2c9022b..d70d508 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -4,4 +4,7 @@ export * from './HousekeepingFindUserByNameComposer'; export * from './HousekeepingForceDisconnectUserComposer'; export * from './HousekeepingKickUserComposer'; export * from './HousekeepingMuteUserComposer'; +export * from './HousekeepingResetUserPasswordComposer'; +export * from './HousekeepingSetUserRankComposer'; +export * from './HousekeepingTradeLockUserComposer'; export * from './HousekeepingUnbanUserComposer'; From 597cd2402fc27482e82cc4d39fbcdc056bc8bcbd Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:24:51 +0200 Subject: [PATCH 08/10] =?UTF-8?q?feat(communication):=20housekeeping=20roo?= =?UTF-8?q?ms=20domain=20=E2=80=94=207=20composers=20+=202=20events?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Outgoing 9110-9116: find-room-by-id, search-rooms (exact|prefix), room-state (open|close toggle), mute-room, kick-all-from-room, transfer-room-ownership, delete-room. * Incoming 9202 HousekeepingRoomDetailEvent + 9203 RoomListEvent. * HousekeepingRoomData parser data class with the 11 IHousekeepingRoom fields. Single-room and list events share the same data class via composition. `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 11 ++++- .../src/messages/incoming/IncomingHeader.ts | 2 + .../HousekeepingRoomDetailEvent.ts | 16 +++++++ .../housekeeping/HousekeepingRoomListEvent.ts | 16 +++++++ .../messages/incoming/housekeeping/index.ts | 2 + .../src/messages/outgoing/OutgoingHeader.ts | 7 +++ .../HousekeepingDeleteRoomComposer.ts | 11 +++++ .../HousekeepingFindRoomByIdComposer.ts | 11 +++++ .../HousekeepingKickAllFromRoomComposer.ts | 11 +++++ .../HousekeepingMuteRoomComposer.ts | 11 +++++ .../HousekeepingRoomStateComposer.ts | 11 +++++ .../HousekeepingSearchRoomsComposer.ts | 11 +++++ ...usekeepingTransferRoomOwnershipComposer.ts | 11 +++++ .../messages/outgoing/housekeeping/index.ts | 7 +++ .../housekeeping/HousekeepingRoomData.ts | 45 +++++++++++++++++++ .../HousekeepingRoomDetailParser.ts | 30 +++++++++++++ .../HousekeepingRoomListParser.ts | 27 +++++++++++ .../src/messages/parser/housekeeping/index.ts | 3 ++ 18 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomDetailEvent.ts create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomListEvent.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingDeleteRoomComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindRoomByIdComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickAllFromRoomComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteRoomComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingRoomStateComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingSearchRoomsComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingTransferRoomOwnershipComposer.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingRoomData.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingRoomDetailParser.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingRoomListParser.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 0a6abc5..d9ae109 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickUserComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingDeleteRoomComposer, HousekeepingFindRoomByIdComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickAllFromRoomComposer, HousekeepingKickUserComposer, HousekeepingMuteRoomComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingRoomDetailEvent, HousekeepingRoomListEvent, HousekeepingRoomStateComposer, HousekeepingSearchRoomsComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingTransferRoomOwnershipComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -510,6 +510,8 @@ export class NitroMessages implements IMessageConfiguration // Housekeeping (in-client admin panel) this._events.set(IncomingHeader.HOUSEKEEPING_USER_DETAIL, HousekeepingUserDetailEvent); this._events.set(IncomingHeader.HOUSEKEEPING_ACTION_RESULT, HousekeepingActionResultEvent); + this._events.set(IncomingHeader.HOUSEKEEPING_ROOM_DETAIL, HousekeepingRoomDetailEvent); + this._events.set(IncomingHeader.HOUSEKEEPING_ROOM_LIST, HousekeepingRoomListEvent); this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent); this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent); this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent); @@ -1272,6 +1274,13 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_SET_USER_RANK, HousekeepingSetUserRankComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_TRADE_LOCK_USER, HousekeepingTradeLockUserComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_RESET_USER_PASSWORD, HousekeepingResetUserPasswordComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_FIND_ROOM_BY_ID, HousekeepingFindRoomByIdComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_SEARCH_ROOMS, HousekeepingSearchRoomsComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_ROOM_STATE, HousekeepingRoomStateComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_MUTE_ROOM, HousekeepingMuteRoomComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_KICK_ALL_FROM_ROOM, HousekeepingKickAllFromRoomComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_TRANSFER_ROOM_OWNERSHIP, HousekeepingTransferRoomOwnershipComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_DELETE_ROOM, HousekeepingDeleteRoomComposer); } public get events(): Map diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts index 78db29a..9b25958 100644 --- a/packages/communication/src/messages/incoming/IncomingHeader.ts +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -507,4 +507,6 @@ export class IncomingHeader // Housekeeping (in-client admin panel) — IDs 9200..9299 reserved public static HOUSEKEEPING_USER_DETAIL = 9200; public static HOUSEKEEPING_ACTION_RESULT = 9201; + public static HOUSEKEEPING_ROOM_DETAIL = 9202; + public static HOUSEKEEPING_ROOM_LIST = 9203; } diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomDetailEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomDetailEvent.ts new file mode 100644 index 0000000..2b5c766 --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomDetailEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingRoomDetailParser } from '../../parser'; + +export class HousekeepingRoomDetailEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingRoomDetailParser); + } + + public getParser(): HousekeepingRoomDetailParser + { + return this.parser as HousekeepingRoomDetailParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomListEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomListEvent.ts new file mode 100644 index 0000000..ecffe28 --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingRoomListEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingRoomListParser } from '../../parser'; + +export class HousekeepingRoomListEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingRoomListParser); + } + + public getParser(): HousekeepingRoomListParser + { + return this.parser as HousekeepingRoomListParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/index.ts b/packages/communication/src/messages/incoming/housekeeping/index.ts index 0b9a86a..9d293d5 100644 --- a/packages/communication/src/messages/incoming/housekeeping/index.ts +++ b/packages/communication/src/messages/incoming/housekeeping/index.ts @@ -1,2 +1,4 @@ export * from './HousekeepingActionResultEvent'; +export * from './HousekeepingRoomDetailEvent'; +export * from './HousekeepingRoomListEvent'; export * from './HousekeepingUserDetailEvent'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index ee7e229..dacc8fb 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -534,4 +534,11 @@ export class OutgoingHeader public static HOUSEKEEPING_SET_USER_RANK = 9107; public static HOUSEKEEPING_TRADE_LOCK_USER = 9108; public static HOUSEKEEPING_RESET_USER_PASSWORD = 9109; + public static HOUSEKEEPING_FIND_ROOM_BY_ID = 9110; + public static HOUSEKEEPING_SEARCH_ROOMS = 9111; + public static HOUSEKEEPING_ROOM_STATE = 9112; + public static HOUSEKEEPING_MUTE_ROOM = 9113; + public static HOUSEKEEPING_KICK_ALL_FROM_ROOM = 9114; + public static HOUSEKEEPING_TRANSFER_ROOM_OWNERSHIP = 9115; + public static HOUSEKEEPING_DELETE_ROOM = 9116; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingDeleteRoomComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingDeleteRoomComposer.ts new file mode 100644 index 0000000..9c22813 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingDeleteRoomComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingDeleteRoomComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) { this._data = [roomId]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindRoomByIdComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindRoomByIdComposer.ts new file mode 100644 index 0000000..83d46f8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingFindRoomByIdComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingFindRoomByIdComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) { this._data = [roomId]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickAllFromRoomComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickAllFromRoomComposer.ts new file mode 100644 index 0000000..2f635d0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingKickAllFromRoomComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingKickAllFromRoomComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number) { this._data = [roomId]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteRoomComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteRoomComposer.ts new file mode 100644 index 0000000..df3efc2 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingMuteRoomComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingMuteRoomComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, minutes: number) { this._data = [roomId, minutes]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingRoomStateComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingRoomStateComposer.ts new file mode 100644 index 0000000..b375ccb --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingRoomStateComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingRoomStateComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, open: boolean) { this._data = [roomId, open]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSearchRoomsComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSearchRoomsComposer.ts new file mode 100644 index 0000000..39977d0 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSearchRoomsComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingSearchRoomsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(query: string, exactMatch: boolean, limit: number) { this._data = [query, exactMatch, limit]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTransferRoomOwnershipComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTransferRoomOwnershipComposer.ts new file mode 100644 index 0000000..1a01f0d --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingTransferRoomOwnershipComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingTransferRoomOwnershipComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(roomId: number, newOwnerId: number) { this._data = [roomId, newOwnerId]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index d70d508..5fed902 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,10 +1,17 @@ export * from './HousekeepingBanUserComposer'; +export * from './HousekeepingDeleteRoomComposer'; +export * from './HousekeepingFindRoomByIdComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; export * from './HousekeepingForceDisconnectUserComposer'; +export * from './HousekeepingKickAllFromRoomComposer'; export * from './HousekeepingKickUserComposer'; +export * from './HousekeepingMuteRoomComposer'; export * from './HousekeepingMuteUserComposer'; export * from './HousekeepingResetUserPasswordComposer'; +export * from './HousekeepingRoomStateComposer'; +export * from './HousekeepingSearchRoomsComposer'; export * from './HousekeepingSetUserRankComposer'; export * from './HousekeepingTradeLockUserComposer'; +export * from './HousekeepingTransferRoomOwnershipComposer'; export * from './HousekeepingUnbanUserComposer'; diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomData.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomData.ts new file mode 100644 index 0000000..97c0d68 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomData.ts @@ -0,0 +1,45 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class HousekeepingRoomData +{ + private _id: number = 0; + private _name: string = ''; + private _description: string = ''; + private _ownerId: number = 0; + private _ownerName: string = ''; + private _userCount: number = 0; + private _maxUsers: number = 0; + private _isLocked: boolean = false; + private _isMuted: boolean = false; + private _isPublic: boolean = false; + private _createdAt: number = 0; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._name = wrapper.readString(); + this._description = wrapper.readString(); + this._ownerId = wrapper.readInt(); + this._ownerName = wrapper.readString(); + this._userCount = wrapper.readInt(); + this._maxUsers = wrapper.readInt(); + this._isLocked = wrapper.readBoolean(); + this._isMuted = wrapper.readBoolean(); + this._isPublic = wrapper.readBoolean(); + this._createdAt = wrapper.readInt(); + } + + public get id(): number { return this._id; } + public get name(): string { return this._name; } + public get description(): string { return this._description; } + public get ownerId(): number { return this._ownerId; } + public get ownerName(): string { return this._ownerName; } + public get userCount(): number { return this._userCount; } + public get maxUsers(): number { return this._maxUsers; } + public get isLocked(): boolean { return this._isLocked; } + public get isMuted(): boolean { return this._isMuted; } + public get isPublic(): boolean { return this._isPublic; } + public get createdAt(): number { return this._createdAt; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomDetailParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomDetailParser.ts new file mode 100644 index 0000000..dfebd6a --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomDetailParser.ts @@ -0,0 +1,30 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HousekeepingRoomData } from './HousekeepingRoomData'; + +export class HousekeepingRoomDetailParser implements IMessageParser +{ + private _found: boolean = false; + private _room: HousekeepingRoomData | null = null; + + public flush(): boolean + { + this._found = false; + this._room = null; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._found = wrapper.readBoolean(); + + if(this._found) this._room = new HousekeepingRoomData(wrapper); + + return true; + } + + public get found(): boolean { return this._found; } + public get room(): HousekeepingRoomData | null { return this._room; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomListParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomListParser.ts new file mode 100644 index 0000000..de81ac2 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingRoomListParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HousekeepingRoomData } from './HousekeepingRoomData'; + +export class HousekeepingRoomListParser implements IMessageParser +{ + private _rooms: HousekeepingRoomData[] = []; + + public flush(): boolean + { + this._rooms = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) this._rooms.push(new HousekeepingRoomData(wrapper)); + + return true; + } + + public get rooms(): HousekeepingRoomData[] { return this._rooms; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/index.ts b/packages/communication/src/messages/parser/housekeeping/index.ts index 6dbabb1..8767e59 100644 --- a/packages/communication/src/messages/parser/housekeeping/index.ts +++ b/packages/communication/src/messages/parser/housekeeping/index.ts @@ -1,3 +1,6 @@ export * from './HousekeepingActionResultParser'; +export * from './HousekeepingRoomData'; +export * from './HousekeepingRoomDetailParser'; +export * from './HousekeepingRoomListParser'; export * from './HousekeepingUserDetailData'; export * from './HousekeepingUserDetailParser'; From 386bf79ddcd83d35b965c00fa145bb6a0d52a8be Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:30:53 +0200 Subject: [PATCH 09/10] =?UTF-8?q?feat(communication):=20housekeeping=20eco?= =?UTF-8?q?nomy=20=E2=80=94=204=20composers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutgoingHeader 9117-9120: give-credits, give-currency (generic across duckets/diamonds/seasonal via a currencyType int), grant-item, set-hc-subscription. All four ride the existing HousekeepingActionResultEvent — no new parser needed. `yarn compile:fast` clean. --- packages/communication/src/NitroMessages.ts | 6 +++++- .../src/messages/outgoing/OutgoingHeader.ts | 4 ++++ .../housekeeping/HousekeepingGiveCreditsComposer.ts | 11 +++++++++++ .../housekeeping/HousekeepingGiveCurrencyComposer.ts | 11 +++++++++++ .../housekeeping/HousekeepingGrantItemComposer.ts | 11 +++++++++++ .../HousekeepingSetHcSubscriptionComposer.ts | 11 +++++++++++ .../src/messages/outgoing/housekeeping/index.ts | 4 ++++ 7 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCreditsComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCurrencyComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingGrantItemComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetHcSubscriptionComposer.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index d9ae109..bab22d9 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingDeleteRoomComposer, HousekeepingFindRoomByIdComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingKickAllFromRoomComposer, HousekeepingKickUserComposer, HousekeepingMuteRoomComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingRoomDetailEvent, HousekeepingRoomListEvent, HousekeepingRoomStateComposer, HousekeepingSearchRoomsComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingTransferRoomOwnershipComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingDeleteRoomComposer, HousekeepingFindRoomByIdComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingGiveCreditsComposer, HousekeepingGiveCurrencyComposer, HousekeepingGrantItemComposer, HousekeepingKickAllFromRoomComposer, HousekeepingKickUserComposer, HousekeepingMuteRoomComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingRoomDetailEvent, HousekeepingRoomListEvent, HousekeepingRoomStateComposer, HousekeepingSearchRoomsComposer, HousekeepingSetHcSubscriptionComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingTransferRoomOwnershipComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -1281,6 +1281,10 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_KICK_ALL_FROM_ROOM, HousekeepingKickAllFromRoomComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_TRANSFER_ROOM_OWNERSHIP, HousekeepingTransferRoomOwnershipComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_DELETE_ROOM, HousekeepingDeleteRoomComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_GIVE_CREDITS, HousekeepingGiveCreditsComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_GIVE_CURRENCY, HousekeepingGiveCurrencyComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_GRANT_ITEM, HousekeepingGrantItemComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_SET_HC_SUBSCRIPTION, HousekeepingSetHcSubscriptionComposer); } public get events(): Map diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index dacc8fb..c9a220e 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -541,4 +541,8 @@ export class OutgoingHeader public static HOUSEKEEPING_KICK_ALL_FROM_ROOM = 9114; public static HOUSEKEEPING_TRANSFER_ROOM_OWNERSHIP = 9115; public static HOUSEKEEPING_DELETE_ROOM = 9116; + public static HOUSEKEEPING_GIVE_CREDITS = 9117; + public static HOUSEKEEPING_GIVE_CURRENCY = 9118; + public static HOUSEKEEPING_GRANT_ITEM = 9119; + public static HOUSEKEEPING_SET_HC_SUBSCRIPTION = 9120; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCreditsComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCreditsComposer.ts new file mode 100644 index 0000000..7ab6828 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCreditsComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingGiveCreditsComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, amount: number) { this._data = [userId, amount]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCurrencyComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCurrencyComposer.ts new file mode 100644 index 0000000..5aedad5 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGiveCurrencyComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingGiveCurrencyComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, currencyType: number, amount: number) { this._data = [userId, currencyType, amount]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGrantItemComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGrantItemComposer.ts new file mode 100644 index 0000000..9529fbe --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGrantItemComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingGrantItemComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, itemId: number, quantity: number) { this._data = [userId, itemId, quantity]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetHcSubscriptionComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetHcSubscriptionComposer.ts new file mode 100644 index 0000000..568081d --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSetHcSubscriptionComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingSetHcSubscriptionComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(userId: number, days: number) { this._data = [userId, days]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 5fed902..7e71234 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,6 +1,9 @@ export * from './HousekeepingBanUserComposer'; export * from './HousekeepingDeleteRoomComposer'; export * from './HousekeepingFindRoomByIdComposer'; +export * from './HousekeepingGiveCreditsComposer'; +export * from './HousekeepingGiveCurrencyComposer'; +export * from './HousekeepingGrantItemComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; export * from './HousekeepingForceDisconnectUserComposer'; @@ -11,6 +14,7 @@ export * from './HousekeepingMuteUserComposer'; export * from './HousekeepingResetUserPasswordComposer'; export * from './HousekeepingRoomStateComposer'; export * from './HousekeepingSearchRoomsComposer'; +export * from './HousekeepingSetHcSubscriptionComposer'; export * from './HousekeepingSetUserRankComposer'; export * from './HousekeepingTradeLockUserComposer'; export * from './HousekeepingTransferRoomOwnershipComposer'; From 5dd5b26bbe4f4f347ce7869bfc29665a5282cb63 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 24 May 2026 11:52:41 +0200 Subject: [PATCH 10/10] feat(communication): housekeeping hotel alert + dashboard + audit log MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Outgoing 9127-9129: send-hotel-alert (message string), get-dashboard (no args), list-action-log (limit int). Incoming 9206 HousekeepingDashboardEvent + 9207 ActionLogEvent with matching parsers and data classes. Dashboard is a flat one-shot parse — no count prefix; action log uses the standard "count + N entries" list pattern. Closes the HK packet surface — yarn compile:fast clean. --- packages/communication/src/NitroMessages.ts | 7 ++- .../src/messages/incoming/IncomingHeader.ts | 2 + .../HousekeepingActionLogEvent.ts | 16 +++++ .../HousekeepingDashboardEvent.ts | 16 +++++ .../messages/incoming/housekeeping/index.ts | 2 + .../src/messages/outgoing/OutgoingHeader.ts | 3 + .../HousekeepingGetDashboardComposer.ts | 7 +++ .../HousekeepingListActionLogComposer.ts | 11 ++++ .../HousekeepingSendHotelAlertComposer.ts | 11 ++++ .../messages/outgoing/housekeeping/index.ts | 9 ++- .../HousekeepingActionLogEntryData.ts | 42 +++++++++++++ .../HousekeepingActionLogParser.ts | 27 +++++++++ .../HousekeepingDashboardParser.ts | 60 +++++++++++++++++++ .../src/messages/parser/housekeeping/index.ts | 3 + 14 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingActionLogEvent.ts create mode 100644 packages/communication/src/messages/incoming/housekeeping/HousekeepingDashboardEvent.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingGetDashboardComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingListActionLogComposer.ts create mode 100644 packages/communication/src/messages/outgoing/housekeeping/HousekeepingSendHotelAlertComposer.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogEntryData.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogParser.ts create mode 100644 packages/communication/src/messages/parser/housekeeping/HousekeepingDashboardParser.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index bab22d9..845b7d3 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -7,7 +7,7 @@ import { ConfInvisStateMessageEvent } from './messages'; import { HanditemBlockStateMessageEvent } from './messages'; import { TranslationLanguagesEvent, TranslationLanguagesRequestComposer, TranslationResultEvent, TranslationTextRequestComposer } from './messages'; import { YouTubeRoomBroadcastEvent, YouTubeRoomPlayComposer, YouTubeRoomSettingsComposer, YouTubeRoomSettingsEvent, YouTubeRoomWatchersEvent, YouTubeRoomWatchingComposer } from './messages'; -import { HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingDeleteRoomComposer, HousekeepingFindRoomByIdComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingGiveCreditsComposer, HousekeepingGiveCurrencyComposer, HousekeepingGrantItemComposer, HousekeepingKickAllFromRoomComposer, HousekeepingKickUserComposer, HousekeepingMuteRoomComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingRoomDetailEvent, HousekeepingRoomListEvent, HousekeepingRoomStateComposer, HousekeepingSearchRoomsComposer, HousekeepingSetHcSubscriptionComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingTransferRoomOwnershipComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; +import { HousekeepingActionLogEvent, HousekeepingActionResultEvent, HousekeepingBanUserComposer, HousekeepingDashboardEvent, HousekeepingDeleteRoomComposer, HousekeepingFindRoomByIdComposer, HousekeepingFindUserByIdComposer, HousekeepingFindUserByNameComposer, HousekeepingForceDisconnectUserComposer, HousekeepingGetDashboardComposer, HousekeepingGiveCreditsComposer, HousekeepingGiveCurrencyComposer, HousekeepingGrantItemComposer, HousekeepingKickAllFromRoomComposer, HousekeepingKickUserComposer, HousekeepingListActionLogComposer, HousekeepingMuteRoomComposer, HousekeepingMuteUserComposer, HousekeepingResetUserPasswordComposer, HousekeepingRoomDetailEvent, HousekeepingRoomListEvent, HousekeepingRoomStateComposer, HousekeepingSearchRoomsComposer, HousekeepingSendHotelAlertComposer, HousekeepingSetHcSubscriptionComposer, HousekeepingSetUserRankComposer, HousekeepingTradeLockUserComposer, HousekeepingTransferRoomOwnershipComposer, HousekeepingUnbanUserComposer, HousekeepingUserDetailEvent } from './messages'; export class NitroMessages implements IMessageConfiguration { private _events: Map; @@ -512,6 +512,8 @@ export class NitroMessages implements IMessageConfiguration this._events.set(IncomingHeader.HOUSEKEEPING_ACTION_RESULT, HousekeepingActionResultEvent); this._events.set(IncomingHeader.HOUSEKEEPING_ROOM_DETAIL, HousekeepingRoomDetailEvent); this._events.set(IncomingHeader.HOUSEKEEPING_ROOM_LIST, HousekeepingRoomListEvent); + this._events.set(IncomingHeader.HOUSEKEEPING_DASHBOARD, HousekeepingDashboardEvent); + this._events.set(IncomingHeader.HOUSEKEEPING_ACTION_LOG, HousekeepingActionLogEvent); this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent); this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent); this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent); @@ -1285,6 +1287,9 @@ export class NitroMessages implements IMessageConfiguration this._composers.set(OutgoingHeader.HOUSEKEEPING_GIVE_CURRENCY, HousekeepingGiveCurrencyComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_GRANT_ITEM, HousekeepingGrantItemComposer); this._composers.set(OutgoingHeader.HOUSEKEEPING_SET_HC_SUBSCRIPTION, HousekeepingSetHcSubscriptionComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_SEND_HOTEL_ALERT, HousekeepingSendHotelAlertComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_GET_DASHBOARD, HousekeepingGetDashboardComposer); + this._composers.set(OutgoingHeader.HOUSEKEEPING_LIST_ACTION_LOG, HousekeepingListActionLogComposer); } public get events(): Map diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts index 9b25958..bd60165 100644 --- a/packages/communication/src/messages/incoming/IncomingHeader.ts +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -509,4 +509,6 @@ export class IncomingHeader public static HOUSEKEEPING_ACTION_RESULT = 9201; public static HOUSEKEEPING_ROOM_DETAIL = 9202; public static HOUSEKEEPING_ROOM_LIST = 9203; + public static HOUSEKEEPING_DASHBOARD = 9204; + public static HOUSEKEEPING_ACTION_LOG = 9205; } diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionLogEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionLogEvent.ts new file mode 100644 index 0000000..72a5517 --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingActionLogEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingActionLogParser } from '../../parser'; + +export class HousekeepingActionLogEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingActionLogParser); + } + + public getParser(): HousekeepingActionLogParser + { + return this.parser as HousekeepingActionLogParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/HousekeepingDashboardEvent.ts b/packages/communication/src/messages/incoming/housekeeping/HousekeepingDashboardEvent.ts new file mode 100644 index 0000000..61f2c6e --- /dev/null +++ b/packages/communication/src/messages/incoming/housekeeping/HousekeepingDashboardEvent.ts @@ -0,0 +1,16 @@ +import { IMessageEvent } from '@nitrots/api'; +import { MessageEvent } from '@nitrots/events'; +import { HousekeepingDashboardParser } from '../../parser'; + +export class HousekeepingDashboardEvent extends MessageEvent implements IMessageEvent +{ + constructor(callBack: Function) + { + super(callBack, HousekeepingDashboardParser); + } + + public getParser(): HousekeepingDashboardParser + { + return this.parser as HousekeepingDashboardParser; + } +} diff --git a/packages/communication/src/messages/incoming/housekeeping/index.ts b/packages/communication/src/messages/incoming/housekeeping/index.ts index 9d293d5..16d9727 100644 --- a/packages/communication/src/messages/incoming/housekeeping/index.ts +++ b/packages/communication/src/messages/incoming/housekeeping/index.ts @@ -1,4 +1,6 @@ +export * from './HousekeepingActionLogEvent'; export * from './HousekeepingActionResultEvent'; +export * from './HousekeepingDashboardEvent'; export * from './HousekeepingRoomDetailEvent'; export * from './HousekeepingRoomListEvent'; export * from './HousekeepingUserDetailEvent'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index c9a220e..532c562 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -545,4 +545,7 @@ export class OutgoingHeader public static HOUSEKEEPING_GIVE_CURRENCY = 9118; public static HOUSEKEEPING_GRANT_ITEM = 9119; public static HOUSEKEEPING_SET_HC_SUBSCRIPTION = 9120; + public static HOUSEKEEPING_SEND_HOTEL_ALERT = 9121; + public static HOUSEKEEPING_GET_DASHBOARD = 9122; + public static HOUSEKEEPING_LIST_ACTION_LOG = 9123; } diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGetDashboardComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGetDashboardComposer.ts new file mode 100644 index 0000000..4158604 --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingGetDashboardComposer.ts @@ -0,0 +1,7 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingGetDashboardComposer implements IMessageComposer<[]> +{ + public getMessageArray(): [] { return []; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingListActionLogComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingListActionLogComposer.ts new file mode 100644 index 0000000..476f1eb --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingListActionLogComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingListActionLogComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(limit: number) { this._data = [limit]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSendHotelAlertComposer.ts b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSendHotelAlertComposer.ts new file mode 100644 index 0000000..9e400ad --- /dev/null +++ b/packages/communication/src/messages/outgoing/housekeeping/HousekeepingSendHotelAlertComposer.ts @@ -0,0 +1,11 @@ +import { IMessageComposer } from '@nitrots/api'; + +export class HousekeepingSendHotelAlertComposer implements IMessageComposer> +{ + private _data: ConstructorParameters; + + constructor(message: string) { this._data = [message]; } + + public getMessageArray() { return this._data; } + public dispose(): void { return; } +} diff --git a/packages/communication/src/messages/outgoing/housekeeping/index.ts b/packages/communication/src/messages/outgoing/housekeeping/index.ts index 7e71234..04262b4 100644 --- a/packages/communication/src/messages/outgoing/housekeeping/index.ts +++ b/packages/communication/src/messages/outgoing/housekeeping/index.ts @@ -1,19 +1,22 @@ export * from './HousekeepingBanUserComposer'; export * from './HousekeepingDeleteRoomComposer'; export * from './HousekeepingFindRoomByIdComposer'; -export * from './HousekeepingGiveCreditsComposer'; -export * from './HousekeepingGiveCurrencyComposer'; -export * from './HousekeepingGrantItemComposer'; export * from './HousekeepingFindUserByIdComposer'; export * from './HousekeepingFindUserByNameComposer'; export * from './HousekeepingForceDisconnectUserComposer'; +export * from './HousekeepingGetDashboardComposer'; +export * from './HousekeepingGiveCreditsComposer'; +export * from './HousekeepingGiveCurrencyComposer'; +export * from './HousekeepingGrantItemComposer'; export * from './HousekeepingKickAllFromRoomComposer'; export * from './HousekeepingKickUserComposer'; +export * from './HousekeepingListActionLogComposer'; export * from './HousekeepingMuteRoomComposer'; export * from './HousekeepingMuteUserComposer'; export * from './HousekeepingResetUserPasswordComposer'; export * from './HousekeepingRoomStateComposer'; export * from './HousekeepingSearchRoomsComposer'; +export * from './HousekeepingSendHotelAlertComposer'; export * from './HousekeepingSetHcSubscriptionComposer'; export * from './HousekeepingSetUserRankComposer'; export * from './HousekeepingTradeLockUserComposer'; diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogEntryData.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogEntryData.ts new file mode 100644 index 0000000..7d8028e --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogEntryData.ts @@ -0,0 +1,42 @@ +import { IMessageDataWrapper } from '@nitrots/api'; + +export class HousekeepingActionLogEntryData +{ + private _id: number = 0; + private _timestamp: number = 0; + private _actorId: number = 0; + private _actorName: string = ''; + private _targetType: string = 'user'; + private _targetId: number = 0; + private _targetLabel: string = ''; + private _action: string = ''; + private _detail: string = ''; + private _success: boolean = true; + + constructor(wrapper: IMessageDataWrapper) + { + if(!wrapper) throw new Error('invalid_wrapper'); + + this._id = wrapper.readInt(); + this._timestamp = wrapper.readInt(); + this._actorId = wrapper.readInt(); + this._actorName = wrapper.readString(); + this._targetType = wrapper.readString(); + this._targetId = wrapper.readInt(); + this._targetLabel = wrapper.readString(); + this._action = wrapper.readString(); + this._detail = wrapper.readString(); + this._success = wrapper.readBoolean(); + } + + public get id(): number { return this._id; } + public get timestamp(): number { return this._timestamp; } + public get actorId(): number { return this._actorId; } + public get actorName(): string { return this._actorName; } + public get targetType(): string { return this._targetType; } + public get targetId(): number { return this._targetId; } + public get targetLabel(): string { return this._targetLabel; } + public get action(): string { return this._action; } + public get detail(): string { return this._detail; } + public get success(): boolean { return this._success; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogParser.ts new file mode 100644 index 0000000..cec0201 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingActionLogParser.ts @@ -0,0 +1,27 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; +import { HousekeepingActionLogEntryData } from './HousekeepingActionLogEntryData'; + +export class HousekeepingActionLogParser implements IMessageParser +{ + private _entries: HousekeepingActionLogEntryData[] = []; + + public flush(): boolean + { + this._entries = []; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + const count = wrapper.readInt(); + + for(let i = 0; i < count; i++) this._entries.push(new HousekeepingActionLogEntryData(wrapper)); + + return true; + } + + public get entries(): HousekeepingActionLogEntryData[] { return this._entries; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/HousekeepingDashboardParser.ts b/packages/communication/src/messages/parser/housekeeping/HousekeepingDashboardParser.ts new file mode 100644 index 0000000..cec54c2 --- /dev/null +++ b/packages/communication/src/messages/parser/housekeeping/HousekeepingDashboardParser.ts @@ -0,0 +1,60 @@ +import { IMessageDataWrapper, IMessageParser } from '@nitrots/api'; + +export class HousekeepingDashboardParser implements IMessageParser +{ + private _onlineUsers: number = 0; + private _totalUsers: number = 0; + private _activeRooms: number = 0; + private _totalRooms: number = 0; + private _peakOnlineToday: number = 0; + private _peakOnlineAllTime: number = 0; + private _pendingTickets: number = 0; + private _sanctionsLast24h: number = 0; + private _serverUptimeSeconds: number = 0; + private _serverVersion: string = ''; + + public flush(): boolean + { + this._onlineUsers = 0; + this._totalUsers = 0; + this._activeRooms = 0; + this._totalRooms = 0; + this._peakOnlineToday = 0; + this._peakOnlineAllTime = 0; + this._pendingTickets = 0; + this._sanctionsLast24h = 0; + this._serverUptimeSeconds = 0; + this._serverVersion = ''; + + return true; + } + + public parse(wrapper: IMessageDataWrapper): boolean + { + if(!wrapper) return false; + + this._onlineUsers = wrapper.readInt(); + this._totalUsers = wrapper.readInt(); + this._activeRooms = wrapper.readInt(); + this._totalRooms = wrapper.readInt(); + this._peakOnlineToday = wrapper.readInt(); + this._peakOnlineAllTime = wrapper.readInt(); + this._pendingTickets = wrapper.readInt(); + this._sanctionsLast24h = wrapper.readInt(); + this._serverUptimeSeconds = wrapper.readInt(); + this._serverVersion = wrapper.readString(); + + return true; + } + + public get onlineUsers(): number { return this._onlineUsers; } + public get totalUsers(): number { return this._totalUsers; } + public get activeRooms(): number { return this._activeRooms; } + public get totalRooms(): number { return this._totalRooms; } + public get peakOnlineToday(): number { return this._peakOnlineToday; } + public get peakOnlineAllTime(): number { return this._peakOnlineAllTime; } + public get pendingTickets(): number { return this._pendingTickets; } + public get sanctionsLast24h(): number { return this._sanctionsLast24h; } + public get serverUptimeSeconds(): number { return this._serverUptimeSeconds; } + public get serverVersion(): string { return this._serverVersion; } +} diff --git a/packages/communication/src/messages/parser/housekeeping/index.ts b/packages/communication/src/messages/parser/housekeeping/index.ts index 8767e59..4e1acd7 100644 --- a/packages/communication/src/messages/parser/housekeeping/index.ts +++ b/packages/communication/src/messages/parser/housekeeping/index.ts @@ -1,4 +1,7 @@ +export * from './HousekeepingActionLogEntryData'; +export * from './HousekeepingActionLogParser'; export * from './HousekeepingActionResultParser'; +export * from './HousekeepingDashboardParser'; export * from './HousekeepingRoomData'; export * from './HousekeepingRoomDetailParser'; export * from './HousekeepingRoomListParser';