Каналы Django group_send не отправляются через opponent_offline в некоторых случаях, когда один пользователь отключается

#python #django #django-channels

#python #django #django-channels

Вопрос:

Я разрабатываю шахматную игру на Django, используя каналы Django. Вот соответствующие части GameConsumer

 class GameConsumer(AsyncJsonWebsocketConsumer):

    async def disconnect(self, code):
        await self.disconn()
        await self.opp_offline()

    async def opp_offline(self):
        await self.channel_layer.group_send(
            str(self.game_id),
            {
                "type": "offline.opp",
                'sender_channel_name': self.channel_name
            }
        )
    
    async def offline_opp(self,event):
        if self.channel_name != event['sender_channel_name']:
            await self.send_json({
                "command":"opponent-offline",
            })
            print("sending offline")

    @database_sync_to_async
    def disconn(self):
        user = self.scope["user"]
        game = Game.objects.all().filter(id=self.game_id)[0]
        if game.opponent == user:
            game.opponent_online = False
            print("Setting opponent offline")
        elif game.owner == user:
            game.owner_online = False
            print("Setting owner offline")
        game.save()
 

Итак, я хочу уведомить другого онлайн-пользователя (если таковой имеется) о том, что их оппонент отключился. Итак, вот случай, в котором возникает проблема:

  1. Подключается первый пользователь. Это показывает, что его оппонент еще не подключился, и говорит ему подождать.
  2. Подключается второй пользователь. Игра начинается для них обоих.
  3. Теперь первый пользователь отключается до того, как были сделаны какие-либо ходы. Второй пользователь не получает уведомление пользователя об отключении. Но если это было наоборот, т.Е. Второй пользователь отключается, тогда первый пользователь получает уведомление.
  4. Но если был сделан ход, тогда все работает нормально.

Пытаюсь выяснить, где возникает проблема.

Вы можете просмотреть полный код потребителя здесь

Комментарии:

1. Можете ли вы добавить connect метод вашего потребителя?

2. В конце я добавил ссылку для всего потребителя. Я не думал, что это будет актуально

3. Весь проект находится на github на случай, если кто-либо из вас захочет получить дополнительные разъяснения.