diff --git a/handlers/elements.go b/handlers/elements.go index b60b1c7..c58261d 100644 --- a/handlers/elements.go +++ b/handlers/elements.go @@ -294,7 +294,14 @@ func HandleAddBot(w http.ResponseWriter, r *http.Request) { abortWithError(w, err.Error()) return } - botname := fmt.Sprintf("bot_%d", len(llmapi.SignalChanMap)+1) // what if many rooms? + var botname string + maxID, err := repo.PlayerGetMaxID(r.Context()) + if err != nil { + log.Warn("failed to get players max id") + botname = fmt.Sprintf("bot_%d", len(llmapi.SignalChanMap)+1) // what if many rooms? + } else { + botname = fmt.Sprintf("bot_%d", maxID+1) // what if many rooms? + } _, err = llmapi.NewBot(role, team, botname, fi.Room.ID, cfg, false) if err != nil { abortWithError(w, err.Error()) diff --git a/repos/players.go b/repos/players.go index b736c05..8286501 100644 --- a/repos/players.go +++ b/repos/players.go @@ -19,6 +19,7 @@ type PlayersRepo interface { PlayerList(ctx context.Context, isBot bool) ([]models.Player, error) PlayerListAll(ctx context.Context) ([]models.Player, error) PlayerListByRoom(ctx context.Context, roomID string) ([]models.Player, error) + PlayerGetMaxID(ctx context.Context) (uint32, error) } func (p *RepoProvider) PlayerListNames(ctx context.Context) ([]string, error) { @@ -96,6 +97,15 @@ func (p *RepoProvider) PlayerList(ctx context.Context, isBot bool) ([]models.Pla return players, nil } +func (p *RepoProvider) PlayerGetMaxID(ctx context.Context) (uint32, error) { + var maxID uint32 + err := sqlx.GetContext(ctx, p.DB, &maxID, "SELECT COALESCE(MAX(id), 0) FROM players") + if err != nil { + return 0, err + } + return maxID, nil +} + func (p *RepoProvider) PlayerListAll(ctx context.Context) ([]models.Player, error) { var players []models.Player query := "SELECT id, room_id, username, team, role, is_bot FROM players;"