랭킹전.gif

<aside> ✅ Casual, Casual Power, Ladder 3개의 게임큐 존재

</aside>

1. Interval

@Interval('gameType', 7000)
async checkCasualGame() {
	if (this.gameQ[GAME_TYPE].getCount() < 2)
		return;
	const p1 = await this.checkPlayer(GameConstants.CASUAL, this.gameQ[GameConstants.CASUAL].peek(1), 1);
	if (p1 === null)
		return;
	const p2 = await this.checkPlayer(GameConstants.CASUAL, this.gameQ[GameConstants.CASUAL].peek(2), 2);
	if (p1 === null)
		return;
	if (p1.data.nickname === p2.data.nickname) {
		this.gameQ[GAME_TYPE].deQueue();
		return;
	}
	
 // p1, p2는 client의 socket
	this.gameQ[GAME_TYPE].deQueue();
	this.gameQ[GAME_TYPE].deQueue();
	this.memberRepository.updateStatus(p1.data.nickname, MemberConstants.INGAME);
	this.memberRepository.updateStatus(p2.data.nickname, MemberConstants.INGAME);
	const roomId = randomBytes(13).toString('hex');
	p1.emit("startGame", new GameInfoDto(GAME_TYPE, roomId, p1.data.nickname, p2.data.nickname, 0));
	p2.emit("startGame", new GameInfoDto(GAME_TYPE, roomId, p1.data.nickname, p2.data.nickname, 1));

}

2. Check Member Status

async checkPlayer(type: number, name: string, flag: number): Promise<Socket> {
	if (this.gameQ[type].getCount() < 2) // 게임 대기큐에 2명 이상일 경우만 실행
		return null;
	const { status } = await this.memberRepository.getStatus(name);
	if (status !== MemberConstants.ONLINE) { // 멤버의 상태가 온라인이 아닐 경우 대기큐에서 제거
		if (flag === 1) // 첫번째 player를 체크하는 경우
			this.gameQ[type].deQueue(); 
		else // 두번째 player를 체크하는 경우
			this.gameQ[type].deQueueSecond();
		this.checkPlayer(type, this.gameQ[type].peek(flag), flag);
	} // 가능한 player를 찾을 때까지 재귀적으로 함수 실행
	return this.checkSocket(type, name, flag);
} // 플레이어를 찾았을 경우 socekt 상태 확인

	waitGame(@MessageBody() type: number, @ConnectedSocket() socket: Socket): Promise<void> {
		if (!this.gameQ[type].enQueue(socket.data.nickname)) {
			socket.emit('errorMessage', "The waiting list is full. Please try again later.");
			socket.emit('failQueue');
			return; // 대기큐가 꽉 차있을 경우 Error 반환
		}
		socket.emit('addQueue', type);
	}

3. Check Member Socket

async checkSocket(type: number, name: string, flag: number): Promise<Socket> {
	const socket = await this.findSocketByName(name);
	if (socket === null) {
		if (flag === 1)
			this.gameQ[type].deQueue();
		else
			this.gameQ[type].deQueueSecond();
		return null
	}
	return socket;
}