Files
Nitro_Render_V3/packages/session/src/handler/RoomSessionHandler.ts
T
2026-03-20 16:06:03 +01:00

118 lines
4.3 KiB
TypeScript

import { IConnection, IRoomHandlerListener } from '@nitrots/api';
import { DesktopViewEvent, FlatAccessDeniedMessageEvent, GoToFlatMessageComposer, RoomDoorbellAcceptedEvent, RoomEnterEvent, RoomReadyMessageEvent, YouAreSpectatorMessageEvent } from '@nitrots/communication';
import { GetEventDispatcher, RoomSessionDoorbellEvent, RoomSessionSpectatorModeEvent } from '@nitrots/events';
import { NitroLogger } from '@nitrots/utils';
import { BaseHandler } from './BaseHandler';
export class RoomSessionHandler extends BaseHandler
{
public static RS_CONNECTED: string = 'RS_CONNECTED';
public static RS_READY: string = 'RS_READY';
public static RS_DISCONNECTED: string = 'RS_DISCONNECTED';
constructor(connection: IConnection, listener: IRoomHandlerListener)
{
super(connection, listener);
connection.addMessageEvent(new RoomEnterEvent(this.onRoomEnterEvent.bind(this)));
connection.addMessageEvent(new RoomReadyMessageEvent(this.onRoomReadyMessageEvent.bind(this)));
connection.addMessageEvent(new DesktopViewEvent(this.onDesktopViewEvent.bind(this)));
connection.addMessageEvent(new RoomDoorbellAcceptedEvent(this.onRoomDoorbellAcceptedEvent.bind(this)));
connection.addMessageEvent(new FlatAccessDeniedMessageEvent(this.onRoomDoorbellRejectedEvent.bind(this)));
connection.addMessageEvent(new YouAreSpectatorMessageEvent(this.onYouAreSpectatorMessageEvent.bind(this)));
}
private onRoomEnterEvent(event: RoomEnterEvent): void
{
if(!(event instanceof RoomEnterEvent)) return;
if(this.listener) this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_CONNECTED);
}
private onRoomReadyMessageEvent(event: RoomReadyMessageEvent): void
{
if(!(event instanceof RoomReadyMessageEvent)) return;
const fromRoomId = this.roomId;
const toRoomId = event.getParser().roomId;
if(this.listener)
{
this.listener.sessionReinitialize(fromRoomId, toRoomId);
this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_READY);
}
}
private onDesktopViewEvent(event: DesktopViewEvent): void
{
if(!(event instanceof DesktopViewEvent)) return;
NitroLogger.log('[RoomSessionHandler] DesktopViewEvent received (roomId=' + this.roomId + ')');
if(this.listener) this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_DISCONNECTED);
}
private onRoomDoorbellAcceptedEvent(event: RoomDoorbellAcceptedEvent): void
{
if(!(event instanceof RoomDoorbellAcceptedEvent) || !this.listener) return;
const parser = event.getParser();
if(!parser) return;
const username = parser.userName;
if(!username || !username.length)
{
this.connection.send(new GoToFlatMessageComposer(this.roomId));
}
else
{
const session = this.listener.getSession(this.roomId);
if(!session) return;
GetEventDispatcher().dispatchEvent(new RoomSessionDoorbellEvent(RoomSessionDoorbellEvent.RSDE_ACCEPTED, session, username));
}
}
private onRoomDoorbellRejectedEvent(event: FlatAccessDeniedMessageEvent): void
{
if(!(event instanceof FlatAccessDeniedMessageEvent) || !this.listener) return;
const parser = event.getParser();
if(!parser) return;
const username = parser.userName;
if(!username || !username.length)
{
NitroLogger.log('[RoomSessionHandler] FlatAccessDenied (empty username) → RS_DISCONNECTED (roomId=' + this.roomId + ')');
this.listener.sessionUpdate(this.roomId, RoomSessionHandler.RS_DISCONNECTED);
}
else
{
const session = this.listener.getSession(this.roomId);
if(!session) return;
GetEventDispatcher().dispatchEvent(new RoomSessionDoorbellEvent(RoomSessionDoorbellEvent.RSDE_REJECTED, session, username));
}
}
private onYouAreSpectatorMessageEvent(event: YouAreSpectatorMessageEvent): void
{
if(this.listener)
{
const session = this.listener.getSession(this.roomId);
if(!session) return;
session.isSpectator = true;
GetEventDispatcher().dispatchEvent(new RoomSessionSpectatorModeEvent(RoomSessionSpectatorModeEvent.SPECTATOR_MODE, session));
}
}
}