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