Fix: bot recovery
This commit is contained in:
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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, "")
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
1
todos.md
1
todos.md
@ -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);
|
||||||
|
Reference in New Issue
Block a user