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 !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 {

View File

@ -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)
}
}
}
}

View File

@ -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) {

View File

@ -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,

View File

@ -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
}