Fix: bot recovery

This commit is contained in:
Grail Finder
2025-06-20 11:06:48 +03:00
parent 2db1c246a4
commit 1d51697c1a
4 changed files with 24 additions and 18 deletions

View File

@ -83,10 +83,10 @@ func saveFullInfo(fi *models.FullInfo) error {
func notifyBotIfNeeded(fi *models.FullInfo) { func notifyBotIfNeeded(fi *models.FullInfo) {
if botName := fi.Room.WhichBotToMove(); botName != "" { 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 llmapi.SignalChanMap[botName] <- true
log.Debug("after sending signal", "name", botName)
} }
log.Debug("no bot", "room_id", fi.Room.ID)
} }
// cache // cache
@ -169,11 +169,22 @@ func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) {
return resp, nil 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) { func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) {
// get username // get username
fi, _ := getFullInfoByCtx(ctx) fi, _ := getFullInfoByCtx(ctx)
fi.Room.RedTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.RedTeam.Guessers) // leave gueesers if present
fi.Room.BlueTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.BlueTeam.Guessers) leaveRole(fi)
// get room // get room
if role == "mime" { if role == "mime" {
if team == "blue" { if team == "blue" {
@ -186,9 +197,6 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error)
fi.Room.BlueTeam.Color = "blue" fi.Room.BlueTeam.Color = "blue"
fi.State.Team = "blue" fi.State.Team = "blue"
fi.State.Role = "mime" fi.State.Role = "mime"
if fi.Room.RedTeam.Mime == fi.State.Username {
fi.Room.RedTeam.Mime = ""
}
} else if team == "red" { } else if team == "red" {
if fi.Room.RedTeam.Mime != "" { if fi.Room.RedTeam.Mime != "" {
// error: alredy taken // error: alredy taken
@ -199,9 +207,6 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error)
fi.Room.RedTeam.Color = "red" fi.Room.RedTeam.Color = "red"
fi.State.Team = "red" fi.State.Team = "red"
fi.State.Role = "mime" fi.State.Role = "mime"
if fi.Room.BlueTeam.Mime == fi.State.Username {
fi.Room.BlueTeam.Mime = ""
}
} else { } else {
err := errors.New("uknown team:" + team) err := errors.New("uknown team:" + team)
return nil, err 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) return fmt.Errorf("no such room: %s; err: %w", bm["room_id"], err)
} }
log.Debug("recovering bot", "bot", bm) 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 { if err != nil {
return err return err
} }

View File

@ -186,11 +186,11 @@ func HandleAddBot(w http.ResponseWriter, r *http.Request) {
return return
} }
botname := fmt.Sprintf("bot_%d", len(llmapi.SignalChanMap)+1) // what if many rooms? 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 { if err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
go bot.StartBot() // go bot.StartBot()
notify(models.NotifyRoomUpdatePrefix+fi.Room.ID, "") notify(models.NotifyRoomUpdatePrefix+fi.Room.ID, "")
} }

View File

@ -248,7 +248,7 @@ func (b *Bot) StartBot() {
// EndBot // 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{ bot := &Bot{
Role: role, Role: role,
RoomID: roomID, RoomID: roomID,
@ -271,7 +271,7 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) {
return nil, err return nil, err
} }
// check if not running // check if not running
if role == "mime" && room.IsRunning { if role == "mime" && room.IsRunning && !recovery {
return nil, errors.New("cannot join after game started") return nil, errors.New("cannot join after game started")
} }
room.PlayerList = append(room.PlayerList, name) 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 // check if already has the same team-role bot
// only one is allowed // only one is allowed
for n, p := range room.BotMap { 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) 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" { if role == "mime" {
room.RedTeam.Mime = name room.RedTeam.Mime = name
} else if role == "guesser" { } else if role == "guesser" {
room.RedTeam.Guessers = append(room.RedTeam.Guessers, name) room.RedTeam.Guessers = []string{name}
} else { } else {
return nil, fmt.Errorf("uknown role: %s", role) 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" { if role == "mime" {
room.BlueTeam.Mime = name room.BlueTeam.Mime = name
} else if role == "guesser" { } else if role == "guesser" {
room.BlueTeam.Guessers = append(room.BlueTeam.Guessers, name) room.BlueTeam.Guessers = []string{name}
} else { } else {
return nil, fmt.Errorf("uknown role: %s", role) return nil, fmt.Errorf("uknown role: %s", role)
} }

View File

@ -40,3 +40,4 @@
- restart bot routines after server restart; + - 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 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; - guesser bot no request after game restart;
- if mime joins another role, he stays as mime (before game start);