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) } } }