Enha: remove bot without room

This commit is contained in:
Grail Finder
2025-07-06 12:57:02 +03:00
parent a38472a685
commit e84941d593
5 changed files with 46 additions and 12 deletions

View File

@ -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 the creator is not in the room or the room is inactive, it's time to delete
if !creatorInRoom || isInactive { if !creatorInRoom || isInactive {
reason := "creator left" reason := "creator left"
@ -107,7 +106,7 @@ func (cm *CronManager) CleanupRooms() {
for _, player := range players { for _, player := range players {
if player.IsBot { 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) cm.log.Error("failed to delete bot player", "room_id", room.ID, "username", player.Username, "err", err)
} }
} else { } else {

View File

@ -1,6 +1,9 @@
package crons package crons
import "context" import (
"context"
"gralias/llmapi"
)
func (cm *CronManager) CleanupPlayersRoom() { func (cm *CronManager) CleanupPlayersRoom() {
ctx, tx, err := cm.repo.InitTx(context.Background()) ctx, tx, err := cm.repo.InitTx(context.Background())
@ -43,11 +46,24 @@ func (cm *CronManager) CleanupPlayersRoom() {
} }
} }
if !found { if !found {
// delete roomid from player cm.log.Debug("player routine; not found room", "username", player.Username)
if err := cm.repo.PlayerExitRoom(ctx, player.Username); err != nil { if !player.IsBot && player.RoomID != nil {
cm.log.Error("failed to unset room", "err", err) // delete roomid from player
if err := tx.Rollback(); err != nil { if err := cm.repo.PlayerExitRoom(ctx, player.Username); err != nil {
cm.log.Error("failed to rollback transaction for actions cleanup", "err", err) 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)
}
} }
} }
} }

View File

@ -345,13 +345,31 @@ func RemoveBot(botName string, room *models.Room) error {
// remove role from room // remove role from room
room.RemovePlayer(botName) room.RemovePlayer(botName)
slog.Debug("removing bot player", "name", botName, "room_id", room.ID, "room", room) 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) slog.Error("failed to remove bot player", "name", botName, "room_id", room.ID)
return err return err
} }
return saveRoom(room) 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 // EndBot
func NewBot(role, team, name, roomID string, cfg *config.Config, recovery bool) (*Bot, error) { func NewBot(role, team, name, roomID string, cfg *config.Config, recovery bool) (*Bot, error) {

View File

@ -40,6 +40,7 @@ func NewRepoProvider(pathToDB string) *RepoProvider {
os.Exit(1) os.Exit(1)
} }
slog.Info("Successfully connected to database") slog.Info("Successfully connected to database")
// db.SetMaxOpenConns(2)
rp := &RepoProvider{ rp := &RepoProvider{
DB: db, DB: db,
pathToDB: pathToDB, pathToDB: pathToDB,

View File

@ -12,7 +12,7 @@ type PlayersRepo interface {
PlayerGetByName(ctx context.Context, username string) (*models.Player, error) PlayerGetByName(ctx context.Context, username string) (*models.Player, error)
PlayerAdd(ctx context.Context, player *models.Player) error PlayerAdd(ctx context.Context, player *models.Player) error
PlayerUpdate(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 PlayerSetRoomID(ctx context.Context, roomID, username string) error
PlayerExitRoom(ctx context.Context, username string) error PlayerExitRoom(ctx context.Context, username string) error
PlayerListNames(ctx context.Context) ([]string, error) PlayerListNames(ctx context.Context) ([]string, error)
@ -56,9 +56,9 @@ func (p *RepoProvider) PlayerUpdate(ctx context.Context, player *models.Player)
return err 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) 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 return err
} }