81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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 * float32(stats.PlayedAsMime-1)
 | |
| 				if player.Team == room.TeamWon {
 | |
| 					gamesWonAsMime++
 | |
| 				}
 | |
| 				stats.MimeWinrate = gamesWonAsMime / float32(stats.PlayedAsMime)
 | |
| 			}
 | |
| 		} else if player.Role == models.UserRoleGuesser {
 | |
| 			stats.PlayedAsGuesser++
 | |
| 			if stats.PlayedAsGuesser > 0 {
 | |
| 				gamesWonAsGuesser := stats.GuesserWinrate * float32(stats.PlayedAsGuesser-1)
 | |
| 				if player.Team == room.TeamWon {
 | |
| 					gamesWonAsGuesser++
 | |
| 				}
 | |
| 				stats.GuesserWinrate = gamesWonAsGuesser / float32(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)
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
