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
	 Grail Finder
					Grail Finder