itRemove redundant flag count/score from user table - scoreboard - Interactive scoreboard for CTF-like games Err z3bra.org 70 hgit clone git://git.z3bra.org/scoreboard.git URL:git://git.z3bra.org/scoreboard.git z3bra.org 70 1Log /scm/scoreboard/log.gph z3bra.org 70 1Files /scm/scoreboard/files.gph z3bra.org 70 1Refs /scm/scoreboard/refs.gph z3bra.org 70 i--- Err z3bra.org 70 1commit dc2f40166091506f6da7f28f9c85c086f6b225a5 /scm/scoreboard/commit/dc2f40166091506f6da7f28f9c85c086f6b225a5.gph z3bra.org 70 1parent 9ae93c35af4c5f5f17da95e9405c72788d3f0707 /scm/scoreboard/commit/9ae93c35af4c5f5f17da95e9405c72788d3f0707.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:contact@z3bra.org z3bra.org 70 iDate: Sat, 28 Sep 2024 11:42:48 +0200 Err z3bra.org 70 i Err z3bra.org 70 iRemove redundant flag count/score from user table Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M db.go | 51 ++++++++++++++++++++++--------- Err z3bra.org 70 i M main.go | 2 +- Err z3bra.org 70 i M player.go | 61 ++++++++++++------------------- Err z3bra.org 70 i Err z3bra.org 70 i3 files changed, 61 insertions(+), 53 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/db.go b/db.go /scm/scoreboard/file/db.go.gph z3bra.org 70 it@@ -26,8 +26,6 @@ const ( Err z3bra.org 70 i user( Err z3bra.org 70 i name TEXT PRIMARY KEY, Err z3bra.org 70 i hash TEXT NOT NULL UNIQUE, Err z3bra.org 70 i- score INT, Err z3bra.org 70 i- flag INT, Err z3bra.org 70 i ts INT Err z3bra.org 70 i ); Err z3bra.org 70 i CREATE TABLE IF NOT EXISTS Err z3bra.org 70 it@@ -74,10 +72,14 @@ func db_count_players(db *sql.DB) (int, error) { Err z3bra.org 70 i return count, err Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i-func db_count_user_flags(db *sql.DB, name string) (int, error) { Err z3bra.org 70 i+func db_get_user_score(db *sql.DB, name string) (int, error) { Err z3bra.org 70 i var count int Err z3bra.org 70 i Err z3bra.org 70 i- query := `SELECT count(*) FROM score WHERE name = ?;` Err z3bra.org 70 i+ query := `SELECT Err z3bra.org 70 i+ IFNULL(SUM(flag.score),0) Err z3bra.org 70 i+ FROM flag Err z3bra.org 70 i+ INNER JOIN score ON score.flag = flag.value Err z3bra.org 70 i+ WHERE score.name = ?;` Err z3bra.org 70 i Err z3bra.org 70 i row := db.QueryRow(query, name) Err z3bra.org 70 i err := row.Scan(&count) Err z3bra.org 70 it@@ -85,19 +87,30 @@ func db_count_user_flags(db *sql.DB, name string) (int, error) { Err z3bra.org 70 i return count, err Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i-func db_calculate_user_score(db *sql.DB, name string) (int, error) { Err z3bra.org 70 i- var count int Err z3bra.org 70 i+func db_get_user_flags(db *sql.DB, name string) ([]Flag, error) { Err z3bra.org 70 i+ var flags []Flag Err z3bra.org 70 i Err z3bra.org 70 i query := `SELECT Err z3bra.org 70 i- sum(flag.score) Err z3bra.org 70 i+ flag.rowid,flag.value,flag.badge,flag.score Err z3bra.org 70 i FROM flag Err z3bra.org 70 i INNER JOIN score ON score.flag = flag.value Err z3bra.org 70 i WHERE score.name = ?;` Err z3bra.org 70 i Err z3bra.org 70 i- row := db.QueryRow(query, name) Err z3bra.org 70 i- err := row.Scan(&count) Err z3bra.org 70 i+ rows, err := db.Query(query, name) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return nil, err Err z3bra.org 70 i+ } Err z3bra.org 70 i Err z3bra.org 70 i- return count, err Err z3bra.org 70 i+ for rows.Next() { Err z3bra.org 70 i+ var f Flag Err z3bra.org 70 i+ err := rows.Scan(&f.id, &f.value, &f.badge, &f.score) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return nil, err Err z3bra.org 70 i+ } Err z3bra.org 70 i+ flags = append(flags, f) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ return flags, err Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i func db_get_flag(db *sql.DB, flag string) (Flag, error) { Err z3bra.org 70 it@@ -135,12 +148,17 @@ func db_get_flags(db *sql.DB) ([]Flag, error) { Err z3bra.org 70 i Err z3bra.org 70 i func db_ranked_players(db *sql.DB, offset, limit int) ([]Player, error) { Err z3bra.org 70 i query := `SELECT Err z3bra.org 70 i- name,flag,score,ts Err z3bra.org 70 i+ user.name, Err z3bra.org 70 i+ user.ts, Err z3bra.org 70 i+ IFNULL(SUM(flag.score),0) as score Err z3bra.org 70 i FROM user Err z3bra.org 70 i+ FULL OUTER JOIN score ON user.name = score.name Err z3bra.org 70 i+ FULL OUTER JOIN flag ON flag.value = score.flag Err z3bra.org 70 i+ WHERE user.name IS NOT NULL Err z3bra.org 70 i+ GROUP BY user.name Err z3bra.org 70 i ORDER BY Err z3bra.org 70 i score DESC, Err z3bra.org 70 i- flag DESC, Err z3bra.org 70 i- ts ASC Err z3bra.org 70 i+ user.ts ASC Err z3bra.org 70 i LIMIT ? Err z3bra.org 70 i OFFSET ? Err z3bra.org 70 i ;` Err z3bra.org 70 it@@ -153,7 +171,12 @@ func db_ranked_players(db *sql.DB, offset, limit int) ([]Player, error) { Err z3bra.org 70 i players := make([]Player, 0) Err z3bra.org 70 i for rows.Next() { Err z3bra.org 70 i var p Player Err z3bra.org 70 i- err := rows.Scan(&p.name, &p.flag, &p.score, &p.ts) Err z3bra.org 70 i+ p.db = db; Err z3bra.org 70 i+ err := rows.Scan(&p.name, &p.ts, &p.score) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return nil, err Err z3bra.org 70 i+ } Err z3bra.org 70 i+ err = p.Fetch() Err z3bra.org 70 i if err != nil { Err z3bra.org 70 i return nil, err Err z3bra.org 70 i } Err z3bra.org 70 1diff --git a/main.go b/main.go /scm/scoreboard/file/main.go.gph z3bra.org 70 it@@ -126,7 +126,7 @@ func main() { Err z3bra.org 70 i scoreboard.board = tview.NewFlex() Err z3bra.org 70 i scoreboard.player = &Player{ Err z3bra.org 70 i db: scoreboard.db, Err z3bra.org 70 i- flag: 0, Err z3bra.org 70 i+ flags: make([]Flag,0), Err z3bra.org 70 i score: 0, Err z3bra.org 70 i ts: time.Now().Unix(), Err z3bra.org 70 i token: "", Err z3bra.org 70 1diff --git a/player.go b/player.go /scm/scoreboard/file/player.go.gph z3bra.org 70 it@@ -33,7 +33,7 @@ type Player struct { Err z3bra.org 70 i id int Err z3bra.org 70 i token string Err z3bra.org 70 i name string Err z3bra.org 70 i- flag int Err z3bra.org 70 i+ flags []Flag Err z3bra.org 70 i score int Err z3bra.org 70 i ts int64 Err z3bra.org 70 i } Err z3bra.org 70 it@@ -87,20 +87,23 @@ func (p *Player) Register() error { Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i func (p *Player) Fetch() error { Err z3bra.org 70 i+ var err error Err z3bra.org 70 i+ Err z3bra.org 70 i /* Fill player struct with basic info */ Err z3bra.org 70 i query := `SELECT rowid,ts FROM user WHERE name = ?;` Err z3bra.org 70 i row := p.db.QueryRow(query, p.name) Err z3bra.org 70 i row.Scan(&p.id, &p.ts) Err z3bra.org 70 i Err z3bra.org 70 i /* Calculate score based on submitted flags */ Err z3bra.org 70 i- query = `SELECT Err z3bra.org 70 i- COUNT(flag.score), SUM(flag.score) Err z3bra.org 70 i- FROM flag Err z3bra.org 70 i- INNER JOIN score ON score.flag = flag.value Err z3bra.org 70 i- WHERE score.name = ?;` Err z3bra.org 70 i+ p.flags, err = db_get_user_flags(p.db, p.name) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return err Err z3bra.org 70 i+ } Err z3bra.org 70 i Err z3bra.org 70 i- row = p.db.QueryRow(query, p.name) Err z3bra.org 70 i- row.Scan(&p.flag, &p.score) Err z3bra.org 70 i+ p.score, err = db_get_user_score(p.db, p.name) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return err Err z3bra.org 70 i+ } Err z3bra.org 70 i Err z3bra.org 70 i return nil Err z3bra.org 70 i } Err z3bra.org 70 it@@ -108,18 +111,18 @@ func (p *Player) Fetch() error { Err z3bra.org 70 i func (p *Player) Refresh(ts int64) error { Err z3bra.org 70 i var err error Err z3bra.org 70 i Err z3bra.org 70 i- p.flag, err = db_count_user_flags(p.db, p.name) Err z3bra.org 70 i+ p.flags, err = db_get_user_flags(p.db, p.name) Err z3bra.org 70 i if err != nil { Err z3bra.org 70 i return err Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- p.score, err = db_calculate_user_score(p.db, p.name) Err z3bra.org 70 i+ p.score, err = db_get_user_score(p.db, p.name) Err z3bra.org 70 i if err != nil { Err z3bra.org 70 i return err Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- query := `UPDATE user SET score = ?, flag = ?, ts = ? WHERE name = ?;` Err z3bra.org 70 i- _, err = p.db.Exec(query, p.score, p.flag, ts, p.name) Err z3bra.org 70 i+ query := `UPDATE user ts = ? WHERE name = ?;` Err z3bra.org 70 i+ _, err = p.db.Exec(query, ts, p.name) Err z3bra.org 70 i if err != nil { Err z3bra.org 70 i return err Err z3bra.org 70 i } Err z3bra.org 70 it@@ -144,32 +147,13 @@ func (p *Player) ScoreRank() int { Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i func (p *Player) FlagStr() string { Err z3bra.org 70 i- return fmt.Sprintf("%2d/%d", p.flag, len(scoreboard.flag_ref)) Err z3bra.org 70 i+ return fmt.Sprintf("%2d/%d", len(p.flags), len(scoreboard.flag_ref)) Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i func (p *Player) FlagsStr() string { Err z3bra.org 70 i var flaglist strings.Builder Err z3bra.org 70 i Err z3bra.org 70 i- var flags []Flag Err z3bra.org 70 i- Err z3bra.org 70 i- query := `SELECT Err z3bra.org 70 i- flag.badge, flag.value, flag.score Err z3bra.org 70 i- FROM flag Err z3bra.org 70 i- INNER JOIN score ON score.flag = flag.value Err z3bra.org 70 i- WHERE score.name = ?;` Err z3bra.org 70 i- Err z3bra.org 70 i- rows, err := p.db.Query(query, p.name) Err z3bra.org 70 i- if err != nil { Err z3bra.org 70 i- return "" Err z3bra.org 70 i- } Err z3bra.org 70 i- Err z3bra.org 70 i- for rows.Next() { Err z3bra.org 70 i- var f Flag Err z3bra.org 70 i- err := rows.Scan(&f.badge, &f.value, &f.score) Err z3bra.org 70 i- if err != nil { Err z3bra.org 70 i- return "" Err z3bra.org 70 i- } Err z3bra.org 70 i- flags = append(flags, f) Err z3bra.org 70 i+ for _, f := range p.flags { Err z3bra.org 70 i flaglist.WriteString(fmt.Sprintf("%s %s\n", f.badge, f.value)) Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 it@@ -183,7 +167,7 @@ func (p *Player) FlagsStr() string { Err z3bra.org 70 i } Err z3bra.org 70 i flaglist.WriteString("[::-][::d]") Err z3bra.org 70 i for _, r := range scoreboard.flag_ref { Err z3bra.org 70 i- if !hasflag(flags, r) { Err z3bra.org 70 i+ if !hasflag(p.flags, r) { Err z3bra.org 70 i flaglist.WriteString(fmt.Sprintf("[::d]%s ................................................................[::-]\n", r.badge)) Err z3bra.org 70 i } Err z3bra.org 70 i } Err z3bra.org 70 it@@ -224,12 +208,12 @@ func (p *Player) BadgeStr() string { Err z3bra.org 70 i } Err z3bra.org 70 i return false Err z3bra.org 70 i } Err z3bra.org 70 i- badges.WriteString("[::-]") Err z3bra.org 70 i+ badges.WriteString("[-::-]") Err z3bra.org 70 i for _, r := range scoreboard.flag_ref { Err z3bra.org 70 i if hasflag(flags, r) { Err z3bra.org 70 i- badges.WriteString(fmt.Sprintf("[::b]%s[::-]", r.badge)) Err z3bra.org 70 i+ badges.WriteString(fmt.Sprintf("%s", r.badge)) Err z3bra.org 70 i } else { Err z3bra.org 70 i- badges.WriteString(fmt.Sprintf("[::d]%s[::-]", r.badge)) Err z3bra.org 70 i+ badges.WriteString(fmt.Sprintf("[black::d]%s[-::-]", r.badge)) Err z3bra.org 70 i } Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 it@@ -314,10 +298,11 @@ func (p *Player) FromToken(token string) error { Err z3bra.org 70 i query := `SELECT name,flag,score,ts FROM user WHERE hash = ?` Err z3bra.org 70 i Err z3bra.org 70 i row := p.db.QueryRow(query, hash) Err z3bra.org 70 i- err = row.Scan(&p.name, &p.flag, &p.score, &p.ts) Err z3bra.org 70 i+ err = row.Scan(&p.name, &p.ts) Err z3bra.org 70 i if err == sql.ErrNoRows { Err z3bra.org 70 i return errors.New("Unknown token") Err z3bra.org 70 i } Err z3bra.org 70 i+ p.Fetch() Err z3bra.org 70 i Err z3bra.org 70 i return nil Err z3bra.org 70 i } Err z3bra.org 70 .