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