URI:
       tAllow having multiple flags for the same chapter - scoreboard - Interactive scoreboard for CTF-like games
  HTML git clone git://git.z3bra.org/scoreboard.git
   DIR Log
   DIR Files
   DIR Refs
       ---
   DIR commit 4e55278ba45d60e799d7ffa66788b8db4ab81db5
   DIR parent fa790c7999b6849352187e0619a7a20d070c585b
  HTML Author: Willy Goiffon <contact@z3bra.org>
       Date:   Thu,  7 Sep 2023 20:01:27 +0200
       
       Allow having multiple flags for the same chapter
       
       Diffstat:
         M db.go                               |      10 +++++-----
         M main.go                             |      21 +++++++++++++--------
       
       2 files changed, 18 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/db.go b/db.go
       t@@ -138,18 +138,18 @@ func db_ranked_players(db *sql.DB, offset, limit int) ([]Player, error) {
                return players, nil
        }
        
       -func db_flags(db *sql.DB) ([]string, error) {
       -        query := `SELECT value FROM flag ORDER BY chapter;`
       +func db_flags(db *sql.DB) ([]Flag, error) {
       +        query := `SELECT chapter,value FROM flag ORDER BY chapter;`
        
                rows, err := db.Query(query)
                if err != nil {
                        return nil, err
                }
        
       -        flags := make([]string, 0)
       +        flags := make([]Flag, 0)
                for rows.Next() {
       -                var flag string
       -                err := rows.Scan(&flag)
       +                var flag Flag
       +                err := rows.Scan(&flag.chapter, &flag.value)
                        if err != nil {
                                return nil, err
                        }
   DIR diff --git a/main.go b/main.go
       t@@ -41,9 +41,14 @@ Save it carefully, do not share it.
        `
        )
        
       +type Flag struct {
       +        chapter int
       +        value string
       +}
       +
        type Application struct {
                flag int
       -        flag_ref []string
       +        flag_ref []Flag
                db *sql.DB
                app *tview.Application
                html string
       t@@ -63,8 +68,8 @@ func usage() {
        
        func flagid(hash string) int {
                for i := 0; i<len(cyboard.flag_ref); i++ {
       -                if strings.ToUpper(hash) == cyboard.flag_ref[i] {
       -                        return i
       +                if strings.ToUpper(hash) == cyboard.flag_ref[i].value {
       +                        return cyboard.flag_ref[i].chapter
                        }
                }
                return -1
       t@@ -182,6 +187,9 @@ func main() {
                                os.Exit(0)
                        }
                        switch cyboard.flag = flagid(args[0]) + 1; cyboard.flag {
       +                case 0:
       +                        fmt.Println("Incorrect flag")
       +                        return
                        case 1:
                                cyboard.player.flag = cyboard.flag
                                cyboard.player.score = 100
       t@@ -196,11 +204,8 @@ func main() {
        
                                cyboard.NewPlayer(rank)
                                cyboard.pages.SwitchToPage("board")
       -                case 2,3,4,5:
       -                        cyboard.pages.SwitchToPage("token")
                        default:
       -                        fmt.Println("Incorrect flag")
       -                        return
       +                        cyboard.pages.SwitchToPage("token")
                        }
                } else {
                        cyboard.pages.SwitchToPage("board")
       t@@ -212,7 +217,7 @@ func main() {
                        os.Exit(1)
                }
        
       -        if cyboard.player.token != "" && cyboard.flag < (len(cyboard.flag_ref)) {
       +        if cyboard.player.token != "" && cyboard.flag < 7 {
                        fmt.Printf(TOKEN_REMINDER, cyboard.player.name, humanize.Ordinal(cyboard.flag + 1), cyboard.player.token)
                }
        }