diff --git a/crons/main.go b/crons/main.go index 6eee827..c50b3dc 100644 --- a/crons/main.go +++ b/crons/main.go @@ -96,7 +96,6 @@ func (cm *CronManager) CleanupRooms() { } } } - // If the creator is not in the room or the room is inactive, it's time to delete if !creatorInRoom || isInactive { reason := "creator left" @@ -107,7 +106,7 @@ func (cm *CronManager) CleanupRooms() { for _, player := range players { if player.IsBot { - if err := cm.repo.PlayerDelete(ctx, room.ID, player.Username); err != nil { + if err := cm.repo.PlayerDelete(ctx, room.ID); err != nil { cm.log.Error("failed to delete bot player", "room_id", room.ID, "username", player.Username, "err", err) } } else { diff --git a/crons/players.go b/crons/players.go index 228e5bf..95a470c 100644 --- a/crons/players.go +++ b/crons/players.go @@ -1,6 +1,9 @@ package crons -import "context" +import ( + "context" + "gralias/llmapi" +) func (cm *CronManager) CleanupPlayersRoom() { ctx, tx, err := cm.repo.InitTx(context.Background()) @@ -43,11 +46,24 @@ func (cm *CronManager) CleanupPlayersRoom() { } } if !found { - // delete roomid from player - if err := cm.repo.PlayerExitRoom(ctx, player.Username); err != nil { - cm.log.Error("failed to unset room", "err", err) - if err := tx.Rollback(); err != nil { - cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) + cm.log.Debug("player routine; not found room", "username", player.Username) + if !player.IsBot && player.RoomID != nil { + // delete roomid from player + if err := cm.repo.PlayerExitRoom(ctx, player.Username); err != nil { + cm.log.Error("failed to unset room", "err", err) + if err := tx.Rollback(); err != nil { + cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) + } + } + } + if player.IsBot { + cm.log.Debug("trying to remove bot", "name", player.Username) + // delete player and stop the bot + if err := llmapi.RemoveBotNoRoom(player.Username); err != nil { + cm.log.Error("failed to remove bot", "err", err) + if err := tx.Rollback(); err != nil { + cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) + } } } } diff --git a/llmapi/main.go b/llmapi/main.go index 041349a..22402b9 100644 --- a/llmapi/main.go +++ b/llmapi/main.go @@ -345,13 +345,31 @@ func RemoveBot(botName string, room *models.Room) error { // remove role from room room.RemovePlayer(botName) slog.Debug("removing bot player", "name", botName, "room_id", room.ID, "room", room) - if err := repo.PlayerDelete(context.Background(), room.ID, botName); err != nil { + if err := repo.PlayerDelete(context.Background(), botName); err != nil { slog.Error("failed to remove bot player", "name", botName, "room_id", room.ID) return err } return saveRoom(room) } +func RemoveBotNoRoom(botName string) error { + // channels + dc, ok := DoneChanMap[botName] + if ok { + dc <- true + close(DoneChanMap[botName]) + } + sc, ok := SignalChanMap[botName] + if ok { + close(sc) + } + // maps + delete(DoneChanMap, botName) + delete(SignalChanMap, botName) + // remove role from room + return repo.PlayerDelete(context.Background(), botName) +} + // EndBot func NewBot(role, team, name, roomID string, cfg *config.Config, recovery bool) (*Bot, error) { diff --git a/repos/main.go b/repos/main.go index 20ef961..0ceddc8 100644 --- a/repos/main.go +++ b/repos/main.go @@ -40,6 +40,7 @@ func NewRepoProvider(pathToDB string) *RepoProvider { os.Exit(1) } slog.Info("Successfully connected to database") + // db.SetMaxOpenConns(2) rp := &RepoProvider{ DB: db, pathToDB: pathToDB, diff --git a/repos/players.go b/repos/players.go index 0c86dfd..5694675 100644 --- a/repos/players.go +++ b/repos/players.go @@ -12,7 +12,7 @@ type PlayersRepo interface { PlayerGetByName(ctx context.Context, username string) (*models.Player, error) PlayerAdd(ctx context.Context, player *models.Player) error PlayerUpdate(ctx context.Context, player *models.Player) error - PlayerDelete(ctx context.Context, roomID, username string) error + PlayerDelete(ctx context.Context, username string) error PlayerSetRoomID(ctx context.Context, roomID, username string) error PlayerExitRoom(ctx context.Context, username string) error PlayerListNames(ctx context.Context) ([]string, error) @@ -56,9 +56,9 @@ func (p *RepoProvider) PlayerUpdate(ctx context.Context, player *models.Player) return err } -func (p *RepoProvider) PlayerDelete(ctx context.Context, roomID, username string) error { +func (p *RepoProvider) PlayerDelete(ctx context.Context, username string) error { db := getDB(ctx, p.DB) - _, err := db.ExecContext(ctx, "DELETE FROM players WHERE room_id = ? AND username = ?", roomID, username) + _, err := db.ExecContext(ctx, "DELETE FROM players WHERE username = ?", username) return err }