Files
gralias/handlers/stats.go
2025-07-11 21:19:16 +03:00

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