• 카테고리

    질문 & 답변
  • 세부 분야

    웹 개발

  • 해결 여부

    해결됨

채팅 로비에서 유저수 노출을 위하여

23.08.02 17:47 작성 23.08.02 17:48 수정 조회수 204

0

  1. LobbyMember 모델을 생성해서 index에 들어오면 해당 user를 추가하는 식으로 구성하였습니다.

    class LobbyMember(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  2. consumer에도 따로 LobbyConsumer를 생성하여 접속할 땐 생성하거나 조회하고 채팅방에 접속 시 삭제하도록 하였습니다.

    class LobbyConsumer(JsonWebsocketConsumer):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.group_name = "lobby"
    
        def connect(self):
            user = self.scope["user"]
            if not user.is_authenticated:
                self.close()
            else:
                lobby_user, _ = LobbyMember.objects.get_or_create(user=user)
                async_to_sync(self.channel_layer.group_add)(
                    self.group_name, self.channel_name
                )
                async_to_sync(self.channel_layer.group_send)(
                    self.group_name,
                    {"type": "lobby"},
                )
                self.accept()
    
        def disconnect(self, code):
            if self.group_name:
                async_to_sync(self.channel_layer.group_discard)(
                    self.group_name, self.channel_name
                )
            user = self.scope["user"]
            lobby_member, _ = LobbyMember.objects.get_or_create(user=user)
            lobby_member.delete()
            async_to_sync(self.channel_layer.group_send)(
                self.group_name,
                {"type": "lobby"},
            )
    
        def lobby(self, message_dict):
            count = LobbyMember.get_count()
            self.send_json({"type": "lobby", "count": count})
  3. 정상적으로 작동하는가 싶더니 2개의 다른 브라우저에서 같은 이용자로 로그인 한 후

    1. 한 곳에서 로그아웃하면 해당 유저가 삭제되어

    2. 아직 로그인 되어 있는 쪽에서는 로그인 유저가 0명으로 표시되더라구요.

  4. 지금처럼 LobbyMember를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!

답변 1

답변을 작성해보세요.

1

안녕하세요.

웹소켓 연결 시에 LobbyMember(user)를 생성하고, 웹소켓 연결이 끊어질 때 LobbyMember(user)를 삭제하도록 구성하셨는 데요.

그러니 #3에서 말씀하신 것처럼, 한 user가 연결#1이 연결된 상황에서도 연결#2의 연결이 끊어진다면, 그 user의 LobbyMember가 삭제되는 상황이 발생할 수 밖에 없습니다.

#4에서 말씀하신 것처럼 기존 모델을 활용하시는 것도 한 방법이 되겠습니다. Lobby 라는 이름의 채팅방을 고정으로 이용하는 방식인 것이죠.

살펴보시고 질문 남겨주세요.

화이팅입니다. :-)

커리30님의 프로필

커리30

질문자

2023.08.04

Lobby 방과 Lobby 방 전용 owner를 생성해서 해결하였습니다. 감사합니다!