introduce tshash
This commit is contained in:
parent
ac0e97eb38
commit
57fb1de78b
1 changed files with 14 additions and 8 deletions
22
tgmsbot.py
22
tgmsbot.py
|
@ -94,7 +94,7 @@ class Saved_Game:
|
||||||
# timestamp of the last update keyboard action,
|
# timestamp of the last update keyboard action,
|
||||||
# it is used to calculate time gap between
|
# it is used to calculate time gap between
|
||||||
# two actions and identify unique actions.
|
# two actions and identify unique actions.
|
||||||
self.last_action = 0
|
self.last_action = 0.0
|
||||||
# number of timeout error catched
|
# number of timeout error catched
|
||||||
self.timeouts = 0
|
self.timeouts = 0
|
||||||
self.lives = lives
|
self.lives = lives
|
||||||
|
@ -159,8 +159,9 @@ class GameManager:
|
||||||
lives = int(board.mines/3)
|
lives = int(board.mines/3)
|
||||||
if lives <= 0:
|
if lives <= 0:
|
||||||
lives = 1
|
lives = 1
|
||||||
self.__games[board_hash] = Game(board, group_id, creator_id, lives=lives)
|
_ng = self.__games[board_hash] = Game(board, group_id, creator_id, lives=lives)
|
||||||
self.save_async()
|
self.save_async()
|
||||||
|
return _ng
|
||||||
def remove(self, board_hash):
|
def remove(self, board_hash):
|
||||||
board = self.get_game_from_hash(board_hash)
|
board = self.get_game_from_hash(board_hash)
|
||||||
if board:
|
if board:
|
||||||
|
@ -298,13 +299,14 @@ def send_keyboard(update, context):
|
||||||
msg.reply_text('你输入的是什么鬼!')
|
msg.reply_text('你输入的是什么鬼!')
|
||||||
return
|
return
|
||||||
bhash = hash(board)
|
bhash = hash(board)
|
||||||
game_manager.append(board, bhash, msg.chat, msg.from_user)
|
game = game_manager.append(board, bhash, msg.chat, msg.from_user)
|
||||||
|
tshash = hash(game.last_action) % 100
|
||||||
# create a new keyboard
|
# create a new keyboard
|
||||||
keyboard = list()
|
keyboard = list()
|
||||||
for row in range(board.height):
|
for row in range(board.height):
|
||||||
current_row = list()
|
current_row = list()
|
||||||
for col in range(board.width):
|
for col in range(board.width):
|
||||||
cell = InlineKeyboardButton(text=UNOPENED_CELL, callback_data="{} {} {}".format(bhash, row, col))
|
cell = InlineKeyboardButton(text=UNOPENED_CELL, callback_data=f"{bhash} {row} {col} {tshash}")
|
||||||
current_row.append(cell)
|
current_row.append(cell)
|
||||||
keyboard.append(current_row)
|
keyboard.append(current_row)
|
||||||
# send the keyboard
|
# send the keyboard
|
||||||
|
@ -433,6 +435,7 @@ def update_keyboard(context, noqueue=None):
|
||||||
logger.debug('New update action requested, abort this one.')
|
logger.debug('New update action requested, abort this one.')
|
||||||
return
|
return
|
||||||
def gen_keyboard(board):
|
def gen_keyboard(board):
|
||||||
|
tshash = hash(game.last_action) % 100
|
||||||
keyboard = list()
|
keyboard = list()
|
||||||
for row in range(board.height):
|
for row in range(board.height):
|
||||||
current_row = list()
|
current_row = list()
|
||||||
|
@ -447,7 +450,7 @@ def update_keyboard(context, noqueue=None):
|
||||||
cell_text = STEPPED_CELL
|
cell_text = STEPPED_CELL
|
||||||
else:
|
else:
|
||||||
cell_text = chr(NUM_CELL_ORD + board.map[row][col] - 10)
|
cell_text = chr(NUM_CELL_ORD + board.map[row][col] - 10)
|
||||||
cell = InlineKeyboardButton(text=cell_text, callback_data="{} {} {}".format(bhash, row, col))
|
cell = InlineKeyboardButton(text=cell_text, callback_data=f"{bhash} {row} {col} {tshash}")
|
||||||
current_row.append(cell)
|
current_row.append(cell)
|
||||||
keyboard.append(current_row)
|
keyboard.append(current_row)
|
||||||
return keyboard
|
return keyboard
|
||||||
|
@ -478,7 +481,10 @@ def handle_button_click(update, context):
|
||||||
try:
|
try:
|
||||||
data = data.split(' ')
|
data = data.split(' ')
|
||||||
data = [int(i) for i in data]
|
data = [int(i) for i in data]
|
||||||
(bhash, row, col) = data
|
if len(data) == 3: # compat
|
||||||
|
data.append(0)
|
||||||
|
(bhash, row, col, tshash) = data
|
||||||
|
assert 0 <= tshash <= 100
|
||||||
except:
|
except:
|
||||||
logger.info('Unknown callback data: {} from user {}'.format(data, user.id))
|
logger.info('Unknown callback data: {} from user {}'.format(data, user.id))
|
||||||
return
|
return
|
||||||
|
@ -500,7 +506,7 @@ def handle_button_click(update, context):
|
||||||
game.stopped = True
|
game.stopped = True
|
||||||
game.lock.release()
|
game.lock.release()
|
||||||
game.save_action(user, (row, col))
|
game.save_action(user, (row, col))
|
||||||
if not array_equal(board.map, mmap):
|
if not array_equal(board.map, mmap) or hash(game.last_action) % 100 != tshash:
|
||||||
update_keyboard_request(context, bhash, game, chat_id, msg.message_id)
|
update_keyboard_request(context, bhash, game, chat_id, msg.message_id)
|
||||||
(s_op, s_is, s_3bv) = board.gen_statistics()
|
(s_op, s_is, s_3bv) = board.gen_statistics()
|
||||||
ops_count = game.actions_sum()
|
ops_count = game.actions_sum()
|
||||||
|
@ -539,7 +545,7 @@ def handle_button_click(update, context):
|
||||||
logger.critical(format_exc())
|
logger.critical(format_exc())
|
||||||
if game.stopped:
|
if game.stopped:
|
||||||
game_manager.remove(bhash)
|
game_manager.remove(bhash)
|
||||||
elif mmap is None or (not array_equal(board.map, mmap)):
|
elif mmap is None or (not array_equal(board.map, mmap)) or hash(game.last_action) % 100 != tshash:
|
||||||
game.lock.release()
|
game.lock.release()
|
||||||
game.save_action(user, (row, col))
|
game.save_action(user, (row, col))
|
||||||
update_keyboard_request(context, bhash, game, chat_id, msg.message_id)
|
update_keyboard_request(context, bhash, game, chat_id, msg.message_id)
|
||||||
|
|
Loading…
Reference in a new issue