invite.gif

1. Invite

@SubscribeMessage('invite')
async inviteGame(@MessageBody() data: { type: number, invitee: string }, @ConnectedSocket() socket: Socket) {
	const { status } = await this.memberRepository.getStatus(data.invitee);
	const inviteeSocket = await this.findSocketByName(data.invitee);
	if (status !== MemberConstants.ONLINE || inviteeSocket === null) {
		socket.emit('errorMessage', "The invitee\\'s status is not online. Please try again later.");
		return;
	}
	const gameType = data.type;
	const inviter = socket.data.nickname;
	inviteeSocket.emit("invite", { gameType, inviter })
	this.memberRepository.updateStatus(socket.data.nickname, MemberConstants.WAIT);
}
@SubscribeMessage('inviteAccept')
async startGame(@MessageBody() data: { type: number, inviterName: string }, @ConnectedSocket() socket: Socket) {
	const { status } = await this.memberRepository.getStatus(data.inviterName);
	const inviter = await this.findSocketByName(data.inviterName);
	if (status !== MemberConstants.WAIT || inviter === null) {
		socket.emit("lost", data.inviterName);
		return;
	}
	// 초대자가 초대 응답 전 로그아웃 등으로 상태가 변경된 경우 안내
	this.memberRepository.updateStatus(socket.data.nickname, MemberConstants.INGAME);
	this.memberRepository.updateStatus(data.inviterName, MemberConstants.INGAME);
	const roomId = randomBytes(Math.ceil(25 / 2)).toString('hex').slice(0, 25);
	inviter.emit("startGame", new GameInfoDto(data.type, roomId, data.inviterName, socket.data.nickname, 0));
	socket.emit("startGame", new GameInfoDto(data.type, roomId, data.inviterName, socket.data.nickname, 1));
}

게임거절.gif

2. Rejected

@SubscribeMessage('inviteReject')
async rejectGame(@MessageBody() inviterName: string, @ConnectedSocket() socket: Socket) {
	const inviter = await this.findSocketByName(inviterName);
	if (inviter === null)
		return;
	this.memberRepository.updateStatus(inviterName, MemberConstants.ONLINE);
	inviter.emit("rejectedGame", socket.data.nickname);
}