package crons import ( "context" "gralias/llmapi" ) func (cm *CronManager) CleanupPlayersRoom() { ctx, tx, err := cm.repo.InitTx(context.Background()) if err != nil { cm.log.Error("failed to init transaction for actions cleanup", "err", err) return } defer func() { if r := recover(); r != nil { if err := tx.Rollback(); err != nil { cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) } panic(r) } }() players, err := cm.repo.PlayerListAll(ctx) if err != nil { cm.log.Error("failed to list players", "err", err) if err := tx.Rollback(); err != nil { cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) } return } // get all rooms to have only one req rooms, err := cm.repo.RoomList(ctx) if err != nil { cm.log.Error("failed to list rooms", "err", err) if err := tx.Rollback(); err != nil { cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) } return } for _, player := range players { found := false for _, room := range rooms { // check if room exists if player.RoomID != nil && room.ID == *player.RoomID { found = true break } } if !found { 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) } } } } } if err := tx.Commit(); err != nil { cm.log.Error("failed to commit transaction for actions cleanup", "err", err) } }