|  | @@ -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),
 |