from channels import Group from channels.sessions import channel_session import random from .models import Player, Group as OtreeGroup, Constants import json import time def ws_connect(message, group_name): Group(group_name).add(message.reply_channel) # Connected to websocket.receive def ws_message(message, group_name): # Intercept the message jsonmessage = json.loads(message.content['text']) # Perform any actions or insert any extra data based on the message's contents, source, destination... group_id = group_name[5:] mygroup = OtreeGroup.objects.get(id=group_id) padded_message = {} parcel = None for key in jsonmessage.keys(): padded_message[key] = jsonmessage[key] # If a backup reload is called, grab the last screenshot that was stored and reload the display # Then get the messages that have been queued for delivery and send those too if jsonmessage['backupStatus'] == Constants.backup_reload_signal: backup = mygroup.reload_backup(int(jsonmessage['sourceID'])) tally = 0 iterations = 0 for key in mygroup.get_land_owner_ids(): if len(backup[key]['offers']) > 0: tally += 1 for key in mygroup.get_land_owner_ids(): counter = 1 print(str(key)) if len(backup[key]['offers']) > 0: iterations += 1 for offer in backup[key]['offers']: if counter == len(backup[key]['offers']): offer['Last'] = None if mygroup.terminate: offer['terminate'] = None offer['Progress'] = (100*(counter/len(backup[key]['offers']))) * iterations/tally print(str(offer)) Group(group_name).send({"text": json.dumps(offer)}) counter += 1 print('Reloading backup for player %d' % jsonmessage['sourceID']) print() return None # If the data has not been processed already, determine if it's an offer or a response and # process it accordingly else: if jsonmessage['p2p'] == Constants.offer_signal: mygroup.make_offer(jsonmessage['catalogueCode'], jsonmessage['sourceID'], jsonmessage['offerInTransit']) elif jsonmessage['p2p'] == Constants.acknowledgment_signal: mygroup.acknowledge_offer(jsonmessage['catalogueCode'], jsonmessage['acknowledgment']) padded_message['budget'] = mygroup.tenant_balance parcel = json.dumps(padded_message) if jsonmessage['p2p'] == Constants.end_negotiations_signal: mygroup.terminate_negotiations() padded_message['submit'] = None parcel = json.dumps(padded_message) if mygroup.submit_form(int(jsonmessage['time'])): padded_message['submit'] = None parcel = json.dumps(padded_message) # Throw the message back out to be picked up by its destination Group(group_name).send({"text": parcel}) # If no changes need to be made to the message, it can just be thrown back in #Group(group_name).send({"text": message.content['text']}) mygroup.save() # Connected to websocket.disconnect def ws_disconnect(message, group_name): Group(group_name).discard(message.reply_channel)