-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathmain.go
83 lines (70 loc) · 1.71 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
import (
"flag"
"io/ioutil"
"strings"
"github.com/gin-gonic/gin"
log "unknwon.dev/clog/v2"
)
var title, token, port string
var hub *Hub
var teams []team
func init() {
_ = log.NewConsole()
gin.SetMode(gin.ReleaseMode)
}
func main() {
// Parse CLI.
flag.StringVar(&title, "title", "HCTF", "Contest name")
flag.StringVar(&token, "token", randomString(32), "Authorization Token")
flag.StringVar(&port, "port", "12345", "HTTP Listening Port")
flag.Parse()
loadTeams()
// Web server router.
r := gin.Default()
r.GET("/websocket", func(c *gin.Context) {
ServeWebSocket(hub, c)
})
auth := r.Use(func(c *gin.Context) {
if c.GetHeader("Authorization") != token {
c.JSON(makeErrJSON(403, 40300, "unauthorized"))
c.Abort()
return
}
c.Next()
})
auth.POST("/attack", attackHandler)
auth.POST("/rank", rankHandler)
auth.POST("/status", statusHandler)
auth.POST("/round", roundHandler)
auth.GET("/easterEgg", eggHandler)
auth.POST("/time", timeHandler)
auth.POST("/clear", clearHandler)
auth.POST("/clearAll", clearAllHandler)
// Run websocket hub.
hub = NewHub()
go hub.Run()
log.Info("Authorization token: %s\n", token)
log.Info("Listening and serving HTTP on :%s\n", port)
log.Fatal("Failed to start web server: %v", r.Run(":"+port))
}
func loadTeams() {
// Load team file.
teamData, err := ioutil.ReadFile("team.txt")
if err != nil {
log.Fatal("Failed to read file team.txt: %v", err)
}
teamsName := strings.Split(string(teamData), "\n")
for index, t := range teamsName {
teams = append(teams, team{
Id: index,
Name: t,
Rank: index + 1,
Score: 1000,
})
}
log.Info("===== Teams =====")
for k, v := range teams {
log.Trace("%2d - %s", k+1, v.Name)
}
}