Enha: remove bot without room
This commit is contained in:
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user