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 }