|
|
@@ -5,6 +5,11 @@ import hashlib |
|
|
|
import json |
|
|
|
import qrcode |
|
|
|
|
|
|
|
from asgiref.sync import async_to_sync |
|
|
|
|
|
|
|
from channels.generic.http import AsyncHttpConsumer |
|
|
|
from channels.layers import get_channel_layer |
|
|
|
|
|
|
|
from django.db import transaction |
|
|
|
from django.http import HttpResponse |
|
|
|
from django.shortcuts import get_object_or_404, redirect, render |
|
|
@@ -288,12 +293,22 @@ def handle_game_request(request, game, update): |
|
|
|
res['value'] = current_value |
|
|
|
else: |
|
|
|
res = {'success': True} |
|
|
|
async_to_sync(get_channel_layer().group_send)( |
|
|
|
"%s_status" % game.access_code, |
|
|
|
{"type": "fear_tracker.invalidate_status"}) |
|
|
|
return HttpResponse(json.dumps(res)) |
|
|
|
|
|
|
|
players = get_players_with_fear(game, current_phase, players) |
|
|
|
status_obj = game_status_object(game, current_phase, players) |
|
|
|
status_string = json.dumps(status_obj) |
|
|
|
|
|
|
|
async_to_sync(get_channel_layer().group_send)( |
|
|
|
"%s_status" % game.access_code, { |
|
|
|
"type": "fear_tracker.hashcode_seen", |
|
|
|
"hashcode": status_obj['hash'], |
|
|
|
"status_string": status_string, |
|
|
|
}) |
|
|
|
|
|
|
|
for player in players.values(): |
|
|
|
info = player.fear |
|
|
|
if not info: |
|
|
@@ -324,4 +339,57 @@ def status(request, game, hashcode=None): |
|
|
|
return HttpResponse(status=HTTPStatus.NOT_MODIFIED) |
|
|
|
else: |
|
|
|
status_string = json.dumps(status_obj) |
|
|
|
async_to_sync(get_channel_layer().group_send)( |
|
|
|
"%s_status" % game.access_code, { |
|
|
|
"type": "fear_tracker.hashcode_seen", |
|
|
|
"hashcode": status_obj['hash'], |
|
|
|
"status_string": status_string, |
|
|
|
}) |
|
|
|
return HttpResponse(status_string) |
|
|
|
|
|
|
|
|
|
|
|
class StatusLongPollConsumer(AsyncHttpConsumer): |
|
|
|
async def handle(self, body): |
|
|
|
self.access_code = self.scope["url_route"]["kwargs"]["access_code"] |
|
|
|
self.hashcode = self.scope["url_route"]["kwargs"]["hashcode"] |
|
|
|
|
|
|
|
await self.channel_layer.group_add("%s_status" % self.access_code, |
|
|
|
self.channel_name) |
|
|
|
await self.channel_layer.group_send( |
|
|
|
"%s_status" % self.access_code, { |
|
|
|
"type": "fear_tracker.hashcode_seen", |
|
|
|
"hashcode": self.hashcode, |
|
|
|
}) |
|
|
|
|
|
|
|
async def http_request(self, message): |
|
|
|
""" |
|
|
|
Async entrypoint - concatenates body fragments and hands off control |
|
|
|
to ``self.handle`` when the body has been completely received. |
|
|
|
""" |
|
|
|
if "body" in message: |
|
|
|
self.body.append(message["body"]) |
|
|
|
if not message.get("more_body"): |
|
|
|
await self.handle(b"".join(self.body)) |
|
|
|
|
|
|
|
async def disconnect(self): |
|
|
|
await self.channel_layer.group_discard("%s_status" % self.access_code, |
|
|
|
self.channel_name) |
|
|
|
|
|
|
|
async def fear_tracker_hashcode_seen(self, event): |
|
|
|
if self.hashcode != event["hashcode"]: |
|
|
|
if event["status_string"]: |
|
|
|
body = event["status_string"].encode('utf-8') |
|
|
|
await self.send_response(200, body) |
|
|
|
await self.disconnect() |
|
|
|
await self.channel_layer.group_send( |
|
|
|
"%s_status" % self.access_code, { |
|
|
|
"type": "fear_tracker.invalidate_status", |
|
|
|
}) |
|
|
|
|
|
|
|
async def fear_tracker_invalidate_status(self, event): |
|
|
|
no_hash_status = reverse('status', |
|
|
|
kwargs={'access_code': self.access_code}) |
|
|
|
await self.send_response(302, b'', headers=[ |
|
|
|
(b"Location", no_hash_status.encode('utf-8')) |
|
|
|
]) |
|
|
|
await self.http_disconnect(None) |