web_gui.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // package web_gui -- веб-сервер для графики
  2. package web_gui
  3. import (
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "strconv"
  8. "github.com/gofiber/fiber/v2"
  9. "wartank/pkg/alias"
  10. "wartank/pkg/types"
  11. )
  12. // ВебГип -- веб-сервер для графики
  13. type ВебГуи struct {
  14. серв types.ИСервер
  15. файбер *fiber.App
  16. }
  17. // НовВебГуи -- возвращает новый веб-сервер для графики
  18. func НовВебГуи(вебСервер types.ИВебСервер) (*ВебГуи, error) {
  19. if вебСервер == nil {
  20. return nil, fmt.Errorf("НовВебГуи(): ИВебСервер==nil")
  21. }
  22. сам := &ВебГуи{
  23. серв: вебСервер.Сервер(),
  24. файбер: вебСервер.Файбер(),
  25. }
  26. сам.файбер.Get("/", сам.индекс)
  27. сам.файбер.Get("/gui/login", сам.логин)
  28. сам.файбер.Get("/gui/list_bot", сам.кукиПроверить, сам.списокБотов)
  29. сам.файбер.Get("/gui/add_bot", сам.кукиПроверить, сам.гетБотНов)
  30. сам.файбер.Get("/gui/bot/:number/state", сам.кукиПроверить, сам.состояниеБота)
  31. return сам, nil
  32. }
  33. // Показывает состояние бота по имени
  34. func (сам *ВебГуи) состояниеБота(кнт *fiber.Ctx) error {
  35. log.Printf("ВебГуи.состояниеБота()\n")
  36. стрНомер := кнт.Params("number")
  37. иНомер, ош := strconv.Atoi(стрНомер)
  38. if ош != nil {
  39. return кнт.Render("list_bot", fiber.Map{
  40. "Title": "WarTank",
  41. "err": fmt.Sprintf("ВебГуи.состояниеБота(): ошибка декодирования имени бота: %v", ош.Error()),
  42. })
  43. }
  44. ботНомер := alias.БотНомер(иНомер)
  45. log.Printf("ВебГуи.состояниеБота(): имя=%s\n", стрНомер)
  46. бот := сам.серв.ServBots().Get(ботНомер)
  47. if бот == nil {
  48. return кнт.Render("list_bot", fiber.Map{
  49. "Title": "WarTank",
  50. "err": "Бот не найден",
  51. })
  52. }
  53. уровень := бот.Ангар().База().Шахта().Уровень()
  54. стрУровень := fmt.Sprint(уровень.Получ())
  55. return кнт.Render("state_bot", fiber.Map{
  56. "Title": "WarTank",
  57. "имя": бот.Имя(),
  58. "number": бот.Номер(),
  59. "топливо": бот.Ангар().Топливо().Получ(),
  60. "золото": бот.Ангар().Золото().Получ(),
  61. "серебро": бот.Ангар().СереброВсего().Получ(),
  62. "слава": бот.Ангар().Конвой().Слава().Получ(),
  63. "атака": бот.Стата().Атака().Получ(),
  64. "броня": бот.Стата().Броня().Получ(),
  65. "точность": бот.Стата().Точность().Получ(),
  66. "прочность": бот.Стата().Прочность().Получ(),
  67. "мощь": бот.Стата().Мощь().Получ(),
  68. "шахта_уровень": стрУровень,
  69. "шахта_режим": бот.Ангар().База().Шахта().СценаРежим().Режим(),
  70. "шахта_сделать_кол": бот.Ангар().База().Шахта().ПродуктКолСейчас(),
  71. "шахта_сделать_назв": бот.Ангар().База().Шахта().ПродуктИмяСейчас(),
  72. "шахта_сделать_время": бот.Ангар().База().Шахта().ПродуктВремяСейчас(),
  73. "полигон_уровень": fmt.Sprintf("%v", бот.Ангар().База().Полигон().Уровень().Получ()),
  74. "полигон_режим": fmt.Sprintf("%v", бот.Ангар().База().Полигон().СценаРежим().Режим()),
  75. "полигон_сделать_кол": fmt.Sprintf("%v", бот.Ангар().База().Полигон().ПродуктКолСейчас()),
  76. "полигон_сделать_назв": бот.Ангар().База().Полигон().ПродуктИмяСейчас(),
  77. "полигон_сделать_время": бот.Ангар().База().Полигон().ПродуктВремяСейчас(),
  78. "оружейная_режим": бот.Ангар().База().Арсенал().СценаРежим().Режим(),
  79. "оружейная_работа": бот.Ангар().База().Арсенал().СценаРежим().Работа(),
  80. "оружейная_время": бот.Ангар().База().Арсенал().ВремяОстат().String(),
  81. "оружейная_ремки": бот.Ангар().База().Арсенал().Ремки().Получ(),
  82. "оружейная_кумул": бот.Ангар().База().Арсенал().Кумулятивы().Получ(),
  83. })
  84. }
  85. // Показывает страницу добавления бота
  86. func (сам *ВебГуи) гетБотНов(кнт *fiber.Ctx) error {
  87. log.Printf("ВебГуи.гетБотНов()\n")
  88. return кнт.Render("add_bot", fiber.Map{
  89. "Title": "WarTank",
  90. })
  91. }
  92. // Возвращает страницу со списком ботов
  93. func (сам *ВебГуи) списокБотов(кнт *fiber.Ctx) error {
  94. log.Printf("ВебГуи.списокБотов()\n")
  95. списокБотов := сам.серв.ServBots().ListBot()
  96. списокБот := make(map[alias.БотНомер]string, 0)
  97. for _, бот := range списокБотов {
  98. списокБот[бот.Номер()] = бот.Имя()
  99. }
  100. return кнт.Render("list_bot", fiber.Map{
  101. "Title": "WarTank",
  102. "bots": списокБот,
  103. })
  104. }
  105. // Возвращает индексную страницу
  106. func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
  107. log.Printf("ВебГуи.индекс()\n")
  108. имя := кнт.Cookies("login")
  109. if имя != "svi" {
  110. return кнт.Redirect("/gui/login", http.StatusSeeOther)
  111. }
  112. return кнт.Redirect("/gui/list_bot", http.StatusSeeOther)
  113. }
  114. // Возвращает страницу логина
  115. func (сам *ВебГуи) логин(кнт *fiber.Ctx) error {
  116. log.Printf("ВебГуи.логин()\n")
  117. return кнт.Render("login", fiber.Map{
  118. "Title": "WarTank",
  119. "err": "Неправильный логин",
  120. })
  121. }
  122. // Проверка на куки
  123. func (sf *ВебГуи) кукиПроверить(кнт *fiber.Ctx) error {
  124. log.Printf("ВебГуи.кукиПроверить()\n")
  125. имя := кнт.Cookies("login")
  126. if имя != "svi" {
  127. return кнт.Redirect("/gui/login", http.StatusSeeOther)
  128. }
  129. return кнт.Next()
  130. }