Feat: update stats
This commit is contained in:
		
							
								
								
									
										80
									
								
								handlers/stats.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								handlers/stats.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| package handlers | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"gralias/models" | ||||
| ) | ||||
|  | ||||
| // updateStatsOnCardReveal updates player stats when a card is revealed. | ||||
| func updateStatsOnCardReveal(ctx context.Context, player *models.Player, cardColor models.WordColor) { | ||||
| 	if player.IsBot { | ||||
| 		return | ||||
| 	} | ||||
| 	stats, err := repo.GetPlayerStats(ctx, player.Username) | ||||
| 	if err != nil { | ||||
| 		log.Error("failed to get player stats for card reveal update", "username", player.Username, "error", err) | ||||
| 		return | ||||
| 	} | ||||
| 	playerTeamColorStr := string(player.Team) | ||||
| 	switch cardColor { | ||||
| 	case models.WordColorBlack: | ||||
| 		stats.OpenedBlackWords++ | ||||
| 	case models.WordColorWhite: | ||||
| 		stats.OpenedWhiteWords++ | ||||
| 	default: | ||||
| 		if string(cardColor) != playerTeamColorStr { | ||||
| 			stats.OpenedOppositeWords++ | ||||
| 		} | ||||
| 	} | ||||
| 	if err := repo.UpdatePlayerStats(ctx, stats); err != nil { | ||||
| 		log.Error("failed to update player stats on card reveal", "username", player.Username, "error", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // updateStatsOnGameOver updates stats for all players in a room when a game ends. | ||||
| func updateStatsOnGameOver(ctx context.Context, room *models.Room) { | ||||
| 	// Get all players in the room | ||||
| 	players, err := repo.PlayerListByRoom(ctx, room.ID) | ||||
| 	if err != nil { | ||||
| 		log.Error("failed to list players by room for stats update", "room_id", room.ID, "error", err) | ||||
| 		return | ||||
| 	} | ||||
| 	for _, player := range players { | ||||
| 		if player.IsBot { | ||||
| 			continue | ||||
| 		} | ||||
| 		stats, err := repo.GetPlayerStats(ctx, player.Username) | ||||
| 		if err != nil { | ||||
| 			log.Error("failed to get player stats for game over update", "username", player.Username, "error", err) | ||||
| 			continue | ||||
| 		} | ||||
| 		stats.GamesPlayed++ | ||||
| 		if player.Team == room.TeamWon { | ||||
| 			stats.GamesWon++ | ||||
| 		} else { | ||||
| 			stats.GamesLost++ | ||||
| 		} | ||||
| 		if player.Role == models.UserRoleMime { | ||||
| 			stats.PlayedAsMime++ | ||||
| 			if stats.PlayedAsMime > 0 { | ||||
| 				gamesWonAsMime := stats.MimeWinrate * float64(stats.PlayedAsMime-1) | ||||
| 				if player.Team == room.TeamWon { | ||||
| 					gamesWonAsMime++ | ||||
| 				} | ||||
| 				stats.MimeWinrate = gamesWonAsMime / float64(stats.PlayedAsMime) | ||||
| 			} | ||||
| 		} else if player.Role == models.UserRoleGuesser { | ||||
| 			stats.PlayedAsGuesser++ | ||||
| 			if stats.PlayedAsGuesser > 0 { | ||||
| 				gamesWonAsGuesser := stats.GuesserWinrate * float64(stats.PlayedAsGuesser-1) | ||||
| 				if player.Team == room.TeamWon { | ||||
| 					gamesWonAsGuesser++ | ||||
| 				} | ||||
| 				stats.GuesserWinrate = gamesWonAsGuesser / float64(stats.PlayedAsGuesser) | ||||
| 			} | ||||
| 		} | ||||
| 		if err := repo.UpdatePlayerStats(ctx, stats); err != nil { | ||||
| 			log.Error("failed to update player stats on game over", "username", player.Username, "error", err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder