Эх сурвалжийг харах

SVI Переделка на новую архитектуру

SVI 1 жил өмнө
parent
commit
0e6084b63c

+ 3 - 1
.env

@@ -1 +1,3 @@
-STAGE="local"
+STAGE="local"
+LOCAL_STORE_PATH="/store"
+SERVER_HTTP_PORT="18100"

+ 0 - 3
pkg/alias/alias.go

@@ -33,6 +33,3 @@ type АренаРаботаИмя string
 
 
 // АренаРежимНомер -- номер режима прены (1/2)
 // АренаРежимНомер -- номер режима прены (1/2)
 type АренаРежимНомер int
 type АренаРежимНомер int
-
-// БотНомер -- номер бота
-type БотНомер int

+ 5 - 5
pkg/arena/arena.go

@@ -24,11 +24,11 @@ type АренаКонфиг struct {
 
 
 // Контролирует правильность параметров
 // Контролирует правильность параметров
 func (конф *АренаКонфиг) контроль() {
 func (конф *АренаКонфиг) контроль() {
-	Паника(конф.СтрКонтроль_ == "", "АренаКонфиг.СтрКонтроль_ == \"\"")
-	Паника(конф.ФнПуск_ == nil, "АренаКонфиг.ФнПуск_ == nil")
-	Паника(конф.Бот_ == nil, "АренаКонфиг.Бот_ == nil")
-	Паника(конф.АренаИмя_ == "", "АренаКонфиг.СценаИмя_ == \"\"")
-	Паника(конф.СтрУрл_ == "", "АренаКонфиг.СтрУрл_ == \"\"")
+	Паника(конф.СтрКонтроль_ != "", "АренаКонфиг.СтрКонтроль_ == \"\"")
+	Паника(конф.ФнПуск_ != nil, "АренаКонфиг.ФнПуск_ == nil")
+	Паника(конф.Бот_ != nil, "АренаКонфиг.Бот_ == nil")
+	Паника(конф.АренаИмя_ != "", "АренаКонфиг.СценаИмя_ == \"\"")
+	Паника(конф.СтрУрл_ != "", "АренаКонфиг.СтрУрл_ == \"\"")
 }
 }
 
 
 // Арена -- арена игры
 // Арена -- арена игры

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
pkg/kernel/kernel_serv_http/static/js/hyperscript.min.js


+ 5 - 0
server/lev0/alias/alias.go

@@ -0,0 +1,5 @@
+// package alias -- алиасы для приложения
+package alias
+
+// АБотНомер -- номер бота
+type АБотНомер int

+ 2 - 2
server/lev0/types/ibot.go

@@ -2,7 +2,7 @@ package types
 
 
 import (
 import (
 	"context"
 	"context"
-	"wartank/pkg/alias"
+	. "wartank/server/lev0/alias"
 )
 )
 
 
 // ИБот -- серверный бот с реальным состоянием
 // ИБот -- серверный бот с реальным состоянием
@@ -12,7 +12,7 @@ type ИБот interface {
 	// Пароль -- возвращает пароль бота
 	// Пароль -- возвращает пароль бота
 	Пароль() string
 	Пароль() string
 	// Номер -- возвращает номер бота
 	// Номер -- возвращает номер бота
-	Номер() alias.БотНомер
+	Номер() АБотНомер
 	// Ангар -- возвращает ангар бота
 	// Ангар -- возвращает ангар бота
 	Ангар() ИАнгар
 	Ангар() ИАнгар
 	// Стата -- возвращает статистику танка
 	// Стата -- возвращает статистику танка

+ 3 - 3
server/lev0/types/iserv_bots.go

@@ -1,15 +1,15 @@
 package types
 package types
 
 
 import (
 import (
-	"wartank/pkg/alias"
+	. "wartank/server/lev0/alias"
 )
 )
 
 
 // ИБотоФерма -- словарь серверных ботов
 // ИБотоФерма -- словарь серверных ботов
 type ИБотоФерма interface {
 type ИБотоФерма interface {
 	// Get -- возвращает бота по его имени
 	// Get -- возвращает бота по его имени
-	Get(botNumber alias.БотНомер) ИБот
+	Get(botNumber АБотНомер) ИБот
 	// BotStart -- запускает бота в работу
 	// BotStart -- запускает бота в работу
-	BotStart(botNumber alias.БотНомер) error
+	BotStart(botNumber АБотНомер) error
 	// ListBot -- возвращает список ботов
 	// ListBot -- возвращает список ботов
 	ListBot() []ИБот
 	ListBot() []ИБот
 	// НовБот -- добавляет нового бота на бото-ферму
 	// НовБот -- добавляет нового бота на бото-ферму

+ 9 - 0
server/lev0/types/iweb_render.go

@@ -0,0 +1,9 @@
+package types
+
+// ИВебРендер -- заполняет страницу по ключу
+type ИВебРендер interface {
+	// Доб -- добавляет блок замещения
+	Доб(ключ, блок string)
+	// Получ -- возвращает страницу после рендеринга
+	Получ() string
+}

+ 3 - 0
server/lev1/web_render/base.tmpl.html

@@ -0,0 +1,3 @@
+{.header}
+{.main}
+{.footer}

+ 5 - 3
web/tmpl/footer.tmpl.html → server/lev1/web_render/footer.tmpl.html

@@ -1,4 +1,4 @@
-{{ define "footer" }}
+
 <br>
 <br>
 <!-- Контейнер подвала -->
 <!-- Контейнер подвала -->
 <div class="container-fluid border rounded text-info bg-dark">
 <div class="container-fluid border rounded text-info bg-dark">
@@ -7,10 +7,12 @@
 <span hx-get="/api/count_start" hx-trigger="every 30s"></span>
 <span hx-get="/api/count_start" hx-trigger="every 30s"></span>
 </div>
 </div>
 
 
+
+<!-- main.end -->
+</div>
 <!-- конец боди-контейнера -->
 <!-- конец боди-контейнера -->
 </div>
 </div>
 <script src="/static/js/bootstrap.bundle.min.js"></script>
 <script src="/static/js/bootstrap.bundle.min.js"></script>
 </body>
 </body>
 
 
-</HTML>
-{{end}}
+</HTML>

+ 5 - 6
web/tmpl/header.tmpl.html → server/lev1/web_render/header.tmpl.html

@@ -1,9 +1,8 @@
-{{ define "header" }}
 <!doctype html>
 <!doctype html>
 <HTML lang="ru">
 <HTML lang="ru">
 
 
     <head>
     <head>
-        <title>{{.Title}}</title>
+        <title>ВарТанк</title>
         <meta charset="utf-8">
         <meta charset="utf-8">
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <meta pragma="no-cache">
         <meta pragma="no-cache">
@@ -11,10 +10,11 @@
         <link href="/static/css/bootstrap.min.css" rel="stylesheet">
         <link href="/static/css/bootstrap.min.css" rel="stylesheet">
         <!-- htmx -->
         <!-- htmx -->
         <script src="/static/js/htmx.min.js"></script>
         <script src="/static/js/htmx.min.js"></script>
-        <script src="/static/js/_hyperscript.min.js"></script>
+        <script src="/static/js/hyperscript.min.js"></script>
     </head>
     </head>
 
 
     <body hx-boost="true">
     <body hx-boost="true">
+        <div id="main">
         <div class="container-fluid"><!-- начало боди-контейнера -->
         <div class="container-fluid"><!-- начало боди-контейнера -->
             <div class="container-fluid align-middle"><!-- контейнер заголовка -->
             <div class="container-fluid align-middle"><!-- контейнер заголовка -->
                 <div class="row border align-items-center">
                 <div class="row border align-items-center">
@@ -23,7 +23,7 @@
                     </div>
                     </div>
                     <div class="col">
                     <div class="col">
                         <a class="btn btn-primary" href="/">Главная</a>
                         <a class="btn btn-primary" href="/">Главная</a>
-                        <a class="btn btn-primary" href="/gui/list_bot">Список ботов</a>
+                        <a class="btn btn-primary" href="/gui/bot">Список ботов</a>
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
@@ -31,5 +31,4 @@
                 <button _="on click increment the textContent of the next <output/>">Прибавить</button>
                 <button _="on click increment the textContent of the next <output/>">Прибавить</button>
                 [<output>0</output>]
                 [<output>0</output>]
                 <button _="on click decrement the textContent of the previous <output/>">убавить</button><br>
                 <button _="on click decrement the textContent of the previous <output/>">убавить</button><br>
-            </div>
-            {{end}}
+            </div>

+ 54 - 0
server/lev1/web_render/web_render.go

@@ -0,0 +1,54 @@
+// package web_render -- возвращает веб-рендер
+package web_render
+
+import (
+	_ "embed"
+	"strings"
+
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/server/lev0/types"
+)
+
+// ВебРендер -- простой веб-рендер
+type ВебРендер struct {
+	лог     *kernel_log.Логгер
+	слвБлок map[string]string
+}
+
+//go:embed base.tmpl.html
+var стрБаза string
+
+//go:embed header.tmpl.html
+var стрЗаголовок string
+
+//go:embed footer.tmpl.html
+var стрПодвал string
+
+// НовВебРендер -- возвращает новый веб-рендер
+func НовВебРендер(шаблон string) *ВебРендер {
+	лог := kernel_log.НовЛоггер("ВебРендер")
+	сам := &ВебРендер{
+		лог:     лог,
+		слвБлок: map[string]string{},
+	}
+	сам.слвБлок["{.header}"] = стрЗаголовок
+	сам.слвБлок["{.main}"] = шаблон
+	сам.слвБлок["{.footer}"] = стрПодвал
+	_ = ИВебРендер(сам)
+	return сам
+}
+
+// Получ -- возвращает результат рендеринга
+func (сам *ВебРендер) Получ() string {
+	рез := стрБаза
+	for ключ, блок := range сам.слвБлок {
+		рез = strings.ReplaceAll(рез, ключ, блок)
+	}
+	return рез
+}
+
+// Доб -- добавляет блок замещения
+func (сам *ВебРендер) Доб(ключ, блок string) {
+	сам.лог.Паника(ключ == "", "ВебРендер.Доб(): пустой ключ")
+	сам.слвБлок[ключ] = блок
+}

+ 5 - 5
server/lev2/serv_bots/dict_warbot/dict_warbot.go

@@ -7,9 +7,9 @@ import (
 	"strings"
 	"strings"
 	"sync"
 	"sync"
 
 
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
 	"wartank/server/lev2/serv_bots/warbot"
 	"wartank/server/lev2/serv_bots/warbot"
 )
 )
@@ -23,7 +23,7 @@ type СловарьБотов struct {
 	конт    ИЯдроКонтекст
 	конт    ИЯдроКонтекст
 	сервер  ИСервер
 	сервер  ИСервер
 	хран    IKernelStore
 	хран    IKernelStore
-	словарь map[alias.БотНомер]ИБот
+	словарь map[АБотНомер]ИБот
 	блок    sync.RWMutex
 	блок    sync.RWMutex
 	лог     ИЯдроЛог
 	лог     ИЯдроЛог
 }
 }
@@ -37,7 +37,7 @@ func НовСловарьБотов(конт ИЯдроКонтекст, сер
 		конт:    конт,
 		конт:    конт,
 		сервер:  сервер,
 		сервер:  сервер,
 		хран:    сервер.Получ("kernStore").(IKernelStore),
 		хран:    сервер.Получ("kernStore").(IKernelStore),
-		словарь: map[alias.БотНомер]ИБот{},
+		словарь: map[АБотНомер]ИБот{},
 		лог:     лог,
 		лог:     лог,
 	}
 	}
 	сам.load()
 	сам.load()
@@ -56,7 +56,7 @@ func (сам *СловарьБотов) ListBot() []ИБот {
 }
 }
 
 
 // Get -- возвращает бота по имени
 // Get -- возвращает бота по имени
-func (сам *СловарьБотов) Get(botNumber alias.БотНомер) ИБот {
+func (сам *СловарьБотов) Get(botNumber АБотНомер) ИБот {
 	сам.блок.RLock()
 	сам.блок.RLock()
 	defer сам.блок.RUnlock()
 	defer сам.блок.RUnlock()
 	bot := сам.словарь[botNumber]
 	bot := сам.словарь[botNumber]
@@ -106,7 +106,7 @@ func (сам *СловарьБотов) load() {
 		}
 		}
 		iNumber, err := strconv.Atoi(strNumber)
 		iNumber, err := strconv.Atoi(strNumber)
 		сам.лог.Паника(err != nil, "СловарьБотов.load(): при получении номера бота, ош=\n\t%v\n", err)
 		сам.лог.Паника(err != nil, "СловарьБотов.load(): при получении номера бота, ош=\n\t%v\n", err)
-		number := alias.БотНомер(iNumber)
+		number := АБотНомер(iNumber)
 		_, isOk := сам.словарь[number]
 		_, isOk := сам.словарь[number]
 		if isOk {
 		if isOk {
 			continue
 			continue

+ 4 - 4
server/lev2/serv_bots/serv_bots.go

@@ -5,8 +5,8 @@ import (
 	"fmt"
 	"fmt"
 	"log"
 	"log"
 
 
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
 	"wartank/server/lev2/serv_bots/dict_warbot"
 	"wartank/server/lev2/serv_bots/dict_warbot"
 	"wartank/server/lev2/serv_bots/warbot"
 	"wartank/server/lev2/serv_bots/warbot"
@@ -32,13 +32,13 @@ func НовБотоФерма(конт ИЯдроКонтекст) *БотоФе
 }
 }
 
 
 // Get -- возвращает боевого бота по имени
 // Get -- возвращает боевого бота по имени
-func (сам *БотоФерма) Get(botNumber alias.БотНомер) ИБот {
+func (сам *БотоФерма) Get(botNumber АБотНомер) ИБот {
 	bot := сам.словБот.Get(botNumber)
 	bot := сам.словБот.Get(botNumber)
 	return bot
 	return bot
 }
 }
 
 
 // BotStart -- запускает бота в работу по его имени
 // BotStart -- запускает бота в работу по его имени
-func (сам *БотоФерма) BotStart(botNumber alias.БотНомер) error {
+func (сам *БотоФерма) BotStart(botNumber АБотНомер) error {
 	bot := сам.словБот.Get(botNumber)
 	bot := сам.словБот.Get(botNumber)
 	if bot == nil {
 	if bot == nil {
 		return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", botNumber)
 		return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", botNumber)
@@ -62,7 +62,7 @@ func (сам *БотоФерма) НовБот(логин, пароль string,
 			}
 			}
 		}
 		}
 	}
 	}
-	номер := alias.БотНомер(len(сам.словБот.ListBot()) + 1)
+	номер := АБотНомер(len(сам.словБот.ListBot()) + 1)
 	фнНомерПровер := func() bool {
 	фнНомерПровер := func() bool {
 		for _, бот := range сам.словБот.ListBot() {
 		for _, бот := range сам.словБот.ListBot() {
 			if бот.Номер() == номер {
 			if бот.Номер() == номер {

+ 5 - 4
server/lev2/serv_bots/warbot/warbot.go

@@ -8,11 +8,11 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_dict"
 	"wartank/pkg/kernel/kernel_dict"
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_bool"
 	"wartank/pkg/kernel/safe_bool"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
 	"wartank/server/lev2/serv_bots/warbot/angar"
 	"wartank/server/lev2/serv_bots/warbot/angar"
 	"wartank/server/lev2/serv_bots/warbot/bot_stat/tank_stat"
 	"wartank/server/lev2/serv_bots/warbot/bot_stat/tank_stat"
@@ -38,7 +38,7 @@ type ВарБот struct {
 }
 }
 
 
 // ЗагрузитьВарБот -- загружает бота из базы
 // ЗагрузитьВарБот -- загружает бота из базы
-func ЗагрузитьВарБот(конт ИЯдроКонтекст, сервер ИСервер, номер alias.БотНомер) *ВарБот {
+func ЗагрузитьВарБот(конт ИЯдроКонтекст, сервер ИСервер, номер АБотНомер) *ВарБот {
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог.Инфо("ЗагрузитьВарБот()\n")
 	лог.Инфо("ЗагрузитьВарБот()\n")
 	лог.Паника(сервер == nil, "ЗагрузитьВарБот(): ИСервер ==nil")
 	лог.Паника(сервер == nil, "ЗагрузитьВарБот(): ИСервер ==nil")
@@ -69,7 +69,7 @@ func (сам *ВарБот) рестарт() {
 }
 }
 
 
 // НовВарБот -- возвращает новый WarBot
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(сервер ИСервер, номер alias.БотНомер, логин, пароль string, еслиАвто bool) *ВарБот {
+func НовВарБот(сервер ИСервер, номер АБотНомер, логин, пароль string, еслиАвто bool) *ВарБот {
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог.Инфо("НовВарБот()\n")
 	лог.Инфо("НовВарБот()\n")
 	лог.Паника(сервер == nil, "НовВарБот(): ИСервер == nil")
 	лог.Паника(сервер == nil, "НовВарБот(): ИСервер == nil")
@@ -108,6 +108,7 @@ func создатьЯдроВарБот(серв ИСервер, конфиг *w
 		фтОтмена:       fnCancel,
 		фтОтмена:       fnCancel,
 		лог:            лог,
 		лог:            лог,
 	}
 	}
+	сам.конт.Уст("бот", сам)
 	var err error
 	var err error
 	// WarBotNet
 	// WarBotNet
 	сам.сеть = warbot_net.НовВарБотСеть(конт, сам)
 	сам.сеть = warbot_net.НовВарБотСеть(конт, сам)
@@ -131,7 +132,7 @@ func (сам *ВарБот) ЕслиПуск() bool {
 }
 }
 
 
 // Номер -- возвращает номер бота
 // Номер -- возвращает номер бота
-func (сам *ВарБот) Номер() alias.БотНомер {
+func (сам *ВарБот) Номер() АБотНомер {
 	return сам.конфиг.Номер()
 	return сам.конфиг.Номер()
 }
 }
 
 

+ 7 - 6
server/lev2/serv_bots/warbot/warbot_config/warbot_config.go

@@ -4,16 +4,17 @@ package warbot_config
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"sync"
 	"sync"
-	"wartank/pkg/alias"
+
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
+	. "wartank/server/lev0/alias"
 )
 )
 
 
 // ВарБотКонфиг -- конфиг бота для хранения в базе
 // ВарБотКонфиг -- конфиг бота для хранения в базе
 type ВарБотКонфиг struct {
 type ВарБотКонфиг struct {
-	ЕслиАвтозапуск_ bool           `json:"is_auto_run,omitempty"` // Признак автостарта при загрузке
-	Логин_          string         `json:"login"`                 // Логин бота
-	Пароль_         string         `json:"password"`              // Пароль бота
-	Номер_          alias.БотНомер `json:"number"`                // Номер бота
+	ЕслиАвтозапуск_ bool      `json:"is_auto_run,omitempty"` // Признак автостарта при загрузке
+	Логин_          string    `json:"login"`                 // Логин бота
+	Пароль_         string    `json:"password"`              // Пароль бота
+	Номер_          АБотНомер `json:"number"`                // Номер бота
 	блок            sync.RWMutex
 	блок            sync.RWMutex
 }
 }
 
 
@@ -39,7 +40,7 @@ func (сам *ВарБотКонфиг) Логин() string {
 }
 }
 
 
 // Номер -- возвращает номер бота
 // Номер -- возвращает номер бота
-func (сам *ВарБотКонфиг) Номер() alias.БотНомер {
+func (сам *ВарБотКонфиг) Номер() АБотНомер {
 	сам.блок.RLock()
 	сам.блок.RLock()
 	defer сам.блок.RUnlock()
 	defer сам.блок.RUnlock()
 	return сам.Номер_
 	return сам.Номер_

+ 2 - 2
server/lev2/serv_web/serv_web.go

@@ -6,9 +6,9 @@ import (
 
 
 	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2"
 
 
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
 	"wartank/server/lev2/serv_web/web_api"
 	"wartank/server/lev2/serv_web/web_api"
 	"wartank/server/lev2/serv_web/web_gui"
 	"wartank/server/lev2/serv_web/web_gui"
@@ -42,7 +42,7 @@ func НовСервВеб(серв ИСервер) *СервВеб {
 }
 }
 
 
 type ПостБотСтат struct {
 type ПостБотСтат struct {
-	Номер alias.БотНомер `form:"bot_number"`
+	Номер АБотНомер `form:"bot_number"`
 }
 }
 
 
 // постБотСтат -- возвращает статистику бота
 // постБотСтат -- возвращает статистику бота

+ 19 - 90
server/lev2/serv_web/web_api/web_api.go

@@ -3,15 +3,13 @@ package web_api
 
 
 import (
 import (
 	"fmt"
 	"fmt"
-	"net/http"
 	"strings"
 	"strings"
-	"time"
 
 
 	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2"
 
 
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
 )
 )
 
 
@@ -30,8 +28,6 @@ func НовВебАпи(конт ИБотКонтекст) *ВебАпи {
 		лог:  лог,
 		лог:  лог,
 	}
 	}
 	файбер := конт.Получ("fiberApp").(*fiber.App)
 	файбер := конт.Получ("fiberApp").(*fiber.App)
-	файбер.Post("/api/login", сам.логин)
-	файбер.Post("/api/add_bot", сам.добавитьБота)
 	файбер.Get("/api/uptime", сам.аптаймСервер)
 	файбер.Get("/api/uptime", сам.аптаймСервер)
 	файбер.Get("/api/count_start", сам.стартНомер)
 	файбер.Get("/api/count_start", сам.стартНомер)
 
 
@@ -67,7 +63,7 @@ func (сам *ВебАпи) арсеналРаботаИмя(кнт *fiber.Ctx)
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 		return кнт.SendString("[Тип: нет такого бота]")
@@ -86,7 +82,7 @@ func (сам *ВебАпи) арсеналРежим(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 		return кнт.SendString("[Режим: нет такого бота]")
@@ -106,7 +102,7 @@ func (сам *ВебАпи) арсеналУровень(кнт *fiber.Ctx) erro
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 		return кнт.SendString("[Уровень: нет такого бота]")
@@ -126,7 +122,7 @@ func (сам *ВебАпи) арсеналВремяОсталось(кнт *fib
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 		return кнт.SendString("[Время: нет такого бота]")
@@ -146,7 +142,7 @@ func (сам *ВебАпи) арсеналЛог(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 		return кнт.SendString("[Время: нет такого бота]")
@@ -167,7 +163,7 @@ func (сам *ВебАпи) полигонВремяОсталось(кнт *fib
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 		return кнт.SendString("[Время: нет такого бота]")
@@ -187,7 +183,7 @@ func (сам *ВебАпи) полигонРаботаИмя(кнт *fiber.Ctx)
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 		return кнт.SendString("[Тип: нет такого бота]")
@@ -206,7 +202,7 @@ func (сам *ВебАпи) полигонРаботаКоличество(кн
 		сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Кол: нет такого бота]")
 		return кнт.SendString("[Кол: нет такого бота]")
@@ -226,7 +222,7 @@ func (сам *ВебАпи) полигонРежим(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 		return кнт.SendString("[Режим: нет такого бота]")
@@ -246,7 +242,7 @@ func (сам *ВебАпи) полигонУровень(кнт *fiber.Ctx) erro
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 		return кнт.SendString("[Уровень: нет такого бота]")
@@ -266,7 +262,7 @@ func (сам *ВебАпи) ангарСеребро(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Серебро: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Серебро: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Серебро: нет такого бота]")
 		return кнт.SendString("[Серебро: нет такого бота]")
@@ -286,7 +282,7 @@ func (сам *ВебАпи) танкТопливо(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Топливо: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Топливо: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Топливо: нет такого бота]")
 		return кнт.SendString("[Топливо: нет такого бота]")
@@ -306,7 +302,7 @@ func (сам *ВебАпи) шахтаРаботаИмя(кнт *fiber.Ctx) erro
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 		return кнт.SendString("[Тип: нет такого бота]")
@@ -325,7 +321,7 @@ func (сам *ВебАпи) шахтаРаботаКоличество(кнт *f
 		сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Кол: нет такого бота]")
 		return кнт.SendString("[Кол: нет такого бота]")
@@ -345,7 +341,7 @@ func (сам *ВебАпи) шахтаРежим(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 		return кнт.SendString("[Режим: нет такого бота]")
@@ -365,7 +361,7 @@ func (сам *ВебАпи) шахтаУровень(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 		return кнт.SendString("[Уровень: нет такого бота]")
@@ -385,7 +381,7 @@ func (сам *ВебАпи) шахтаЛог(кнт *fiber.Ctx) error {
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 		return кнт.SendString("[Время: нет такого бота]")
@@ -406,7 +402,7 @@ func (сам *ВебАпи) шахтаВремяОсталось(кнт *fiber.C
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
 		return кнт.SendString(сообщ)
 		return кнт.SendString(сообщ)
 	}
 	}
-	ботНомер := alias.БотНомер(номер)
+	ботНомер := АБотНомер(номер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 		return кнт.SendString("[Время: нет такого бота]")
@@ -428,70 +424,3 @@ func (сам *ВебАпи) стартНомер(кнт *fiber.Ctx) error {
 func (сам *ВебАпи) аптаймСервер(кнт *fiber.Ctx) error {
 func (сам *ВебАпи) аптаймСервер(кнт *fiber.Ctx) error {
 	return кнт.SendString("[Аптайм: " + сам.серв.Стат().ВремяВсего() + "]")
 	return кнт.SendString("[Аптайм: " + сам.серв.Стат().ВремяВсего() + "]")
 }
 }
-
-type AddBotRequest struct {
-	Логин_ string `json:"login" form:"login_bot"`
-	Пароль string `json:"password" form:"password_bot"`
-}
-
-// Запрос добавления нового бота на ботоферму
-func (сам *ВебАпи) добавитьБота(кнт *fiber.Ctx) error {
-	запрос := &AddBotRequest{}
-	if err := кнт.BodyParser(запрос); err != nil {
-		return кнт.Render("add_bot", fiber.Map{
-			"err": "ошибка в разборе формы",
-		})
-	}
-	сам.лог.Отладка("добавитьБота(): : %#+v\n", запрос)
-	if запрос.Логин_ == "" {
-		return кнт.Render("add_bot", fiber.Map{
-			"err": "пустой логин бота",
-		})
-	}
-	if запрос.Пароль == "" {
-		return кнт.Render("add_bot", fiber.Map{
-			"err": "пустой пароль бота",
-		})
-	}
-	if ош := сам.серв.ServBots().НовБот(запрос.Логин_, запрос.Пароль, true); ош != nil {
-		return кнт.Render("add_bot", fiber.Map{
-			"err": ош.Error(),
-		})
-	}
-	return кнт.Redirect("/gui/list_bot")
-}
-
-type LoginRequest struct {
-	Логин_            string `json:"login" form:"login"`
-	Пароль_           string `json:"password" form:"password"`
-	КонтрольноеСлово_ string `json:"control_word" form:"control_word"`
-}
-
-// Вызывается при попытке войти
-func (сам *ВебАпи) логин(кнт *fiber.Ctx) error {
-	запрос := new(LoginRequest)
-	if err := кнт.BodyParser(запрос); err != nil {
-		return кнт.JSON(fiber.Map{
-			"status": "ошибка в разборе формы",
-		})
-	}
-	сам.лог.Инфо("ВебАпи.логин(): : %#+v\n", *запрос)
-	if запрос.Логин_ == "" || запрос.Пароль_ == "" {
-		return кнт.Render("login", fiber.Map{
-			"err": "пустой логин/пароль",
-		})
-	}
-
-	if запрос.Логин_ != "svi" || запрос.Пароль_ != "Lera_07091978" {
-		return кнт.Render("login", fiber.Map{
-			"err": "ошибка логина/пароля",
-		})
-	}
-	кнт.Cookie(&fiber.Cookie{
-		Name:     "login",
-		Value:    "svi",
-		Expires:  time.Now().Add(24 * time.Hour),
-		HTTPOnly: true,
-	})
-	return кнт.Redirect("/gui/list_bot", http.StatusSeeOther)
-}

+ 81 - 0
server/lev2/serv_web/web_gui/page_bot_add/page_bot_add.go

@@ -0,0 +1,81 @@
+// package page_bot_add -- страница добавления бота
+package page_bot_add
+
+import (
+	_ "embed"
+	"net/http"
+
+	"github.com/gofiber/fiber/v2"
+
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/types"
+	"wartank/server/lev1/web_render"
+)
+
+// СтраницаДобавлениеБота -- страница добавления бота
+type СтраницаБотаДобавить struct {
+	лог    *kernel_log.Логгер
+	серв   ИСервер
+	рендер ИВебРендер
+}
+
+//go:embed page_bot_add.tmpl.html
+var стрБотДобавить string
+
+// НовСтраницаБотовДобавить
+func НовСтраницаБотовДобавить(конт ИЯдроКонтекст) *СтраницаБотаДобавить {
+	лог := kernel_log.НовЛоггер("СтраницаДобавлениеБота")
+	лог.Паника(конт == nil, "НовСтраницаБотовДобавить(): ИЯдроКонтекст==nil")
+	сам := &СтраницаБотаДобавить{
+		лог:    лог,
+		серв:   конт.Получ("сервер").(ИСервер),
+		рендер: web_render.НовВебРендер(стрБотДобавить),
+	}
+	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер.Get("/gui/bot/add", сам.кукиПроверить, сам.гетБотНов)
+	файбер.Post("/gui/bot/add", сам.кукиПроверить, сам.постДобавитьБота)
+	return сам
+}
+
+type AddBotRequest struct {
+	Логин_ string `form:"login_bot"`
+	Пароль string `form:"password_bot"`
+}
+
+// Запрос добавления нового бота на ботоферму
+func (сам *СтраницаБотаДобавить) постДобавитьБота(кнт *fiber.Ctx) error {
+	запрос := &AddBotRequest{}
+	if err := кнт.BodyParser(запрос); err != nil {
+		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
+	}
+	сам.лог.Отладка("добавитьБота(): : %#+v\n", запрос)
+	if запрос.Логин_ == "" {
+		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
+	}
+	if запрос.Пароль == "" {
+		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
+	}
+	if ош := сам.серв.ServBots().НовБот(запрос.Логин_, запрос.Пароль, true); ош != nil {
+		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
+	}
+	return кнт.Redirect("/", http.StatusSeeOther)
+}
+
+// Показывает страницу добавления бота
+func (сам *СтраницаБотаДобавить) гетБотНов(кнт *fiber.Ctx) error {
+	сам.лог.Отладка("СтраницаБотаДобавить.гетБотНов()\n")
+	кнт.Set("Content-type", "text/html; charset=utf8;")
+	стрРез := сам.рендер.Получ()
+	return кнт.SendString(стрРез)
+}
+
+// Проверка на куки
+func (сам *СтраницаБотаДобавить) кукиПроверить(кнт *fiber.Ctx) error {
+	сам.лог.Отладка("СтраницаБотаДобавить.кукиПроверить()\n")
+	имя := кнт.Cookies("login")
+	if имя != "svi" {
+		return кнт.Redirect("/gui/login", http.StatusSeeOther)
+	}
+	return кнт.Next()
+}

+ 4 - 10
web/tmpl/add_bot.tmpl.html → server/lev2/serv_web/web_gui/page_bot_add/page_bot_add.tmpl.html

@@ -1,7 +1,5 @@
-{{ define "add_bot" }}
-{{ template "header" . }}
-Страница добавления бота вартанк.
-<form action="/api/add_bot" method="POST" class="container border rounded">
+<h1>Страница добавления бота вартанк</h1>
+<form action="/gui/bot/add" method="get" class="container border rounded" hx-boost="false">
     <div class="row p-3">
     <div class="row p-3">
         <label for="login_bot" class="col-2 form-label text-right">Логин бота:</label>
         <label for="login_bot" class="col-2 form-label text-right">Логин бота:</label>
         <input class="col form-control" type="text" name="login_bot" id="login_bot" placeholder="login_bot">
         <input class="col form-control" type="text" name="login_bot" id="login_bot" placeholder="login_bot">
@@ -13,11 +11,7 @@
     </div>
     </div>
     <div class="row p-3">
     <div class="row p-3">
         <label class="col form-label text-right"></label>
         <label class="col form-label text-right"></label>
-        <input class="col-2 btn btn-primary" type="submit" value="Добавить">
+        <button class="col-2 btn btn-primary"
+        hx-post="/gui/bot/add" hx-target="#main">Добавить</button>
     </div>
     </div>
 </form>
 </form>
-{{ if .err }}
-<p>{{ .err }}</p>
-{{ end }}
-{{ template "footer" . }}
-{{end}}

+ 74 - 0
server/lev2/serv_web/web_gui/page_bot_list/page_bot_list.go

@@ -0,0 +1,74 @@
+// package page_bot_list -- страница списка ботов
+package page_bot_list
+
+import (
+	_ "embed"
+	"fmt"
+	"net/http"
+	"strings"
+
+	"github.com/gofiber/fiber/v2"
+
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/types"
+	"wartank/server/lev1/web_render"
+)
+
+// СтраницаЛогин -- страница списка ботов
+type СтраницаСписокБотов struct {
+	лог    *kernel_log.Логгер
+	серв   ИСервер
+	рендер ИВебРендер
+}
+
+//go:embed page_list_bot.tmpl.html
+var стрСписок string
+
+// НовСтраницаСписокБотов
+func НовСтраницаСписокБотов(конт ИЯдроКонтекст) *СтраницаСписокБотов {
+	лог := kernel_log.НовЛоггер("СтраницаСписокБотов")
+	лог.Паника(конт == nil, "НовСтраницаСписокБотов(): ИЯдроКонтекст==nil")
+	сам := &СтраницаСписокБотов{
+		лог:    лог,
+		серв:   конт.Получ("сервер").(ИСервер),
+		рендер: web_render.НовВебРендер(стрСписок),
+	}
+	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер.Get("/gui/bot", сам.кукиПроверить, сам.получСписокБотов)
+	return сам
+}
+
+var стрСсылкаШаблон = `
+<div>
+    <a href="/gui/bot/{.number}/state">{.name}</a><br><br>
+</div>
+`
+
+// Возвращает страницу логина
+func (сам *СтраницаСписокБотов) получСписокБотов(кнт *fiber.Ctx) error {
+	сам.лог.Отладка("СтраницаСписокБотов.получСписокБотов()\n")
+	кнт.Set("Content-type", "text/html; charset=utf8;")
+	списокБотов := сам.серв.ServBots().ListBot()
+	стрСсылки := ""
+	for _, бот := range списокБотов {
+		стрНомер := fmt.Sprint(бот.Номер())
+		стрНомер = strings.ReplaceAll(стрСсылкаШаблон, "{.number}", стрНомер)
+		стрНомер = strings.ReplaceAll(стрНомер, "{.name}", бот.Имя())
+		стрСсылки += стрНомер + "<br>\n"
+	}
+
+	сам.рендер.Доб("{.list_bot}", стрСсылки)
+	стрРез := сам.рендер.Получ()
+	return кнт.SendString(стрРез)
+}
+
+// Проверка на куки
+func (сам *СтраницаСписокБотов) кукиПроверить(кнт *fiber.Ctx) error {
+	сам.лог.Отладка("СтраницаСписокБотов.кукиПроверить()\n")
+	имя := кнт.Cookies("login")
+	if имя != "svi" {
+		return кнт.Redirect("/gui/login", http.StatusSeeOther)
+	}
+	return кнт.Next()
+}

+ 4 - 0
server/lev2/serv_web/web_gui/page_bot_list/page_list_bot.tmpl.html

@@ -0,0 +1,4 @@
+<h1>Страница списка ботов вартанк</h1>
+{.list_bot}
+<br>
+<a href="/gui/bot/add">Добавить бота</a>

+ 2 - 9
web/tmpl/login.tmpl.html → server/lev2/serv_web/web_gui/page_login/login.tmpl.html

@@ -1,9 +1,7 @@
-{{ define "login" }}
-{{ template "header" . }}
 <h1>Логин на сервер</h1>
 <h1>Логин на сервер</h1>
 
 
 <!-- Форма логина -->
 <!-- Форма логина -->
-<form action="/api/login" method="POST" class="container border rounded">
+<form action="/gui/login" method="POST" class="container border rounded">
     <div class="row p-3">
     <div class="row p-3">
         <label for="login" class="col-2 form-label text-right">Логин:</label>
         <label for="login" class="col-2 form-label text-right">Логин:</label>
         <input type="text" id="login" name="login" id="login" class="col form-control" placeholder="admin"><br><br>
         <input type="text" id="login" name="login" id="login" class="col form-control" placeholder="admin"><br><br>
@@ -21,9 +19,4 @@
     </div>
     </div>
 </form>
 </form>
 
 
-{{ if .err }}
-<p>{{ .err }}</p>
-{{ end }}
-
-{{ template "footer" . }}
-{{end}}
+<p>{.err}</p>

+ 76 - 0
server/lev2/serv_web/web_gui/page_login/page_login.go

@@ -0,0 +1,76 @@
+// package page_login -- страница логина
+package page_login
+
+import (
+	_ "embed"
+	"net/http"
+	"time"
+
+	"github.com/gofiber/fiber/v2"
+
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/types"
+	"wartank/server/lev1/web_render"
+)
+
+// СтраницаЛогин -- страница логина
+type СтраницаЛогин struct {
+	лог    *kernel_log.Логгер
+	рендер ИВебРендер
+}
+
+//go:embed login.tmpl.html
+var стрЛогин string
+
+// НовСтраницаЛогин
+func НовСтраницаЛогин(конт ИЯдроКонтекст) *СтраницаЛогин {
+	лог := kernel_log.НовЛоггер("СтраницаЛогин")
+	лог.Паника(конт == nil, "НовСтраницаЛогин(): ИЯдроКонтекст==nil")
+	сам := &СтраницаЛогин{
+		лог:    лог,
+		рендер: web_render.НовВебРендер(стрЛогин),
+	}
+	сам.рендер.Доб("{.err}", "")
+	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер.Get("/gui/login", сам.получЛогин)
+	файбер.Post("/gui/login", сам.постЛогин)
+	return сам
+}
+
+// Возвращает страницу логина
+func (сам *СтраницаЛогин) получЛогин(кнт *fiber.Ctx) error {
+	сам.лог.Отладка("СтраницаЛогин.логин()\n")
+	кнт.Set("Content-type", "text/html; charset=utf8;")
+	стрРез := сам.рендер.Получ()
+	return кнт.SendString(стрРез)
+}
+
+type LoginRequest struct {
+	Логин_            string `form:"login"`
+	Пароль_           string `form:"password"`
+	КонтрольноеСлово_ string `form:"control_word"`
+}
+
+// Вызывается при попытке войти
+func (сам *СтраницаЛогин) постЛогин(кнт *fiber.Ctx) error {
+	запрос := new(LoginRequest)
+	if err := кнт.BodyParser(запрос); err != nil {
+		return кнт.Redirect("/gui/login", http.StatusSeeOther)
+	}
+	сам.лог.Инфо("СтраницаЛогин.логин(): : %#+v\n", *запрос)
+	if запрос.Логин_ == "" || запрос.Пароль_ == "" {
+		return кнт.Redirect("/gui/login", http.StatusSeeOther)
+	}
+
+	if запрос.Логин_ != "svi" || запрос.Пароль_ != "Lera_07091978" {
+		return кнт.Redirect("/gui/login", http.StatusSeeOther)
+	}
+	кнт.Cookie(&fiber.Cookie{
+		Name:     "login",
+		Value:    "svi",
+		Expires:  time.Now().Add(24 * time.Hour),
+		HTTPOnly: true,
+	})
+	return кнт.Redirect("/gui/bot", http.StatusSeeOther)
+}

+ 10 - 38
server/lev2/serv_web/web_gui/web_gui.go

@@ -8,10 +8,13 @@ import (
 
 
 	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2"
 
 
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_log"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	. "wartank/pkg/kernel/kernel_types"
+	. "wartank/server/lev0/alias"
 	. "wartank/server/lev0/types"
 	. "wartank/server/lev0/types"
+	"wartank/server/lev2/serv_web/web_gui/page_bot_add"
+	"wartank/server/lev2/serv_web/web_gui/page_bot_list"
+	"wartank/server/lev2/serv_web/web_gui/page_login"
 )
 )
 
 
 // ВебГип -- веб-сервер для графики
 // ВебГип -- веб-сервер для графики
@@ -23,17 +26,17 @@ type ВебГуи struct {
 // НовВебГуи -- возвращает новый веб-сервер для графики
 // НовВебГуи -- возвращает новый веб-сервер для графики
 func НовВебГуи(конт ИЯдроКонтекст) *ВебГуи {
 func НовВебГуи(конт ИЯдроКонтекст) *ВебГуи {
 	лог := kernel_log.НовЛоггер("ВебГуи")
 	лог := kernel_log.НовЛоггер("ВебГуи")
-	лог.Паника(конт == nil, "НовВебГуи(): ИВебСервер==nil")
+	лог.Паника(конт == nil, "НовВебГуи(): ИЯдроКонтекст==nil")
 	сам := &ВебГуи{
 	сам := &ВебГуи{
 		серв: конт.Получ("сервер").(ИСервер),
 		серв: конт.Получ("сервер").(ИСервер),
 		лог:  лог,
 		лог:  лог,
 	}
 	}
 	файбер := конт.Получ("fiberApp").(*fiber.App)
 	файбер := конт.Получ("fiberApp").(*fiber.App)
 	файбер.Get("/", сам.индекс)
 	файбер.Get("/", сам.индекс)
-	файбер.Get("/gui/login", сам.логин)
-	файбер.Get("/gui/list_bot", сам.кукиПроверить, сам.списокБотов)
-	файбер.Get("/gui/add_bot", сам.кукиПроверить, сам.гетБотНов)
 	файбер.Get("/gui/bot/:number/state", сам.кукиПроверить, сам.состояниеБота)
 	файбер.Get("/gui/bot/:number/state", сам.кукиПроверить, сам.состояниеБота)
+	_ = page_login.НовСтраницаЛогин(конт)
+	_ = page_bot_list.НовСтраницаСписокБотов(конт)
+	_ = page_bot_add.НовСтраницаБотовДобавить(конт)
 	return сам
 	return сам
 }
 }
 
 
@@ -48,7 +51,7 @@ func (сам *ВебГуи) состояниеБота(кнт *fiber.Ctx) error
 			"err":   fmt.Sprintf("ВебГуи.состояниеБота(): ошибка декодирования имени бота: %v", ош.Error()),
 			"err":   fmt.Sprintf("ВебГуи.состояниеБота(): ошибка декодирования имени бота: %v", ош.Error()),
 		})
 		})
 	}
 	}
-	ботНомер := alias.БотНомер(иНомер)
+	ботНомер := АБотНомер(иНомер)
 	сам.лог.Отладка("ВебГуи.состояниеБота(): ботНомер=%d\n", стрНомер)
 	сам.лог.Отладка("ВебГуи.состояниеБота(): ботНомер=%d\n", стрНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	бот := сам.серв.ServBots().Get(ботНомер)
 	if бот == nil {
 	if бот == nil {
@@ -94,28 +97,6 @@ func (сам *ВебГуи) состояниеБота(кнт *fiber.Ctx) error
 	})
 	})
 }
 }
 
 
-// Показывает страницу добавления бота
-func (сам *ВебГуи) гетБотНов(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("ВебГуи.гетБотНов()\n")
-	return кнт.Render("add_bot", fiber.Map{
-		"Title": "WarTank",
-	})
-}
-
-// Возвращает страницу со списком ботов
-func (сам *ВебГуи) списокБотов(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("ВебГуи.списокБотов()\n")
-	списокБотов := сам.серв.ServBots().ListBot()
-	списокБот := make(map[alias.БотНомер]string, 0)
-	for _, бот := range списокБотов {
-		списокБот[бот.Номер()] = бот.Имя()
-	}
-	return кнт.Render("list_bot", fiber.Map{
-		"Title": "WarTank",
-		"bots":  списокБот,
-	})
-}
-
 // Возвращает индексную страницу
 // Возвращает индексную страницу
 func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
 func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
 	сам.лог.Отладка("ВебГуи.индекс()\n")
 	сам.лог.Отладка("ВебГуи.индекс()\n")
@@ -123,16 +104,7 @@ func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
 	if имя != "svi" {
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)
 	}
 	}
-	return кнт.Redirect("/gui/list_bot", http.StatusSeeOther)
-}
-
-// Возвращает страницу логина
-func (сам *ВебГуи) логин(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("ВебГуи.логин()\n")
-	return кнт.Render("login", fiber.Map{
-		"Title": "WarTank",
-		"err":   "Неправильный логин",
-	})
+	return кнт.Redirect("/gui/bot", http.StatusSeeOther)
 }
 }
 
 
 // Проверка на куки
 // Проверка на куки

+ 0 - 8
web/tmpl/index.tmpl.html

@@ -1,8 +0,0 @@
-{{ define "index" }}
-{{ template "header" . }}
-<h1>Стартовая страница игры вартанк</h1>
-
-С возвращением, SVI!
-
-{{ template "footer" . }}
-{{end}}

+ 0 - 20
web/tmpl/list_bot.tmpl.html

@@ -1,20 +0,0 @@
-{{ define "list_bot" }}
-<!-- web/tmpl/list_bot.tmpl.html -->
-{{ template "header" . }}
-<h1>Страница списка ботов вартанк</h1>
-{{ range $number, $name := .bots }}
-<div>
-    <a href="/gui/bot/{{ $number }}/state">{{ $name }}</a><br><br>
-</div>
-{{ else }}
-Нет ботов
-{{ end }}
-<br>
-<a href="/gui/add_bot">Добавить бота</a>
-
-{{ if .err }}
-<p>{{ .err }}</p>
-{{ end }}
-
-{{ template "footer" . }}
-{{end}}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно