Compare commits

...

41 Commits

Author SHA1 Message Date
Janis d2cd3254b3 feat(benchmarks): add MoveBenchmark for performance testing of game rules
Build & Test (NowChessSystems) TeamCity build finished
2026-05-06 09:19:20 +02:00
Janis 763a2b8c39 feat(benchmarks): add JMH benchmarks for performance testing and load scripts
Build & Test (NowChessSystems) TeamCity build failed
2026-05-06 08:41:49 +02:00
Janis 0eb752d493 fix(redis): enhance GameRedisSubscriberManager to use ReactiveRedisDataSource and improve subscription handling
Build & Test (NowChessSystems) TeamCity build finished
2026-05-06 08:41:30 +02:00
Janis e279c39246 fix(auth): add InternalClientHeadersFactory for custom client headers management
Build & Test (NowChessSystems) TeamCity build failed
2026-05-06 08:07:58 +02:00
TeamCity a101866bcf ci: bump version with Build-67 2026-05-05 18:20:39 +00:00
Janis 5baf6a7cdb fix(redis): update Redis configuration with max pool size and waiting parameters
Build & Test (NowChessSystems) TeamCity build finished
2026-05-05 20:01:32 +02:00
TeamCity a10958b0d1 ci: bump version with Build-66 2026-05-05 07:07:00 +00:00
Janis dc224abe26 fix: Lints
Build & Test (NowChessSystems) TeamCity build finished
2026-05-05 08:44:25 +02:00
Janis 1813ea1d2d fix(redis): simplify refreshRedisHeartbeat logic and ensure proper error handling
Build & Test (NowChessSystems) TeamCity build failed
2026-05-05 08:24:10 +02:00
Janis 6e0fd9523e fix(auth): update InternalAuthFilter to use @ApplicationScoped and add index-dependency configuration
Build & Test (NowChessSystems) TeamCity build failed
2026-05-05 06:49:45 +02:00
Janis 847b13202c fix(redis): prevent concurrent Redis heartbeat refreshes using AtomicBoolean
Build & Test (NowChessSystems) TeamCity build failed
2026-05-04 22:45:45 +02:00
Janis c08d5303eb fix(auth): change InternalAuthFilter to use @Singleton and add HTTP tests for secret validation
Build & Test (NowChessSystems) TeamCity build failed
2026-05-03 17:27:30 +02:00
Janis 33e5017f51 fix(redis): add max pool wait time and switch to ReactiveRedisDataSource for heartbeat updates
Build & Test (NowChessSystems) TeamCity build failed
2026-05-03 16:47:54 +02:00
TeamCity de391113dc ci: bump version with Build-65 2026-05-03 11:30:40 +00:00
Janis 85b187293f fix(auth): correct internal secret validation logic in InternalAuthFilter
Build & Test (NowChessSystems) TeamCity build finished
2026-05-03 13:12:57 +02:00
TeamCity 4a145cb538 ci: bump version with Build-64 2026-05-03 10:34:44 +00:00
Janis 327c23a6aa fix(ci): update image existence check to use GitHub token for authentication
Build & Test (NowChessSystems) TeamCity build finished
2026-05-03 12:16:31 +02:00
Janis d522f7f6ed fix(coordinator): refine type casting in rolloutSpec method (#45)
Build & Test (NowChessSystems) TeamCity build failed
Reviewed-on: #45
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-03 12:12:39 +02:00
Janis 82d0b754be fix(coordinator): use genericKubernetesResources API for Argo Rollout scaling (#44)
Build & Test (NowChessSystems) TeamCity build failed
Reviewed-on: #44
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-02 22:27:18 +02:00
TeamCity 4694f516fa ci: bump version with Build-63 2026-05-02 19:39:06 +00:00
Janis fa3c6b2886 fix(coordinator): use genericKubernetesResources API for Argo Rollout scaling (#43)
Build & Test (NowChessSystems) TeamCity build finished
fabric8 disallows client.resources(classOf[GenericKubernetesResource]) — throws
KubernetesClientException at runtime. Switch to genericKubernetesResources(apiVersion, kind)
which is the correct API for CRDs.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

Reviewed-on: #43
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-02 21:22:53 +02:00
TeamCity e472fb75ad ci: bump version with Build-62 2026-05-02 17:12:34 +00:00
Janis 5f44570b35 fix(dependencies): replace Fabric8 Kubernetes client with Quarkus Kubernetes client
Build & Test (NowChessSystems) TeamCity build finished
2026-05-02 18:52:47 +02:00
Janis c16f139c8e fix(ci): add version check and conditional steps for image existence in GHCR
Build & Test (NowChessSystems) TeamCity build failed
2026-05-02 18:39:09 +02:00
TeamCity cabf1bca73 ci: bump version with Build-61 2026-05-02 16:33:43 +00:00
Janis 0c981517da fix(heartbeat): inject ObjectMapper into InstanceHeartbeatService (#42)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #42
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-02 18:15:29 +02:00
TeamCity 18a4b1cc15 ci: bump version with Build-60 2026-05-02 15:53:05 +00:00
Janis 804a4bf179 feat(logging): add DEBUG/INFO/WARN logging across services (NCS-72) (#41)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #41
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-05-02 17:33:27 +02:00
TeamCity 3c47d2b8c9 ci: bump version with Build-58 2026-05-01 18:23:46 +00:00
Janis d346c41d98 refactor: improve code formatting and readability
Build & Test (NowChessSystems) TeamCity build finished
2026-05-01 20:06:10 +02:00
Janis 2dd0501687 fix(middleware): update paths for bot generation and stockfish configuration
Build & Test (NowChessSystems) TeamCity build failed
refactor(bru): standardize authentication settings across requests
chore: add coordinator base URL to configuration files
2026-05-01 19:56:34 +02:00
Janis e17e4e806a feat(api): add comprehensive API collection for NowChess microservices 2026-05-01 19:55:07 +02:00
TeamCity 9f86cc421f ci: bump version with Build-57 2026-04-30 17:14:21 +00:00
Janis 3844456f0c feat(api): add comprehensive API collection for NowChess microservices
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 18:56:54 +02:00
TeamCity 77e498a326 ci: bump version with Build-56 2026-04-30 16:15:27 +00:00
Janis 3efebd5ed0 feat(config): update application.yml to nest HTTP port configuration
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 17:58:16 +02:00
TeamCity 0229147f4d ci: bump version with Build-55 2026-04-30 15:35:40 +00:00
Janis 3a0cb92256 feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 16:45:15 +02:00
Janis 39c9e492ce feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build failed
2026-04-30 16:29:16 +02:00
Janis 2404e6164c feat(config): update application.yml for PostgreSQL and remove staging/production configurations 2026-04-30 16:14:10 +02:00
TeamCity 6a143a462a ci: bump version with Build-54 2026-04-30 09:55:43 +00:00
160 changed files with 4435 additions and 736 deletions
+201 -188
View File
@@ -2,7 +2,7 @@
> **Stack:** raw-http | none | unknown | scala > **Stack:** raw-http | none | unknown | scala
> 0 routes + 40 rpc | 0 models | 0 components | 146 lib files | 1 env vars | 1 middleware > 0 routes + 40 rpc | 0 models | 0 components | 163 lib files | 1 env vars | 1 middleware
> **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.** > **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.**
--- ---
@@ -75,6 +75,7 @@
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame - `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala` - `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge - class Challenge
- function gameIdOpt - function gameIdOpt
@@ -100,7 +101,7 @@
- function persist - function persist
- function findByEmail - function findByEmail
- function findAll - function findAll
- _...12 more_ - _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala` - `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository - class ChallengeRepository
- function findActiveByChallengerId - function findActiveByChallengerId
@@ -116,14 +117,16 @@
- function me - function me
- function publicProfile - function publicProfile
- function banUser - function banUser
- _...10 more_ - _...9 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala` - `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource - class ChallengeResource
- function create - function create
- function list - function list
- function get
- function accept - function accept
- function decline - function decline
- function cancel - _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala` - `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService - class AccountService
- function register - function register
@@ -131,15 +134,20 @@
- function findByUsername - function findByUsername
- function findById - function findById
- function createBotAccount - function createBotAccount
- _...11 more_ - _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala` - `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService - class ChallengeService
- function create - function create
- function accept - function accept
- function decline - function decline
- function cancel - function cancel
- function listForUser - function findById
- _...1 more_ - _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
- class EventPublisher
- function publishGameStart
- function publishChallengeCreated
- function publishChallengeAccepted
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board - class Board
- function apply - function apply
@@ -162,10 +170,6 @@
- class Square - class Square
- function fromAlgebraic - function fromAlgebraic
- function offset - function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
@@ -186,6 +190,14 @@
- function withEnPassantSquare - function withEnPassantSquare
- function withHalfMoveClock - function withHalfMoveClock
- _...4 more_ - _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
- class ProtoMapperBase
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...17 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext - `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
@@ -201,115 +213,21 @@
- function isCheck - function isCheck
- function isCheckmate - function isCheckmate
- _...6 more_ - _...6 more_
- `modules/bot/python/nnue.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function get_weights_dir: () - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
- function get_data_dir: () - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
- function list_checkpoints: () - class BotRegistry
- function migrate_legacy_data: () - function register
- function show_header: () - function unregister
- function show_checkpoints_table: () - function dispatch
- _...10 more_ - function registeredBots
- `modules/bot/python/src/dataset.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
- function get_datasets_dir: () -> Path - class BotEventResource
- function next_dataset_version: () -> int - function streamEvents
- function list_datasets: () -> List[Tuple[int, Dict]] - function streamGame
- function load_dataset_metadata: (version) -> Optional[Dict] - function makeMove
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/bot/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/bot/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp - `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
- class BeansProducer
- function redissonClient
- function kubernetesClient
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- class CoordinatorConfig - class CoordinatorConfig
- function maxGamesPerCore - function maxGamesPerCore
@@ -393,10 +311,6 @@
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig - `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove - `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` - `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine - class GameEngine
@@ -405,21 +319,14 @@
- function context - function context
- function pendingDrawOfferBy - function pendingDrawOfferBy
- function currentClockState - function currentClockState
- _...22 more_ - _...21 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala` - `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException - class ApiException
- class GameNotFoundException - class GameNotFoundException
- class BadRequestException - class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse - `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler - `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` - `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
- class CoreProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper - class IoGrpcClientWrapper
- function exportCombined - function exportCombined
@@ -444,15 +351,18 @@
- function unsubscribe - function unsubscribe
- _...1 more_ - _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage - `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent - `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala`
- class GameRedisPublisher
- class GameRedisPublisher
- function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala` - `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager - class GameRedisSubscriberManager
- function subscribeGame - function subscribeGame
- function onMessage
- function unsubscribeGame - function unsubscribeGame
- function batchResubscribeGames - function batchResubscribeGames
- function unsubscribeGames - function unsubscribeGames
- _...3 more_ - function evictGames
- _...2 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry - class GameRegistry
- function store - function store
@@ -518,14 +428,7 @@
- function importGameContext - function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares - `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService - `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` - `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
- class IoProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` - `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
@@ -556,16 +459,124 @@
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer - `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer - `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer - `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/official-bots/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/official-bots/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/official-bots/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/official-bots/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- class BotController
- function getBot
- function listBots
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala` — class OfficialBotService, function onStart
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` - `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
- class ProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService - `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala` - `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource - class RuleSetResource
@@ -576,38 +587,40 @@
- function isCheckmate - function isCheckmate
- _...6 more_ - _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
- `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig - `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
- class RedissonProducer
- function redissonClient
- function close
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord - `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` - `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
- class GameWritebackStreamListener
- function startListening
- function onMessage
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala` - `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository - class GameRecordRepository
- function findByGameId - function findByGameId
- function persist - function persist
- function merge - function merge
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame - function findByPlayerId
- function findByPlayerIdRunning
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
- class StoreGameResource
- function getGame
- function getRunning
- function getHistory
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack - `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig - `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala` - `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource - class GameWebSocketResource
- function onOpen - function onOpen
- function onMessage
- function onTextMessage - function onTextMessage
- function onClose - function onClose
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
- class UserWebSocketResource
- function onOpen
- function onClose
--- ---
@@ -615,14 +628,14 @@
## Environment Variables ## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py - `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
--- ---
# Middleware # Middleware
## custom ## custom
- generate — `modules/bot/python/src/generate.py` - generate — `modules/official-bots/python/src/generate.py`
--- ---
@@ -631,38 +644,38 @@
## Most Imported Files (change these carefully) ## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files - `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files - `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files - `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files - `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
## Import Map (who imports what) ## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
--- ---
+1 -1
View File
@@ -2,4 +2,4 @@
## Environment Variables ## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py - `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
+21 -21
View File
@@ -3,35 +3,35 @@
## Most Imported Files (change these carefully) ## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files - `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files - `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files - `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files - `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files - `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **8** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files - `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
## Import Map (who imports what) ## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more - `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more - `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more - `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more - `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more - `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more - `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
+177 -164
View File
@@ -19,6 +19,7 @@
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame - `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala` - `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge - class Challenge
- function gameIdOpt - function gameIdOpt
@@ -44,7 +45,7 @@
- function persist - function persist
- function findByEmail - function findByEmail
- function findAll - function findAll
- _...12 more_ - _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala` - `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository - class ChallengeRepository
- function findActiveByChallengerId - function findActiveByChallengerId
@@ -60,14 +61,16 @@
- function me - function me
- function publicProfile - function publicProfile
- function banUser - function banUser
- _...10 more_ - _...9 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala` - `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource - class ChallengeResource
- function create - function create
- function list - function list
- function get
- function accept - function accept
- function decline - function decline
- function cancel - _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala` - `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService - class AccountService
- function register - function register
@@ -75,15 +78,20 @@
- function findByUsername - function findByUsername
- function findById - function findById
- function createBotAccount - function createBotAccount
- _...11 more_ - _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala` - `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService - class ChallengeService
- function create - function create
- function accept - function accept
- function decline - function decline
- function cancel - function cancel
- function listForUser - function findById
- _...1 more_ - _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
- class EventPublisher
- function publishGameStart
- function publishChallengeCreated
- function publishChallengeAccepted
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` - `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board - class Board
- function apply - function apply
@@ -106,10 +114,6 @@
- class Square - class Square
- function fromAlgebraic - function fromAlgebraic
- function offset - function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply - `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
@@ -130,6 +134,14 @@
- function withEnPassantSquare - function withEnPassantSquare
- function withHalfMoveClock - function withHalfMoveClock
- _...4 more_ - _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
- class ProtoMapperBase
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...17 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext - `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext - `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply - `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
@@ -145,115 +157,21 @@
- function isCheck - function isCheck
- function isCheckmate - function isCheckmate
- _...6 more_ - _...6 more_
- `modules/bot/python/nnue.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
- function get_weights_dir: () - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
- function get_data_dir: () - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
- function list_checkpoints: () - class BotRegistry
- function migrate_legacy_data: () - function register
- function show_header: () - function unregister
- function show_checkpoints_table: () - function dispatch
- _...10 more_ - function registeredBots
- `modules/bot/python/src/dataset.py` - `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
- function get_datasets_dir: () -> Path - class BotEventResource
- function next_dataset_version: () -> int - function streamEvents
- function list_datasets: () -> List[Tuple[int, Dict]] - function streamGame
- function load_dataset_metadata: (version) -> Optional[Dict] - function makeMove
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/bot/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/bot/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp - `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
- class BeansProducer
- function redissonClient
- function kubernetesClient
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala` - `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- class CoordinatorConfig - class CoordinatorConfig
- function maxGamesPerCore - function maxGamesPerCore
@@ -337,10 +255,6 @@
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig - `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove - `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` - `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine - class GameEngine
@@ -349,21 +263,14 @@
- function context - function context
- function pendingDrawOfferBy - function pendingDrawOfferBy
- function currentClockState - function currentClockState
- _...22 more_ - _...21 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala` - `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException - class ApiException
- class GameNotFoundException - class GameNotFoundException
- class BadRequestException - class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse - `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler - `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` - `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
- class CoreProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` - `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper - class IoGrpcClientWrapper
- function exportCombined - function exportCombined
@@ -388,15 +295,18 @@
- function unsubscribe - function unsubscribe
- _...1 more_ - _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage - `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent - `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala`
- class GameRedisPublisher
- class GameRedisPublisher
- function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala` - `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager - class GameRedisSubscriberManager
- function subscribeGame - function subscribeGame
- function onMessage
- function unsubscribeGame - function unsubscribeGame
- function batchResubscribeGames - function batchResubscribeGames
- function unsubscribeGames - function unsubscribeGames
- _...3 more_ - function evictGames
- _...2 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala` - `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry - class GameRegistry
- function store - function store
@@ -462,14 +372,7 @@
- function importGameContext - function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares - `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService - `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` - `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
- class IoProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext - `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` - `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
@@ -500,16 +403,124 @@
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer - `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer - `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer - `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/official-bots/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/official-bots/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/official-bots/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/official-bots/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- class BotController
- function getBot
- function listBots
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala` — class OfficialBotService, function onStart
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` - `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
- class ProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService - `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala` - `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource - class RuleSetResource
@@ -520,35 +531,37 @@
- function isCheckmate - function isCheckmate
- _...6 more_ - _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf - `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
- `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig - `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
- class RedissonProducer
- function redissonClient
- function close
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord - `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` - `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
- class GameWritebackStreamListener
- function startListening
- function onMessage
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala` - `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository - class GameRecordRepository
- function findByGameId - function findByGameId
- function persist - function persist
- function merge - function merge
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame - function findByPlayerId
- function findByPlayerIdRunning
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
- class StoreGameResource
- function getGame
- function getRunning
- function getHistory
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack - `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize - `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig - `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig - `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala` - `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource - class GameWebSocketResource
- function onOpen - function onOpen
- function onMessage
- function onTextMessage - function onTextMessage
- function onClose - function onClose
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
- class UserWebSocketResource
- function onOpen
- function onClose
+1 -1
View File
@@ -1,4 +1,4 @@
# Middleware # Middleware
## custom ## custom
- generate — `modules/bot/python/src/generate.py` - generate — `modules/official-bots/python/src/generate.py`
+47 -12
View File
@@ -19,12 +19,20 @@ jobs:
- id: check - id: check
run: | run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "Triggered manually — allowing build"
echo "allowed=true" >> "$GITHUB_OUTPUT" echo "allowed=true" >> "$GITHUB_OUTPUT"
else else
COMMIT_AUTHOR=$(git log -1 --format='%an') COMMIT_AUTHOR=$(git log -1 --format='%an')
COMMIT_SHA=$(git log -1 --format='%H')
COMMIT_MSG=$(git log -1 --format='%s')
echo "Commit: ${COMMIT_SHA}"
echo "Author: ${COMMIT_AUTHOR}"
echo "Message: ${COMMIT_MSG}"
if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then
echo "Author is TeamCity — allowing build"
echo "allowed=true" >> "$GITHUB_OUTPUT" echo "allowed=true" >> "$GITHUB_OUTPUT"
else else
echo "Author is not TeamCity — skipping build"
echo "allowed=false" >> "$GITHUB_OUTPUT" echo "allowed=false" >> "$GITHUB_OUTPUT"
fi fi
fi fi
@@ -53,7 +61,39 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Read version from versions.env
id: version
run: |
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
source modules/${{ matrix.module }}/versions.env
VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "[${{ matrix.module }}] Version: ${VERSION}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
else
echo "[${{ matrix.module }}] No versions.env found — using 'latest'"
echo "version=latest" >> "$GITHUB_OUTPUT"
fi
- name: Check if image exists in GHCR
id: image-check
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PACKAGE="now-chess-systems%2F${{ matrix.module }}"
VERSION="${{ steps.version.outputs.version }}"
EXISTING_TAGS=$(gh api "orgs/now-chess/packages/container/${PACKAGE}/versions" \
--jq '.[].metadata.container.tags[]' 2>/dev/null || echo "")
echo "[${{ matrix.module }}] Existing tags: $(echo "${EXISTING_TAGS}" | tr '\n' ' ' | xargs)"
if echo "${EXISTING_TAGS}" | grep -qx "${VERSION}"; then
echo "[${{ matrix.module }}] Image ${VERSION} already exists — skipping build"
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "[${{ matrix.module }}] Image ${VERSION} not found — will build"
echo "exists=false" >> "$GITHUB_OUTPUT"
fi
- name: Set up GraalVM - name: Set up GraalVM
if: steps.image-check.outputs.exists == 'false'
uses: graalvm/setup-graalvm@v1 uses: graalvm/setup-graalvm@v1
with: with:
java-version: '21' java-version: '21'
@@ -61,6 +101,7 @@ jobs:
native-image-job-reports: 'true' native-image-job-reports: 'true'
- name: Cache Gradle packages - name: Cache Gradle packages
if: steps.image-check.outputs.exists == 'false'
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
@@ -69,24 +110,16 @@ jobs:
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-${{ runner.os }}- restore-keys: gradle-${{ runner.os }}-
- name: Read version from versions.env
id: version
run: |
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
source modules/${{ matrix.module }}/versions.env
VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
else
echo "version=latest" >> "$GITHUB_OUTPUT"
fi
- name: Build native binary - name: Build native binary
run: ./gradlew :modules:${{ matrix.module }}:build -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false --no-daemon if: steps.image-check.outputs.exists == 'false'
run: ./gradlew :modules:${{ matrix.module }}:build -x test -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false -Dquarkus.profile=deployed --no-daemon
- name: Set up Docker Buildx - name: Set up Docker Buildx
if: steps.image-check.outputs.exists == 'false'
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry - name: Log in to GitHub Container Registry
if: steps.image-check.outputs.exists == 'false'
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ghcr.io registry: ghcr.io
@@ -94,6 +127,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata - name: Extract metadata
if: steps.image-check.outputs.exists == 'false'
id: meta id: meta
uses: docker/metadata-action@v5 uses: docker/metadata-action@v5
with: with:
@@ -103,6 +137,7 @@ jobs:
type=raw,value=latest type=raw,value=latest
- name: Build and push - name: Build and push
if: steps.image-check.outputs.exists == 'false'
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
+149
View File
@@ -0,0 +1,149 @@
# NowChess Bruno API Collection
Complete API collection for all NowChess microservices.
## Structure
```
bruno/
├── collection.bru # Collection metadata
├── environments/ # Environment configurations
│ ├── local.bru # Local development (http://localhost)
│ ├── staging.bru # Staging (https://st.nowchess.janis-eccarius.de)
│ └── prod.bru # Production (https://nowchess.janis-eccarius.de)
├── core/ # Core service endpoints (port 8080)
│ ├── game.bru # Game management
│ ├── rules.bru # Rule validation (@InternalOnly)
│ ├── io.bru # Import/Export (@InternalOnly)
│ └── coordinator.bru # Orchestration
├── account/ # Account service (port 8083)
│ ├── account.bru # User & bot accounts
│ ├── challenge.bru # Player challenges
│ └── official-challenge.bru # Official bot challenges
├── store/ # Store service (port 8085)
│ └── game.bru # Game persistence
├── ws/ # WebSocket (port 8084)
│ ├── game-ws.bru # Game real-time updates
│ └── user-ws.bru # User notifications
└── bot/ # Bot integration
└── events.bru # Bot event streaming
```
## Ingress Routing
Based on `ingress-nginx` configuration:
```yaml
/api/account → nowchess-account-active:8083
/ws → nowchess-ws-active:8084
/api/store → nowchess-store-active:8085
/api → nowchess-core-active:8080
```
## Environments
### Local Development
```
baseUrl: http://localhost:8080
accountBaseUrl: http://localhost:8083
storeBaseUrl: http://localhost:8085
wsBaseUrl: ws://localhost:8084
```
### Staging
```
baseUrl: https://st.nowchess.janis-eccarius.de/api
wsBaseUrl: wss://st.nowchess.janis-eccarius.de/ws
```
### Production
```
baseUrl: https://nowchess.janis-eccarius.de/api
wsBaseUrl: wss://nowchess.janis-eccarius.de/ws
```
## Environment Variables
Set these in your Bruno environment for authentication:
- `token`: JWT token for regular user operations
- `adminToken`: JWT token with Admin role
- `botToken`: Bot account JWT token
- `internalToken`: Internal service-to-service token
- `gameId`: Game identifier for game endpoints
- `username`: User username for profile/challenge operations
- `playerId`: Player ID for store operations
- `botId`: Bot ID for bot endpoints
- `botName`: Official bot name for challenges
- `difficulty`: Bot difficulty 1000-2800 (ELO)
- `color`: white/black/random for bot challenges
## Security Notes
From `@modules/security/src`:
- **InternalOnly** endpoints require internal service authentication
- `/api/rules/*`
- `/io/*`
- **@RolesAllowed** endpoints require JWT with specific roles
- Admin operations
- Authenticated user operations
- Internal filters validate service-to-service calls
## API Endpoints Summary
### Public Endpoints (No Auth Required)
- `GET /api/account/{username}` - Public profile
- `GET /api/account/official-bots` - List official bots
- `GET /game/{gameId}` - Game record
- `GET /api/board/game/{gameId}` - Game state
- `GET /api/board/game/{gameId}/moves` - Legal moves
### Authenticated Endpoints (JWT Required)
- `POST /api/account` - Register
- `POST /api/account/login` - Login
- `GET /api/account/me` - Current user profile
- `POST /api/challenge/*` - Challenge operations
- `POST /api/challenge/official/{botName}` - Challenge official bot
- `POST /api/account/bots` - Create bot account
- `GET /api/bot/stream/events` - Bot event stream
- `WS /api/board/game/{gameId}/ws` - Game WebSocket
- `WS /api/user/ws` - User notifications
### Internal Endpoints (@InternalOnly)
- `POST /api/rules/*` - Rule validation
- `POST /io/*` - Format conversion
- `POST /api/board/game` - Create game
## Usage
1. **Select Environment**: Click the environment dropdown and choose local/staging/prod
2. **Set Variables**: Update `token`, `gameId`, `username`, etc. as needed
3. **Send Request**: Click Send on any endpoint
4. **WebSocket**: Use Bruno's WebSocket support or connect manually with:
```bash
websocat wss://nowchess.janis-eccarius.de/ws/api/board/game/GAMEID/ws
```
## Example Workflows
### Play a Game
1. `POST /api/account` - Create user
2. `POST /api/account/login` - Get JWT token
3. `POST /api/challenge/official/Stockfish` - Challenge a bot
4. Use returned `gameId` for subsequent moves
5. `WS /api/board/game/{gameId}/ws` - Connect for real-time updates
6. `POST /api/board/game/{gameId}/move/{uci}` - Make moves
### Manage Bot Account
1. `POST /api/account` - Create main account
2. `POST /api/account/login` - Get token
3. `POST /api/account/bots` - Create bot account
4. Copy bot token from response
5. `GET /api/bot/stream/events?botId={botId}` - Listen for game invites
6. `POST /api/bot/game/{gameId}/move/{uci}` - Submit moves
## Notes
- All timestamps are ISO 8601 format
- Move notation uses UCI (e.g., "e2e4")
- Game IDs are auto-generated UUIDs
- WebSocket connections auto-close on inactivity (check your server timeout)
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Register
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/account
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
}
body:json {
{
"username": "player1",
"email": "player1@example.com",
"password": "securepassword"
}
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: Login
type: http
seq: 2
}
post {
url: {{accountBaseUrl}}/account/login
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
}
body:json {
{
"username": "player1",
"password": "securepassword"
}
}
@@ -0,0 +1,21 @@
meta {
name: Get Current User
type: http
seq: 3
}
get {
url: {{accountBaseUrl}}/account/me
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,20 @@
meta {
name: Get Public Profile
type: http
seq: 4
}
get {
url: {{accountBaseUrl}}/account/{{username}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Accept: application/json
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: Create Bot
type: http
seq: 5
}
post {
url: {{accountBaseUrl}}/account/bots
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"name": "ChessBot-1"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: List Bots
type: http
seq: 6
}
get {
url: {{accountBaseUrl}}/account/bots
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,27 @@
meta {
name: Update Bot Name
type: http
seq: 7
}
put {
url: {{accountBaseUrl}}/account/bots/{{botId}}
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"name": "ChessBot-Updated"
}
}
@@ -0,0 +1,20 @@
meta {
name: Rotate Bot Token
type: http
seq: 8
}
post {
url: {{accountBaseUrl}}/account/bots/{{botId}}/rotate-token
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Delete Bot
type: http
seq: 9
}
delete {
url: {{accountBaseUrl}}/account/bots/{{botId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
@@ -0,0 +1,20 @@
meta {
name: Get Official Bots
type: http
seq: 10
}
get {
url: {{accountBaseUrl}}/account/official-bots
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Accept: application/json
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Ban User
type: http
seq: 11
}
post {
url: {{accountBaseUrl}}/account/{{userId}}/ban
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Unban User
type: http
seq: 12
}
post {
url: {{accountBaseUrl}}/account/{{userId}}/unban
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: account
seq: 1
}
@@ -0,0 +1,30 @@
meta {
name: Send Challenge
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/challenge/{{username}}
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"timeControl": {
"limitSeconds": 600,
"incrementSeconds": 5
}
}
}
@@ -0,0 +1,21 @@
meta {
name: List Challenges
type: http
seq: 2
}
get {
url: {{accountBaseUrl}}/challenge
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,21 @@
meta {
name: Get Challenge
type: http
seq: 3
}
get {
url: {{accountBaseUrl}}/challenge/{{challengeId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
@@ -0,0 +1,20 @@
meta {
name: Accept Challenge
type: http
seq: 4
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/accept
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
@@ -0,0 +1,27 @@
meta {
name: Decline Challenge
type: http
seq: 5
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/decline
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{token}}
}
body:json {
{
"reason": "Not interested"
}
}
@@ -0,0 +1,20 @@
meta {
name: Cancel Challenge
type: http
seq: 6
}
post {
url: {{accountBaseUrl}}/challenge/{{challengeId}}/cancel
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: challenge
seq: 2
}
@@ -0,0 +1,27 @@
meta {
name: Challenge Official Bot
type: http
seq: 1
}
post {
url: {{accountBaseUrl}}/challenge/official/{{botName}}?difficulty={{difficulty}}&color={{color}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{token}}
Accept: application/json
}
docs {
Query Parameters:
- difficulty: 1000-2800 (ELO)
- color: white | black | random
}
@@ -0,0 +1,27 @@
meta {
name: Create Official Bot
type: http
seq: 2
}
post {
url: {{accountBaseUrl}}/account/official-bots
body: json
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Content-Type: application/json
Authorization: Bearer {{adminToken}}
}
body:json {
{
"name": "Stockfish-1000"
}
}
@@ -0,0 +1,20 @@
meta {
name: Delete Official Bot
type: http
seq: 3
}
delete {
url: {{accountBaseUrl}}/account/official-bots/{{botId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
headers {
Authorization: Bearer {{adminToken}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: official
seq: 3
}
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 2 seq: 2
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 3 seq: 3
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 4 seq: 4
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 1 seq: 1
} }
http { get {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 2 seq: 2
} }
http { get {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,11 +4,15 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game url: {{baseUrl}}/api/board/game
body: json body: json
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
headers { headers {
+6 -1
View File
@@ -7,7 +7,12 @@ meta {
get { get {
url: {{baseUrl}}/api/board/game/{{gameId}} url: {{baseUrl}}/api/board/game/{{gameId}}
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
vars:pre-request { vars:pre-request {
+7 -3
View File
@@ -4,9 +4,13 @@ meta {
seq: 4 seq: 4
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/resign url: {{baseUrl}}/api/board/game/{{gameId}}/resign
body: none body: none
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
+7 -3
View File
@@ -4,11 +4,15 @@ meta {
seq: 1 seq: 1
} }
http { post {
method: POST
url: {{baseUrl}}/api/board/game/import/fen url: {{baseUrl}}/api/board/game/import/fen
body: json body: json
auth: none auth: inherit
}
settings {
encodeUrl: true
timeout: 0
} }
headers { headers {
+26
View File
@@ -0,0 +1,26 @@
meta {
name: Stream Bot Events
type: http
seq: 1
}
http {
method: GET
url: {{baseUrl}}/bot/stream/events?botId={{botId}}
auth: none
}
headers {
Authorization: Bearer {{botToken}}
Accept: text/event-stream
}
notes {
Server-Sent Events stream.
Bot must match token subject (botId).
Events:
- Game start notification
- Move requests
- Game end notification
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: Stream Game Events
type: http
seq: 2
}
http {
method: GET
url: {{baseUrl}}/bot/game/stream/{{gameId}}
auth: none
}
headers {
Accept: text/event-stream
}
notes {
Server-Sent Events stream of game updates.
No authentication required - broadcasts all state changes.
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Make Bot Move
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/bot/game/{{gameId}}/move/{{uci}}
auth: none
}
headers {
Authorization: Bearer {{botToken}}
}
notes {
Submit move from bot.
Parameters:
- gameId: Game identifier
- uci: Move notation (e.g., e2e4)
}
+36
View File
@@ -0,0 +1,36 @@
meta {
name: NowChess API
type: http
seq: 1
}
docs {
title: NowChess Microservices API Collection
content: |
# NowChess API Collection
Complete API collection for all NowChess microservices.
## Services Architecture
- **Core** (8080): Game engine, rules validation, format import/export
- **Account** (8083): User management, bot accounts, challenges
- **Store** (8085): Game persistence and history
- **WebSocket** (8084): Real-time game updates
## Ingress Routing
- /api/account → nowchess-account-active:8083
- /ws → nowchess-ws-active:8084
- /api/store → nowchess-store-active:8085
- /api → nowchess-core-active:8080
## Environments
- **local**: http://localhost (direct service ports)
- **staging**: https://st.nowchess.janis-eccarius.de/api
- **prod**: https://nowchess.janis-eccarius.de/api
## Security
@modules/security/src contains:
- InternalAuthFilter: Validates internal service tokens
- InternalOnly: Annotation for internal endpoints (rules, io)
- JWT validation for authenticated endpoints
}
+33
View File
@@ -0,0 +1,33 @@
meta {
name: List Instances
type: http
seq: 1
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/instances
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+30
View File
@@ -0,0 +1,30 @@
meta {
name: List Instances
type: http
seq: 1
}
http {
method: GET
url: {{coordinatorBaseUrl}}/api/coordinator/instances
auth: none
}
headers {
Accept: application/json
}
notes {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — number of active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+32
View File
@@ -0,0 +1,32 @@
meta {
name: Get Metrics
type: http
seq: 2
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/metrics
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Aggregate load metrics computed from the instance registry.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Response: MetricsDto
totalInstances: int
healthyInstances: int
deadInstances: int
totalGames: int — sum of subscriptionCount across all instances
avgGamesPerCore: double
maxGamesPerCore: int
minGamesPerCore: int
instances: InstanceMetadata[]
}
+29
View File
@@ -0,0 +1,29 @@
meta {
name: Rebalance
type: http
seq: 3
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/rebalance
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers a manual rebalance of game subscriptions across core instances.
Runs asynchronously — response does not wait for completion.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-rebalance runs every 30s (rebalance-interval), min 60s between runs
(rebalance-min-interval). Triggers when load deviation exceeds 20%
(max-deviation-percent).
Response: {"status": "rebalance_started"}
}
+32
View File
@@ -0,0 +1,32 @@
meta {
name: Failover
type: http
seq: 4
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/failover/{{instanceId}}
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
vars:pre-request {
instanceId: core-instance-1
}
docs {
Triggers manual failover for a specific core instance.
Marks it DEAD and migrates its game subscriptions to healthy instances.
Runs asynchronously — response does not wait for completion.
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Path param: instanceId — from /instances response (instanceId field)
Response: {"status": "failover_started", "instanceId": "<id>"}
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Scale Up
type: http
seq: 5
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/scale-up
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers manual scale-up of core replicas via Kubernetes rollout.
Requires auto-scale-enabled=true and a reachable k8s API.
Respects scale-max-replicas (default: 10).
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-scale triggers when avg load exceeds scale-up-threshold (default: 0.8).
Response: {"status": "scale_up_started"}
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Scale Down
type: http
seq: 6
}
post {
url: {{coordinatorBaseUrl}}/api/coordinator/scale-down
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Triggers manual scale-down of core replicas via Kubernetes rollout.
Requires auto-scale-enabled=true and a reachable k8s API.
Respects scale-min-replicas (default: 2).
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
Auto-scale triggers when avg load drops below scale-down-threshold (default: 0.3).
Response: {"status": "scale_down_started"}
}
+31
View File
@@ -0,0 +1,31 @@
meta {
name: List Instances
type: http
seq: 1
}
get {
url: {{coordinatorBaseUrl}}/api/coordinator/instances
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Returns all known core instances from the in-memory registry.
Registry is populated via gRPC heartbeats from core instances.
Response: InstanceMetadata[]
instanceId: string — unique instance ID
hostname: string
httpPort: int
grpcPort: int
subscriptionCount: int — number of active game subscriptions
localCacheSize: int
lastHeartbeat: string — ISO-8601 timestamp
state: string — "HEALTHY" | "DEAD"
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: coordinator
seq: 6
}
+26
View File
@@ -0,0 +1,26 @@
meta {
name: Create Game
type: http
seq: 1
}
http {
method: POST
url: {{baseUrl}}/board/game
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"white": {"id": "p1", "displayName": "Player 1"},
"black": {"id": "p2", "displayName": "Player 2"},
"timeControl": {"limitSeconds": 600, "incrementSeconds": 5},
"mode": "Open"
}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Game
type: http
seq: 2
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}
auth: none
}
headers {
Accept: application/json
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Make Move
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/move/{{uci}}
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Legal Moves
type: http
seq: 4
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/moves?square={{square}}
auth: none
}
headers {
Accept: application/json
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Undo Move
type: http
seq: 5
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/undo
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Redo Move
type: http
seq: 6
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/redo
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Resign Game
type: http
seq: 7
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/resign
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Import FEN
type: http
seq: 8
}
http {
method: POST
url: {{baseUrl}}/board/game/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"white": {"id": "p1", "displayName": "Player 1"},
"black": {"id": "p2", "displayName": "Player 2"}
}
}
+22
View File
@@ -0,0 +1,22 @@
meta {
name: Import PGN
type: http
seq: 9
}
http {
method: POST
url: {{baseUrl}}/board/game/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"pgn": "[Event \"Test Game\"]\n[Site \"NowChess\"]\n1. e4 e5 2. Nf3 Nc6"
}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Export FEN
type: http
seq: 10
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/export/fen
auth: none
}
headers {
Accept: text/plain
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Export PGN
type: http
seq: 11
}
http {
method: GET
url: {{baseUrl}}/board/game/{{gameId}}/export/pgn
auth: none
}
headers {
Accept: application/x-chess-pgn
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Offer Draw
type: http
seq: 12
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/offer
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Accept Draw
type: http
seq: 13
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/accept
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Decline Draw
type: http
seq: 14
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/decline
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Claim Draw
type: http
seq: 15
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/draw/claim
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Request Takeback
type: http
seq: 16
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/request
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Accept Takeback
type: http
seq: 17
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/accept
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Decline Takeback
type: http
seq: 18
}
http {
method: POST
url: {{baseUrl}}/board/game/{{gameId}}/takeback/decline
auth: none
}
headers {
Authorization: Bearer {{token}}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: game
seq: 1
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Import FEN
type: http
seq: 1
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
}
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Import PGN
type: http
seq: 2
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"pgn": "[Event \"Test\"]\n1. e4 e5"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Export FEN
type: http
seq: 3
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/fen
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Export PGN
type: http
seq: 4
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: io
seq: 3
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Candidate Moves
type: http
seq: 1
}
post {
url: {{baseUrl}}/rules/candidate-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"context": {},
"square": "e2"
}
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: Legal Moves
type: http
seq: 2
}
http {
method: POST
url: {{baseUrl}}/rules/legal-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{
"context": {},
"square": "e2"
}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: All Legal Moves
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/rules/all-legal-moves
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Is Check
type: http
seq: 4
}
http {
method: POST
url: {{baseUrl}}/rules/is-check
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Is Checkmate
type: http
seq: 5
}
http {
method: POST
url: {{baseUrl}}/rules/is-checkmate
body: json
auth: none
}
headers {
Content-Type: application/json
Authorization: Bearer {{internalToken}}
}
body:json {
{}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: rules
seq: 2
}
+9 -2
View File
@@ -1,5 +1,12 @@
vars { vars {
baseUrl: http://localhost:8080 baseUrl: http://localhost:8080/api
wsBaseUrl: ws://localhost:8084 wsBaseUrl: ws://localhost:8084
ioBaseUrl: http://localhost:8081 ioBaseUrl: http://localhost:8080/api
accountBaseUrl: http://localhost:8083/api
storeBaseUrl: http://localhost:8085
coordinatorBaseUrl: http://localhost:8086
token: your_jwt_token_here
adminToken: your_admin_jwt_token_here
botToken: your_bot_jwt_token_here
internalToken: your_internal_service_token_here
} }
+8
View File
@@ -0,0 +1,8 @@
vars {
baseUrl: https://nowchess.janis-eccarius.de/api
wsBaseUrl: wss://nowchess.janis-eccarius.de/ws
ioBaseUrl: https://nowchess.janis-eccarius.de/api
accountBaseUrl: https://nowchess.janis-eccarius.de/api
storeBaseUrl: https://nowchess.janis-eccarius.de/api
coordinatorBaseUrl: http://localhost:8086
}
+8
View File
@@ -0,0 +1,8 @@
vars {
baseUrl: https://st.nowchess.janis-eccarius.de/api
wsBaseUrl: wss://st.nowchess.janis-eccarius.de/ws
ioBaseUrl: https://st.nowchess.janis-eccarius.de/api
accountBaseUrl: https://st.nowchess.janis-eccarius.de/api
storeBaseUrl: https://st.nowchess.janis-eccarius.de/api
coordinatorBaseUrl: http://localhost:8086
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Game Record
type: http
seq: 1
}
http {
method: GET
url: {{storeBaseUrl}}/game/{{gameId}}
auth: none
}
headers {
Accept: application/json
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Get Running Games
type: http
seq: 2
}
http {
method: GET
url: {{storeBaseUrl}}/game/running/{{playerId}}?offset=0&limit=20
auth: none
}
headers {
Accept: application/json
}
notes {
Optional query parameters:
- offset: Skip N records (default 0)
- limit: Return N records (default 20)
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: Get Game History
type: http
seq: 3
}
http {
method: GET
url: {{storeBaseUrl}}/game/history/{{playerId}}?offset=0&limit=20
auth: none
}
headers {
Accept: application/json
}
notes {
Optional query parameters:
- offset: Skip N records (default 0)
- limit: Return N records (default 20)
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: Game WebSocket
type: ws
seq: 1
}
ws {
url: {{wsBaseUrl}}/api/board/game/{{gameId}}/ws
body: ws
auth: inherit
}
headers {
Authorization: Bearer {{token}}
}
body:ws {
name: message 1
type: json
content: '''
{}
'''
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: User WebSocket
type: ws
seq: 2
}
ws {
url: {{wsBaseUrl}}/api/user/ws
body: ws
auth: inherit
}
headers {
Authorization: Bearer {{token}}
}
body:ws {
name: message 1
type: json
content: '''
{}
'''
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: ws
seq: 7
}
+3 -1
View File
@@ -3,6 +3,7 @@ plugins {
id("org.scoverage") version "8.1" apply false id("org.scoverage") version "8.1" apply false
id("com.diffplug.spotless") version "8.4.0" apply false id("com.diffplug.spotless") version "8.4.0" apply false
id("io.github.cosmicsilence.scalafix") version "0.2.6" apply false id("io.github.cosmicsilence.scalafix") version "0.2.6" apply false
id("me.champeau.jmh") version "0.7.2" apply false
} }
group = "de.nowchess" group = "de.nowchess"
@@ -99,7 +100,8 @@ val versions = mapOf(
"SCALA_PARSER_COMBINATORS" to "2.4.0", "SCALA_PARSER_COMBINATORS" to "2.4.0",
"FASTPARSE" to "3.0.2", "FASTPARSE" to "3.0.2",
"JACKSON" to "2.17.2", "JACKSON" to "2.17.2",
"JACKSON_SCALA" to "2.17.2" "JACKSON_SCALA" to "2.17.2",
"JMH" to "1.37"
) )
extra["VERSIONS"] = versions extra["VERSIONS"] = versions
+100
View File
@@ -0,0 +1,100 @@
# NowChess Load Testing with k6
Performance testing suite for NowChess services using k6.
## Installation
```bash
# Install k6 (macOS)
brew install k6
# Or download from https://k6.io/docs/getting-started/installation/
```
## Test Scenarios
### 1. Ramp-Up Test
Gradually increases load from 10 to 100 concurrent users.
```bash
k6 run ramp-up.js
```
Target: Identify system behavior under gradual load increase.
### 2. Stress Test
Incremental load increase up to 500 concurrent users to find breaking point.
```bash
k6 run stress-test.js
```
Target: Determine system capacity and failure point.
### 3. Spike Test
Sudden traffic surge (baseline 50 → 500 users instantly).
```bash
k6 run spike-test.js
```
Target: Test recovery and resilience to sudden spikes.
### 4. Constant Load Test
Maintains 50 VUs for 10 minutes.
```bash
k6 run constant-load.js
```
Target: Check stability under sustained load.
## Environment Variables
```bash
# Override service endpoints
export BASE_URL=http://localhost:8080
export ACCOUNT_HOST=http://localhost:8083
export STORE_HOST=http://localhost:8085
k6 run ramp-up.js
```
## Prerequisites
Ensure services are running:
- Core: `localhost:8080`
- Account: `localhost:8083`
- Store: `localhost:8085`
- Redis: `localhost:6379` (with increased pool size)
## Metrics Interpretation
- `http_req_duration`: Response time (p95, p99 percentiles matter most)
- `http_req_failed`: Failed requests (connection errors, errors, non-2xx responses)
- `vus`: Virtual Users (concurrent connections)
- `iterations`: Completed test cycles per VU
## Results
k6 generates HTML report output. Use with:
```bash
k6 run --out=csv=results.csv ramp-up.js
```
## Troubleshooting
If you see:
- **"max pool wait timeout"** → Redis pool still too small or maxWaitTime too short
- **"connection refused"** → Service not running
- **"high p99 latency"** → System approaching capacity
Increase Redis pool settings in `modules/*/src/main/resources/application.yml`:
```yaml
quarkus:
redis:
pool:
max-size: 128 # Increase if still hitting limits
max-waiting: 256
```
+25
View File
@@ -0,0 +1,25 @@
export const BASE_URL = __ENV.BASE_URL || 'http://localhost:8080';
export const ACCOUNT_HOST = __ENV.ACCOUNT_HOST || 'http://localhost:8083';
export const STORE_HOST = __ENV.STORE_HOST || 'http://localhost:8085';
export const CORE_HOST = BASE_URL;
export const ENDPOINTS = {
// Account endpoints
accountCreateUser: `${ACCOUNT_HOST}/api/account`,
accountLogin: `${ACCOUNT_HOST}/api/account/login`,
accountProfile: `${ACCOUNT_HOST}/api/account/me`,
accountPublicProfile: (username) => `${ACCOUNT_HOST}/api/account/${username}`,
// Store endpoints
storeGame: `${STORE_HOST}/api/games`,
storeGameById: (gameId) => `${STORE_HOST}/api/games/${gameId}`,
// Core endpoints (game operations)
gameWebSocket: (gameId) => `ws://localhost:8080/api/games/${gameId}/ws`,
};
export const TEST_USERS = [
{ username: 'load-test-user-1', email: 'load1@example.com' },
{ username: 'load-test-user-2', email: 'load2@example.com' },
{ username: 'load-test-user-3', email: 'load3@example.com' },
];
+40
View File
@@ -0,0 +1,40 @@
import http from 'k6/http';
import { check, sleep } from 'k6';
import { ENDPOINTS } from './config.js';
export const options = {
vus: 50,
duration: '10m',
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1000'],
http_req_failed: ['rate<0.1'],
},
};
export default function () {
// Simulate consistent user traffic
// 1. Get account profile
const profileRes = http.get(ENDPOINTS.accountProfile);
check(profileRes, {
'profile status is 200 or 401': (r) => r.status === 200 || r.status === 401,
});
sleep(0.5);
// 2. Get public profile
const publicRes = http.get(ENDPOINTS.accountPublicProfile('testuser'));
check(publicRes, {
'public profile status ok': (r) => r.status > 0,
});
sleep(0.5);
// 3. List store games
const gamesRes = http.get(ENDPOINTS.storeGame);
check(gamesRes, {
'store games status ok': (r) => r.status > 0,
});
sleep(1);
}
+35
View File
@@ -0,0 +1,35 @@
import http from 'k6/http';
import { check, sleep } from 'k6';
import { ENDPOINTS, ACCOUNT_HOST } from './config.js';
export const options = {
stages: [
{ duration: '1m', target: 10 },
{ duration: '3m', target: 50 },
{ duration: '5m', target: 100 },
{ duration: '3m', target: 50 },
{ duration: '1m', target: 0 },
],
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1000'],
http_req_failed: ['rate<0.1'],
},
};
export default function () {
// Test account endpoints
const accountRes = http.get(ENDPOINTS.accountPublicProfile('testuser'));
check(accountRes, {
'account endpoint status is 200': (r) => r.status === 200,
});
sleep(1);
// Test store endpoints
const storeRes = http.get(ENDPOINTS.storeGame);
check(storeRes, {
'store endpoint status is 200': (r) => r.status === 200 || r.status === 401,
});
sleep(1);
}
+68
View File
@@ -0,0 +1,68 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default values
TEST_TYPE="${1:-ramp-up}"
BASE_URL="${BASE_URL:-http://localhost:8080}"
OUTPUT_FILE="${2:-results-$(date +%s).csv}"
echo -e "${BLUE}NowChess Load Test Runner${NC}"
echo "Test Type: $TEST_TYPE"
echo "Base URL: $BASE_URL"
echo ""
# Check if k6 is installed
if ! command -v k6 &> /dev/null; then
echo -e "${RED}Error: k6 not found. Install from https://k6.io/docs/getting-started/installation/${NC}"
exit 1
fi
case "$TEST_TYPE" in
ramp-up)
echo -e "${GREEN}Running Ramp-Up Test (10->100 VUs over 13 minutes)${NC}"
k6 run --out=csv=$OUTPUT_FILE ramp-up.js
;;
stress)
echo -e "${GREEN}Running Stress Test (up to 500 VUs)${NC}"
k6 run --out=csv=$OUTPUT_FILE stress-test.js
;;
spike)
echo -e "${GREEN}Running Spike Test (sudden 50->500 spike)${NC}"
k6 run --out=csv=$OUTPUT_FILE spike-test.js
;;
constant)
echo -e "${GREEN}Running Constant Load Test (50 VUs for 10m)${NC}"
k6 run --out=csv=$OUTPUT_FILE constant-load.js
;;
all)
echo -e "${GREEN}Running All Tests${NC}"
for test in ramp-up stress spike constant; do
echo ""
echo -e "${BLUE}Starting $test test...${NC}"
$0 $test
sleep 5
done
exit 0
;;
*)
echo -e "${RED}Usage: $0 {ramp-up|stress|spike|constant|all} [output-file]${NC}"
echo ""
echo "Examples:"
echo " $0 ramp-up"
echo " $0 stress results.csv"
echo " $0 all"
exit 1
;;
esac
echo -e "${GREEN}Test complete. Results saved to $OUTPUT_FILE${NC}"
+36
View File
@@ -0,0 +1,36 @@
import http from 'k6/http';
import { check, sleep } from 'k6';
import { ENDPOINTS } from './config.js';
export const options = {
stages: [
{ duration: '1m', target: 50 },
{ duration: '30s', target: 500, ramp: 'fast' },
{ duration: '2m', target: 500 },
{ duration: '30s', target: 50, ramp: 'fast' },
{ duration: '1m', target: 0 },
],
thresholds: {
http_req_duration: ['p(95)<2000', 'p(99)<5000'],
http_req_failed: ['rate<0.3'],
},
};
export default function () {
// Rapid account checks
const urls = [
ENDPOINTS.accountPublicProfile('testuser'),
ENDPOINTS.storeGame,
ENDPOINTS.accountProfile,
];
urls.forEach((url) => {
const res = http.get(url);
check(res, {
'response received': (r) => r.status > 0,
'response time under 3s': (r) => r.timings.duration < 3000,
});
});
sleep(0.1);
}

Some files were not shown because too many files have changed in this diff Show More