Feat: add cleaner cron
This commit is contained in:
		
							
								
								
									
										76
									
								
								crons/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								crons/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| package crons | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"gralias/repos" | ||||
| 	"log/slog" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type CronManager struct { | ||||
| 	repo repos.AllRepos | ||||
| 	log  *slog.Logger | ||||
| } | ||||
|  | ||||
| func NewCronManager(repo repos.AllRepos, log *slog.Logger) *CronManager { | ||||
| 	return &CronManager{ | ||||
| 		repo: repo, | ||||
| 		log:  log, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (cm *CronManager) Start() { | ||||
| 	ticker := time.NewTicker(30 * time.Second) | ||||
| 	go func() { | ||||
| 		for range ticker.C { | ||||
| 			cm.CleanupRooms() | ||||
| 		} | ||||
| 	}() | ||||
| } | ||||
|  | ||||
| func (cm *CronManager) CleanupRooms() { | ||||
| 	ctx := context.Background() | ||||
| 	rooms, err := cm.repo.RoomList(ctx) | ||||
| 	if err != nil { | ||||
| 		cm.log.Error("failed to get rooms list", "err", err) | ||||
| 		return | ||||
| 	} | ||||
| 	for _, room := range rooms { | ||||
| 		players, err := cm.repo.PlayerListByRoom(ctx, room.ID) | ||||
| 		if err != nil { | ||||
| 			cm.log.Error("failed to get players for room", "room_id", room.ID, "err", err) | ||||
| 			continue | ||||
| 		} | ||||
| 		if len(players) == 0 { | ||||
| 			cm.log.Info("deleting empty room", "room_id", room.ID) | ||||
| 			if err := cm.repo.RoomDeleteByID(ctx, room.ID); err != nil { | ||||
| 				cm.log.Error("failed to delete empty room", "room_id", room.ID, "err", err) | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		creatorInRoom := false | ||||
| 		for _, player := range players { | ||||
| 			if player.Username == room.CreatorName { | ||||
| 				creatorInRoom = true | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		if !creatorInRoom { | ||||
| 			cm.log.Info("deleting room because creator left", "room_id", room.ID) | ||||
| 			for _, player := range players { | ||||
| 				if player.IsBot { | ||||
| 					if err := cm.repo.PlayerDelete(ctx, room.ID, player.Username); err != nil { | ||||
| 						cm.log.Error("failed to delete bot player", "room_id", room.ID, "username", player.Username, "err", err) | ||||
| 					} | ||||
| 				} else { | ||||
| 					if err := cm.repo.PlayerExitRoom(ctx, player.Username); err != nil { | ||||
| 						cm.log.Error("failed to update player room", "room_id", room.ID, "username", player.Username, "err", err) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if err := cm.repo.RoomDeleteByID(ctx, room.ID); err != nil { | ||||
| 				cm.log.Error("failed to delete room after creator left", "room_id", room.ID, "err", err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder