|
@@ -47,6 +47,7 @@ from utils import (
|
|
|
unparse,
|
|
|
)
|
|
|
from rand import roll_dices
|
|
|
+from chess0 import IllegalMove, GameOver
|
|
|
|
|
|
|
|
|
class Handler:
|
|
@@ -651,6 +652,146 @@ async def roll_handler(bot, event, command):
|
|
|
)
|
|
|
|
|
|
|
|
|
+async def chess_start_handler(chess, id):
|
|
|
+ await chess.begin(id)
|
|
|
+
|
|
|
+ return [svg2png(chess.svg(id))]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_stop_handler(chess, id):
|
|
|
+ if await chess.end(id):
|
|
|
+ return ["Игра завершена."]
|
|
|
+
|
|
|
+ return ["Нет активной игры."]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_move_handler(chess, id, move):
|
|
|
+ try:
|
|
|
+ await chess.move(id, move)
|
|
|
+ except KeyError:
|
|
|
+ return ["Нет активной игры."]
|
|
|
+ except GameOver as e:
|
|
|
+ board = svg2png(chess.svg(id))
|
|
|
+
|
|
|
+ await chess.end(id)
|
|
|
+
|
|
|
+ return [
|
|
|
+ board,
|
|
|
+ f"Конец игры: {str(e)}",
|
|
|
+ ]
|
|
|
+ except IllegalMove:
|
|
|
+ return ["Некорректный ход."]
|
|
|
+
|
|
|
+ return [svg2png(chess.svg(id))]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_undo_handler(chess, id):
|
|
|
+ try:
|
|
|
+ await chess.undo(id)
|
|
|
+ except KeyError:
|
|
|
+ return ["Нет активной игры."]
|
|
|
+ except IndexError:
|
|
|
+ return ["Нечего отменять."]
|
|
|
+
|
|
|
+ return ["Последний ход отменён.", svg2png(chess.svg(id))]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_skip_handler(chess, id):
|
|
|
+ try:
|
|
|
+ await chess.skip(id)
|
|
|
+ except KeyError:
|
|
|
+ return ["Нет активной игры."]
|
|
|
+ except GameOver as e:
|
|
|
+ board = svg2png(chess.svg(id))
|
|
|
+
|
|
|
+ await chess.end(id)
|
|
|
+
|
|
|
+ return [
|
|
|
+ board,
|
|
|
+ f"Конец игры: {str(e)}",
|
|
|
+ ]
|
|
|
+
|
|
|
+ return [svg2png(chess.svg(id))]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_pass_handler(chess, id):
|
|
|
+ try:
|
|
|
+ await chess.move(id)
|
|
|
+ except KeyError:
|
|
|
+ return ["Нет активной игры."]
|
|
|
+ except GameOver as e:
|
|
|
+ board = svg2png(chess.svg(id))
|
|
|
+
|
|
|
+ await chess.end(id)
|
|
|
+
|
|
|
+ return [
|
|
|
+ board,
|
|
|
+ f"Конец игры: {str(e)}",
|
|
|
+ ]
|
|
|
+
|
|
|
+ return [svg2png(chess.svg(id))]
|
|
|
+
|
|
|
+
|
|
|
+async def chess_board_handler(chess, id, move):
|
|
|
+ try:
|
|
|
+ board = svg2png(chess.svg(id))
|
|
|
+ except KeyError:
|
|
|
+ return ["Нет активной игры."]
|
|
|
+
|
|
|
+ return [board]
|
|
|
+
|
|
|
+
|
|
|
+CHESS_COMMANDS = {
|
|
|
+ "start": (chess_start_handler, "Начать новую игру", 0),
|
|
|
+ "end": (chess_stop_handler, "Завершить игру", 0),
|
|
|
+ "move": (chess_move_handler, "Сделать ход", 1),
|
|
|
+ "undo": (chess_undo_handler, "Отменить ход", 0),
|
|
|
+ "skip": (chess_skip_handler, "Пропустить ход", 0),
|
|
|
+ "pass": (chess_pass_handler, "Сделать ход вместо вас.", 0),
|
|
|
+ "board": (chess_board_handler, "Показать состояние доски"),
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+async def chess_handler(bot, event, command):
|
|
|
+ if not bot.chess:
|
|
|
+ await event.reply("Извините, данная функция недоступна....")
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ if command.argc < 1:
|
|
|
+ buffer = "Доступные субкоманды:\n"
|
|
|
+
|
|
|
+ for command in CHESS_COMMANDS:
|
|
|
+ buffer += f"- {command} - {CHESS_COMMANDS[command][1]}.\n"
|
|
|
+
|
|
|
+ await event.reply(buffer.strip())
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ if command.args[0] not in CHESS_COMMANDS:
|
|
|
+ await event.reply(f"Неизвестная субкоманда: '{command.args[0]}'.")
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ subcommand = CHESS_COMMANDS[command.args[0]]
|
|
|
+ if command.argc - 1 != subcommand[2]:
|
|
|
+ await event.reply(
|
|
|
+ f"Некорректное количество аргументов для субкоманды '{command.args[0]}'."
|
|
|
+ )
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ result = await subcommand[0](bot.chess, event.sender.id, *command.args[1:])
|
|
|
+
|
|
|
+ for reply in result:
|
|
|
+ if isinstance(reply, bytes):
|
|
|
+ await bot.send_file(
|
|
|
+ event.peer_id, file=reply, reply_to=event, force_document=False
|
|
|
+ )
|
|
|
+ else:
|
|
|
+ await event.reply(reply)
|
|
|
+
|
|
|
+
|
|
|
COMMANDS = {
|
|
|
"newadmin": Handler(newadmin_handler, is_restricted=True),
|
|
|
"deladmin": Handler(deladmin_handler, is_restricted=True),
|