85baabe4ba
- internal/robot: durable kind='robot' account pool (migration 00004); every per-game and per-turn choice derived deterministically from the game seed (restart-stable FNV mix); a background move driver; margin targeting (band 1-30, closest-to-band); right-skewed [2,90]min delays (median ~10m); opponent-anchored sleep with +/-3h drift; daytime nudge reply + proactive 12h nudge; friend/chat blocked via profile toggles. - engine.Candidates (decoded ranked plays); game.Candidates + RobotTurns; social.LastNudgeAt. - matchmaker: 10s wait then robot substitution (reaper) + Poll delivery seam. - config (BACKEND_ROBOT_DRIVE_INTERVAL, BACKEND_LOBBY_ROBOT_WAIT, BACKEND_LOBBY_REAPER_INTERVAL); main wiring + boot-time pool provisioning. - metrics: robot account_stats (authoritative balance) + robot_games_finished_total OTel counter + per-finish log. - docs: PLAN, ARCHITECTURE, FUNCTIONAL(+ru), TESTING, README; account.go comment. - tests: robot strategy units, matchmaker reaper/Poll, engine.Candidates; inttest robot full-game / substitution / proactive-nudge.
37 lines
1.0 KiB
Go
37 lines
1.0 KiB
Go
package lobby
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// Config configures the matchmaking pool's robot substitution.
|
|
type Config struct {
|
|
// RobotWait is how long an auto-match player waits for a human before a robot
|
|
// is substituted. Sourced from BACKEND_LOBBY_ROBOT_WAIT.
|
|
RobotWait time.Duration
|
|
// ReaperInterval is how often the substitution reaper scans for over-waited
|
|
// players. Sourced from BACKEND_LOBBY_REAPER_INTERVAL.
|
|
ReaperInterval time.Duration
|
|
}
|
|
|
|
// DefaultConfig returns the matchmaking defaults: a 10-second wait
|
|
// (docs/ARCHITECTURE.md §7) scanned every second.
|
|
func DefaultConfig() Config {
|
|
return Config{
|
|
RobotWait: 10 * time.Second,
|
|
ReaperInterval: time.Second,
|
|
}
|
|
}
|
|
|
|
// Validate reports whether the configuration is usable.
|
|
func (c Config) Validate() error {
|
|
if c.RobotWait <= 0 {
|
|
return fmt.Errorf("lobby: robot wait must be positive, got %s", c.RobotWait)
|
|
}
|
|
if c.ReaperInterval <= 0 {
|
|
return fmt.Errorf("lobby: reaper interval must be positive, got %s", c.ReaperInterval)
|
|
}
|
|
return nil
|
|
}
|