Fix: stats and marks queries

This commit is contained in:
Grail Finder
2025-07-11 21:19:16 +03:00
parent f01fc12510
commit acf1386c73
7 changed files with 16 additions and 13 deletions

View File

@ -50,7 +50,6 @@ func HandleShowColor(w http.ResponseWriter, r *http.Request) {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
// color, exists := fi.Room.WCMap[word]
color, exists := fi.Room.FindColor(word) color, exists := fi.Room.FindColor(word)
if !exists { if !exists {
abortWithError(w, "word is not found") abortWithError(w, "word is not found")

View File

@ -76,6 +76,10 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
if fi.Room == nil {
http.Redirect(w, r, "/", 302)
return
}
if fi.Room.IsRunning && role == "mime" { if fi.Room.IsRunning && role == "mime" {
err = errors.New("cannot join as mime when game is running") err = errors.New("cannot join as mime when game is running")
abortWithError(w, err.Error()) abortWithError(w, err.Error())

View File

@ -57,20 +57,20 @@ func updateStatsOnGameOver(ctx context.Context, room *models.Room) {
if player.Role == models.UserRoleMime { if player.Role == models.UserRoleMime {
stats.PlayedAsMime++ stats.PlayedAsMime++
if stats.PlayedAsMime > 0 { if stats.PlayedAsMime > 0 {
gamesWonAsMime := stats.MimeWinrate * float64(stats.PlayedAsMime-1) gamesWonAsMime := stats.MimeWinrate * float32(stats.PlayedAsMime-1)
if player.Team == room.TeamWon { if player.Team == room.TeamWon {
gamesWonAsMime++ gamesWonAsMime++
} }
stats.MimeWinrate = gamesWonAsMime / float64(stats.PlayedAsMime) stats.MimeWinrate = gamesWonAsMime / float32(stats.PlayedAsMime)
} }
} else if player.Role == models.UserRoleGuesser { } else if player.Role == models.UserRoleGuesser {
stats.PlayedAsGuesser++ stats.PlayedAsGuesser++
if stats.PlayedAsGuesser > 0 { if stats.PlayedAsGuesser > 0 {
gamesWonAsGuesser := stats.GuesserWinrate * float64(stats.PlayedAsGuesser-1) gamesWonAsGuesser := stats.GuesserWinrate * float32(stats.PlayedAsGuesser-1)
if player.Team == room.TeamWon { if player.Team == room.TeamWon {
gamesWonAsGuesser++ gamesWonAsGuesser++
} }
stats.GuesserWinrate = gamesWonAsGuesser / float64(stats.PlayedAsGuesser) stats.GuesserWinrate = gamesWonAsGuesser / float32(stats.PlayedAsGuesser)
} }
} }
if err := repo.UpdatePlayerStats(ctx, stats); err != nil { if err := repo.UpdatePlayerStats(ctx, stats); err != nil {

View File

@ -46,20 +46,20 @@ func updateStatsOnGameOver(ctx context.Context, room *models.Room) {
if player.Role == models.UserRoleMime { if player.Role == models.UserRoleMime {
stats.PlayedAsMime++ stats.PlayedAsMime++
if stats.PlayedAsMime > 0 { if stats.PlayedAsMime > 0 {
gamesWonAsMime := stats.MimeWinrate * float64(stats.PlayedAsMime-1) gamesWonAsMime := stats.MimeWinrate * float32(stats.PlayedAsMime-1)
if player.Team == room.TeamWon { if player.Team == room.TeamWon {
gamesWonAsMime++ gamesWonAsMime++
} }
stats.MimeWinrate = gamesWonAsMime / float64(stats.PlayedAsMime) stats.MimeWinrate = gamesWonAsMime / float32(stats.PlayedAsMime)
} }
} else if player.Role == models.UserRoleGuesser { } else if player.Role == models.UserRoleGuesser {
stats.PlayedAsGuesser++ stats.PlayedAsGuesser++
if stats.PlayedAsGuesser > 0 { if stats.PlayedAsGuesser > 0 {
gamesWonAsGuesser := stats.GuesserWinrate * float64(stats.PlayedAsGuesser-1) gamesWonAsGuesser := stats.GuesserWinrate * float32(stats.PlayedAsGuesser-1)
if player.Team == room.TeamWon { if player.Team == room.TeamWon {
gamesWonAsGuesser++ gamesWonAsGuesser++
} }
stats.GuesserWinrate = gamesWonAsGuesser / float64(stats.PlayedAsGuesser) stats.GuesserWinrate = gamesWonAsGuesser / float32(stats.PlayedAsGuesser)
} }
} }

View File

@ -148,8 +148,8 @@ type PlayerStats struct {
OpenedOppositeWords int `db:"opened_opposite_words"` OpenedOppositeWords int `db:"opened_opposite_words"`
OpenedWhiteWords int `db:"opened_white_words"` OpenedWhiteWords int `db:"opened_white_words"`
OpenedBlackWords int `db:"opened_black_words"` OpenedBlackWords int `db:"opened_black_words"`
MimeWinrate float64 `db:"mime_winrate"` MimeWinrate float32 `db:"mime_winrate"`
GuesserWinrate float64 `db:"guesser_winrate"` GuesserWinrate float32 `db:"guesser_winrate"`
PlayedAsMime int `db:"played_as_mime"` PlayedAsMime int `db:"played_as_mime"`
PlayedAsGuesser int `db:"played_as_guesser"` PlayedAsGuesser int `db:"played_as_guesser"`
Rating float32 `db:"rating"` Rating float32 `db:"rating"`

View File

@ -39,6 +39,6 @@ func (r *RepoProvider) CardMarksByRoomID(ctx context.Context, roomID string) ([]
} }
func (r *RepoProvider) CardMarksRemoveByRoomID(ctx context.Context, roomID string) error { func (r *RepoProvider) CardMarksRemoveByRoomID(ctx context.Context, roomID string) error {
db := getDB(ctx, r.DB) db := getDB(ctx, r.DB)
_, err := db.ExecContext(ctx, "DELETE FROM card_marks WHERE room_id = ?;", roomID) _, err := db.ExecContext(ctx, "DELETE FROM card_marks WHERE card_id IN (select id from word_cards where room_id = ?);", roomID)
return err return err
} }

View File

@ -37,7 +37,7 @@ func (p *RepoProvider) UpdatePlayerStats(ctx context.Context, stats *models.Play
mime_winrate = :mime_winrate, mime_winrate = :mime_winrate,
guesser_winrate = :guesser_winrate, guesser_winrate = :guesser_winrate,
played_as_mime = :played_as_mime, played_as_mime = :played_as_mime,
played_as_guesser = :played_as_guesser played_as_guesser = :played_as_guesser,
rating = :rating rating = :rating
WHERE username = :username`, stats) WHERE username = :username`, stats)
return err return err