Fix: on login add player once
This commit is contained in:
@ -35,7 +35,7 @@
|
|||||||
<tbody class="text-gray-700">
|
<tbody class="text-gray-700">
|
||||||
{{range .}}
|
{{range .}}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="py-2 px-4 border">{{.PlayerUsername}}</td>
|
<td class="py-2 px-4 border">{{.Username}}</td>
|
||||||
<td class="py-2 px-4 border">{{.GamesPlayed}}</td>
|
<td class="py-2 px-4 border">{{.GamesPlayed}}</td>
|
||||||
<td class="py-2 px-4 border">{{.GamesWon}}</td>
|
<td class="py-2 px-4 border">{{.GamesWon}}</td>
|
||||||
<td class="py-2 px-4 border">{{.GamesLost}}</td>
|
<td class="py-2 px-4 border">{{.GamesLost}}</td>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
@ -9,7 +8,6 @@ import (
|
|||||||
"gralias/models"
|
"gralias/models"
|
||||||
"gralias/utils"
|
"gralias/utils"
|
||||||
"html/template"
|
"html/template"
|
||||||
"log/slog"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -93,7 +91,7 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// login user
|
// login user
|
||||||
cookie, err := makeCookie(cleanName, r.RemoteAddr)
|
cookie, session, err := makeCookie(cleanName, r.RemoteAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("failed to login", "error", err)
|
log.Error("failed to login", "error", err)
|
||||||
abortWithError(w, err.Error())
|
abortWithError(w, err.Error())
|
||||||
@ -136,10 +134,15 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := repo.SessionCreate(r.Context(), session); err != nil {
|
||||||
|
log.Error("failed to save session", "error", err)
|
||||||
|
abortWithError(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
http.Redirect(w, r, "/", 302)
|
http.Redirect(w, r, "/", 302)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeCookie(username string, remote string) (*http.Cookie, error) {
|
func makeCookie(username string, remote string) (*http.Cookie, *models.Session, error) {
|
||||||
// secret
|
// secret
|
||||||
// Create a new random session token
|
// Create a new random session token
|
||||||
// sessionToken := xid.New().String()
|
// sessionToken := xid.New().String()
|
||||||
@ -176,19 +179,19 @@ func makeCookie(username string, remote string) (*http.Cookie, error) {
|
|||||||
cookie.Secure = false
|
cookie.Secure = false
|
||||||
log.Info("changing cookie domain", "domain", cookie.Domain)
|
log.Info("changing cookie domain", "domain", cookie.Domain)
|
||||||
}
|
}
|
||||||
player, err := repo.PlayerGetByName(context.Background(), username)
|
// player, err := repo.PlayerGetByName(context.Background(), username)
|
||||||
if err != nil || player == nil {
|
// if err != nil || player == nil {
|
||||||
// make player first, since username is fk to players table
|
// // make player first, since username is fk to players table
|
||||||
player = models.InitPlayer(username)
|
// player = models.InitPlayer(username)
|
||||||
if err := repo.PlayerAdd(context.Background(), player); err != nil {
|
// if err := repo.PlayerAdd(context.Background(), player); err != nil {
|
||||||
slog.Error("failed to create player", "username", username)
|
// slog.Error("failed to create player", "username", username)
|
||||||
return nil, err
|
// return nil, err
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if err := repo.SessionCreate(context.Background(), session); err != nil {
|
// if err := repo.SessionCreate(context.Background(), session); err != nil {
|
||||||
return nil, err
|
// return nil, err
|
||||||
}
|
// }
|
||||||
return cookie, nil
|
return cookie, session, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleSignout(w http.ResponseWriter, r *http.Request) {
|
func HandleSignout(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -128,8 +128,10 @@ func HandleStats(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
fi, err := getFullInfoByCtx(r.Context())
|
fi, err := getFullInfoByCtx(r.Context())
|
||||||
if err != nil {
|
if err != nil || fi == nil {
|
||||||
log.Error("failed to fetch fi", "error", err)
|
log.Error("failed to fetch fi", "error", err)
|
||||||
|
http.Redirect(w, r, "/", 302)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
// there must be a better way
|
// there must be a better way
|
||||||
if fi != nil && fi.Room != nil && fi.Room.ID != "" && fi.State != nil {
|
if fi != nil && fi.Room != nil && fi.Room.ID != "" && fi.State != nil {
|
||||||
|
@ -61,8 +61,6 @@ func GetSession(next http.Handler) http.Handler {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
userSession, err := repo.SessionByToken(r.Context(), sessionToken)
|
userSession, err := repo.SessionByToken(r.Context(), sessionToken)
|
||||||
// userSession, err := cacheGetSession(sessionToken)
|
|
||||||
// log.Debug("userSession from cache", "us", userSession)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := "auth failed; session does not exists"
|
msg := "auth failed; session does not exists"
|
||||||
log.Debug(msg, "error", err, "key", sessionToken)
|
log.Debug(msg, "error", err, "key", sessionToken)
|
||||||
@ -83,13 +81,6 @@ func GetSession(next http.Handler) http.Handler {
|
|||||||
models.CtxUsernameKey, userSession.Username)
|
models.CtxUsernameKey, userSession.Username)
|
||||||
ctx = context.WithValue(ctx,
|
ctx = context.WithValue(ctx,
|
||||||
models.CtxSessionKey, userSession)
|
models.CtxSessionKey, userSession)
|
||||||
// if err := cacheSetSession(sessionToken,
|
|
||||||
// userSession); err != nil {
|
|
||||||
// msg := "failed to marshal user session"
|
|
||||||
// log.Warn(msg, "error", err)
|
|
||||||
// next.ServeHTTP(w, r)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
next.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ CREATE TABLE journal(
|
|||||||
|
|
||||||
CREATE TABLE player_stats (
|
CREATE TABLE player_stats (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
player_username TEXT NOT NULL UNIQUE,
|
username TEXT NOT NULL UNIQUE,
|
||||||
games_played INTEGER NOT NULL DEFAULT 0,
|
games_played INTEGER NOT NULL DEFAULT 0,
|
||||||
games_won INTEGER NOT NULL DEFAULT 0,
|
games_won INTEGER NOT NULL DEFAULT 0,
|
||||||
games_lost INTEGER NOT NULL DEFAULT 0,
|
games_lost INTEGER NOT NULL DEFAULT 0,
|
||||||
@ -101,6 +101,6 @@ CREATE TABLE player_stats (
|
|||||||
guesser_winrate REAL NOT NULL DEFAULT 0.0,
|
guesser_winrate REAL NOT NULL DEFAULT 0.0,
|
||||||
played_as_mime INTEGER NOT NULL DEFAULT 0,
|
played_as_mime INTEGER NOT NULL DEFAULT 0,
|
||||||
played_as_guesser INTEGER NOT NULL DEFAULT 0,
|
played_as_guesser INTEGER NOT NULL DEFAULT 0,
|
||||||
FOREIGN KEY (player_username) REFERENCES players(username) ON DELETE CASCADE
|
FOREIGN KEY (username) REFERENCES players(username) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ type Journal struct {
|
|||||||
|
|
||||||
type PlayerStats struct {
|
type PlayerStats struct {
|
||||||
ID uint32 `db:"id"`
|
ID uint32 `db:"id"`
|
||||||
PlayerUsername string `db:"player_username"`
|
Username string `db:"username"`
|
||||||
GamesPlayed int `db:"games_played"`
|
GamesPlayed int `db:"games_played"`
|
||||||
GamesWon int `db:"games_won"`
|
GamesWon int `db:"games_won"`
|
||||||
GamesLost int `db:"games_lost"`
|
GamesLost int `db:"games_lost"`
|
||||||
|
@ -16,7 +16,7 @@ type PlayerStatsRepo interface {
|
|||||||
|
|
||||||
func (p *RepoProvider) GetPlayerStats(ctx context.Context, username string) (*models.PlayerStats, error) {
|
func (p *RepoProvider) GetPlayerStats(ctx context.Context, username string) (*models.PlayerStats, error) {
|
||||||
stats := &models.PlayerStats{}
|
stats := &models.PlayerStats{}
|
||||||
err := sqlx.GetContext(ctx, p.DB, stats, "SELECT * FROM player_stats WHERE player_username = ?", username)
|
err := sqlx.GetContext(ctx, p.DB, stats, "SELECT * FROM player_stats WHERE username = ?", username)
|
||||||
return stats, err
|
return stats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,12 +38,12 @@ func (p *RepoProvider) UpdatePlayerStats(ctx context.Context, stats *models.Play
|
|||||||
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
|
||||||
WHERE player_username = :player_username`, stats)
|
WHERE username = :username`, stats)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *RepoProvider) CreatePlayerStats(ctx context.Context, username string) error {
|
func (p *RepoProvider) CreatePlayerStats(ctx context.Context, username string) error {
|
||||||
db := getDB(ctx, p.DB)
|
db := getDB(ctx, p.DB)
|
||||||
_, err := db.ExecContext(ctx, "INSERT INTO player_stats (player_username) VALUES (?)", username)
|
_, err := db.ExecContext(ctx, "INSERT INTO player_stats (username) VALUES (?)", username)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user