txlyre 1 day ago
parent
commit
546fd746be
2 changed files with 38 additions and 23 deletions
  1. 4 9
      chess0.py
  2. 34 14
      commands.py

+ 4 - 9
chess0.py

@@ -103,7 +103,7 @@ class ChessManager:
 
 
     async def begin(self, id, moves=None):
     async def begin(self, id, moves=None):
         if id in self.sessions:
         if id in self.sessions:
-            await self.end(id)
+            self.end(id)
 
 
         if not self.engine:
         if not self.engine:
             _, self.engine = await chess.engine.popen_uci(self.engine_path)
             _, self.engine = await chess.engine.popen_uci(self.engine_path)
@@ -113,7 +113,7 @@ class ChessManager:
         if moves is not None:
         if moves is not None:
             self.sessions[id].from_moves(moves)
             self.sessions[id].from_moves(moves)
 
 
-    async def end(self, id):
+    def end(self, id):
         session = self.sessions.get(id)
         session = self.sessions.get(id)
         if not session:
         if not session:
             return False
             return False
@@ -161,16 +161,11 @@ class ChessManager:
 
 
             if len(session.board.move_stack) > 1 and session.board.move_stack[-2] != chess.Move.null():
             if len(session.board.move_stack) > 1 and session.board.move_stack[-2] != chess.Move.null():
                 arrows.append((session.board.move_stack[-2].from_square, session.board.move_stack[-2].to_square))
                 arrows.append((session.board.move_stack[-2].from_square, session.board.move_stack[-2].to_square))
- 
-        move = None
-
-        if session.board.attackers_mask(chess.WHITE, session.board.king(chess.BLACK)) != 0:
-            move = session.board.king(chess.BLACK)
           
           
         if session.board.is_check():
         if session.board.is_check():
-            return chess.svg.board(session.board, size=size, lastmove=move, arrows=arrows, fill={checker: "#cc0000cc" for checker in session.board.checkers()}, check=session.board.king(session.board.turn))
+            return chess.svg.board(session.board, size=size, arrows=arrows, fill={checker: "#cc0000cc" for checker in session.board.checkers()}, check=session.board.king(session.board.turn))
 
 
-        return chess.svg.board(session.board, size=size, lastmove=move, arrows=arrows)
+        return chess.svg.board(session.board, size=size, arrows=arrows)
 
 
     def ascii(self, id):
     def ascii(self, id):
         session = self.sessions.get(id)
         session = self.sessions.get(id)

+ 34 - 14
commands.py

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