frontend.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. "text/template"
  12. "time"
  13. )
  14. func compileTemplate(w http.ResponseWriter, title string, content string) {
  15. type TemplateData struct {
  16. Title string
  17. Content string
  18. Active_Servers bool
  19. Active_Stats bool
  20. Active_About bool
  21. LastUpdate string
  22. }
  23. var Active_Servers bool
  24. var Active_Stats bool
  25. var Active_About bool
  26. LastUpdate, _ := strconv.ParseInt(redisGet("LastUpdate"), 10, 64)
  27. t := time.Unix(LastUpdate, 0)
  28. switch title {
  29. case "About":
  30. Active_About = true
  31. case "Stats":
  32. Active_Stats = true
  33. default:
  34. Active_Servers = true
  35. }
  36. data := TemplateData{
  37. Title: title,
  38. Content: content,
  39. Active_Servers: Active_Servers,
  40. Active_Stats: Active_Stats,
  41. Active_About: Active_About,
  42. LastUpdate: t.Format(time.RFC3339),
  43. }
  44. tmpl := template.Must(template.ParseFiles("templates/template.html"))
  45. tmpl.Execute(w, data)
  46. }
  47. func handleServers(w http.ResponseWriter, r *http.Request) {
  48. var err error
  49. type serversStruct struct {
  50. ServerCount int
  51. PlayerCount int
  52. Servers []ServerMeta
  53. }
  54. // Fetch the data from Redis and Unmarshal it
  55. metadata := redisGet("metadata")
  56. var ServerMetaData []ServerMeta
  57. err = json.Unmarshal([]byte(metadata), &ServerMetaData)
  58. if err != nil {
  59. panic(err)
  60. }
  61. var playerCount int
  62. for i, server := range ServerMetaData {
  63. playerCount += server.Players
  64. if server.Description == "No" {
  65. ServerMetaData[i].Description = ""
  66. } else {
  67. ServerMetaData[i].Description = strings.ReplaceAll(ServerMetaData[i].Description, "<br />", "")
  68. ServerMetaData[i].Description = strings.ReplaceAll(ServerMetaData[i].Description, "__", "")
  69. ServerMetaData[i].Description = strings.ReplaceAll(ServerMetaData[i].Description, " ", "")
  70. }
  71. }
  72. var sortfields string
  73. keys, ok := r.URL.Query()["sort"]
  74. if !ok || len(keys[0]) < 1 {
  75. sortfields = "Players:DESC"
  76. } else {
  77. sortfields = keys[0]
  78. }
  79. switch sortfields {
  80. case "Country:DESC":
  81. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].ISO > ServerMetaData[j].ISO })
  82. case "Country:ASC":
  83. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].ISO < ServerMetaData[j].ISO })
  84. case "Server:DESC":
  85. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].Name > ServerMetaData[j].Name })
  86. case "Server:ASC":
  87. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].Name < ServerMetaData[j].Name })
  88. case "Scenario:DESC":
  89. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].MissionName > ServerMetaData[j].MissionName })
  90. case "Scenario:ASC":
  91. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].MissionName < ServerMetaData[j].MissionName })
  92. case "Players:ASC":
  93. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].Players < ServerMetaData[j].Players })
  94. default:
  95. sort.Slice(ServerMetaData, func(i, j int) bool { return ServerMetaData[i].Players > ServerMetaData[j].Players })
  96. }
  97. serversContent := serversStruct{len(ServerMetaData), playerCount, ServerMetaData}
  98. var tpl bytes.Buffer
  99. parsedTemplate, _ := template.ParseFiles("templates/servers.html")
  100. err = parsedTemplate.Execute(&tpl, serversContent)
  101. if err != nil {
  102. log.Println("Error executing template :", err)
  103. return
  104. }
  105. compileTemplate(w, "Servers", tpl.String())
  106. }
  107. func handleServer(w http.ResponseWriter, r *http.Request) {
  108. url := r.URL.String()
  109. // Redirect /servers/ -> /servers
  110. if url == "/servers/" {
  111. http.Redirect(w, r, "/servers", 301)
  112. }
  113. // Parse data
  114. server := url[9:]
  115. ServerInfo := redisGet(server)
  116. var ServerDataMeta ServerMeta
  117. err := json.Unmarshal([]byte(ServerInfo), &ServerDataMeta)
  118. if err != nil {
  119. log.Println("Server nofound")
  120. }
  121. var tpl bytes.Buffer
  122. parsedTemplate, _ := template.ParseFiles("templates/server.html")
  123. err = parsedTemplate.Execute(&tpl, ServerDataMeta)
  124. if err != nil {
  125. log.Println("Error executing template :", err)
  126. return
  127. }
  128. compileTemplate(w, "Servers", tpl.String())
  129. }
  130. func handlerStats(w http.ResponseWriter, r *http.Request) {
  131. metrics := struct{ stuff int }{stuff: 0}
  132. var tpl bytes.Buffer
  133. parsedTemplate, _ := template.ParseFiles("templates/stats.html")
  134. err := parsedTemplate.Execute(&tpl, metrics)
  135. if err != nil {
  136. log.Println("Error executing template :", err)
  137. return
  138. }
  139. compileTemplate(w, "Servers", tpl.String())
  140. }
  141. func handlerAbout(w http.ResponseWriter, r *http.Request) {
  142. content, err := ioutil.ReadFile("templates/about.html")
  143. if err != nil {
  144. log.Fatal(err)
  145. }
  146. compileTemplate(w, "About", string(content))
  147. }