|
@@ -662,7 +662,7 @@ def chess_game_stats(chess, id):
|
|
if not chess.has_moves(id):
|
|
if not chess.has_moves(id):
|
|
return "Ходов ещё не сделано."
|
|
return "Ходов ещё не сделано."
|
|
|
|
|
|
- text = f"Последние два хода: {chess.moves(id, 2)}\nВсе ходы (первый ход - игрока) [{chess.moves_count(id)}]: {chess.moves(id)}"
|
|
|
|
|
|
+ text = f"Последние два хода: {chess.moves(id, 2)}\nВсе ходы [{chess.moves_count(id)}]: {chess.moves(id)}"
|
|
|
|
|
|
if chess.is_check(id):
|
|
if chess.is_check(id):
|
|
text = f"Шах!\n{text}"
|
|
text = f"Шах!\n{text}"
|
|
@@ -670,11 +670,11 @@ def chess_game_stats(chess, id):
|
|
return text
|
|
return text
|
|
|
|
|
|
|
|
|
|
-async def chess_game_over(chess, id, e):
|
|
|
|
|
|
+def chess_game_over(chess, id, e):
|
|
board = svg2png(chess.svg(id))
|
|
board = svg2png(chess.svg(id))
|
|
stats = chess_game_stats(chess, id)
|
|
stats = chess_game_stats(chess, id)
|
|
|
|
|
|
- await chess.end(id)
|
|
|
|
|
|
+ chess.end(id)
|
|
|
|
|
|
return [
|
|
return [
|
|
board,
|
|
board,
|
|
@@ -687,9 +687,9 @@ async def chess_from_handler(chess, id, moves):
|
|
try:
|
|
try:
|
|
await chess.begin(id, moves)
|
|
await chess.begin(id, moves)
|
|
except GameOver as e:
|
|
except GameOver as e:
|
|
- return await chess_game_over(chess, id, e)
|
|
|
|
|
|
+ return chess_game_over(chess, id, e)
|
|
except IllegalMove as e:
|
|
except IllegalMove as e:
|
|
- await chess.end(id)
|
|
|
|
|
|
+ chess.end(id)
|
|
|
|
|
|
move = str(e)
|
|
move = str(e)
|
|
|
|
|
|
@@ -712,19 +712,23 @@ async def chess_stop_handler(chess, id):
|
|
except KeyError:
|
|
except KeyError:
|
|
return ["Нет активной игры."]
|
|
return ["Нет активной игры."]
|
|
|
|
|
|
- await chess.end(id)
|
|
|
|
|
|
+ chess.end(id)
|
|
|
|
|
|
return ["Игра завершена.", stats]
|
|
return ["Игра завершена.", stats]
|
|
|
|
|
|
|
|
|
|
async def chess_move_handler(chess, id, move):
|
|
async def chess_move_handler(chess, id, move):
|
|
|
|
+ is_group = isinstance(id, str)
|
|
|
|
+
|
|
try:
|
|
try:
|
|
await chess.move(id, move)
|
|
await chess.move(id, move)
|
|
- await chess.move(id)
|
|
|
|
|
|
+
|
|
|
|
+ if not is_group:
|
|
|
|
+ await chess.move(id)
|
|
except KeyError:
|
|
except KeyError:
|
|
return ["Нет активной игры."]
|
|
return ["Нет активной игры."]
|
|
except GameOver as e:
|
|
except GameOver as e:
|
|
- return await chess_game_over(chess, id, e)
|
|
|
|
|
|
+ return chess_game_over(chess, id, e)
|
|
except IllegalMove:
|
|
except IllegalMove:
|
|
return ["Некорректный ход."]
|
|
return ["Некорректный ход."]
|
|
|
|
|
|
@@ -737,9 +741,13 @@ async def chess_move_handler(chess, id, move):
|
|
|
|
|
|
|
|
|
|
async def chess_undo_handler(chess, id):
|
|
async def chess_undo_handler(chess, id):
|
|
|
|
+ is_group = isinstance(id, str)
|
|
|
|
+
|
|
try:
|
|
try:
|
|
chess.undo(id)
|
|
chess.undo(id)
|
|
- chess.undo(id)
|
|
|
|
|
|
+
|
|
|
|
+ if not is_group:
|
|
|
|
+ chess.undo(id)
|
|
except KeyError:
|
|
except KeyError:
|
|
return ["Нет активной игры."]
|
|
return ["Нет активной игры."]
|
|
except IndexError:
|
|
except IndexError:
|
|
@@ -749,13 +757,17 @@ async def chess_undo_handler(chess, id):
|
|
|
|
|
|
|
|
|
|
async def chess_skip_handler(chess, id):
|
|
async def chess_skip_handler(chess, id):
|
|
|
|
+ is_group = isinstance(id, str)
|
|
|
|
+
|
|
try:
|
|
try:
|
|
await chess.skip(id)
|
|
await chess.skip(id)
|
|
- await chess.move(id)
|
|
|
|
|
|
+
|
|
|
|
+ if not is_group:
|
|
|
|
+ await chess.move(id)
|
|
except KeyError:
|
|
except KeyError:
|
|
return ["Нет активной игры."]
|
|
return ["Нет активной игры."]
|
|
except GameOver as e:
|
|
except GameOver as e:
|
|
- return await chess_game_over(chess, id, e)
|
|
|
|
|
|
+ return chess_game_over(chess, id, e)
|
|
|
|
|
|
reply = [svg2png(chess.svg(id))]
|
|
reply = [svg2png(chess.svg(id))]
|
|
|
|
|
|
@@ -766,13 +778,17 @@ async def chess_skip_handler(chess, id):
|
|
|
|
|
|
|
|
|
|
async def chess_pass_handler(chess, id):
|
|
async def chess_pass_handler(chess, id):
|
|
|
|
+ is_group = isinstance(id, str)
|
|
|
|
+
|
|
try:
|
|
try:
|
|
await chess.move(id)
|
|
await chess.move(id)
|
|
- await chess.move(id)
|
|
|
|
|
|
+
|
|
|
|
+ if not is_group:
|
|
|
|
+ await chess.move(id)
|
|
except KeyError:
|
|
except KeyError:
|
|
return ["Нет активной игры."]
|
|
return ["Нет активной игры."]
|
|
except GameOver as e:
|
|
except GameOver as e:
|
|
- return await chess_game_over(chess, id, e)
|
|
|
|
|
|
+ return chess_game_over(chess, id, e)
|
|
|
|
|
|
reply = [svg2png(chess.svg(id))]
|
|
reply = [svg2png(chess.svg(id))]
|
|
|
|
|
|
@@ -815,6 +831,8 @@ CHESS_COMMANDS = {
|
|
"pass": (chess_pass_handler, "Сделать ход вместо вас", 0),
|
|
"pass": (chess_pass_handler, "Сделать ход вместо вас", 0),
|
|
"board": (chess_board_handler, "Показать доску", 0),
|
|
"board": (chess_board_handler, "Показать доску", 0),
|
|
"moves": (chess_moves_handler, "Показать историю ходов и состояние игры", 0),
|
|
"moves": (chess_moves_handler, "Показать историю ходов и состояние игры", 0),
|
|
|
|
+
|
|
|
|
+ "create": (chess_start_handler, "Создать общую доску (в личных чатах эквивалентно start)", 0),
|
|
}
|
|
}
|
|
|
|
|
|
CHESS_ALIASES = {
|
|
CHESS_ALIASES = {
|
|
@@ -827,6 +845,7 @@ CHESS_ALIASES = {
|
|
"p": "pass",
|
|
"p": "pass",
|
|
"ms": "moves",
|
|
"ms": "moves",
|
|
"i": "moves",
|
|
"i": "moves",
|
|
|
|
+ "c": "create",
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -874,7 +893,8 @@ async def chess_handler(bot, event, command):
|
|
|
|
|
|
args = command.args[1:]
|
|
args = command.args[1:]
|
|
|
|
|
|
- result = await subcommand[0](bot.chess, event.sender.id, *args)
|
|
|
|
|
|
+ peer_id = str(get_peer_id(event.peer_id))
|
|
|
|
+ result = await subcommand[0](bot.chess, peer_id if not event.is_private and (name == "create" or (peer_id in chess.sessions and name not in ("start", "from"))) else event.sender.id, *args)
|
|
|
|
|
|
for reply in result:
|
|
for reply in result:
|
|
if isinstance(reply, bytes):
|
|
if isinstance(reply, bytes):
|