itInitial commit - scoreboard - Interactive scoreboard for CTF-like games Err z3bra.org 70 hgit clone git://git.z3bra.org/scoreboard.git URL:git://git.z3bra.org/scoreboard.git z3bra.org 70 1Log /scm/scoreboard/log.gph z3bra.org 70 1Files /scm/scoreboard/files.gph z3bra.org 70 1Refs /scm/scoreboard/refs.gph z3bra.org 70 i--- Err z3bra.org 70 1commit 54deea3d092677422021864f23df5cb091f0a0ec /scm/scoreboard/commit/54deea3d092677422021864f23df5cb091f0a0ec.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:contact@z3bra.org z3bra.org 70 iDate: Fri, 2 Dec 2022 17:04:52 +0100 Err z3bra.org 70 i Err z3bra.org 70 iInitial commit Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i A db.go | 115 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i A go.mod | 39 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i A go.sum | 84 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i A main.go | 277 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i A mkfile | 4 ++++ Err z3bra.org 70 i A playerbox.go | 112 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i A util.go | 49 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i Err z3bra.org 70 i7 files changed, 680 insertions(+), 0 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/db.go b/db.go /scm/scoreboard/file/db.go.gph z3bra.org 70 it@@ -0,0 +1,115 @@ Err z3bra.org 70 i+// Copyright 2016 The Tcell Authors Err z3bra.org 70 i+// Err z3bra.org 70 i+// Licensed under the Apache License, Version 2.0 (the "License"); Err z3bra.org 70 i+// you may not use file except in compliance with the License. Err z3bra.org 70 i+// You may obtain a copy of the license at Err z3bra.org 70 i+// Err z3bra.org 70 i+// http://www.apache.org/licenses/LICENSE-2.0 Err z3bra.org 70 i+// Err z3bra.org 70 i+// Unless required by applicable law or agreed to in writing, software Err z3bra.org 70 i+// distributed under the License is distributed on an "AS IS" BASIS, Err z3bra.org 70 i+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Err z3bra.org 70 i+// See the License for the specific language governing permissions and Err z3bra.org 70 i+// limitations under the License. Err z3bra.org 70 i+ Err z3bra.org 70 i+package main Err z3bra.org 70 i+ Err z3bra.org 70 i+import ( Err z3bra.org 70 i+ "database/sql" Err z3bra.org 70 i+ _ "modernc.org/sqlite" Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+const ( Err z3bra.org 70 i+ // DB queries Err z3bra.org 70 i+ DB_CREATE string = ` Err z3bra.org 70 i+ DROP TABLE score; Err z3bra.org 70 i+ CREATE TABLE IF NOT EXISTS score(id INTEGER PRIMARY KEY, name TEXT, token TEXT, flag INT, score INT, ts INT); Err z3bra.org 70 i+ ` Err z3bra.org 70 i+ DB_FILL string = ` Err z3bra.org 70 i+ DELETE FROM score; Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('WGS', 'token0', 3, 600, 10); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('DQK', 'token1', 5, 1337, 1); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('VNM', 'token2', 5, 1000, 100); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('PLR', 'token3', 5, 1000, 300); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('UKN', 'token4', 2, 200, 200); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('JFK', 'token5', 3, 600, 200); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('NTM', 'token6', 4, 800, 100); Err z3bra.org 70 i+ INSERT INTO score(name,token,flag,score,ts) VALUES ('BOB', 'token7', 1, 100, 25); Err z3bra.org 70 i+ ` Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+func db_count() int { Err z3bra.org 70 i+ var count int Err z3bra.org 70 i+ query := `SELECT count(id) FROM score;` Err z3bra.org 70 i+ row := db.QueryRow(query) Err z3bra.org 70 i+ row.Scan(&count) Err z3bra.org 70 i+ return count Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func db_rank(score int, ts int64) int { Err z3bra.org 70 i+ var rank int Err z3bra.org 70 i+ query := `SELECT Err z3bra.org 70 i+ count(id) Err z3bra.org 70 i+ FROM score Err z3bra.org 70 i+ WHERE Err z3bra.org 70 i+ score >= ? Err z3bra.org 70 i+ ;` Err z3bra.org 70 i+ Err z3bra.org 70 i+ row := db.QueryRow(query, score) Err z3bra.org 70 i+ row.Scan(&rank) Err z3bra.org 70 i+ return rank + 1 Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func db_ranked(offset, limit int) ([]Player, error) { Err z3bra.org 70 i+ query := `SELECT Err z3bra.org 70 i+ id,name,token,flag,score Err z3bra.org 70 i+ FROM score Err z3bra.org 70 i+ ORDER BY Err z3bra.org 70 i+ score DESC, Err z3bra.org 70 i+ ts ASC Err z3bra.org 70 i+ LIMIT ? Err z3bra.org 70 i+ OFFSET ? Err z3bra.org 70 i+ ;` Err z3bra.org 70 i+ Err z3bra.org 70 i+ rows, err := db.Query(query, limit, offset) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return nil, err Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ players := make([]Player, 0) Err z3bra.org 70 i+ for rows.Next() { Err z3bra.org 70 i+ var p Player Err z3bra.org 70 i+ err := rows.Scan(&p.id, &p.name, &p.token, &p.flags, &p.score) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ return nil, err Err z3bra.org 70 i+ } Err z3bra.org 70 i+ players = append(players, p) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ return players, nil Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func db_player(id int) *Player { Err z3bra.org 70 i+ var p Player Err z3bra.org 70 i+ query := `SELECT id,name,token,flag,score,ts FROM score WHERE id = ?` Err z3bra.org 70 i+ Err z3bra.org 70 i+ row := db.QueryRow(query, p.id) Err z3bra.org 70 i+ err := row.Scan(&p.id, &p.name, &p.token, &p.flags, &p.score) Err z3bra.org 70 i+ if err == sql.ErrNoRows { Err z3bra.org 70 i+ return nil Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ return &p Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func db_save(p Player) int64 { Err z3bra.org 70 i+ query := `INSERT INTO score(name,token,flag,score,ts) VALUES(?,?,?,?,?);` Err z3bra.org 70 i+ r, err := db.Exec(query, p.name, p.token, p.flags, p.score, p.ts) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ panic(err) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ id, _ := r.LastInsertId() Err z3bra.org 70 i+ Err z3bra.org 70 i+ return id Err z3bra.org 70 i+} Err z3bra.org 70 1diff --git a/go.mod b/go.mod /scm/scoreboard/file/go.mod.gph z3bra.org 70 it@@ -0,0 +1,39 @@ Err z3bra.org 70 i+module cyb.farm/scoreboard Err z3bra.org 70 i+ Err z3bra.org 70 i+go 1.18 Err z3bra.org 70 i+ Err z3bra.org 70 i+require ( Err z3bra.org 70 i+ github.com/gdamore/tcell/v2 v2.5.3 Err z3bra.org 70 i+ github.com/rivo/tview v0.0.0-20221128165837-db36428c92d9 Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+require ( Err z3bra.org 70 i+ github.com/dustin/go-humanize v1.0.0 Err z3bra.org 70 i+ modernc.org/sqlite v1.20.0 Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+require ( Err z3bra.org 70 i+ github.com/gdamore/encoding v1.0.0 // indirect Err z3bra.org 70 i+ github.com/google/uuid v1.3.0 // indirect Err z3bra.org 70 i+ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect Err z3bra.org 70 i+ github.com/lucasb-eyer/go-colorful v1.2.0 // indirect Err z3bra.org 70 i+ github.com/mattn/go-isatty v0.0.16 // indirect Err z3bra.org 70 i+ github.com/mattn/go-runewidth v0.0.13 // indirect Err z3bra.org 70 i+ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect Err z3bra.org 70 i+ github.com/rivo/uniseg v0.4.2 // indirect Err z3bra.org 70 i+ golang.org/x/mod v0.3.0 // indirect Err z3bra.org 70 i+ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect Err z3bra.org 70 i+ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect Err z3bra.org 70 i+ golang.org/x/text v0.3.7 // indirect Err z3bra.org 70 i+ golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 // indirect Err z3bra.org 70 i+ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect Err z3bra.org 70 i+ lukechampine.com/uint128 v1.2.0 // indirect Err z3bra.org 70 i+ modernc.org/cc/v3 v3.40.0 // indirect Err z3bra.org 70 i+ modernc.org/ccgo/v3 v3.16.13 // indirect Err z3bra.org 70 i+ modernc.org/libc v1.21.5 // indirect Err z3bra.org 70 i+ modernc.org/mathutil v1.5.0 // indirect Err z3bra.org 70 i+ modernc.org/memory v1.4.0 // indirect Err z3bra.org 70 i+ modernc.org/opt v0.1.3 // indirect Err z3bra.org 70 i+ modernc.org/strutil v1.1.3 // indirect Err z3bra.org 70 i+ modernc.org/token v1.0.1 // indirect Err z3bra.org 70 i+) Err z3bra.org 70 1diff --git a/go.sum b/go.sum /scm/scoreboard/file/go.sum.gph z3bra.org 70 it@@ -0,0 +1,84 @@ Err z3bra.org 70 i+github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= Err z3bra.org 70 i+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= Err z3bra.org 70 i+github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= Err z3bra.org 70 i+github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= Err z3bra.org 70 i+github.com/gdamore/tcell/v2 v2.5.3 h1:b9XQrT6QGbgI7JvZOJXFNczOQeIYbo8BfeSMzt2sAV0= Err z3bra.org 70 i+github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= Err z3bra.org 70 i+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= Err z3bra.org 70 i+github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= Err z3bra.org 70 i+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= Err z3bra.org 70 i+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= Err z3bra.org 70 i+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= Err z3bra.org 70 i+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= Err z3bra.org 70 i+github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= Err z3bra.org 70 i+github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= Err z3bra.org 70 i+github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= Err z3bra.org 70 i+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= Err z3bra.org 70 i+github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= Err z3bra.org 70 i+github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= Err z3bra.org 70 i+github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= Err z3bra.org 70 i+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= Err z3bra.org 70 i+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= Err z3bra.org 70 i+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= Err z3bra.org 70 i+github.com/rivo/tview v0.0.0-20221128165837-db36428c92d9 h1:ccTgRxA37ypj3q8zB8G4k3xGPfBbIaMwrf3Yw6k50NY= Err z3bra.org 70 i+github.com/rivo/tview v0.0.0-20221128165837-db36428c92d9/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= Err z3bra.org 70 i+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= Err z3bra.org 70 i+github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= Err z3bra.org 70 i+github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= Err z3bra.org 70 i+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= Err z3bra.org 70 i+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= Err z3bra.org 70 i+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= Err z3bra.org 70 i+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= Err z3bra.org 70 i+golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= Err z3bra.org 70 i+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= Err z3bra.org 70 i+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= Err z3bra.org 70 i+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= Err z3bra.org 70 i+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= Err z3bra.org 70 i+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= Err z3bra.org 70 i+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= Err z3bra.org 70 i+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= Err z3bra.org 70 i+golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= Err z3bra.org 70 i+golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= Err z3bra.org 70 i+golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= Err z3bra.org 70 i+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= Err z3bra.org 70 i+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= Err z3bra.org 70 i+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= Err z3bra.org 70 i+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= Err z3bra.org 70 i+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= Err z3bra.org 70 i+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= Err z3bra.org 70 i+golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 h1:M8tBwCtWD/cZV9DZpFYRUgaymAYAr+aIUTWzDaM3uPs= Err z3bra.org 70 i+golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= Err z3bra.org 70 i+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= Err z3bra.org 70 i+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= Err z3bra.org 70 i+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= Err z3bra.org 70 i+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= Err z3bra.org 70 i+lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= Err z3bra.org 70 i+lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= Err z3bra.org 70 i+modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= Err z3bra.org 70 i+modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= Err z3bra.org 70 i+modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= Err z3bra.org 70 i+modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= Err z3bra.org 70 i+modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= Err z3bra.org 70 i+modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= Err z3bra.org 70 i+modernc.org/libc v1.21.5 h1:xBkU9fnHV+hvZuPSRszN0AXDG4M7nwPLwTWwkYcvLCI= Err z3bra.org 70 i+modernc.org/libc v1.21.5/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= Err z3bra.org 70 i+modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= Err z3bra.org 70 i+modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= Err z3bra.org 70 i+modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk= Err z3bra.org 70 i+modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= Err z3bra.org 70 i+modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= Err z3bra.org 70 i+modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= Err z3bra.org 70 i+modernc.org/sqlite v1.20.0 h1:80zmD3BGkm8BZ5fUi/4lwJQHiO3GXgIUvZRXpoIfROY= Err z3bra.org 70 i+modernc.org/sqlite v1.20.0/go.mod h1:EsYz8rfOvLCiYTy5ZFsOYzoCcRMu98YYkwAcCw5YIYw= Err z3bra.org 70 i+modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= Err z3bra.org 70 i+modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= Err z3bra.org 70 i+modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= Err z3bra.org 70 i+modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= Err z3bra.org 70 i+modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= Err z3bra.org 70 i+modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= Err z3bra.org 70 1diff --git a/main.go b/main.go /scm/scoreboard/file/main.go.gph z3bra.org 70 it@@ -0,0 +1,277 @@ Err z3bra.org 70 i+// Copyright 2016 The Tcell Authors Err z3bra.org 70 i+// Err z3bra.org 70 i+// Licensed under the Apache License, Version 2.0 (the "License"); Err z3bra.org 70 i+// you may not use file except in compliance with the License. Err z3bra.org 70 i+// You may obtain a copy of the license at Err z3bra.org 70 i+// Err z3bra.org 70 i+// http://www.apache.org/licenses/LICENSE-2.0 Err z3bra.org 70 i+// Err z3bra.org 70 i+// Unless required by applicable law or agreed to in writing, software Err z3bra.org 70 i+// distributed under the License is distributed on an "AS IS" BASIS, Err z3bra.org 70 i+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Err z3bra.org 70 i+// See the License for the specific language governing permissions and Err z3bra.org 70 i+// limitations under the License. Err z3bra.org 70 i+ Err z3bra.org 70 i+package main Err z3bra.org 70 i+ Err z3bra.org 70 i+import ( Err z3bra.org 70 i+ "flag" Err z3bra.org 70 i+ "fmt" Err z3bra.org 70 i+ "math" Err z3bra.org 70 i+ "os" Err z3bra.org 70 i+ "regexp" Err z3bra.org 70 i+ "time" Err z3bra.org 70 i+ "database/sql" Err z3bra.org 70 i+ "github.com/gdamore/tcell/v2" Err z3bra.org 70 i+ "github.com/rivo/tview" Err z3bra.org 70 i+ "github.com/dustin/go-humanize" Err z3bra.org 70 i+ //"golang.org/x/crypto/argon2" Err z3bra.org 70 i+ Err z3bra.org 70 i+ _ "modernc.org/sqlite" Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+const ( Err z3bra.org 70 i+ BOARD_SIZE int = 15 Err z3bra.org 70 i+ DB string = "leaderboard.db" Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+type Player struct { Err z3bra.org 70 i+ id int Err z3bra.org 70 i+ name string Err z3bra.org 70 i+ token string Err z3bra.org 70 i+ flags int Err z3bra.org 70 i+ score int Err z3bra.org 70 i+ ts int64 Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+type Application struct { Err z3bra.org 70 i+ app *tview.Application Err z3bra.org 70 i+ pages *tview.Pages Err z3bra.org 70 i+ frame *tview.Grid Err z3bra.org 70 i+ board *tview.Grid Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+var flag_sha256 = [...]string { Err z3bra.org 70 i+ "A", Err z3bra.org 70 i+ //"A6322C6522FB49959242670BC62E85A29ED7EB8CFCD87BE91521F0CA5EEBD198", // cookie.png Err z3bra.org 70 i+ "AFE502310D1EE1494770A46DEEED25CABB4B0CA70EFD0571C249C6BAA3728B46", // onion.png + zip Err z3bra.org 70 i+ "AC899E9F52E7194933E64D26800A609A83FF01826347FEA5ECDB2E420CAF1F43", // cream.png Err z3bra.org 70 i+ "8CB250A66D4301244699186CA723E11AFA806C64466789AB14B7027A2F928BF8", // egg.png Err z3bra.org 70 i+ "F6A4071C9C0DDCCB53FC1CDCA38E32CF10551F75AA48996A9341842A7EF2591B"} // salt.png Err z3bra.org 70 i+ Err z3bra.org 70 i+//var Application { Err z3bra.org 70 i+// app: tview.NewApplication(), Err z3bra.org 70 i+// frame: BoardFrame(26, 15), Err z3bra.org 70 i+// pages: tview.NewPages(), Err z3bra.org 70 i+// board: tview.NewTable(), Err z3bra.org 70 i+//} Err z3bra.org 70 i+ Err z3bra.org 70 i+var app = tview.NewApplication() Err z3bra.org 70 i+var pages = tview.NewPages() Err z3bra.org 70 i+var db *sql.DB Err z3bra.org 70 i+var player = Player{ Err z3bra.org 70 i+ score: 100, Err z3bra.org 70 i+ flags: 1, Err z3bra.org 70 i+ ts: time.Now().Unix(), Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func usage() { Err z3bra.org 70 i+ fmt.Println("ssh board@cyb.farm [flag SHA256]") Err z3bra.org 70 i+ os.Exit(0) Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func RankTable(t *tview.Table, offset, limit, rank int, fill bool) (*tview.Table) { Err z3bra.org 70 i+ players, err := db_ranked(offset, limit) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ panic(err) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ t.SetSelectable(true, false). Err z3bra.org 70 i+ SetSelectedStyle(tcell.StyleDefault.Reverse(true)) Err z3bra.org 70 i+ Err z3bra.org 70 i+ for i := 0; i < len(players); i++ { Err z3bra.org 70 i+ p := players[i] Err z3bra.org 70 i+ rankstr := fmt.Sprintf("%4s", humanize.Ordinal(rank + i)) Err z3bra.org 70 i+ flagstr := flag2str(p.flags) Err z3bra.org 70 i+ scorestr := fmt.Sprintf("%4d", p.score) Err z3bra.org 70 i+ t.SetCell(i, 0, newcell(rankstr)) Err z3bra.org 70 i+ t.SetCell(i, 1, newcell(p.name)) Err z3bra.org 70 i+ t.SetCell(i, 2, newcell(flagstr)) Err z3bra.org 70 i+ t.SetCell(i, 3, newcell(scorestr)) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ if fill == true { Err z3bra.org 70 i+ for i:=t.GetRowCount(); i 0 { Err z3bra.org 70 i+ cmd = args[0] Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ // Override default borders Err z3bra.org 70 i+ tview.Borders.HorizontalFocus = tview.BoxDrawingsLightHorizontal Err z3bra.org 70 i+ tview.Borders.VerticalFocus = tview.BoxDrawingsLightVertical Err z3bra.org 70 i+ tview.Borders.TopLeftFocus = tview.BoxDrawingsLightDownAndRight Err z3bra.org 70 i+ tview.Borders.TopRightFocus = tview.BoxDrawingsLightDownAndLeft Err z3bra.org 70 i+ tview.Borders.BottomLeftFocus = tview.BoxDrawingsLightUpAndRight Err z3bra.org 70 i+ tview.Borders.BottomRightFocus = tview.BoxDrawingsLightUpAndLeft Err z3bra.org 70 i+ Err z3bra.org 70 i+ // Set default colors Err z3bra.org 70 i+ tview.Styles.PrimitiveBackgroundColor = tcell.ColorDefault Err z3bra.org 70 i+ tview.Styles.BorderColor = tcell.ColorDefault Err z3bra.org 70 i+ tview.Styles.TitleColor = tcell.ColorDefault Err z3bra.org 70 i+ tview.Styles.GraphicsColor = tcell.ColorDefault Err z3bra.org 70 i+ tview.Styles.PrimaryTextColor = tcell.ColorDefault Err z3bra.org 70 i+ Err z3bra.org 70 i+ // open database Err z3bra.org 70 i+ db, err = sql.Open("sqlite", DB) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ panic(err) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ defer db.Close() Err z3bra.org 70 i+ Err z3bra.org 70 i+ // create schema if needed Err z3bra.org 70 i+ _, err = db.Exec(DB_CREATE) Err z3bra.org 70 i+ if err != nil { Err z3bra.org 70 i+ panic(err) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ //_, err = db.Exec(DB_FILL) Err z3bra.org 70 i+ //if err != nil { Err z3bra.org 70 i+ // panic(err) Err z3bra.org 70 i+ //} Err z3bra.org 70 i+ pages.SetBackgroundColor(tcell.ColorDefault) Err z3bra.org 70 i+ Err z3bra.org 70 i+ pages.AddPage("flag", pageFlag(), true, false) Err z3bra.org 70 i+ pages.AddPage("score", pageScore(), true, false) Err z3bra.org 70 i+ pages.AddPage("board", pageBoard(), true, false) Err z3bra.org 70 i+ Err z3bra.org 70 i+ switch cmd { Err z3bra.org 70 i+ case "prompt": Err z3bra.org 70 i+ pages.ShowPage("flag") Err z3bra.org 70 i+ case "flag": Err z3bra.org 70 i+ if (len(args) < 2) { Err z3bra.org 70 i+ usage() Err z3bra.org 70 i+ } Err z3bra.org 70 i+ switch flagid(args[1]) { Err z3bra.org 70 i+ case 0: Err z3bra.org 70 i+ if db_count() < 10 { Err z3bra.org 70 i+ player.score += 10 - db_count() Err z3bra.org 70 i+ } Err z3bra.org 70 i+ pages.SwitchToPage("score") Err z3bra.org 70 i+ //case 1,2,3,4: Err z3bra.org 70 i+ // pages.ShowPage("token") Err z3bra.org 70 i+ default: Err z3bra.org 70 i+ fmt.Println("Incorrect flag") Err z3bra.org 70 i+ } Err z3bra.org 70 i+ default: Err z3bra.org 70 i+ pages.SwitchToPage("board") Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ if err := app.SetRoot(pages, true).EnableMouse(true).Run(); err != nil { Err z3bra.org 70 i+ panic(err) Err z3bra.org 70 i+ } Err z3bra.org 70 i+} Err z3bra.org 70 1diff --git a/mkfile b/mkfile /scm/scoreboard/file/mkfile.gph z3bra.org 70 it@@ -0,0 +1,4 @@ Err z3bra.org 70 i+GO = go Err z3bra.org 70 i+ Err z3bra.org 70 i+scoreboard: main.go db.go playerbox.go util.go Err z3bra.org 70 i+ ${GO} build Err z3bra.org 70 1diff --git a/playerbox.go b/playerbox.go /scm/scoreboard/file/playerbox.go.gph z3bra.org 70 it@@ -0,0 +1,112 @@ Err z3bra.org 70 i+package main Err z3bra.org 70 i+ Err z3bra.org 70 i+import ( Err z3bra.org 70 i+ "fmt" Err z3bra.org 70 i+ //"time" Err z3bra.org 70 i+ "github.com/gdamore/tcell/v2" Err z3bra.org 70 i+ "github.com/rivo/tview" Err z3bra.org 70 i+ "github.com/dustin/go-humanize" Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+type PlayerBox struct { Err z3bra.org 70 i+ name []byte Err z3bra.org 70 i+ char []int Err z3bra.org 70 i+ cur int Err z3bra.org 70 i+ box *tview.TextView Err z3bra.org 70 i+ score *tview.TextView Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+var charlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _.-!" Err z3bra.org 70 i+var playerbox = PlayerBox {name: []byte("AAA"), char: []int{0,0,0}, cur: 0} Err z3bra.org 70 i+ Err z3bra.org 70 i+func boxtext (b PlayerBox) string { Err z3bra.org 70 i+ str := "" Err z3bra.org 70 i+ for i:=0; i<3; i++ { Err z3bra.org 70 i+ b.name[i] = charlist[b.char[i]] Err z3bra.org 70 i+ if i == b.cur { Err z3bra.org 70 i+ str = fmt.Sprintf("%s[::r]%c[::-]", str, b.name[i]) Err z3bra.org 70 i+ } else { Err z3bra.org 70 i+ str = fmt.Sprintf("%s%c", str, b.name[i]) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ } Err z3bra.org 70 i+ return str Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func manipulatebox(event *tcell.EventKey) *tcell.EventKey { Err z3bra.org 70 i+ switch event.Key() { Err z3bra.org 70 i+ case tcell.KeyLeft: Err z3bra.org 70 i+ playerbox.cur-- Err z3bra.org 70 i+ if playerbox.cur < 0 { Err z3bra.org 70 i+ playerbox.cur = 2 Err z3bra.org 70 i+ } Err z3bra.org 70 i+ case tcell.KeyRight: Err z3bra.org 70 i+ playerbox.cur++ Err z3bra.org 70 i+ if playerbox.cur > 2 { Err z3bra.org 70 i+ playerbox.cur = 0 Err z3bra.org 70 i+ } Err z3bra.org 70 i+ case tcell.KeyUp: Err z3bra.org 70 i+ playerbox.char[playerbox.cur]++ Err z3bra.org 70 i+ if playerbox.char[playerbox.cur] > len(charlist) { Err z3bra.org 70 i+ playerbox.char[playerbox.cur] = 0 Err z3bra.org 70 i+ } Err z3bra.org 70 i+ case tcell.KeyDown: Err z3bra.org 70 i+ playerbox.char[playerbox.cur]-- Err z3bra.org 70 i+ if playerbox.char[playerbox.cur] < 0 { Err z3bra.org 70 i+ playerbox.char[playerbox.cur] = len(charlist) - 1 Err z3bra.org 70 i+ } Err z3bra.org 70 i+ } Err z3bra.org 70 i+ playerbox.box.SetText(boxtext(playerbox)) Err z3bra.org 70 i+ return event Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func PlayerBoxName(p Player) *tview.TextView { Err z3bra.org 70 i+ v := tview.NewTextView(). Err z3bra.org 70 i+ SetDynamicColors(true). Err z3bra.org 70 i+ SetTextAlign(tview.AlignRight). Err z3bra.org 70 i+ SetText(boxtext(playerbox)). Err z3bra.org 70 i+ SetChangedFunc(func() { Err z3bra.org 70 i+ app.Draw() Err z3bra.org 70 i+ }). Err z3bra.org 70 i+ SetDoneFunc(func(key tcell.Key) { Err z3bra.org 70 i+ if key == tcell.KeyEnter { Err z3bra.org 70 i+ p.name = fmt.Sprintf("%3s", playerbox.name) Err z3bra.org 70 i+ db_save(p) Err z3bra.org 70 i+ pages.SwitchToPage("board") Err z3bra.org 70 i+ } Err z3bra.org 70 i+ }) Err z3bra.org 70 i+ Err z3bra.org 70 i+ v.Focus(func(p tview.Primitive) { Err z3bra.org 70 i+ v.SetText(fmt.Sprintf("%4d ", player.score)) Err z3bra.org 70 i+ }) Err z3bra.org 70 i+ Err z3bra.org 70 i+ v.SetInputCapture(manipulatebox) Err z3bra.org 70 i+ Err z3bra.org 70 i+ return v Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+func PlayerBoxGrid(p Player, rank int) *tview.Grid { Err z3bra.org 70 i+ gridcell := func (text string) *tview.TextView { Err z3bra.org 70 i+ return tview.NewTextView(). Err z3bra.org 70 i+ SetDynamicColors(true). Err z3bra.org 70 i+ SetTextAlign(tview.AlignRight). Err z3bra.org 70 i+ SetText(fmt.Sprintf("[::l]%s",text)) Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ rankstr := humanize.Ordinal(rank) Err z3bra.org 70 i+ Err z3bra.org 70 i+ box := PlayerBoxName(p) Err z3bra.org 70 i+ Err z3bra.org 70 i+ playerbox.box = box Err z3bra.org 70 i+ playerbox.score = gridcell(fmt.Sprintf("%4d ", p.score)) Err z3bra.org 70 i+ Err z3bra.org 70 i+ grid := tview.NewGrid(). Err z3bra.org 70 i+ SetColumns(4,3,6,6). Err z3bra.org 70 i+ SetGap(0, 2). Err z3bra.org 70 i+ SetRows(1). Err z3bra.org 70 i+ AddItem(gridcell(rankstr), 0, 0, 1, 1, 0, 0, false). Err z3bra.org 70 i+ AddItem(box, 0, 1, 1, 1, 0, 0, true). Err z3bra.org 70 i+ AddItem(gridcell(flag2str(p.flags)), 0, 2, 1, 1, 0, 0, false). Err z3bra.org 70 i+ AddItem(playerbox.score, 0, 3, 1, 1, 0, 0, false) Err z3bra.org 70 i+ Err z3bra.org 70 i+ return grid Err z3bra.org 70 i+} Err z3bra.org 70 1diff --git a/util.go b/util.go /scm/scoreboard/file/util.go.gph z3bra.org 70 it@@ -0,0 +1,49 @@ Err z3bra.org 70 i+package main Err z3bra.org 70 i+ Err z3bra.org 70 i+import ( Err z3bra.org 70 i+ "fmt" Err z3bra.org 70 i+ "strings" Err z3bra.org 70 i+ "github.com/rivo/tview" Err z3bra.org 70 i+) Err z3bra.org 70 i+ Err z3bra.org 70 i+func flagid(hash string) int { Err z3bra.org 70 i+ for i := 0; i "XXX.." Err z3bra.org 70 i+func flag2str(n int) string { Err z3bra.org 70 i+ var flags [5]byte Err z3bra.org 70 i+ for i:=0; i