prevent dead lock
This commit is contained in:
parent
c2b1b81b2b
commit
864c72f6ce
1 changed files with 61 additions and 54 deletions
115
tgmsbot.py
115
tgmsbot.py
|
@ -341,61 +341,68 @@ def handle_button_click(bot, update):
|
||||||
logger.debug("No game found for hash {}".format(bhash))
|
logger.debug("No game found for hash {}".format(bhash))
|
||||||
return
|
return
|
||||||
game.lock.acquire()
|
game.lock.acquire()
|
||||||
if game.stopped:
|
try:
|
||||||
return
|
|
||||||
board = game.board
|
|
||||||
if board.state == 0:
|
|
||||||
mmap = None
|
|
||||||
else:
|
|
||||||
mmap = deepcopy(board.map)
|
|
||||||
board.move((row, col))
|
|
||||||
if board.state != 1:
|
|
||||||
game.stopped = True
|
|
||||||
game.lock.release()
|
|
||||||
game.save_action(user, (row, col))
|
|
||||||
if not array_equal(board.map, mmap):
|
|
||||||
update_keyboard_request(bot, bhash, game, chat_id, msg.message_id)
|
|
||||||
(s_op, s_is, s_3bv) = board.gen_statistics()
|
|
||||||
ops_count = game.actions_sum()
|
|
||||||
ops_list = game.get_actions()
|
|
||||||
last_player = game.get_last_player()
|
|
||||||
time_used = time.time() - game.start_time
|
|
||||||
timeouts = game.timeouts
|
|
||||||
remain = 0
|
|
||||||
ttl = 0
|
|
||||||
if board.state == 2:
|
|
||||||
reward = gen_reward(game.last_player, negative=False)
|
|
||||||
template = WIN_TEXT_TEMPLATE
|
|
||||||
elif board.state == 3:
|
|
||||||
reward = gen_reward(game.last_player, negative=True)
|
|
||||||
game.lives -= 1
|
|
||||||
if game.lives <= 0:
|
|
||||||
template = LOSE_TEXT_TEMPLATE
|
|
||||||
else:
|
|
||||||
game.stopped = False
|
|
||||||
board.state = 1
|
|
||||||
remain = game.lives
|
|
||||||
ttl = game.ttl_lives
|
|
||||||
template = STEP_TEXT_TEMPLATE
|
|
||||||
else:
|
|
||||||
# Should not reach here
|
|
||||||
reward = None
|
|
||||||
myreply = template.format(s_op=s_op, s_is=s_is, s_3bv=s_3bv, ops_count=ops_count,
|
|
||||||
ops_list=ops_list, last_player=last_player,
|
|
||||||
time=round(time_used, 4), timeouts=timeouts, reward=reward,
|
|
||||||
remain=remain, ttl=ttl)
|
|
||||||
try:
|
|
||||||
msg.reply_text(myreply, parse_mode="Markdown")
|
|
||||||
except TimedOutError:
|
|
||||||
logger.debug('timeout sending report for game {}'.format(bhash))
|
|
||||||
if game.stopped:
|
if game.stopped:
|
||||||
game_manager.remove(bhash)
|
return
|
||||||
elif mmap is None or (not array_equal(board.map, mmap)):
|
board = game.board
|
||||||
game.lock.release()
|
if board.state == 0:
|
||||||
game.save_action(user, (row, col))
|
mmap = None
|
||||||
update_keyboard_request(bot, bhash, game, chat_id, msg.message_id)
|
else:
|
||||||
else:
|
mmap = deepcopy(board.map)
|
||||||
game.lock.release()
|
board.move((row, col))
|
||||||
|
if board.state != 1:
|
||||||
|
game.stopped = True
|
||||||
|
game.lock.release()
|
||||||
|
game.save_action(user, (row, col))
|
||||||
|
if not array_equal(board.map, mmap):
|
||||||
|
update_keyboard_request(bot, bhash, game, chat_id, msg.message_id)
|
||||||
|
(s_op, s_is, s_3bv) = board.gen_statistics()
|
||||||
|
ops_count = game.actions_sum()
|
||||||
|
ops_list = game.get_actions()
|
||||||
|
last_player = game.get_last_player()
|
||||||
|
time_used = time.time() - game.start_time
|
||||||
|
timeouts = game.timeouts
|
||||||
|
remain = 0
|
||||||
|
ttl = 0
|
||||||
|
if board.state == 2:
|
||||||
|
reward = gen_reward(game.last_player, negative=False)
|
||||||
|
template = WIN_TEXT_TEMPLATE
|
||||||
|
elif board.state == 3:
|
||||||
|
reward = gen_reward(game.last_player, negative=True)
|
||||||
|
game.lives -= 1
|
||||||
|
if game.lives <= 0:
|
||||||
|
template = LOSE_TEXT_TEMPLATE
|
||||||
|
else:
|
||||||
|
game.stopped = False
|
||||||
|
board.state = 1
|
||||||
|
remain = game.lives
|
||||||
|
ttl = game.ttl_lives
|
||||||
|
template = STEP_TEXT_TEMPLATE
|
||||||
|
else:
|
||||||
|
# Should not reach here
|
||||||
|
reward = None
|
||||||
|
myreply = template.format(s_op=s_op, s_is=s_is, s_3bv=s_3bv, ops_count=ops_count,
|
||||||
|
ops_list=ops_list, last_player=last_player,
|
||||||
|
time=round(time_used, 4), timeouts=timeouts, reward=reward,
|
||||||
|
remain=remain, ttl=ttl)
|
||||||
|
try:
|
||||||
|
msg.reply_text(myreply, parse_mode="Markdown")
|
||||||
|
except TimedOutError:
|
||||||
|
logger.debug('timeout sending report for game {}'.format(bhash))
|
||||||
|
if game.stopped:
|
||||||
|
game_manager.remove(bhash)
|
||||||
|
elif mmap is None or (not array_equal(board.map, mmap)):
|
||||||
|
game.lock.release()
|
||||||
|
game.save_action(user, (row, col))
|
||||||
|
update_keyboard_request(bot, bhash, game, chat_id, msg.message_id)
|
||||||
|
else:
|
||||||
|
game.lock.release()
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
game.lock.release()
|
||||||
|
except RuntimeError:
|
||||||
|
pass
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue