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 !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 { | ||||
|   | ||||
| @@ -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) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder