You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.2 KiB

import nimpy
import asyncnet, asyncdispatch
import ./secret.nim
import ./chess.nim
import ./engine.nim
let berserk = pyImport("berserk")
var session = berserk.TokenSession(secret.api_token)
var client = berserk.Client(session = session)
let engineID = "tiyn-ychess"
let engineDifficulty = 3
let toAccept = ["tiynger"]
proc playLichessGame(id: string) {.async.} =
## Plays a lichess game with `id` asynchronously.
var color: Color
var chess = initChess()
for event in client.bots.stream_game_state(id):
echo(event)
if $event["type"] in ["gameState", "gameFull"]:
var movesString: PyObject
if $event["type"] == "gameFull":
echo("gameFull received")
movesString = event["state"]["moves"]
if $event["white"]["id"] == engineID:
color = Color.White
if $event["black"]["id"] == engineID:
color = Color.Black
else:
echo("gameState received")
movesString = event["moves"]
if $movesString != "":
var moves = movesString.split(" ")
chess.checkedMove(notationToMove($moves[-1], chess.toMove))
chess.echoBoard(chess.toMove)
if chess.toMove == color:
echo("engine has to make a move")
var bestMove = moveToNotation(chess.bestMove(engineDifficulty))
echo(bestMove)
discard client.bots.make_move(id, bestMove)
proc acceptChallenge(whiteList: openArray[string]): void =
## Accepts a challenge of users in a `whiteList` and starts the
## game process for each.
var events = client.bots.stream_incoming_events()
for event in events:
echo(event)
if $event["type"] == "challenge":
var challenger = $event["challenge"]["challenger"]["id"]
var id = $event["challenge"]["id"]
var speed = $event["challenge"]["speed"]
if challenger in whiteList and speed == "correspondence":
echo("challenge of ", challenger, " whiteList: ", id)
discard client.bots.accept_challenge(id)
discard playLichessGame($event["challenge"]["id"])
else:
discard client.bots.decline_challenge(id)
echo("challenge of ", challenger, " whiteList: ", id)
when isMainModule:
acceptChallenge(toAccept)