server/src/events/events.gateway.ts

82 lines
2.0 KiB
TypeScript

import {
ConnectedSocket,
MessageBody,
OnGatewayConnection,
OnGatewayDisconnect,
OnGatewayInit,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { Packet } from 'src/net/packet';
import { PlayerStoreService } from 'src/player/player-store.service';
import { PlayerSocket } from 'src/types/data-socket';
import { ErrorType } from 'src/types/error-type.enum';
import { PacketType } from 'src/types/packet-type.enum';
import { getRandomId } from 'src/utils/random';
import { WorldService } from 'src/world/world.service';
import { Server } from 'ws';
@WebSocketGateway(8256, {
cors: {
origin: '*',
},
})
export class EventsGateway
implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect
{
constructor(
private readonly players: PlayerStoreService,
private readonly world: WorldService,
) {}
@WebSocketServer()
server: Server;
@SubscribeMessage('message')
async onEvent(
@ConnectedSocket() client: PlayerSocket,
@MessageBody() data: Packet,
) {
let player = this.players.getByClient(client);
if (!player && data.packet !== PacketType.AUTH) {
return client.close(
1007,
new Packet(PacketType.ERROR)
.write(ErrorType.AUTH_FAIL, 'uint8')
.toBuffer(),
);
}
if (data.packet === PacketType.AUTH) {
try {
player = await this.players.authenticate(client, data);
} catch {
return client.close(
1007,
new Packet(PacketType.ERROR)
.write(ErrorType.AUTH_FAIL, 'uint8')
.toBuffer(),
);
}
await this.world.initializePlayer(player);
}
if (player.handlePlayerPacket(data)) return false;
return false;
}
afterInit(server: Server) {
console.log('server init');
}
handleConnection(client: PlayerSocket, ...args: any[]) {
client.id = getRandomId();
}
handleDisconnect(client: PlayerSocket) {
this.players.disconnect(client);
}
}