-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconsumers.py
78 lines (69 loc) · 2.4 KB
/
consumers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import re
import json
from channels import Group
from channels.sessions import channel_session
from django.db.models import Count
from models import Room, Game, Turn, Role, Player, Vote
from consumers_functions import *
from consumers_processing import *
import logging
log = logging.getLogger(__name__)
@channel_session
def ws_connect(message):
try:
url = message['path'].strip('/').split('/')
label = url[-1]
room = Room.objects.get(label=label)
except ValueError:
log.debug('invalid ws path=%s', message['path'])
return
except Room.DoesNotExist:
log.debug('ws room does not exist label=%s', label)
return
log.debug('chat connect room=%s client=%s:%s',
room.label, message['client'][0], message['client'][1])
Group('vote-'+label).add(message.reply_channel)
message.channel_session['room'] = room.label
if 'roster' in url[-2]:
game = room.games.latest('pk')
players = getPlayers(game)
Group('vote-'+label).send({'text': json.dumps({"players":players})})
@channel_session
def ws_receive(message):
output = {}
# Look up the room from the channel session, bailing if it doesn't exist
try:
label = message.channel_session['room']
room = Room.objects.get(label=label)
except KeyError:
log.debug('no room in channel_session')
return
except Room.DoesNotExist:
log.debug('recieved message, but room does not exist label=%s', label)
return
#Initialize new data
try:
data = json.loads(message['text'])
except ValueError:
log.error("ws message isn't json sentence=%s", message)
return
log.error(data)
#Set all objects
output = {}
if 'new_player' in data:
output['players'] = getPlayers(Game.objects.get(pk=data['game']))
if 'assign' in data:
output['assign'] = processRoles(data['game'])
if 'voter' in data:
output = process_vote(data)
if 'new_game' in data:
output['new_game'] = createNewGame(room, Game.objects.get(pk=data['game']))
Group('vote-'+label).send({'text': json.dumps(output)})
@channel_session
def ws_disconnect(message):
try:
label = message.channel_session['room']
room = Room.objects.get(label="test")
Group('test').discard(message.reply_channel)
except (KeyError, Room.DoesNotExist):
log.error("room doesn't exist")