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
	 Grail Finder
					Grail Finder