82 lines
2.0 KiB
TypeScript
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);
|
|
}
|
|
}
|