tDisplay registered flags when logged in - scoreboard - Interactive scoreboard for CTF-like games
 (HTM) git clone git://git.z3bra.org/scoreboard.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 2db1381cace960339b3408f5f18ddf70c814cfb3
 (DIR) parent cb97cb5f224a91c0f4b47db43fae0f37f6e1a079
 (HTM) Author: Willy Goiffon <contact@z3bra.org>
       Date:   Fri, 27 Sep 2024 19:25:46 +0200
       
       Display registered flags when logged in
       
       Diffstat:
         M player.go                           |      72 ++++++++++++++++++++++++++++---
         M ui.go                               |       4 ++--
       
       2 files changed, 67 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/player.go b/player.go
       t@@ -147,9 +147,55 @@ func (p *Player) FlagStr() string {
                return fmt.Sprintf("%2d/%d", p.flag, len(scoreboard.flag_ref))
        }
        
       -func (p *Player) BadgeStr(full bool) string {
       +func (p *Player) FlagsStr() string {
       +        var flaglist strings.Builder
       +
       +        var flags []Flag
       +
       +        query := `SELECT
       +          flag.badge, flag.value, flag.score
       +          FROM flag
       +          INNER JOIN score ON score.flag = flag.value
       +          WHERE score.name = ?;`
       +
       +        rows, err := p.db.Query(query, p.name)
       +        if err != nil {
       +                return ""
       +        }
       +
       +        for rows.Next() {
       +                var f Flag
       +                err := rows.Scan(&f.badge, &f.value, &f.score)
       +                if err != nil {
       +                        return ""
       +                }
       +                flags = append(flags, f)
       +                flaglist.WriteString(fmt.Sprintf("%s %s\n", f.badge, f.value))
       +        }
       +
       +        var hasflag = func(a []Flag, f Flag) bool {
       +                for _, r := range a {
       +                        if f.value == r.value {
       +                                return true
       +                        }
       +                }
       +                return false
       +        }
       +        flaglist.WriteString("[::-][::d]")
       +        for _, r := range scoreboard.flag_ref {
       +                if !hasflag(flags, r) {
       +                        flaglist.WriteString(fmt.Sprintf("[::d]%s ................................................................[::-]\n", r.badge))
       +                }
       +        }
       +
       +        return flaglist.String();
       +}
       +
       +func (p *Player) BadgeStr() string {
                var badges strings.Builder
        
       +        var flags []Flag
       +
                query := `SELECT
                  flag.badge, flag.value, flag.score
                  FROM flag
       t@@ -162,16 +208,28 @@ func (p *Player) BadgeStr(full bool) string {
                }
        
                for rows.Next() {
       -                var b, v string
       -                var s int
       -                err := rows.Scan(&b, &v, &s)
       +                var f Flag
       +                err := rows.Scan(&f.badge, &f.value, &f.score)
                        if err != nil {
                                return ""
                        }
       -                if full {
       -                        badges.WriteString(fmt.Sprintf("%s %s\n", b, v))
       +                flags = append(flags, f)
       +        }
       +
       +        var hasflag = func(a []Flag, f Flag) bool {
       +                for _, r := range a {
       +                        if f.value == r.value {
       +                                return true
       +                        }
       +                }
       +                return false
       +        }
       +        badges.WriteString("[::-]")
       +        for _, r := range scoreboard.flag_ref {
       +                if hasflag(flags, r) {
       +                        badges.WriteString(fmt.Sprintf("[::b]%s[::-]", r.badge))
                        } else {
       -                        badges.WriteString(b)
       +                        badges.WriteString(fmt.Sprintf("[::d]%s[::-]", r.badge))
                        }
                }
        
 (DIR) diff --git a/ui.go b/ui.go
       t@@ -65,9 +65,9 @@ func RankTable(offset, limit, rank int, fill bool) *tview.Table {
                        player.db = scoreboard.db
                        player.Fetch()
                        if scoreboard.player.name == player.name {
       -                        scoreboard.Message(player.name, player.BadgeStr(true))
       +                        scoreboard.Message(player.name, player.FlagsStr())
                        } else {
       -                        scoreboard.Popup(player.name, player.BadgeStr(false))
       +                        scoreboard.Popup(player.name, player.BadgeStr())
                        }
                })