thtml.go - scoreboard - Interactive scoreboard for CTF-like games
(HTM) git clone git://git.z3bra.org/scoreboard.git
(DIR) Log
(DIR) Files
(DIR) Refs
---
thtml.go (1554B)
---
1 package main
2
3 import (
4 "os"
5 "fmt"
6 "strings"
7 "html/template"
8 "github.com/dustin/go-humanize"
9 )
10
11 type Boardline struct {
12 Name string
13 Rank string
14 Flag string
15 Badge string
16 Score string
17 }
18
19 type Template struct {
20 Players []Boardline
21 Placeholders []Boardline
22 }
23
24 func (p *Player) BadgeHTML() string {
25 var badges strings.Builder
26 var flags []Flag
27
28 flags, err := db_get_user_flags(p.db, p.name)
29 if err != nil {
30 return ""
31 }
32
33 for n, f := range flags {
34 if n > 0 && n % 8 == 0 {
35 badges.WriteString("\n")
36 }
37 badges.WriteString(f.badge)
38 }
39
40 return badges.String()
41 }
42
43 func (a *Application) GenerateHTML() {
44 players, err := db_ranked_players(a.db, 0, -1)
45 if err != nil {
46 panic(err)
47 }
48
49 data := Template{}
50 for i:=0; i<len(players); i++ {
51 players[i].db = a.db
52 players[i].Fetch()
53 data.Players = append(data.Players, Boardline{
54 Name: players[i].name,
55 Rank: players[i].RankStr(),
56 Flag: players[i].FlagStr(),
57 Badge: players[i].BadgeHTML(),
58 Score: fmt.Sprintf("%5d", players[i].score),
59 })
60 }
61
62 /* fill with placeholder data */
63 if len(data.Players) < 10 {
64 for i:=len(data.Players); i<10; i++ {
65 data.Placeholders = append(data.Placeholders, Boardline{
66 Name: "AAA",
67 Rank: humanize.Ordinal(i+1),
68 Flag: ".....",
69 Score: "0",
70 })
71 }
72 }
73
74 tmpl, err := template.ParseFiles(a.tmpl)
75 if err != nil {
76 panic(err)
77 }
78
79 f, err := os.OpenFile(a.html, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
80 if err != nil {
81 panic(err)
82 }
83 defer f.Close()
84
85 err = tmpl.Execute(f, data)
86 if err != nil {
87 panic(err)
88 }
89 }