web_gui.go 4.2 KB

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