prevent double-play through race condition
This commit is contained in:
		@@ -2,7 +2,7 @@ from app_instance import api
 | 
			
		||||
 | 
			
		||||
from wiz_game import the_game
 | 
			
		||||
from starlette.websockets import WebSocketDisconnect
 | 
			
		||||
 | 
			
		||||
import asyncio
 | 
			
		||||
 | 
			
		||||
@api.route("/player/{player}")
 | 
			
		||||
def show(req, resp, player: str):
 | 
			
		||||
@@ -31,19 +31,28 @@ def show(req, resp, player: str):
 | 
			
		||||
 | 
			
		||||
@api.route("/player/{player}/play/{card}")
 | 
			
		||||
async def play(req, resp, player: str, card: str):
 | 
			
		||||
    lock = asyncio.Lock()
 | 
			
		||||
    p = int(player)
 | 
			
		||||
    c = int(card)
 | 
			
		||||
    the_game.play_card(p, c)
 | 
			
		||||
    if the_game.is_hand_finished():
 | 
			
		||||
        print("hand finished")
 | 
			
		||||
        trick_winner, highest_card = the_game.get_trick_winner()
 | 
			
		||||
        trick_winner.take_trick()
 | 
			
		||||
        #the_game.next_hand()
 | 
			
		||||
    elif the_game.is_trick_finished():
 | 
			
		||||
        print("trick finished")
 | 
			
		||||
        trick_winner, highest_card = the_game.get_trick_winner()
 | 
			
		||||
        trick_winner.take_trick()
 | 
			
		||||
        the_game.next_trick()
 | 
			
		||||
 | 
			
		||||
    async with lock:
 | 
			
		||||
        try:
 | 
			
		||||
            isActive = the_game.players_ordered[the_game.active_player].id == p
 | 
			
		||||
        except IndexError:
 | 
			
		||||
            isActive = False
 | 
			
		||||
            print("show p: {} | {}".format('None', p))
 | 
			
		||||
        if isActive:
 | 
			
		||||
            the_game.play_card(p, c)
 | 
			
		||||
            if the_game.is_hand_finished():
 | 
			
		||||
                print("hand finished")
 | 
			
		||||
                trick_winner, highest_card = the_game.get_trick_winner()
 | 
			
		||||
                trick_winner.take_trick()
 | 
			
		||||
                #the_game.next_hand()
 | 
			
		||||
            elif the_game.is_trick_finished():
 | 
			
		||||
                print("trick finished")
 | 
			
		||||
                trick_winner, highest_card = the_game.get_trick_winner()
 | 
			
		||||
                trick_winner.take_trick()
 | 
			
		||||
                the_game.next_trick()
 | 
			
		||||
 | 
			
		||||
    url = '/player/'+player
 | 
			
		||||
    for ws in the_game.websockets:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user