diff --git a/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotConfig.scala b/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotConfig.scala index 002c436..213129f 100644 --- a/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotConfig.scala +++ b/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotConfig.scala @@ -20,7 +20,7 @@ object TournamentBotConfig: tournamentId <- env.get("TOURNAMENT_ID").filter(_.nonEmpty) token <- env.get("TOURNAMENT_BOT_TOKEN").filter(_.nonEmpty) botId <- jwtSubject(token) - serverUrl = env.getOrElse("TOURNAMENT_SERVER_URL", "http://localhost:8089") + serverUrl = env.getOrElse("TOURNAMENT_SERVER_URL", "http://141.37.123.132:8086") difficulty = env.getOrElse("TOURNAMENT_BOT_DIFFICULTY", "medium") yield TournamentBotConfig(serverUrl, tournamentId, token, botId, difficulty) diff --git a/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotGamePlayer.scala b/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotGamePlayer.scala index 299f7b8..2e3fc0e 100644 --- a/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotGamePlayer.scala +++ b/modules/official-bots/src/main/scala/de/nowchess/bot/service/TournamentBotGamePlayer.scala @@ -39,10 +39,11 @@ class TournamentBotGamePlayer: // scalafix:on DisableSyntax.var val defaultServerUrl: String = - System.getenv().asScala.getOrElse("TOURNAMENT_SERVER_URL", "http://localhost:8089") + System.getenv().asScala.getOrElse("TOURNAMENT_SERVER_URL", "http://141.37.123.132:8086") @PostConstruct def initialize(): Unit = + parkOnStartup() config match case None => log.info("Tournament bot disabled — set TOURNAMENT_ID and TOURNAMENT_BOT_TOKEN to enable") @@ -50,6 +51,32 @@ class TournamentBotGamePlayer: log.infof("Tournament bot enabled — server=%s tournament=%s bot=%s", cfg.serverUrl, cfg.tournamentId, cfg.botId) startAsync(cfg) + private def parkOnStartup(): Unit = + park(defaultServerUrl, "expert") match + case Some(id) => log.infof("Parked expert bot on %s as id %s", defaultServerUrl, id) + case None => log.warnf("Failed to park expert bot on %s", defaultServerUrl) + + private def park(serverUrl: String, difficulty: String): Option[String] = + System.getenv().asScala.get("TOURNAMENT_BOT_TOKEN").filter(_.nonEmpty).flatMap { token => + Try { + val body = s"""{"name":"${botName(difficulty)}"}""" + val response = client + .target(serverUrl) + .path("api") + .path("bots") + .request(MediaType.APPLICATION_JSON) + .header("Authorization", s"Bearer $token") + .post(Entity.entity(body, MediaType.APPLICATION_JSON)) + if response.getStatus == 201 || response.getStatus == 200 then + val id = objectMapper.readTree(response.readEntity(classOf[String])).path("id").asText() + response.close() + Option(id).filter(_.nonEmpty) + else { log.warnf("Parking bot %s returned status %d", botName(difficulty), response.getStatus); response.close(); None } + }.getOrElse(None) + } + + private def botName(difficulty: String): String = s"NowChess ${difficulty.capitalize}" + def joinTournament( tournamentId: String, botToken: String,