기본적으로 프론트에서 웹소켓을 통해 send
한 값들은 receive
로 들어오게 된다.
받아오는 유형이 채팅 메세지 말고도 여러가지가 있어서, 딕셔너리를 사용해 구분해주기로 했다.
async def receive(self, text_data):
"""웹소켓 receive
프론트에서 받아온 데이터를 처리
Args:
text_data : 프론트에서 넘어오는 데이터.
{"type" : "유형", **kwargs}
"""
data = json.loads(text_data)
type_dict = {
"join_room": self.receive_join_room,
"invitation": self.receive_invitation,
"chat_message": self.receive_chat_message,
"start_game": self.receive_start_game,
"correct_answer": self.receive_correct_answer,
"result": self.receive_result,
}
await type_dict[data["type"]](data)
이런식으로, 받아온 text_data
를 json.loads
로 python
에서 사용할 수 있게 변환시켜주고
그 안의 type
의 value
값 유형을 딕셔너리로 처리했다.
그러고 각 함수로 넘겨준다.
async def receive_result(self, event):
user = self.scope["user"]
result_message = {
"type": "send_message",
"method": "chat_message",
"message": f"{user}의 정답 개수 : {self.quiz_count}",
}
await self.channel_layer.group_send(self.room_group_name, result_message)
async def send_message(self, event):
"""그룹으로부터 각자 메세지 받기
receive 메소드에서 group_send로 메세지를 보냈을 때 받는 메소드
"""
# 웹소켓에 메세지 전달
await self.send(text_data=json.dumps(event))
받아온 메세지를 토대로 그룹 전체에게 뿌려주는 건 group_send
와 send_message
메소드를 이용했다.
넘어온 event
에서 message
값은 담아주고, method
라는 새로운 key value
쌍으로 프론트에서 유형을 구분해서 처리할 수 있게 담아준다.
그리고 그 데이터 값을 group_send
로 그룹에 속해있는 모든 유저들에게 뿌려준다.