From 1d51697c1a587e102d3c0b06c5106317457bd451 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Fri, 20 Jun 2025 11:06:48 +0300 Subject: [PATCH] Fix: bot recovery --- handlers/actions.go | 27 ++++++++++++++++----------- handlers/elements.go | 4 ++-- llmapi/main.go | 10 +++++----- todos.md | 1 + 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/handlers/actions.go b/handlers/actions.go index 963a366..2a9386c 100644 --- a/handlers/actions.go +++ b/handlers/actions.go @@ -83,10 +83,10 @@ func saveFullInfo(fi *models.FullInfo) error { func notifyBotIfNeeded(fi *models.FullInfo) { if botName := fi.Room.WhichBotToMove(); botName != "" { - log.Debug("got botname", "name", botName) + log.Debug("got botname", "name", botName, "channel_len", len(llmapi.SignalChanMap[botName])) llmapi.SignalChanMap[botName] <- true + log.Debug("after sending signal", "name", botName) } - log.Debug("no bot", "room_id", fi.Room.ID) } // cache @@ -169,11 +169,22 @@ func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) { return resp, nil } +func leaveRole(fi *models.FullInfo) { + fi.Room.RedTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.RedTeam.Guessers) + fi.Room.BlueTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.BlueTeam.Guessers) + if fi.Room.RedTeam.Mime == fi.State.Username { + fi.Room.RedTeam.Mime = "" + } + if fi.Room.BlueTeam.Mime == fi.State.Username { + fi.Room.BlueTeam.Mime = "" + } +} + func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) { // get username fi, _ := getFullInfoByCtx(ctx) - fi.Room.RedTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.RedTeam.Guessers) - fi.Room.BlueTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.BlueTeam.Guessers) + // leave gueesers if present + leaveRole(fi) // get room if role == "mime" { if team == "blue" { @@ -186,9 +197,6 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) fi.Room.BlueTeam.Color = "blue" fi.State.Team = "blue" fi.State.Role = "mime" - if fi.Room.RedTeam.Mime == fi.State.Username { - fi.Room.RedTeam.Mime = "" - } } else if team == "red" { if fi.Room.RedTeam.Mime != "" { // error: alredy taken @@ -199,9 +207,6 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) fi.Room.RedTeam.Color = "red" fi.State.Team = "red" fi.State.Role = "mime" - if fi.Room.BlueTeam.Mime == fi.State.Username { - fi.Room.BlueTeam.Mime = "" - } } else { err := errors.New("uknown team:" + team) return nil, err @@ -306,7 +311,7 @@ func recoverBot(bm map[string]string) error { return fmt.Errorf("no such room: %s; err: %w", bm["room_id"], err) } log.Debug("recovering bot", "bot", bm) - _, err := llmapi.NewBot(bm["role"], bm["team"], bm["bot_name"], bm["room_id"], cfg) + _, err := llmapi.NewBot(bm["role"], bm["team"], bm["bot_name"], bm["room_id"], cfg, true) if err != nil { return err } diff --git a/handlers/elements.go b/handlers/elements.go index 1671378..824bda7 100644 --- a/handlers/elements.go +++ b/handlers/elements.go @@ -186,11 +186,11 @@ func HandleAddBot(w http.ResponseWriter, r *http.Request) { return } botname := fmt.Sprintf("bot_%d", len(llmapi.SignalChanMap)+1) // what if many rooms? - bot, err := llmapi.NewBot(role, team, botname, fi.Room.ID, cfg) + _, err = llmapi.NewBot(role, team, botname, fi.Room.ID, cfg, false) if err != nil { abortWithError(w, err.Error()) return } - go bot.StartBot() + // go bot.StartBot() notify(models.NotifyRoomUpdatePrefix+fi.Room.ID, "") } diff --git a/llmapi/main.go b/llmapi/main.go index 2412587..fe8ffa4 100644 --- a/llmapi/main.go +++ b/llmapi/main.go @@ -248,7 +248,7 @@ func (b *Bot) StartBot() { // EndBot -func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) { +func NewBot(role, team, name, roomID string, cfg *config.Config, recovery bool) (*Bot, error) { bot := &Bot{ Role: role, RoomID: roomID, @@ -271,7 +271,7 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) { return nil, err } // check if not running - if role == "mime" && room.IsRunning { + if role == "mime" && room.IsRunning && !recovery { return nil, errors.New("cannot join after game started") } room.PlayerList = append(room.PlayerList, name) @@ -282,7 +282,7 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) { // check if already has the same team-role bot // only one is allowed for n, p := range room.BotMap { - if p.Role == bp.Role && p.Team == bp.Team { + if p.Role == bp.Role && p.Team == bp.Team && !recovery { return nil, fmt.Errorf("already has such bot with name: %s", n) } } @@ -292,7 +292,7 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) { if role == "mime" { room.RedTeam.Mime = name } else if role == "guesser" { - room.RedTeam.Guessers = append(room.RedTeam.Guessers, name) + room.RedTeam.Guessers = []string{name} } else { return nil, fmt.Errorf("uknown role: %s", role) } @@ -300,7 +300,7 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) { if role == "mime" { room.BlueTeam.Mime = name } else if role == "guesser" { - room.BlueTeam.Guessers = append(room.BlueTeam.Guessers, name) + room.BlueTeam.Guessers = []string{name} } else { return nil, fmt.Errorf("uknown role: %s", role) } diff --git a/todos.md b/todos.md index c5c15ef..8ad1143 100644 --- a/todos.md +++ b/todos.md @@ -40,3 +40,4 @@ - restart bot routines after server restart; + - guesser did not have same number of guesses (move ended after 1 guess); show how much guesses left on the page (red after blue); - guesser bot no request after game restart; +- if mime joins another role, he stays as mime (before game start);