Files
chess/adapter/adapter.py
2025-02-22 15:39:49 +01:00

92 lines
2.1 KiB
Python

import os
import subprocess
import flask
from flask_cors import CORS
PIECE_TYPE = [
("P", "pawn"),
("N", "knight"),
]
COLOR = [
("W", "white"),
("B", "black"),
]
HERE = os.path.abspath(os.path.dirname(__file__))
app = flask.Flask(__name__)
CORS(app)
engine = subprocess.Popen(
["cargo", "run"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
cwd=os.path.join(HERE, "../rs"),
)
def reverse(zipped):
return ((b, a) for a, b in zipped)
def make_piece(piece_str):
piece_type, color = piece_str
return {
"piece_type": dict(PIECE_TYPE)[piece_type],
"color": dict(COLOR)[color],
}
def ask_engine(command):
engine.stdin.write(f"{command}\n".encode("ascii"))
engine.stdin.flush()
reply = engine.stdout.readline().decode("ascii").strip()
status, *result = reply.split(",")
if status != "ok":
flask.abort(400)
return result
def parse_state(state_str):
return {
state_str[i + 2 : i + 4]: make_piece(state_str[i : i + 2])
for i in range(0, len(state_str), 4)
}
@app.route("/get_state/")
def get_state():
(state_str,) = ask_engine("get_state")
return flask.jsonify(parse_state(state_str))
@app.route("/get_moves/", methods=["POST"])
def get_moves():
position_str = flask.request.json
(moves_str,) = ask_engine(f"get_moves,{position_str}")
moves = [moves_str[i : i + 2] for i in range(0, len(moves_str), 2)]
return flask.jsonify(moves)
@app.route("/make_move/", methods=["POST"])
def make_move():
source, target = flask.request.json
(state_str,) = ask_engine(f"make_move,{source},{target}")
return flask.jsonify(parse_state(state_str))
@app.route("/choose_move/", methods=["POST"])
def choose_move():
color = dict(reverse(COLOR))[flask.request.json]
move = ask_engine(f"choose_move,{color}")
return flask.jsonify(move)
@app.route("/reset/", methods=["POST"])
def reset():
(state_str,) = ask_engine("reset")
return flask.jsonify(parse_state(state_str))
if __name__ == "__main__":
app.run(debug=True, host="127.0.0.1", port=3000)