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): group_id = group_name[5:] print('GROUP ID', group_id) print('PLAYER::::', message['text']) jsonmessage = json.loads(message.content['text']) mygroup = OtreeGroup.objects.get(id=group_id) curbidder_id = jsonmessage['id'] curbidder_id_in_group = jsonmessage['id_in_group'] cur_player_bid = int(jsonmessage['cur_player_bid']) curbidder = mygroup.get_player_by_id(curbidder_id_in_group) message_for_group = ' ' message_for_player = ' ' stage_info = ' ' if cur_player_bid > Constants.endowment: message_for_player = 'You can not bid more than your maximum endowment.' elif cur_player_bid <= curbidder.highest_bid().amount: message_for_player = 'Your new bid must exceed your current maximum bid.' else: print('Bid is legal') new_bid = curbidder.bid_set.create() new_bid.amount = cur_player_bid new_bid.at_time = time.time() - mygroup.auctionstartdate new_bid.in_stage = 1 new_bid.success = 1 new_bid.in_round = curbidder.subsession.round_number new_bid.p_value = curbidder.private_value new_bid.save() print(new_bid) curbidder.save() if cur_player_bid <= mygroup.second_price: message_for_player = 'Your new bid must exceed the current selling price.' else: print('Bid is relevant') # Sort players by their respective maximum bid and then the time they submitted it (in case of duplicates) sorted_players = sorted( mygroup.get_players(), key=lambda player: (player.highest_bid().amount,-player.highest_bid().at_time), reverse = True) # Replace the prices mygroup.first_price = sorted_players[0].highest_bid().amount mygroup.second_price = sorted_players[1].highest_bid().amount # Set winner mygroup.curwinner = sorted_players[0].id_in_group #print('winner', mygroup.curwinner) message_for_player = 'Your bid was submitted successfully.' mygroup.save() # After the bid/proceed request have been handled, and all variables have # been set, send everything to the group textforgroup = json.dumps({ "price": mygroup.second_price, "winner": mygroup.curwinner, "player_maxbid": curbidder.highest_bid().amount, "message_from_id": curbidder_id_in_group, "message_all":message_for_group, "message_player":message_for_player }) Group(group_name).send({ "text": textforgroup, }) # Connected to websocket.disconnect def ws_disconnect(message, group_name): Group(group_name).discard(message.reply_channel)