
1. Invite
- 게임 초대시 상대방의 접속 상태 및 소켓을 확인
- 초대가 가능한 경우 초대자의 상태를 Wait으로 변경하여 다른 게임이 시작되지 않도록 함
@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));
}

2. Rejected
- 초대자가 초대를 거부한 경우 게임은 진행되지 않고 초대자의 상태를 Wait에서 Online으로 변경함
@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);
}