Pārlūkot izejas kodu

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

SVI 1 gadu atpakaļ
vecāks
revīzija
65a39bdcfb
100 mainītis faili ar 925 papildinājumiem un 2473 dzēšanām
  1. 1 1
      app/lev0/proc/proc_fuel_attack/proc_fuel_attack.go
  2. 12 11
      app/lev0/proc/proc_fuel_find/proc_fuel_find.go
  3. 4 2
      app/lev0/types/iapp.go
  4. 2 2
      app/lev0/types/iarena_market.go
  5. 4 1
      app/lev0/types/ibattle_health.go
  6. 1 1
      app/lev0/types/ibattle_manevr.go
  7. 3 3
      app/lev0/types/ibattle_process.go
  8. 3 7
      app/lev0/types/ibot.go
  9. 4 2
      app/lev0/types/ibot_context.go
  10. 3 6
      app/lev0/types/ibot_net.go
  11. 2 2
      app/lev0/types/iprocess.go
  12. 28 29
      app/lev1/health/health.go
  13. 34 33
      app/lev1/manevr/manevr.go
  14. 4 4
      app/lev1/product/parser_time/parser_time.go
  15. 9 8
      app/lev1/product/product.go
  16. 20 19
      app/lev1/shot/shot.go
  17. 1 1
      app/lev1/shot/shot_time/shot_time.go
  18. 17 13
      app/lev1/stat_param/stat_param.go
  19. 7 5
      app/lev1/web_render/web_render.go
  20. 9 8
      app/lev1/wrag/wrag.go
  21. 7 6
      app/lev2/arena/arena.go
  22. 10 10
      app/lev2/arena/arena_angar/arena_angar.go
  23. 17 23
      app/lev2/arena/arena_arsenal/arena_arsenal.go
  24. 2 2
      app/lev2/arena/arena_bank/arena_bank.go
  25. 1 1
      app/lev2/arena/arena_bank/bank_mode/bank_mode.go
  26. 5 5
      app/lev2/arena/arena_base/arena_base.go
  27. 4 4
      app/lev2/arena/arena_battle/arena_battle.go
  28. 4 4
      app/lev2/arena/arena_battle/battle_worker/battle_worker.go
  29. 23 10
      app/lev2/arena/arena_battle/battle_worker/battle_worker/battle_worker.go
  30. 27 12
      app/lev2/arena/arena_battle/battle_worker/battleon/battleon.go
  31. 11 10
      app/lev2/arena/arena_context/arena_context.go
  32. 2 2
      app/lev2/arena/arena_convoy/arena_convoy.go
  33. 7 6
      app/lev2/arena/arena_death/arena_death.go
  34. 3 2
      app/lev2/arena/arena_death/death_register/death_register.go
  35. 3 2
      app/lev2/arena/arena_death/death_wait/death_wait.go
  36. 2 2
      app/lev2/arena/arena_death/death_worker/death_worker.go
  37. 2 2
      app/lev2/arena/arena_death/death_worker/process_death/process_death.go
  38. 4 4
      app/lev2/arena/arena_death/death_worker/process_death/shot/shot.go
  39. 12 11
      app/lev2/arena/arena_division/div_war/div_war.go
  40. 18 17
      app/lev2/arena/arena_division/div_war/process_divwar/process_divwar.go
  41. 15 14
      app/lev2/arena/arena_division/divwar/div_war_on/div_war_on.go
  42. 8 8
      app/lev2/arena/arena_division/divwar/divwar.go
  43. 25 19
      app/lev2/arena/arena_division/divwar/divwaron/divwaron.go
  44. 1 1
      app/lev2/arena/arena_duel/arena_duel.go
  45. 1 1
      app/lev2/arena/arena_laborator/arena_laborator.go
  46. 5 5
      app/lev2/arena/arena_market/arena_market.go
  47. 10 8
      app/lev2/arena/arena_masters/arena_masters.go
  48. 1 1
      app/lev2/arena/arena_missions/arena_missions.go
  49. 11 9
      app/lev2/arena/arena_net/arena_net.go
  50. 9 8
      app/lev2/arena/arena_net/arena_web_worker/arena_web_worker.go
  51. 21 28
      app/lev2/arena/arena_polygon/arena_polygon.go
  52. 6 4
      app/lev2/arena/arena_string/arena_string.go
  53. 13 11
      app/lev2/arena/arena_upgrade/arena_upgrade.go
  54. 23 22
      app/lev2/arena/down_time/down_time.go
  55. 45 42
      app/lev3/bot/bot.go
  56. 6 4
      app/lev3/bot/bot_config/bot_config.go
  57. 7 6
      app/lev3/bot/bot_net/bot_cookie/bot_cookie.go
  58. 16 24
      app/lev3/bot/bot_net/bot_net.go
  59. 18 16
      app/lev3/bot/bot_net/bot_net_login/bot_net_login.go
  60. 20 17
      app/lev3/bot/bot_net/bot_net_stat/net_stat.go
  61. 17 14
      app/lev3/bot/bot_net/http_worker/http_worker.go
  62. 10 9
      app/lev3/bot/bot_net/http_worker/net_stat/net_stat.go
  63. 16 14
      app/lev3/farm_bots/dict_bot/dict_bot.go
  64. 6 5
      app/lev3/farm_bots/farm_bots.go
  65. 17 16
      app/lev3/serv_web/serv_web.go
  66. 41 24
      app/lev3/serv_web/web_api/web_api.go
  67. 12 11
      app/lev3/serv_web/web_gui/page_bot_add/page_bot_add.go
  68. 11 10
      app/lev3/serv_web/web_gui/page_bot_list/page_bot_list.go
  69. 16 15
      app/lev3/serv_web/web_gui/page_bot_show/page_bot_show.go
  70. 10 9
      app/lev3/serv_web/web_gui/page_login/page_login.go
  71. 11 10
      app/lev3/serv_web/web_gui/web_gui.go
  72. 15 13
      app/lev3/server_stat/server_stat.go
  73. 15 14
      app/lev4/applic/applic.go
  74. 7 12
      app/lev4/build/build.go
  75. 76 0
      doc/svi.md
  76. 11 6
      go.mod
  77. 41 95
      go.sum
  78. 0 21
      kernel/helpers/helper.go
  79. 0 56
      kernel/helpers/helpers.go
  80. 0 119
      kernel/helpers/helpers_test.go
  81. 0 5
      kernel/internal/kernel_alias/kermel_alias.go
  82. 0 7
      kernel/internal/kernel_alias/kernel_alias_test.go
  83. 0 90
      kernel/internal/kernel_ctx/kernel_ctx.go
  84. 0 45
      kernel/internal/kernel_ctx/kernel_ctx_test.go
  85. 0 64
      kernel/internal/kernel_ctx/kernel_keeper/kernel_keeper_test.go
  86. 0 123
      kernel/internal/kernel_ctx/kernel_wg/kernel_wg.go
  87. 0 149
      kernel/internal/kernel_ctx/kernel_wg/kernel_wg_test.go
  88. 0 37
      kernel/internal/kernel_dict/kernel_dict.go
  89. 0 60
      kernel/internal/kernel_log/logger.go
  90. 0 115
      kernel/internal/kernel_serv_http/kernel_serv_http.go
  91. 0 95
      kernel/internal/kernel_serv_http/kernel_serv_http_test.go
  92. 0 180
      kernel/internal/kernel_store/kernel_store.go
  93. 0 143
      kernel/internal/kernel_store/kernel_store_test.go
  94. 0 41
      kernel/internal/safe_bool/safe_bool.go
  95. 0 58
      kernel/internal/safe_bool/safe_bool_test.go
  96. 0 67
      kernel/internal/safe_bool_observer/safe_bool_observer.go
  97. 0 45
      kernel/internal/safe_int/safe_int.go
  98. 0 45
      kernel/internal/safe_int/safe_int_test.go
  99. 0 44
      kernel/internal/safe_string/safe_string.go
  100. 0 46
      kernel/internal/safe_string/safe_string_test.go

+ 1 - 1
app/lev0/proc/proc_fuel_attack/proc_fuel_attack.go

@@ -22,7 +22,7 @@ type ТопливоБой struct {
 
 // НовТопливоБой -- возвращает новый *ТопливоБойNet
 func НовТопливоБой(конт ИБотКонтекст, ангар ИАренаАнгар) (*ТопливоБой, error) {
-	хттпВоркер := конт.Получ("хттпВоркер").(ИХттпВоркер)
+	хттпВоркер := конт.Get("хттпВоркер").(ИХттпВоркер)
 	сам := &ТопливоБой{
 		ангар:  ангар,
 		клиент: хттпВоркер,

+ 12 - 11
app/lev0/proc/proc_fuel_find/proc_fuel_find.go

@@ -6,29 +6,30 @@ import (
 	"strings"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // Топливо -- процесс поиска топлива в баке +1 каждые 15 сек
 type ПроцессТопливоНайти struct {
 	ИАренаАнгар
-	лог     ИЯдроЛог
+	лог     ILogBuf
 	топливо ИСтатПарам
 }
 
 // НовТопливо -- возвращает новый топливный бак
 func НовПроцессТопливоНайти(конт ИБотКонтекст) ИПроцессТопливоНайти {
-	лог := kernel.НовЛог("ПроцессТопливоНайти")
-	лог.Отладка("НовПроцессТопливоНайти\n")
+
 	сам := &ПроцессТопливоНайти{
-		ИАренаАнгар: конт.Получ("ангар").(ИАренаАнгар),
-		лог:лог,
-		топливо:     stat_param.НовСтатПарам("топливо"),
+		ИАренаАнгар: конт.Get("ангар").(ИАренаАнгар),
+		лог:         NewLogBuf(),
+		топливо:     stat_param.НовСтатПарам_("топливо"),
 	}
-	конт.Уст("проц_поиск_топливо", сам)
+	сам.лог.Debug("НовПроцессТопливоНайти\n")
+	конт.Set("проц_поиск_топливо", сам, "Процесс поиска топлива")
 	return сам
 }
 
@@ -60,11 +61,11 @@ func (сам *ПроцессТопливоНайти) Обновить() {
 	lstFuel := strings.Split(strOut, `<img title="Топливо" alt="Топливо" src="/images/icons/fuel.png?2"/> `)
 	// Здесь бывает ошибка (когда возвращена пустая строка)
 	if len(lstFuel) != 2 {
-		сам.лог.Ошибка("Обновить(): бот=%q, при поиске строки топлива, стр=\n\t%v\n", сам.Бот().Имя(), strOut)
+		сам.лог.Err("Обновить(): бот=%q, при поиске строки топлива, стр=\n\t%v\n", сам.Бот().Имя(), strOut)
 		return
 	}
 	if lstFuel[1] == "" {
-		сам.лог.Ошибка("Обновить(): %q, пустое значение в строке топлива, стр=\n\t%v\n", сам.Бот().Имя(), strOut)
+		сам.лог.Err("Обновить(): %q, пустое значение в строке топлива, стр=\n\t%v\n", сам.Бот().Имя(), strOut)
 		return
 	}
 	strFuel := lstFuel[1]

+ 4 - 2
app/lev0/types/iapp.go

@@ -1,6 +1,8 @@
 package types
 
-import "wartank/kernel/kernel_types"
+import (
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
 
 /*
 	Интерфейс для приложения
@@ -8,7 +10,7 @@ import "wartank/kernel/kernel_types"
 
 // ИСервер -- интерфейс для приложения
 type ИПриложение interface {
-	kernel_types.ИЯдроКонтекст
+	IKernelCtx
 	// Пуск -- запускает приложение в работу
 	Пуск()
 	// ServBots -- словарь имеющихся ботов

+ 2 - 2
app/lev0/types/iarena_market.go

@@ -1,6 +1,6 @@
 package types
 
 // ИАренаРынок -- интерфейс к рынку
-type ИАренаРынок interface{
+type ИАренаРынок interface {
 	ИАрена
-}
+}

+ 4 - 1
app/lev0/types/ibattle_health.go

@@ -1,4 +1,7 @@
 package types
 
 // ИЗдоровье -- интерфейс к здоровью танка
-type ИЗдоровье interface{}
+type ИЗдоровье interface {
+	// ЕслиУбит -- возвращает признак убитости
+	ЕслиУбит() bool
+}

+ 1 - 1
app/lev0/types/ibattle_manevr.go

@@ -5,7 +5,7 @@ type ИМанёвр interface {
 	// УстНадо -- требование манёвра
 	УстНадо()
 	// ЕслиГотов -- возвращает признак готовности к манёвру
-	ЕслиГотов()bool
+	ЕслиГотов() bool
 	// Выполнить -- выполняет манёвр, если доступно
 	Выполнить()
 }

+ 3 - 3
app/lev0/types/ibattle_process.go

@@ -1,7 +1,7 @@
 package types
 
 import (
-	. "wartank/kernel/kernel_types"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -12,9 +12,9 @@ import (
 type ИСражениеПроцесс interface {
 	ИАрена
 	// Манёвр -- выполняет манёвр по требованию
-	Манёвр()ИМанёвр
+	Манёвр() ИМанёвр
 	// ЕслиКонец -- признак окончания битвы дивизий
-	ЕслиКонец() ИБезопБул
+	ЕслиКонец() ISafeBool
 	// Выстрел -- объект маскировки
 	Выстрел() ИВыстрел
 }

+ 3 - 7
app/lev0/types/ibot.go

@@ -1,10 +1,8 @@
 package types
 
 import (
-	"context"
-
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 	. "wartank/app/lev0/alias"
-	. "wartank/kernel/kernel_types"
 )
 
 // ИБот -- серверный бот с реальным состоянием
@@ -24,13 +22,11 @@ type ИБот interface {
 	// Пуск -- запускает бота в работу
 	Пуск()
 	// Автозапуск -- возвращает признак автоматического начала игры
-	Автозапуск() ИБезопБулНаблюд
+	Автозапуск() ISafeBoolReact
 	// ЕслиРабота -- признак, что бот работает
 	ЕслиРабота() bool
-	// Контекст -- возвращает контекст бота
-	Контекст() context.Context
 	// Закончить -- отменяет контекст бота
 	Закончить()
 	//  КонтБот -- возвращает контекст бота
-	КонтБот() ИБотКонтекст
+	КонтБот() ILocalCtx
 }

+ 4 - 2
app/lev0/types/ibot_context.go

@@ -1,8 +1,10 @@
 package types
 
-import "wartank/kernel/kernel_types"
+import (
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
 
 // ИБотКонтекст -- контекст бота
 type ИБотКонтекст interface {
-	kernel_types.ИЯдроСловарь
+	ILocalCtx
 }

+ 3 - 6
app/lev0/types/ibot_net.go

@@ -1,8 +1,7 @@
 package types
 
 import (
-	"context"
-	. "wartank/kernel/kernel_types"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -12,15 +11,13 @@ import (
 // ИБотСеть -- интерфейс к сетевому клиенту
 type ИБотСеть interface {
 	// ЕслиОнлайн -- возвращает признак подключенности к интернету
-	ЕслиОнлайн() ИБезопБул
+	ЕслиОнлайн() ISafeBool
 	// Куки -- возвращает объект кукисов
 	Куки() ИБотКуки
 	// ВебВоркер -- возвращает веб-воркер бота
 	ВебВоркер() ИХттпВоркер
 	// Контекст -- контекст сетевого клиента
-	Контекст() context.Context
-	// Отмена -- вызывает отмену контекста сетевого клиента бота
-	Отмена()
+	Контекст() ILocalCtx
 	// Бот -- возвращает ссылку на бота
 	Бот() ИБот
 }

+ 2 - 2
app/lev0/types/iprocess.go

@@ -1,7 +1,7 @@
 package types
 
 // ИПроцесс -- интерфейс процесса
-type ИПроцесс interface{
+type ИПроцесс interface {
 	// Пуск -- выполняет себя
 	Пуск()
-}
+}

+ 28 - 29
app/lev1/health/health.go

@@ -1,7 +1,6 @@
 package health
 
 import (
-	"context"
 
 	// "log"
 	// "strconv"
@@ -13,9 +12,9 @@ import (
 	"wartank/app/lev1/repair_time"
 
 	// "wartank/internal/components/sound"
-	"wartank/kernel"
-	. "wartank/kernel/helpers"
-	. "wartank/kernel/kernel_types"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -28,27 +27,27 @@ type Здоровье struct {
 	fnCancel         func()
 	temp             *health_time.HealthTime // Изменяемое здоровье танка
 	full             *health_time.HealthTime // Полное здоровье танка
-	isRepair         ИБезопБул               // Необходимость восстановления
+	isRepair         ISafeBool               // Необходимость восстановления
 	repairTime       *repair_time.RepairTime // Время до восстановления
-	isEnd            ИБезопБул               // Ссылка на признак конца сражения
+	isEnd            ISafeBool               // Ссылка на признак конца сражения
 	login            string                  // Для поиска контрольных строк
 	chTick           chan int                // Канал для ровной отправки тиков
 	// deltaOld                    int                    // Старая дельта потери здоровья
 	// countLow                    int
-	ctxBattle context.Context // Контекст сражения
+	ctxBattle ILocalCtx // Контекст сражения
 }
 
 // НовЗдоровье -- возвращает новый *Health
 func НовЗдоровье(проц ИСражениеПроцесс) *Здоровье {
-	Паника(проц!=nil, "НовЗдоровье(): ИСражениеПроцесс == nil")
-	логин:=проц.Бот().Имя()
+	Hassert(проц != nil, "НовЗдоровье(): ИСражениеПроцесс == nil")
+	логин := проц.Бот().Имя()
 	сам := &Здоровье{
 		ИСражениеПроцесс: проц,
 		fnCancel:         проц.Отменить,
-		ctxBattle:        проц.Бот().Контекст(),
+		ctxBattle:        проц.Бот().КонтБот(),
 		temp:             health_time.NewHealthTime(),
 		full:             health_time.NewHealthTime(),
-		isRepair:         kernel.НовБезопБул(),
+		isRepair:         NewSafeBool(),
 		repairTime:       repair_time.NewRepairTime(),
 		isEnd:            проц.ЕслиКонец(),
 		login:            логин,
@@ -62,7 +61,7 @@ func НовЗдоровье(проц ИСражениеПроцесс) *Здор
 // Отправляет тики с заданным равным интервалом
 func (сам *Здоровье) makeTik() {
 	defer func() {
-		сам.Отменить()
+		сам.fnCancel()
 		close(сам.chTick)
 		// log._rintf("Health.makeTick(): сражение завершёно\n")
 	}()
@@ -70,10 +69,10 @@ func (сам *Здоровье) makeTik() {
 	repairTime := 0
 	for {
 		select {
-		case <-сам.ctxBattle.Done():
+		case <-сам.ctxBattle.Ctx().Done():
 			return
 		default:
-			if сам.IsDeath() {
+			if сам.ЕслиУбит() {
 				return
 			}
 			if сам.repairTime.Get() == repairTime {
@@ -96,8 +95,8 @@ func (сам *Здоровье) makeTik() {
 func (сам *Здоровье) run() {
 	for {
 		select {
-		case <-сам.ctxBattle.Done():
-			сам.isEnd.Уст()
+		case <-сам.ctxBattle.Ctx().Done():
+			сам.isEnd.Set()
 			return
 		case <-сам.chTick:
 			// if err := сам.findHealth(); err != nil { // Найти свой здоровье
@@ -105,12 +104,12 @@ func (сам *Здоровье) run() {
 			// }
 			сам.findRepairTime()
 			if сам.Выстрел().ЕслиБлок() {
-				if сам.isRepair.Получ() {
+				if сам.isRepair.Get() {
 					go сам.repair()
 				}
 				continue
 			}
-			if сам.isRepair.Получ() {
+			if сам.isRepair.Get() {
 				go сам.repair()
 			}
 		}
@@ -122,9 +121,9 @@ func (сам *Здоровье) Full() int {
 	return сам.full.Get()
 }
 
-// IsDeath -- возвращает признак мертвичины танка
-func (сам *Здоровье) IsDeath() bool {
-	if сам.isEnd.Получ() {
+// ЕслиУбит -- возвращает признак мертвичины танка
+func (сам *Здоровье) ЕслиУбит() bool {
+	if сам.isEnd.Get() {
 		сам.fnCancel()
 		return true
 	}
@@ -133,12 +132,12 @@ func (сам *Здоровье) IsDeath() bool {
 		if strings.Contains(strOut, `>Ваш танк подбит.`) {
 			// log._rintf("INFO Health.repair(): танк подбит\n")
 			сам.temp.Set(0)
-			сам.isEnd.Уст()
-			сам.Отменить()
+			сам.isEnd.Set()
+			сам.fnCancel()
 			return true
 		}
 	}
-	return сам.isEnd.Получ()
+	return сам.isEnd.Get()
 }
 
 // Ищет время восстановления ремки
@@ -179,8 +178,8 @@ func (сам *Здоровье) findRepairTime() {
 	lstTime := strings.Split(strOut, `ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>`)
 	if len(lstTime) < 2 {
 		// log._rintf("ERRO Health.findRepair(): при попытке получить ссылку на ремонт, strOut=\n%v\n", strOut)
-		сам.isEnd.Уст()
-		сам.Отменить()
+		сам.isEnd.Set()
+		сам.fnCancel()
 		return
 	}
 	// strTime := lstTime[1]
@@ -219,13 +218,13 @@ func (сам *Здоровье) repair() {
 	lstBattleOn, err := сам.Сеть().Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO Health.repair(): при выполнении GET-команды ремонта, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
-		сам.Отменить()
+		сам.isEnd.Set()
+		сам.fnCancel()
 		return
 	}
 	if err = сам.СтрОбновить(lstBattleOn); err != nil {
 		// log._rintf("ERRO Health.repair(): при обновлении lstBattle, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
+		сам.isEnd.Set()
 		сам.Отменить()
 		return
 	}

+ 34 - 33
app/lev1/manevr/manevr.go

@@ -8,10 +8,12 @@ import (
 	"time"
 
 	"wartank/app/lev1/repair_time"
-	"wartank/kernel"
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -21,26 +23,25 @@ import (
 // манёвр -- маневрирует после выстрела
 type манёвр struct {
 	ИСражениеПроцесс // FIXME:
-	лог              ИЯдроЛог
-	isEnd            ИБезопБул
+	лог              ILogBuf
+	isEnd            ISafeBool
 	ctxEnd           context.Context
-	еслиНадо         ИБезопБул
-	еслиГотов        ИБезопБул               // Возможность выполнить манёвр
+	еслиНадо         ISafeBool
+	еслиГотов        ISafeBool               // Возможность выполнить манёвр
 	manevrTime       *repair_time.RepairTime // Время до восстановления манёвра
 	chTick           chan int                // Тики для поиска маневра
 }
 
 // НовМанёвр -- возвращает новый манёвр
 func НовМанёвр(проц ИСражениеПроцесс) ИМанёвр {
-	лог := kernel.НовЛог("манёвр")
-	лог.Паника(проц != nil, "НовМанёвр(): ИСражениеПроцесс==nil")
+	Hassert(проц != nil, "НовМанёвр(): ИСражениеПроцесс==nil")
 	сам := &манёвр{
 		ИСражениеПроцесс: проц,
-		лог:              лог,
+		лог:              проц.Бот().КонтБот().Log(),
 		ctxEnd:           проц.Контекст(),
-		еслиНадо:         kernel.НовБезопБул(),
+		еслиНадо:         NewSafeBool(),
 		isEnd:            проц.ЕслиКонец(),
-		еслиГотов:        kernel.НовБезопБул(),
+		еслиГотов:        NewSafeBool(),
 		manevrTime:       repair_time.NewRepairTime(),
 		chTick:           make(chan int, 1),
 	}
@@ -52,12 +53,12 @@ func НовМанёвр(проц ИСражениеПроцесс) ИМанёв
 
 // ЕслиГотов -- возвращает признак готовности к манёвру
 func (сам *манёвр) ЕслиГотов() bool {
-	return сам.еслиГотов.Получ()
+	return сам.еслиГотов.Get()
 }
 
 // УстНадо -- устанавливает требование манёвра
 func (сам *манёвр) УстНадо() {
-	сам.еслиНадо.Уст()
+	сам.еслиНадо.Set()
 }
 
 // Генерирует тик для уменьшения времени ожидания восстановления возможности манёвра
@@ -84,7 +85,7 @@ func (сам *манёвр) makeTick() {
 // Рабочий цикл поиска маневра (~)
 func (сам *манёвр) run() {
 	for range сам.chTick {
-		if !сам.еслиГотов.Получ() {
+		if !сам.еслиГотов.Get() {
 			continue
 		}
 		сам.findManevrTime()
@@ -112,24 +113,24 @@ func (сам *манёвр) findManevrTime() {
 			time.Sleep(time.Second * 1)
 			return
 		}
-		if сам.isEnd.Получ() {
+		if сам.isEnd.Get() {
 			time.Sleep(time.Second * 1)
 			return
 		}
-		сам.лог.Внимание("findManevrTime(): ошибка в поиске времени манёвра, стрВых=%v", стрВых)
+		сам.лог.Warn("findManevrTime(): ошибка в поиске времени манёвра, стрВых=%v", стрВых)
 		time.Sleep(time.Second * 1)
 		return
 	}
 	{ // Найти время манёвра
 		lstTime := strings.Split(стрВых, `ILinkListener-currentControl-maneuverLink" class="simple-but blue"><span><span>`)
 		if len(lstTime) != 2 {
-			сам.лог.Ошибка("манёвр.findManevrTime(): нет двух полей во времени ожидания инд=%v\n\n%v\n%v\n%v",
-			ind,
-			lstBattleOn[ind-1],
-			стрВых,
-			lstBattleOn[ind+1],
-		)
-			сам.еслиГотов.Сброс()
+			сам.лог.Err("манёвр.findManevrTime(): нет двух полей во времени ожидания инд=%v\n\n%v\n%v\n%v",
+				ind,
+				lstBattleOn[ind-1],
+				стрВых,
+				lstBattleOn[ind+1],
+			)
+			сам.еслиГотов.Reset()
 			time.Sleep(time.Second * 1)
 			return
 		}
@@ -137,14 +138,14 @@ func (сам *манёвр) findManevrTime() {
 		lstTime = strings.Split(strTime, ` секунд</span></span></a>`)
 		strTime = lstTime[0]
 		if err := сам.manevrTime.Set(strTime); err != nil {
-			сам.лог.Ошибка("манёвр.findManevrTime(): при обновлении времени ожидания манёвра, ош=\n\t%v", err)
-			сам.еслиГотов.Сброс()
+			сам.лог.Err("манёвр.findManevrTime(): при обновлении времени ожидания манёвра, ош=\n\t%v", err)
+			сам.еслиГотов.Reset()
 			time.Sleep(time.Second * 1)
 			return
 		}
 	}
-	сам.еслиГотов.Уст()
-	сам.лог.Инфо("манёвр.findManevrTime(): до манёвра, время=%v", сам.manevrTime.Get())
+	сам.еслиГотов.Set()
+	сам.лог.Info("манёвр.findManevrTime(): до манёвра, время=%v", сам.manevrTime.Get())
 }
 
 // Выполнить -- принудительный манёвр по требованию
@@ -154,7 +155,7 @@ func (сам *манёвр) Выполнить() {
 		lstBattleOn = сам.СписПолучить()
 		strOut      = ""
 	)
-	if !сам.еслиГотов.Получ() {
+	if !сам.еслиГотов.Get() {
 		time.Sleep(time.Second * 1)
 		return
 	}
@@ -166,7 +167,7 @@ func (сам *манёвр) Выполнить() {
 		}
 	}
 	if !еслиНайдено { // Либо ждём восстановления манёвра, либо сражение закончилось
-		сам.еслиГотов.Сброс()
+		сам.еслиГотов.Reset()
 		time.Sleep(time.Second * 1)
 		return
 	}
@@ -177,14 +178,14 @@ func (сам *манёвр) Выполнить() {
 		strLink = "https://wartank.ru/" + lstLink[0]
 		lstBattleOn, err := сам.Сеть().Get(strLink)
 		if err != nil {
-			сам.лог.Ошибка("манёвр.Выполнить(): при выполнении GET-команды маневра, ош=\n\t%v", err)
-			сам.еслиГотов.Сброс()
+			сам.лог.Err("манёвр.Выполнить(): при выполнении GET-команды маневра, ош=\n\t%v", err)
+			сам.еслиГотов.Reset()
 			time.Sleep(time.Second * 1)
 			return
 		}
 		if err = сам.СтрОбновить(lstBattleOn); err != nil {
-			сам.лог.Ошибка("манёвр.Выполнить(): при обновлении lstBattle, ош=\n\t%v", err)
-			сам.еслиГотов.Сброс()
+			сам.лог.Err("манёвр.Выполнить(): при обновлении lstBattle, ош=\n\t%v", err)
+			сам.еслиГотов.Reset()
 			time.Sleep(time.Second * 1)
 			return
 		}

+ 4 - 4
app/lev1/product/parser_time/parser_time.go

@@ -18,10 +18,10 @@ import (
 
 // ПарсерВремя -- потокобезопасный ковырятор строки времени
 type ПарсерВремя struct {
-	всегоМилСек АМилСек // Числовое значение хранимого времени
-	час         ИПарсерЧас   // Часы метки времени
-	мин         ИПарсерМин   // Минуты метки времени
-	сек         ИПарсерСек   // Секунды метки времени
+	всегоМилСек АМилСек    // Числовое значение хранимого времени
+	час         ИПарсерЧас // Часы метки времени
+	мин         ИПарсерМин // Минуты метки времени
+	сек         ИПарсерСек // Секунды метки времени
 
 	блок sync.RWMutex
 }

+ 9 - 8
app/lev1/product/product.go

@@ -4,34 +4,35 @@ package product
 import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/product/parser_time"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // Продукт -- объект продукта для производства
 type Продукт struct {
-	имя   ИБезопСтрока             // имя продукта
-	кол   ИБезопЦелое              // Количество продукта
+	имя   ISafeString              // имя продукта
+	кол   ISafeInt                 // Количество продукта
 	время *parser_time.ПарсерВремя // Время для производства продукта
 }
 
 // НовПродукт -- возвращает новый объект продукта
 func НовПродукт() *Продукт {
 	сам := &Продукт{
-		имя:   kernel.НовБезопСтрока(),
-		кол:   kernel.НовБезопЦелое(),
+		имя:   NewSafeString(),
+		кол:   NewSafeInt(),
 		время: parser_time.НовПарсерВремя(),
 	}
 	return сам
 }
 
 // Имя -- возвращает название продукта
-func (сам *Продукт) Имя() ИБезопСтрока {
+func (сам *Продукт) Имя() ISafeString {
 	return сам.имя
 }
 
 // Кол -- возвращает количество продукта
-func (сам *Продукт) Кол() ИБезопЦелое {
+func (сам *Продукт) Кол() ISafeInt {
 	return сам.кол
 }
 

+ 20 - 19
app/lev1/shot/shot.go

@@ -11,12 +11,13 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/shot/damage"
 	"wartank/app/lev1/shot/shot_time"
-	"wartank/kernel"
 
 	// "wartank/internal/components/sound"
 	"wartank/app/lev0/alias"
-	. "wartank/kernel/helpers"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -34,8 +35,8 @@ type выстрел struct {
 	recharge         *shot_time.ShotTime // Сколько времени нужно для полной перезарядки
 	damage           *damage.Damage      // Урон от выстрела с памятью
 	damageSum        alias.АУрон         // Суммарный урон
-	isEnd            ИБезопБул           // Признак конца сражения
-	еслиБлок         ИБезопБул           // Признак блокировки выстрела
+	isEnd            ISafeBool           // Признак конца сражения
+	еслиБлок         ISafeBool           // Признак блокировки выстрела
 	login            string              // Логин для поиска контрольных строк
 	chTick           chan int            // Тик для выстрела
 	ctxEnd           context.Context     // Признак окончания сражения
@@ -43,14 +44,14 @@ type выстрел struct {
 
 // НовВыстрел -- возвращает новый выстрел
 func НовВыстрел(проц ИСражениеПроцесс) ИВыстрел {
-	Паника(проц != nil, "НовВыстрел(): ИСражениеПроцесс == nil")
+	Hassert(проц != nil, "НовВыстрел(): ИСражениеПроцесс == nil")
 	логинТанк := проц.Бот().Имя()
 	сам := &выстрел{
 		ИСражениеПроцесс: проц,
 		ctxEnd:           проц.Контекст(),
 		recharge:         shot_time.NewShotTime(),
 		damage:           damage.NewDamage(),
-		еслиБлок:         kernel.НовБезопБул(),
+		еслиБлок:         NewSafeBool(),
 		isEnd:            проц.ЕслиКонец(),
 		login:            логинТанк,
 		chTick:           make(chan int, 2),
@@ -64,15 +65,15 @@ func НовВыстрел(проц ИСражениеПроцесс) ИВыст
 
 // ЕслиБлок -- возвращает признак блокировки выстрела
 func (сам *выстрел) ЕслиБлок() bool {
-	return сам.еслиБлок.Получ()
+	return сам.еслиБлок.Get()
 }
 
 // Генерирует тики, когда можно стрелять
 func (сам *выстрел) makeTick() {
 	defer func() {
-		сам.isEnd.Уст()
+		сам.isEnd.Set()
 		close(сам.chTick)
-		сам.Отменить()
+		сам.Бот().КонтБот().Cancel()
 		// log._rintf("Shot.makeTick(): сражение завершёно\n")
 	}()
 	countMasking := 0
@@ -81,10 +82,10 @@ func (сам *выстрел) makeTick() {
 		case <-сам.ctxEnd.Done():
 			return
 		default:
-			if сам.isEnd.Получ() { // Битва закончилась
+			if сам.isEnd.Get() { // Битва закончилась
 				return
 			}
-			switch сам.еслиБлок.Получ() { // Проверить запрет на стрельбу при слабом здоровье
+			switch сам.еслиБлок.Get() { // Проверить запрет на стрельбу при слабом здоровье
 			case true:
 				// log._rintf("WARN Shot.run(): запрет на выстрел\n")
 				countMasking++
@@ -140,8 +141,8 @@ func (сам *выстрел) shot() {
 	}
 	if !еслиНайдено {
 		// log._rintf("WARN Shot.shot(): не найдены ссылка на выстрел\n")
-		сам.isEnd.Уст()
-		сам.Отменить()
+		сам.isEnd.Set()
+		сам.Бот().КонтБот().Cancel()
 		return
 	}
 	lstLink := strings.Split(strOut, `<a href="`)
@@ -151,14 +152,14 @@ func (сам *выстрел) shot() {
 	lstBattle, err = сам.Сеть().Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO Shot.shot(): при исполнении GET-команды выстрела обычным снарядом, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
-		сам.Отменить()
+		сам.isEnd.Set()
+		сам.Бот().КонтБот().Cancel()
 		return
 	}
 	if err = сам.СтрОбновить(lstBattle); err != nil {
 		// log._rintf("ERRO Shot.shot(): при обновлении lstBattle, err=\n\t%v\n", err)
-		сам.isEnd.Уст()
-		сам.Отменить()
+		сам.isEnd.Set()
+		сам.Бот().КонтБот().Cancel()
 		return
 	}
 	// sound.Shot()
@@ -229,6 +230,6 @@ func (сам *выстрел) setDamage(val alias.АУрон) {
 }
 
 // IsEnd -- возвращает объект разрешения стрельбы
-func (сам *выстрел) IsEnd() ИБезопБул {
+func (сам *выстрел) IsEnd() ISafeBool {
 	return сам.isEnd
 }

+ 1 - 1
app/lev1/shot/shot_time/shot_time.go

@@ -1,8 +1,8 @@
 package shot_time
 
 import (
-	"sync"
 	"log"
+	"sync"
 
 	. "wartank/app/lev0/alias"
 )

+ 17 - 13
app/lev1/stat_param/stat_param.go

@@ -5,52 +5,56 @@ import (
 	"fmt"
 	"sync"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
 )
 
 // СтатПарам -- потокобезопасная статистика
 type статПарам struct {
+	sync.RWMutex
 	имя  string // Имя параметра
 	знач int    // Значение параметра
-	блок sync.RWMutex
+	лог  ILogBuf
 }
 
 // НовБотСтатистика -- возвращает новую статистику
 func НовСтатПарам_(имя string) ИСтатПарам {
-	лог := kernel.НовЛог("СтатПарам")
-	лог.Инфо("НовСтатПарам(%s)\n", имя)
-	лог.Паника(имя == "", "НовСтатПарам(): имя параметра пустое\n")
+	Hassert(имя != "", "НовСтатПарам(): имя параметра пустое\n")
 	сам := &статПарам{
 		имя: имя,
+		лог: NewLogBuf(),
 	}
+	сам.лог.Info("НовСтатПарам(%s)\n", имя)
 	return сам
 }
 
 // ЗначСтр -- строковое представление значение параметра
 func (сам *статПарам) ЗначСтр() string {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
+	сам.RLock()
+	defer сам.RUnlock()
 	return fmt.Sprint(сам.знач)
 }
 
 // Уст -- устанавливает значение параметра
 func (сам *статПарам) Уст(val int) {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
+	сам.Lock()
+	defer сам.Unlock()
 	сам.знач = val
 }
 
 // Получ -- значение хранимого параметра
 func (сам *статПарам) Получ() int {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
+	сам.RLock()
+	defer сам.RUnlock()
 	return сам.знач
 }
 
 // Имя -- возвращает имя хранимого параметра
 func (сам *статПарам) Имя() string {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
+	сам.RLock()
+	defer сам.RUnlock()
 	return сам.имя
 }

+ 7 - 5
app/lev1/web_render/web_render.go

@@ -7,13 +7,15 @@ import (
 	"strings"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // ВебРендер -- простой веб-рендер
 type ВебРендер struct {
-	лог     ИЯдроЛог
+	лог     ILogBuf
 	слвБлок map[string]interface{}
 }
 
@@ -28,7 +30,7 @@ var стрПодвал string
 
 // НовВебРендер -- возвращает новый веб-рендер
 func НовВебРендер(шаблон string) *ВебРендер {
-	лог := kernel.НовЛог("ВебРендер")
+	лог := NewLogBuf()
 	сам := &ВебРендер{
 		лог:     лог,
 		слвБлок: map[string]interface{}{},
@@ -51,6 +53,6 @@ func (сам *ВебРендер) Получ() string {
 
 // Доб -- добавляет блок замещения
 func (сам *ВебРендер) Доб(ключ string, блок interface{}) {
-	сам.лог.Паника(ключ == "", "ВебРендер.Доб(): пустой ключ")
+	Hassert(ключ != "", "ВебРендер.Доб(): пустой ключ")
 	сам.слвБлок[ключ] = блок
 }

+ 9 - 8
app/lev1/wrag/wrag.go

@@ -4,8 +4,9 @@ import (
 	"strconv"
 	"strings"
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -15,14 +16,14 @@ import (
 // Враг -- объект врага
 type Враг struct {
 	сервер   ИПриложение
-	лог      ИЯдроЛог
+	лог      ILogBuf
 	здоровье int //
 }
 
 // НовВраг -- возвращает новый объект врага
-func НовВраг(конт ИЯдроКонтекст, app ИПриложение, lstBattle []string) *Враг {
-	лог := kernel.НовЛог("Враг")
-	лог.Отладка("НовВраг()\n")
+func НовВраг(конт IKernelCtx, app ИПриложение, lstBattle []string) *Враг {
+	лог := NewLogBuf()
+	лог.Debug("НовВраг()\n")
 	сам := &Враг{
 		сервер: app,
 		лог:    лог,
@@ -50,7 +51,7 @@ func (сам *Враг) update(lstBattleOn []string) {
 		}
 	}
 	if !еслиНайдено { // Не нашёл метку врага
-		сам.лог.Ошибка("update(): не нашёл метку врага\n")
+		сам.лог.Err("update(): не нашёл метку врага\n")
 		сам.здоровье = 800
 		return
 	}
@@ -63,7 +64,7 @@ func (сам *Враг) update(lstBattleOn []string) {
 	strHealth = lstHealth[0]
 	iHealth, err := strconv.Atoi(strHealth)
 	if err != nil {
-		сам.лог.Ошибка("update(): здоровье(%v) не число, err=\n\t%v\n", strHealth, err)
+		сам.лог.Err("update(): здоровье(%v) не число, err=\n\t%v\n", strHealth, err)
 		сам.здоровье = 800
 		return
 	}

+ 7 - 6
app/lev2/arena/arena.go

@@ -12,7 +12,8 @@ import (
 	"wartank/app/lev2/arena/arena_net"
 	"wartank/app/lev2/arena/arena_string"
 	"wartank/app/lev2/arena/down_time"
-	. "wartank/kernel/helpers"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 )
 
 // АренаКонфиг -- конфигурация арены
@@ -26,11 +27,11 @@ type АренаКонфиг struct {
 
 // Контролирует правильность параметров
 func (конф *АренаКонфиг) контроль() {
-	Паника(конф.СтрКонтроль_ != "", "АренаКонфиг.СтрКонтроль_ == \"\"")
-	Паника(конф.ФнПуск_ != nil, "АренаКонфиг.ФнПуск_ == nil")
-	Паника(конф.Бот_ != nil, "АренаКонфиг.Бот_ == nil")
-	Паника(конф.АренаИмя_ != "", "АренаКонфиг.СценаИмя_ == \"\"")
-	Паника(конф.СтрУрл_ != "", "АренаКонфиг.СтрУрл_ == \"\"")
+	Hassert(конф.СтрКонтроль_ != "", "АренаКонфиг.СтрКонтроль_ == \"\"")
+	Hassert(конф.ФнПуск_ != nil, "АренаКонфиг.ФнПуск_ == nil")
+	Hassert(конф.Бот_ != nil, "АренаКонфиг.Бот_ == nil")
+	Hassert(конф.АренаИмя_ != "", "АренаКонфиг.СценаИмя_ == \"\"")
+	Hassert(конф.СтрУрл_ != "", "АренаКонфиг.СтрУрл_ == \"\"")
 }
 
 // Арена -- арена игры

+ 10 - 10
app/lev2/arena/arena_angar/arena_angar.go

@@ -35,14 +35,14 @@ type АренаАнгар struct {
 
 // НовАнгар -- возвращает новый *Angar
 func НовАнгар(конт ИБотКонтекст) ИАренаАнгар {
-	бот := конт.Получ("бот").(ИБот)
+	бот := конт.Get("бот").(ИБот)
 	сам := &АренаАнгар{
 		бот:           бот,
-		progress:      stat_param.НовСтатПарам("прогресс"),
-		игроковОнлайн: stat_param.НовСтатПарам("онлайн"),
-		сереброСессия: stat_param.НовСтатПарам("серебро сессия"),
-		танкСтат:      конт.Получ("танкПарам").(ИТанкСтат),
-		серебро:       stat_param.НовСтатПарам("серебро"),
+		progress:      stat_param.НовСтатПарам_("прогресс"),
+		игроковОнлайн: stat_param.НовСтатПарам_("онлайн"),
+		сереброСессия: stat_param.НовСтатПарам_("серебро сессия"),
+		танкСтат:      конт.Get("танкПарам").(ИТанкСтат),
+		серебро:       stat_param.НовСтатПарам_("серебро"),
 	}
 	аренаКонф := arena.АренаКонфиг{
 		Бот_:         бот,
@@ -51,7 +51,7 @@ func НовАнгар(конт ИБотКонтекст) ИАренаАнгар
 		ФнПуск_:      сам.пуск,
 		СтрУрл_:      "https://wartank.ru/angar",
 	}
-	конт.Уст("ангар", сам)
+	конт.Set("ангар", сам, "Объект ангара бота")
 	сам.ИАрена = arena.НовАрена(конт, аренаКонф)
 	сам.ресурсы = bot_resurs.НовБотРесурсы(конт, сам)
 	return сам
@@ -90,7 +90,7 @@ func (сам *АренаАнгар) пуск() {
 		сам.Обновить()
 		// сам.конвойПроверить()
 		if err := сам.ОбратВремяУст("01:00"); err != nil {
-			сам.Отменить()
+			сам.прилож.Cancel()
 			log.Printf("Ангар.Run(): in update ICountTime, err=\n\t%v\n", err)
 			return false
 		}
@@ -100,12 +100,12 @@ func (сам *АренаАнгар) пуск() {
 		ош := сам.ОбратВремяУст("01")
 		if ош != nil {
 			log.Printf("Ангар.Run(): in update ICountTime, ош=\n\t%v\n", ош)
-			сам.прилож.Отменить()
+			сам.прилож.Cancel()
 			return
 		}
 		for {
 			select {
-			case <-сам.прилож.Конт().Done(): // Отмена контекста
+			case <-сам.прилож.Ctx().Done(): // Отмена контекста
 				return
 			case <-сам.ВремяОстат().КаналСиг(): // Метка времени
 				if !фнЦикл() {

+ 17 - 23
app/lev2/arena/arena_arsenal/arena_arsenal.go

@@ -13,8 +13,9 @@ import (
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev1/web_log"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 const (
@@ -28,14 +29,13 @@ const (
 type АренаАрсенал struct {
 	ИАрена
 	вЛог         ИВебЛог
-	лог          ИЯдроЛог
+	лог          ILogBuf
 	бот          ИБот
 	база         ИАренаБаза
 	фугас        ИСтатПарам
 	бронебойка   ИСтатПарам
 	кумулятив    ИСтатПарам
 	ремка        ИСтатПарам
-	уровень      ИСтатПарам
 	продуктИмя   string          // Что сейчас делается
 	продуктКол   ИСтатПарам      // Сколько делается прямо сейчас
 	продуктВремя string          // Сколько осталось времени прямо сейчас
@@ -45,19 +45,18 @@ type АренаАрсенал struct {
 
 // НовАрсенал -- возвращает новый *Arsenal
 func НовАрсенал(конт ИБотКонтекст, база ИАренаБаза) (ИАренаАрсенал, error) {
-	лог := kernel.НовЛог("Арсенал")
-	лог.Инфо("НовАрсенал()\n")
+	лог := NewLogBuf()
+	лог.Info("НовАрсенал()\n")
 
 	кнт, фнОтмена := context.WithCancel(база.Контекст())
 	сам := &АренаАрсенал{
 		бот:        база.Бот(),
 		база:       база,
-		фугас:      stat_param.НовСтатПарам(стрФугасы),
-		бронебойка: stat_param.НовСтатПарам(стрБронебойки),
-		кумулятив:  stat_param.НовСтатПарам(стрКумулятивы),
-		ремка:      stat_param.НовСтатПарам(стрРемки),
-		уровень:    stat_param.НовСтатПарам("уровень"), // FIXME: это должно быть на уровне арены
-		продуктКол: stat_param.НовСтатПарам("свинец"),
+		фугас:      stat_param.НовСтатПарам_(стрФугасы),
+		бронебойка: stat_param.НовСтатПарам_(стрБронебойки),
+		кумулятив:  stat_param.НовСтатПарам_(стрКумулятивы),
+		ремка:      stat_param.НовСтатПарам_(стрРемки),
+		продуктКол: stat_param.НовСтатПарам_("свинец"),
 		кнт:        кнт,
 		фнОтмена:   фнОтмена,
 
@@ -77,11 +76,6 @@ func НовАрсенал(конт ИБотКонтекст, база ИАрен
 	return сам, nil
 }
 
-// Уровень -- возвращает уровень шахты
-func (сам *АренаАрсенал) Уровень() ИСтатПарам {
-	return сам.уровень
-}
-
 // ПродуктКолСейчас -- возвращает количество производимого продукта
 func (сам *АренаАрсенал) ПродуктКолСейчас() int {
 	return сам.продуктКол.Получ()
@@ -136,12 +130,12 @@ func (сам *АренаАрсенал) пуск() {
 		_ = сам.уровеньОбновить()
 		ош := сам.СтатаОбновить()
 		if ош != nil {
-			сам.лог.Ошибка("пуск(): при обновлении статы, ош=\n\t%v\n", ош)
+			сам.лог.Err("пуск(): при обновлении статы, ош=\n\t%v\n", ош)
 			сам.вЛог.Добавить("пуск(): при обновлении статы, ош=\n\t%w", ош)
 		}
 		сам.забрать()
 		сам.сделать()
-		сам.лог.Инфо("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
+		сам.лог.Info("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
 	}
 	for {
 		фнРабота()
@@ -178,12 +172,12 @@ func (сам *АренаАрсенал) уровеньОбновить() bool {
 	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
 	иУровень, ош := strconv.Atoi(_стр)
 	if ош != nil {
-		сам.лог.Ошибка("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		сам.лог.Err("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
 		сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
 		return false
 	}
-	сам.уровень.Уст(иУровень)
-	сам.лог.Инфо("уровеньОбновить(): уровень=%d\n", иУровень)
+	сам.Уровень().Уст(иУровень)
+	сам.лог.Info("уровеньОбновить(): уровень=%d\n", иУровень)
 	сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
 	return true
 }
@@ -226,7 +220,7 @@ func (сам *АренаАрсенал) построить() (bool, error) {
 		сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
 		return true, nil
 	}
-	сам.лог.Инфо("построить(): ок\n")
+	сам.лог.Info("построить(): ок\n")
 	сам.вЛог.Добавить("Арсенал.построить(): ок\n")
 	return true, nil
 }

+ 2 - 2
app/lev2/arena/arena_bank/arena_bank.go

@@ -30,12 +30,12 @@ type АренаБанк struct {
 func НовБанк(конт ИБотКонтекст) ИАренаБанк {
 
 	сам := &АренаБанк{
-		сереброБот: stat_param.НовСтатПарам("серебро бота"),
+		сереброБот: stat_param.НовСтатПарам_("серебро бота"),
 		режим1:     bank_mode.NewBankMode(конт),
 		режим2:     bank_mode.NewBankMode(конт),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         конт.Получ("бот").(ИБот),
+		Бот_:         конт.Get("бот").(ИБот),
 		АренаИмя_:    "Банк",
 		СтрКонтроль_: `<span class="green2">Серебро</span><br/>`,
 		ФнПуск_:      сам.пуск,

+ 1 - 1
app/lev2/arena/arena_bank/bank_mode/bank_mode.go

@@ -18,7 +18,7 @@ type BankMode struct {
 // NewBankMode -- возвращает новый *BankMode
 func NewBankMode(конт ИБотКонтекст) *BankMode {
 	return &BankMode{
-		серебро: stat_param.НовСтатПарам("серебро"),
+		серебро: stat_param.НовСтатПарам_("серебро"),
 	}
 }
 

+ 5 - 5
app/lev2/arena/arena_base/arena_base.go

@@ -16,20 +16,20 @@ import (
 */
 
 const (
-	// времОжидПлат    = "01:00" // Время ожидания платного ускорения
-	// времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
+// времОжидПлат    = "01:00" // Время ожидания платного ускорения
+// времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
 )
 
 // База -- объект базы
 type АренаБаза struct {
 	ИАрена
-	бот          ИБот
-	блок         sync.Mutex
+	бот  ИБот
+	блок sync.Mutex
 }
 
 // НовБаза -- возвращает новую базу бота
 func НовБаза(конт ИБотКонтекст) ИАренаБаза {
-	бот := конт.Получ("бот").(ИБот)
+	бот := конт.Get("бот").(ИБот)
 	log.Printf("НовБаза(): %q\n", бот.Имя())
 	сам := &АренаБаза{
 		бот: бот,

+ 4 - 4
app/lev2/arena/arena_battle/arena_battle.go

@@ -6,9 +6,9 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_register"
-	"wartank/app/lev2/arena_battle/battle_wait"
-	"wartank/app/lev2/arena_battle/battle_worker"
+	"wartank/app/lev2/arena/arena_battle/battle_register"
+	"wartank/app/lev2/arena/arena_battle/battle_wait"
+	"wartank/app/lev2/arena/arena_battle/battle_worker"
 )
 
 // АренаСражение -- объект сражения
@@ -53,7 +53,7 @@ func (сам *АренаСражение) Пуск() {
 func (сам *АренаСражение) пуск() {
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			сам.регистрация.Зарегистрироваться()

+ 4 - 4
app/lev2/arena/arena_battle/battle_worker/battle_worker.go

@@ -7,8 +7,8 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker"
-	"wartank/app/lev2/arena_battle/battle_worker/battle_worker/battle_sound"
+	"wartank/app/lev2/arena/arena_battle/battle_worker/battle_worker"
+	"wartank/app/lev2/arena/arena_battle/battle_worker/battle_worker/battle_sound"
 )
 
 // СражениеДействие -- исполнение битвы
@@ -20,7 +20,7 @@ type СхваткаИсполнитель struct {
 	еслиНачало ИСтатПарам
 
 	// Непосредственное сражение
-	действие *battle_worker.СражениеДействие
+	действие ИСражениеПроцесс
 
 	sound *battle_sound.BattleSound // Однопоточное проигрывание звука
 }
@@ -30,7 +30,7 @@ func НовСражениеИсполнитель(конт ИБотКонтек
 	сам := &СхваткаИсполнитель{
 		конт:       конт,
 		бот:        bot,
-		еслиНачало: stat_param.НовСтатПарам("тревога"),
+		еслиНачало: stat_param.НовСтатПарам_("тревога"),
 		sound:      battle_sound.NewBattleSound(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{

+ 23 - 10
app/lev2/arena/arena_battle/battle_worker/battle_worker/battle_worker.go

@@ -4,11 +4,14 @@ import (
 	"context"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena"
 	"wartank/app/lev1/health"
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
+	"wartank/app/lev2/arena"
 )
 
 /*
@@ -22,21 +25,23 @@ type СражениеДействие struct {
 	кнт        context.Context // Контекст сражения
 	фнОтменить func()          // Функция отмены сражения
 
-	выстрел     ИВыстрел    // Объект выстрела
-	здоровье    ИЗдоровье // Текущее здоровье танка
-	манёвр      ИМанёвр   // Возможность маневрирования
-	логин       string
+	выстрел   ИВыстрел  // Объект выстрела
+	здоровье  ИЗдоровье // Текущее здоровье танка
+	манёвр    ИМанёвр   // Возможность маневрирования
+	логин     string
+	еслиКонец ISafeBool
 }
 
 // НовСражениеДействие -- возвращает новый *BattleOn
 func НовСражениеДействие(конт ИБотКонтекст, бот ИБот) ИСражениеПроцесс {
 	// Ограничить время сражения бота
-	кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
+	кнтСражение, фнОтменить := context.WithTimeout(бот.КонтБот().Ctx(), time.Second*305)
 	сам := &СражениеДействие{
-		бот:         бот,
-		кнт:         кнтСражение,
-		фнОтменить:  фнОтменить,
-		логин:       бот.Имя(),
+		бот:        бот,
+		кнт:        кнтСражение,
+		фнОтменить: фнОтменить,
+		логин:      бот.Имя(),
+		еслиКонец:  NewSafeBool(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         сам.бот,
@@ -50,7 +55,15 @@ func НовСражениеДействие(конт ИБотКонтекст, 
 	return сам
 }
 
+// Манёвр -- возвращает объект маневра
+func (сам *СражениеДействие) Манёвр() ИМанёвр {
+	return сам.манёвр
+}
 
+// ЕслиКонец -- возвращает признак конца сражения
+func (сам *СражениеДействие) ЕслиКонец() ISafeBool {
+	return сам.еслиКонец
+}
 
 // запускает сражение
 func (сам *СражениеДействие) пуск() {

+ 27 - 12
app/lev2/arena/arena_battle/battle_worker/battleon/battleon.go

@@ -4,11 +4,14 @@ import (
 	"context"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena"
 	"wartank/app/lev1/health"
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
+	"wartank/app/lev2/arena"
 )
 
 /*
@@ -22,22 +25,24 @@ type СражениеДействие struct {
 	кнт        context.Context // Контекст сражения
 	фнОтменить func()          // Функция отмены сражения
 
-	выстрел     ИВыстрел    // Объект выстрела
-	здоровье    ИЗдоровье // Текущее здоровье танка
-	манёвр      ИМанёвр   // Возможность маневрирования
-	логин       string
+	выстрел   ИВыстрел  // Объект выстрела
+	здоровье  ИЗдоровье // Текущее здоровье танка
+	манёвр    ИМанёвр   // Возможность маневрирования
+	логин     string
+	еслиКонец ISafeBool
 }
 
 // НовСражениеДействие -- возвращает новый *BattleOn
 func НовСражениеДействие(конт ИБотКонтекст) ИСражениеПроцесс {
 	// Ограничить время сражения бота
-	бот:=конт.Получ("бот").(ИБот)
-	кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
+	бот := конт.Get("бот").Val().(ИБот)
+	кнтСражение, фнОтменить := context.WithTimeout(бот.КонтБот().Ctx(), time.Second*305)
 	сам := &СражениеДействие{
-		бот:         бот,
-		кнт:         кнтСражение,
-		фнОтменить:  фнОтменить,
-		логин:       бот.Имя(),
+		бот:        бот,
+		кнт:        кнтСражение,
+		фнОтменить: фнОтменить,
+		логин:      бот.Имя(),
+		еслиКонец:  NewSafeBool(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         сам.бот,
@@ -51,6 +56,16 @@ func НовСражениеДействие(конт ИБотКонтекст) 
 	return сам
 }
 
+// Манёвр -- возвращает объект маневра
+func (сам *СражениеДействие) Манёвр() ИМанёвр {
+	return сам.манёвр
+}
+
+// ЕслиКонец -- возвращает признак конца действия
+func (сам *СражениеДействие) ЕслиКонец() ISafeBool {
+	return сам.еслиКонец
+}
+
 // запускает сражение
 func (сам *СражениеДействие) пуск() {
 	defer func() {
@@ -73,7 +88,7 @@ func (сам *СражениеДействие) МанёврНадоУст() {
 	сам.манёвр.УстНадо()
 }
 
-// Выстрел -- 
+// Выстрел --
 func (сам *СражениеДействие) Выстрел() ИВыстрел {
 	return сам.выстрел
 }

+ 11 - 10
app/lev2/arena/arena_context/arena_context.go

@@ -4,13 +4,14 @@ package arena_context
 import (
 	"context"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/web_log"
 	"wartank/app/lev2/arena/arena_context/arena_state"
-	"wartank/kernel"
-	. "wartank/kernel/helpers"
-	. "wartank/kernel/kernel_types"
 )
 
 // АренаКонтекст -- контекст арены
@@ -21,17 +22,17 @@ type АренаКонтекст struct {
 	фнОтмена  func()
 	состояние ИАренаСостояние
 	вЛог      ИВебЛог
-	лог       ИЯдроЛог
+	лог       ILogBuf
 }
 
 // НовАренаКонтекст -- возвращает новый контекст арены
 func НовАренаКонтекст(конт ИБотКонтекст, бот ИБот, сценаИмя alias.ААренаИмя) *АренаКонтекст {
-	Паника(конт != nil, "НовАренаКонтекст(): ИЯдроКонтекст==пусто")
-	лог := kernel.НовЛог("АренаКонтекст " + string(сценаИмя))
-	лог.Инфо("НовАренаКонтекст() " + string(сценаИмя) + "\n")
-	лог.Паника(бот == nil, "НовАренаКонтекст(): ИБот==nil")
-	лог.Паника(сценаИмя == "", "НовАренаКонтекст(): сценаИмя не задано")
-	кнт, фнОтмена := context.WithCancel(бот.Контекст())
+	Hassert(бот != nil, "НовАренаКонтекст(): ИБот==nil")
+	Hassert(сценаИмя != "", "НовАренаКонтекст(): сценаИмя не задано")
+	Hassert(конт != nil, "НовАренаКонтекст(): ИЯдроКонтекст==пусто")
+	лог := NewLogBuf()
+	лог.Info("НовАренаКонтекст() " + string(сценаИмя) + "\n")
+	кнт, фнОтмена := context.WithCancel(бот.КонтБот().Ctx())
 	сам := &АренаКонтекст{
 		бот:       бот,
 		аренаИмя:  сценаИмя,

+ 2 - 2
app/lev2/arena/arena_convoy/arena_convoy.go

@@ -28,7 +28,7 @@ type АренаКонвой struct {
 func НовКонвой(конт ИБотКонтекст, бот ИБот) *АренаКонвой {
 	сам := &АренаКонвой{
 		бот:   бот,
-		слава: stat_param.НовСтатПарам("слава"),
+		слава: stat_param.НовСтатПарам_("слава"),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         сам.бот,
@@ -61,7 +61,7 @@ func (сам *АренаКонвой) пуск() {
 	}
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			фнЦикл()

+ 7 - 6
app/lev2/arena/arena_death/arena_death.go

@@ -6,10 +6,11 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_death/death_register"
-	"wartank/app/lev2/arena_death/death_wait"
-	"wartank/app/lev2/arena_death/death_worker"
-	. "wartank/kernel/kernel_types"
+	"wartank/app/lev2/arena/arena_death/death_register"
+	"wartank/app/lev2/arena/arena_death/death_wait"
+	"wartank/app/lev2/arena/arena_death/death_worker"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // АренаСхватка -- объект схватки
@@ -25,7 +26,7 @@ type АренаСхватка struct {
 }
 
 // НовСражение -- возвращает новый *Battle
-func НовСхватка(конт ИЯдроКонтекст, бот ИБот) *АренаСхватка {
+func НовСхватка(конт IKernelCtx, бот ИБот) *АренаСхватка {
 	сам := &АренаСхватка{
 		бот:    бот,
 		клиент: бот.Сеть().ВебВоркер(),
@@ -54,7 +55,7 @@ func (сам *АренаСхватка) Пуск() error {
 func (сам *АренаСхватка) пуск() {
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			сам.регистрация.Зарегистрироваться()

+ 3 - 2
app/lev2/arena/arena_death/death_register/death_register.go

@@ -8,7 +8,8 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // СхваткаРегистрация -- регистрирует танк к началу схватки
@@ -19,7 +20,7 @@ type СхваткаРегистрация struct {
 }
 
 // НовСхваткаРегистрация -- возвращает новый ожидатель битвы
-func НовСхваткаРегистрация(конт ИЯдроКонтекст, бот ИБот) *СхваткаРегистрация {
+func НовСхваткаРегистрация(конт IKernelCtx, бот ИБот) *СхваткаРегистрация {
 	сам := &СхваткаРегистрация{
 		бот:          бот,
 		счётРегистер: 10_000,

+ 3 - 2
app/lev2/arena/arena_death/death_wait/death_wait.go

@@ -8,7 +8,8 @@ import (
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // СражениеОжидание -- ожидатель начала битвы
@@ -18,7 +19,7 @@ type СражениеОжидание struct {
 }
 
 // НовСражениеОжидание -- возвращает новый ожидатель битвы
-func НовСражениеОжидание(конт ИЯдроКонтекст, бот ИБот) *СражениеОжидание {
+func НовСражениеОжидание(конт IKernelCtx, бот ИБот) *СражениеОжидание {
 	сам := &СражениеОжидание{
 		бот: бот,
 	}

+ 2 - 2
app/lev2/arena/arena_death/death_worker/death_worker.go

@@ -7,8 +7,8 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_death/death_worker/process_death"
-	"wartank/app/lev2/arena_death/death_worker/process_death/battle_sound"
+	"wartank/app/lev2/arena/arena_death/death_worker/process_death"
+	"wartank/app/lev2/arena/arena_death/death_worker/process_death/battle_sound"
 )
 
 // СражениеДействие -- исполнение схватки

+ 2 - 2
app/lev2/arena/arena_death/death_worker/process_death/process_death.go

@@ -23,7 +23,7 @@ type СхваткаПроцесс struct {
 	кнт        context.Context // Контекст сражения
 	фнОтменить func()          // Функция отмены сражения
 
-	выстрел  ИВыстрел    // Объект выстрела
+	выстрел  ИВыстрел         // Объект выстрела
 	здоровье *health.Здоровье // Текущее здоровье танка
 	манёвр   ИМанёвр          // Возможность маневрирования
 	логин    string
@@ -32,7 +32,7 @@ type СхваткаПроцесс struct {
 // НовСхваткаПроцесс -- возвращает новый процесс схватки
 func НовСхваткаПроцесс(конт ИБотКонтекст, бот ИБот) *СхваткаПроцесс {
 	// Ограничить время сражения бота
-	кнтСражение, фнОтменить := context.WithTimeout(бот.Контекст(), time.Second*305)
+	кнтСражение, фнОтменить := context.WithTimeout(бот.КонтБот().Ctx(), time.Second*305)
 	сам := &СхваткаПроцесс{
 		бот:        бот,
 		кнт:        кнтСражение,

+ 4 - 4
app/lev2/arena/arena_death/death_worker/process_death/shot/shot.go

@@ -21,8 +21,8 @@ import (
 // Выстрел -- объект выстрела
 type Выстрел struct {
 	ИСражениеПроцесс          // FIXME!!!
-	канТик            chan int // Тик для выстрела
-	выстрелСчёт       int      // Счётчик выстрелов для сервера
+	канТик           chan int // Тик для выстрела
+	выстрелСчёт      int      // Счётчик выстрелов для сервера
 }
 
 // НовВыстрел -- возвращает новый *Shot
@@ -34,8 +34,8 @@ func НовВыстрел(проц ИСражениеПроцесс) (*Выст
 	}
 	сам := &Выстрел{
 		ИСражениеПроцесс: проц,
-		выстрелСчёт:       1,
-		канТик:            make(chan int, 2),
+		выстрелСчёт:      1,
+		канТик:           make(chan int, 2),
 	}
 	go сам.делайТик()
 	go сам.пуск()

+ 12 - 11
app/lev2/arena/arena_division/div_war/div_war.go

@@ -11,10 +11,11 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_division/div_war/div_war_net"
-	"wartank/app/lev2/arena_division/div_war/process_divwar"
-	"wartank/app/lev2/arena_division/div_war/process_divwar/div_war_sound"
-	. "wartank/kernel/kernel_types"
+	"wartank/app/lev2/arena/arena_division/div_war/div_war_net"
+	"wartank/app/lev2/arena/arena_division/div_war/process_divwar"
+	"wartank/app/lev2/arena/arena_division/div_war/process_divwar/div_war_sound"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -32,8 +33,8 @@ type DivWar struct {
 
 	// Непосредственная битва
 	процВойна ИСражениеПроцесс
-	логин string // Для непосредственной битвы дивизий
-	block sync.Mutex
+	логин     string // Для непосредственной битвы дивизий
+	block     sync.Mutex
 
 	chDivWar chan int // Сигнал начала битвы дивизий
 
@@ -41,7 +42,7 @@ type DivWar struct {
 }
 
 // NewDivWar -- возвращает новый *DivWar
-func NewDivWar(конт ИЯдроКонтекст, bot ИБот) (*DivWar, error) {
+func NewDivWar(конт IKernelCtx, bot ИБот) (*DivWar, error) {
 	if bot == nil {
 		return nil, fmt.Errorf("NewDivWar(): IBot == nil")
 	}
@@ -80,7 +81,7 @@ func (сам *DivWar) пуск() {
 func (сам *DivWar) резервТик() {
 	for {
 		select {
-		case <-сам.bot.Контекст().Done():
+		case <-сам.bot.КонтБот().Ctx().Done():
 			return
 		default:
 			ct0 := сам.ВремяОстат().ПолучМилСек()
@@ -102,7 +103,7 @@ func (сам *DivWar) run() {
 	сам.chDivWar <- 1
 	for {
 		select {
-		case <-сам.bot.Контекст().Done():
+		case <-сам.bot.КонтБот().Ctx().Done():
 			return
 		case <-сам.ВремяОстат().КаналСиг(): // Время обновить данные по сражению
 			сам.findTimeCount()
@@ -150,7 +151,7 @@ func (сам *DivWar) findTimeCount() {
 	strTime := lstTime[1]
 	lstTime = strings.Split(strTime, `</span>`)
 	strTime = lstTime[0]
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
+	if err := сам.ОбратВремяУст(alias.АВремя(strTime)); err != nil {
 		// log._rintf("WARN DivWar.findTimeCount(): при установке времени ожидания битвы дивизий(%v)\n\terr=%v\n", strTime, err)
 		return
 	}
@@ -204,7 +205,7 @@ func (сам *DivWar) DivWar() {
 	}()
 	сам.процВойна = process_divwar.НовПроцессДивизияВойна(сам.конт) // IDivWarOn (онлайн)
 	// Цикл ожидания окончания сражения
-	for !сам.процВойна.ЕслиКонец().Получ() {
+	for !сам.процВойна.ЕслиКонец().Get() {
 		time.Sleep(time.Second * 1)
 	}
 

+ 18 - 17
app/lev2/arena/arena_division/div_war/process_divwar/process_divwar.go

@@ -10,8 +10,9 @@ import (
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -22,7 +23,7 @@ import (
 type ПроцессДивизияВойна struct {
 	ИАрена
 	бот            ИБот
-	лог ИЯдроЛог
+	лог            ILogBuf
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
@@ -31,21 +32,21 @@ type ПроцессДивизияВойна struct {
 	манёвр   ИМанёвр   // Возможность маневрирования
 	логин    string
 	chTick   chan int // Ежесекундная проверка на окончание сражения
-	isEnd    ИБезопБул
+	isEnd    ISafeBool
 }
 
 // НовПроцессДивизияВойна -- возвращает новый *DivWarOn
 func НовПроцессДивизияВойна(конт ИБотКонтекст) ИСражениеПроцесс {
-	лог:=kernel.НовЛог("ПроцессДивизияВойна")
-	бот:=конт.Получ("бот").(ИБот)
-	ctxDivWar, fnCancelDivWar := context.WithTimeout(бот.Контекст(), time.Second*305)
+	лог := NewLogBuf()
+	бот := конт.Get("бот").Val().(ИБот)
+	ctxDivWar, fnCancelDivWar := context.WithTimeout(бот.КонтБот().Ctx(), time.Second*305)
 	сам := &ПроцессДивизияВойна{
 		бот:            бот,
-		лог:лог,
+		лог:            лог,
 		ctxDivWar:      ctxDivWar,
 		fnCancelDivWar: fnCancelDivWar,
 		логин:          бот.Имя(),
-		isEnd:          kernel.НовБезопБул(),
+		isEnd:          NewSafeBool(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         бот,
@@ -81,16 +82,16 @@ func (сам *ПроцессДивизияВойна) пуск() {
 func (сам *ПроцессДивизияВойна) makeTick() {
 	defer func() {
 		close(сам.chTick)
-		сам.isEnd.Уст()
+		сам.isEnd.Set()
 	}()
-	for !сам.isEnd.Получ() {
+	for !сам.isEnd.Get() {
 		select {
-		case <-сам.бот.Контекст().Done(): // Отмена контекста приложения
+		case <-сам.бот.КонтБот().Ctx().Done(): // Отмена контекста приложения
 			return
 		case <-сам.ctxDivWar.Done(): // Битва закончилась
 			return
 		default:
-			if сам.isEnd.Получ() {
+			if сам.isEnd.Get() {
 				return
 			}
 			сам.chTick <- 1
@@ -122,7 +123,7 @@ func (сам *ПроцессДивизияВойна) run() {
 // Проверяет окончание сражения
 func (сам *ПроцессДивизияВойна) checkEnd() bool {
 	defer func() {
-		if сам.isEnd.Получ() {
+		if сам.isEnd.Get() {
 			сам.fnCancelDivWar()
 			// log._rintf("DivWarOn.checkEnd(): сражение завершено\n")
 		}
@@ -132,17 +133,17 @@ func (сам *ПроцессДивизияВойна) checkEnd() bool {
 	lstDivWarOn := сам.СписПолучить()
 	for _, strOut := range lstDivWarOn {
 		if strings.Contains(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`) {
-			сам.isEnd.Сброс()
+			сам.isEnd.Reset()
 			return false
 		}
 	}
-	сам.isEnd.Уст()
+	сам.isEnd.Set()
 	сам.fnCancelDivWar()
 	return true
 }
 
 // ЕслиКонец -- возвращает признак окончания сражения (интерфейс)
-func (сам *ПроцессДивизияВойна) ЕслиКонец() ИБезопБул {
+func (сам *ПроцессДивизияВойна) ЕслиКонец() ISafeBool {
 	return сам.isEnd
 }
 

+ 15 - 14
app/lev2/arena/arena_division/divwar/div_war_on/div_war_on.go

@@ -11,8 +11,9 @@ import (
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -31,21 +32,21 @@ type DivWarOn struct {
 	manevr  ИМанёвр   // Возможность маневрирования
 	login   string
 	chTick  chan int // Ежесекундная проверка на окончание сражения
-	isEnd   ИБезопБул
+	isEnd   ISafeBool
 }
 
 // NewDivWarOn -- возвращает новый *DivWarOn
-func NewDivWarOn(конт ИЯдроКонтекст, bot ИБот) (*DivWarOn, error) {
+func NewDivWarOn(конт IKernelCtx, bot ИБот) (*DivWarOn, error) {
 	if bot == nil {
 		return nil, fmt.Errorf("NewDivWarOn(): IBot == nil")
 	}
-	ctxDivWar, fnCancelDivWar := context.WithTimeout(bot.Контекст(), time.Second*305)
+	ctxDivWar, fnCancelDivWar := context.WithTimeout(bot.КонтБот().Ctx(), time.Second*305)
 	сам := &DivWarOn{
 		bot:            bot,
 		ctxDivWar:      ctxDivWar,
 		fnCancelDivWar: fnCancelDivWar,
 		login:          bot.Имя(),
-		isEnd:          kernel.НовБезопБул(),
+		isEnd:          NewSafeBool(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         bot,
@@ -71,16 +72,16 @@ func (сам *DivWarOn) пуск() {
 func (сам *DivWarOn) makeTick() {
 	defer func() {
 		close(сам.chTick)
-		сам.isEnd.Уст()
+		сам.isEnd.Set()
 	}()
-	for !сам.isEnd.Получ() {
+	for !сам.isEnd.Get() {
 		select {
-		case <-сам.bot.Контекст().Done(): // Отмена контекста приложения
+		case <-сам.bot.КонтБот().Ctx().Done(): // Отмена контекста приложения
 			return
 		case <-сам.ctxDivWar.Done(): // Битва закончилась
 			return
 		default:
-			if сам.isEnd.Получ() {
+			if сам.isEnd.Get() {
 				return
 			}
 			сам.chTick <- 1
@@ -112,7 +113,7 @@ func (сам *DivWarOn) run() {
 // Проверяет окончание сражения
 func (сам *DivWarOn) checkEnd() bool {
 	defer func() {
-		if сам.isEnd.Получ() {
+		if сам.isEnd.Get() {
 			сам.fnCancelDivWar()
 			// log._rintf("DivWarOn.checkEnd(): сражение завершено\n")
 		}
@@ -122,17 +123,17 @@ func (сам *DivWarOn) checkEnd() bool {
 	lstDivWarOn := сам.СписПолучить()
 	for _, strOut := range lstDivWarOn {
 		if strings.Contains(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`) {
-			сам.isEnd.Сброс()
+			сам.isEnd.Reset()
 			return false
 		}
 	}
-	сам.isEnd.Уст()
+	сам.isEnd.Set()
 	сам.fnCancelDivWar()
 	return true
 }
 
 // ЕслиКонец -- возвращает признак окончания сражения (интерфейс)
-func (сам *DivWarOn) ЕслиКонец() ИБезопБул {
+func (сам *DivWarOn) ЕслиКонец() ISafeBool {
 	return сам.isEnd
 }
 

+ 8 - 8
app/lev2/arena/arena_division/divwar/divwar.go

@@ -11,9 +11,9 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_division/div_war/div_war_net"
-	"wartank/app/lev2/arena_division/div_war/process_divwar"
-	"wartank/app/lev2/arena_division/div_war/process_divwar/div_war_sound"
+	"wartank/app/lev2/arena/arena_division/div_war/div_war_net"
+	"wartank/app/lev2/arena/arena_division/div_war/process_divwar"
+	"wartank/app/lev2/arena/arena_division/div_war/process_divwar/div_war_sound"
 )
 
 /*
@@ -30,7 +30,7 @@ type DivWar struct {
 	conn  ИХттпВоркер
 
 	// Непосредственная битва
-	дивОн *process_divwar.ПроцессДивизияВойна
+	дивОн ИСражениеПроцесс
 	login string // Для непосредственной битвы дивизий
 	block sync.Mutex
 
@@ -47,7 +47,7 @@ func NewDivWar(конт ИБотКонтекст, bot ИБот) (*DivWar, error)
 	сам := &DivWar{
 		конт:     конт,
 		bot:      bot,
-		alarm:    stat_param.НовСтатПарам("тревога"),
+		alarm:    stat_param.НовСтатПарам_("тревога"),
 		chDivWar: make(chan int, 1),
 		sound:    div_war_sound.NewDivWarSound(),
 		conn:     bot.Сеть().ВебВоркер(),
@@ -80,7 +80,7 @@ func (сам *DivWar) пуск() {
 func (сам *DivWar) резервТик() {
 	for {
 		select {
-		case <-сам.bot.Контекст().Done():
+		case <-сам.bot.КонтБот().Ctx().Done():
 			return
 		default:
 			ct0 := сам.ВремяОстат().ПолучМилСек()
@@ -102,7 +102,7 @@ func (сам *DivWar) run() {
 	сам.chDivWar <- 1
 	for {
 		select {
-		case <-сам.bot.Контекст().Done():
+		case <-сам.bot.КонтБот().Ctx().Done():
 			return
 		case <-сам.ВремяОстат().КаналСиг(): // Время обновить данные по сражению
 			сам.findTimeCount()
@@ -204,7 +204,7 @@ func (сам *DivWar) DivWar() {
 	}()
 	сам.дивОн = process_divwar.НовПроцессДивизияВойна(сам.конт) // IDivWarOn (онлайн)
 	// Цикл ожидания окончания сражения
-	for !сам.дивОн.ЕслиКонец().Получ() {
+	for !сам.дивОн.ЕслиКонец().Get() {
 		time.Sleep(time.Second * 1)
 	}
 

+ 25 - 19
app/lev2/arena/arena_division/divwar/divwaron/divwaron.go

@@ -11,8 +11,9 @@ import (
 	"wartank/app/lev1/manevr"
 	"wartank/app/lev1/shot"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -26,13 +27,13 @@ type DivWarOn struct {
 	ctxDivWar      context.Context // Контекст сражения
 	fnCancelDivWar func()          // Функция отмены сражения
 
-	shot      ИВыстрел    // Объект выстрела
+	выстрел   ИВыстрел  // Объект выстрела
 	health    ИЗдоровье // Текущее здоровье танка
 	manevr    ИМанёвр   // Возможность маневрирования
 	login     string
-	isMasking ИБезопБул // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
+	isMasking ISafeBool // Признак необходимости маскирования (запрет стрельбы, когда слабое здоровье)
 	chTick    chan int  // Ежесекундная проверка на окончание сражения
-	isEnd     ИБезопБул
+	isEnd     ISafeBool
 }
 
 // NewDivWarOn -- возвращает новый *DivWarOn
@@ -40,14 +41,14 @@ func NewDivWarOn(конт ИБотКонтекст, bot ИБот) (*DivWarOn, er
 	if bot == nil {
 		return nil, fmt.Errorf("NewDivWarOn(): IBot == nil")
 	}
-	ctxDivWar, fnCancelDivWar := context.WithTimeout(bot.Контекст(), time.Second*305)
+	ctxDivWar, fnCancelDivWar := context.WithTimeout(bot.КонтБот().Ctx(), time.Second*305)
 	сам := &DivWarOn{
 		bot:            bot,
 		ctxDivWar:      ctxDivWar,
 		fnCancelDivWar: fnCancelDivWar,
 		login:          bot.Имя(),
-		isMasking:      kernel.НовБезопБул(),
-		isEnd:          kernel.НовБезопБул(),
+		isMasking:      NewSafeBool(),
+		isEnd:          NewSafeBool(),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         bot,
@@ -73,16 +74,16 @@ func (сам *DivWarOn) пуск() {
 func (сам *DivWarOn) makeTick() {
 	defer func() {
 		close(сам.chTick)
-		сам.isEnd.Уст()
+		сам.isEnd.Set()
 	}()
-	for !сам.isEnd.Получ() {
+	for !сам.isEnd.Get() {
 		select {
-		case <-сам.bot.Контекст().Done(): // Отмена контекста приложения
+		case <-сам.bot.КонтБот().Ctx().Done(): // Отмена контекста приложения
 			return
 		case <-сам.ctxDivWar.Done(): // Битва закончилась
 			return
 		default:
-			if сам.isEnd.Получ() {
+			if сам.isEnd.Get() {
 				return
 			}
 			сам.chTick <- 1
@@ -91,11 +92,16 @@ func (сам *DivWarOn) makeTick() {
 	}
 }
 
+// Выстрел -- возвращает объект выстрела
+func (сам *DivWarOn) Выстрел() ИВыстрел {
+	return сам.выстрел
+}
+
 // запускает сражение
 func (сам *DivWarOn) run() {
 	// defer log._rintf("DivWarOn.run(): сражение завершено\n")
 	{ // Подготовка к сражению
-		сам.shot = shot.НовВыстрел(сам) // Объект выстрела
+		сам.выстрел = shot.НовВыстрел(сам) // Объект выстрела
 		сам.health = health.НовЗдоровье(сам)
 		сам.manevr = manevr.НовМанёвр(сам)
 	}
@@ -114,7 +120,7 @@ func (сам *DivWarOn) run() {
 // Проверяет окончание сражения
 func (сам *DivWarOn) checkEnd() bool {
 	defer func() {
-		if сам.isEnd.Получ() {
+		if сам.isEnd.Get() {
 			сам.fnCancelDivWar()
 			// log._rintf("DivWarOn.checkEnd(): сражение завершено\n")
 		}
@@ -124,26 +130,26 @@ func (сам *DivWarOn) checkEnd() bool {
 	lstDivWarOn := сам.СписПолучить()
 	for _, strOut := range lstDivWarOn {
 		if strings.Contains(strOut, `" class="simple-but gray"><span><span>ОБЫЧНЫЕ</span></span></a>`) {
-			сам.isEnd.Сброс()
+			сам.isEnd.Reset()
 			return false
 		}
 	}
-	сам.isEnd.Уст()
+	сам.isEnd.Set()
 	сам.fnCancelDivWar()
 	return true
 }
 
 // ЕслиКонец -- возвращает признак окончания сражения (интерфейс)
-func (сам *DivWarOn) ЕслиКонец() ИБезопБул {
+func (сам *DivWarOn) ЕслиКонец() ISafeBool {
 	return сам.isEnd
 }
 
-func (сам *DivWarOn) Манёвр()ИМанёвр {
+func (сам *DivWarOn) Манёвр() ИМанёвр {
 	return сам.manevr
 }
 
 // ВыстрелБлок -- признак запрета стрельбы при слабом здоровье
-func (сам *DivWarOn) ВыстрелБлок() ИБезопБул {
+func (сам *DivWarOn) ВыстрелБлок() ISafeBool {
 	return сам.isMasking
 }
 

+ 1 - 1
app/lev2/arena/arena_duel/arena_duel.go

@@ -42,7 +42,7 @@ func (сам *АренаДуэль) Пуск() {
 func (сам *АренаДуэль) пуск() {
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами

+ 1 - 1
app/lev2/arena/arena_laborator/arena_laborator.go

@@ -35,7 +35,7 @@ func (сам *АренаЛаборатория) пуск() {
 	time.Sleep(time.Millisecond * 4500)
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			сам.работать()

+ 5 - 5
app/lev2/arena/arena_market/arena_market.go

@@ -16,13 +16,13 @@ import (
 type АренаРынок struct {
 	ИАрена
 	конт ИБотКонтекст
-	бот     ИБот
+	бот  ИБот
 }
 
 // НовРынок -- возвращает новый рынок
 func НовРынок(конт ИБотКонтекст) ИАренаРынок {
 	сам := &АренаРынок{
-		бот:     конт.Получ("бот").(ИБот),
+		бот: конт.Get("бот").(ИБот),
 	}
 	аренаКонфиг := arena.АренаКонфиг{
 		Бот_:         сам.бот,
@@ -54,7 +54,7 @@ func (сам *АренаРынок) пуск() {
 	}
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			фнРабота()
@@ -311,7 +311,7 @@ func (сам *АренаРынок) проверОжидание() {
 			case "10", "50", "100", "500":
 				return true
 			default:
-				серебро := сам.конт.Получ("серебро").(int)
+				серебро := сам.конт.Get("серебро").Val().(int)
 				if серебро > 1_000_000 {
 					return true
 				}
@@ -366,7 +366,7 @@ func (сам *АренаРынок) купитьЗолото() bool {
 	}
 	lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
 	strSilver = lstSilver[1]
-	серебро := сам.конт.Получ("серебро").(int)
+	серебро := сам.конт.Get("серебро").Val().(int)
 	еслиКупить := false
 	switch strSilver {
 	case "10", "50", "100", "500": // Допустимые суммы трат

+ 10 - 8
app/lev2/arena/arena_masters/arena_masters.go

@@ -5,11 +5,13 @@ import (
 	"strings"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 /*
@@ -22,14 +24,14 @@ import (
 type БитваМастеров struct {
 	ИАрена
 	бот ИБот
-	лог ИЯдроЛог
+	лог ILogBuf
 }
 
 // НовБитваМастеров -- возвращает новый *BatMas
 func НовБитваМастеров(конт ИБотКонтекст, бот ИБот) *БитваМастеров {
-	лог := kernel.НовЛог("БитваМастеров")
-	лог.Инфо("НовБитваМастеров()\n")
-	лог.Паника(бот == nil, "НовБитваМастеров(): ИБот == nil\n")
+	лог := NewLogBuf()
+	лог.Info("НовБитваМастеров()\n")
+	Hassert(бот != nil, "НовБитваМастеров(): ИБот == nil\n")
 	сам := &БитваМастеров{
 		бот: бот,
 		лог: лог,
@@ -52,7 +54,7 @@ func (сам *БитваМастеров) пуск() {
 		for {
 			time.Sleep(time.Second * 10)
 			select {
-			case <-сам.бот.Контекст().Done():
+			case <-сам.бот.КонтБот().Ctx().Done():
 				return
 			case <-сам.ВремяОстат().КаналСиг():
 				if !сам.goBatMas() { // Проверка на начало сражения
@@ -74,7 +76,7 @@ func (сам *БитваМастеров) goBatMas() bool {
 	countTime := сам.ВремяОстат().String()
 	if countTime > "00:25:00" {
 		if err := сам.ОбратВремяУст(АВремя(countTime)); err != nil {
-			сам.лог.Ошибка("goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err)
+			сам.лог.Err("goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err)
 		}
 		return false
 	}

+ 1 - 1
app/lev2/arena/arena_missions/arena_missions.go

@@ -51,7 +51,7 @@ func (сам *АренаМиссии) пуск() {
 	for { // Время истекло
 		// time.Sleep(time.Minute * 1)
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.бот.КонтБот().Ctx().Done():
 			return
 		default:
 			сам.проверНаграда()

+ 11 - 9
app/lev2/arena/arena_net/arena_net.go

@@ -7,8 +7,10 @@ import (
 	"sync"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // АренаСеть -- базовый тип для сетевых арен
@@ -18,15 +20,15 @@ type АренаСеть struct {
 	арена  ИАрена
 	стрУрл string
 	блок   sync.Mutex
-	лог    ИЯдроЛог
+	лог    ILogBuf
 }
 
 // НовАренаСеть -- возвращает новый *АренаСеть
 func НовАренаСеть_(конт ИБотКонтекст, арена ИАрена, стрУрл string) *АренаСеть {
-	лог := kernel.НовЛог("АренаСеть")
-	лог.Инфо("НовАренаСеть(): strUrl=%q\n", стрУрл)
-	лог.Паника(арена == nil, "НовАренаСеть(): ИСценаСтр == nil")
-	лог.Паника(стрУрл == "", "НовАренаСеть(): стрУрл пустой\n")
+	лог := NewLogBuf()
+	лог.Info("НовАренаСеть(): strUrl=%q\n", стрУрл)
+	Hassert(арена != nil, "НовАренаСеть(): ИСценаСтр == nil")
+	Hassert(стрУрл != "", "НовАренаСеть(): стрУрл пустой\n")
 	сам := &АренаСеть{
 		ИБотСеть: арена.Бот().Сеть(),
 		арена:    арена,
@@ -44,10 +46,10 @@ func (сам *АренаСеть) Обновить() {
 	defer сам.блок.Unlock()
 	// FIXME: попытка разобраться, что за фигня творится
 	// time.Sleep(time.Millisecond * 500)
-	сам.лог.Отладка("Обновить(): бот=%s\tсцена=%v\n", сам.арена.Бот().Имя(), сам.арена.Имя())
+	сам.лог.Debug("Обновить(): бот=%s\tсцена=%v\n", сам.арена.Бот().Имя(), сам.арена.Имя())
 	lstString := сам.клиент.Получ(сам.стрУрл)
 	if ош := сам.арена.СтрОбновить(lstString); ош != nil {
-		сам.лог.Ошибка("Обновить(): при обновлении строк сцены, ош=\n\t%v\n", ош)
+		сам.лог.Err("Обновить(): при обновлении строк сцены, ош=\n\t%v\n", ош)
 	}
 }
 

+ 9 - 8
app/lev2/arena/arena_net/arena_web_worker/arena_web_worker.go

@@ -5,8 +5,9 @@ import (
 	"sync"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -17,17 +18,17 @@ import (
 type АренаВебВоркер struct {
 	ботСеть   ИБотСеть
 	вебВоркер ИХттпВоркер
-	лог       ИЯдроЛог
+	лог       ILogBuf
 	block     sync.Mutex
 }
 
 // НовАренаВебВоркер -- возвращает сетевого клиента
 func НовАренаВебВоркер(конт ИБотКонтекст) *АренаВебВоркер { //, ботСеть ИБотСеть)
-	лог := kernel.НовЛог("АренаВебВоркер")
-	лог.Инфо("НовАренаВебВоркер()\n")
+	лог := NewLogBuf()
+	лог.Info("НовАренаВебВоркер()\n")
 	сам := &АренаВебВоркер{
-		ботСеть:   конт.Получ("ботСеть").(ИБотСеть),
-		вебВоркер: конт.Получ("хттпВоркер").(ИХттпВоркер), //ботСеть.ВебВоркер(),
+		ботСеть:   конт.Get("ботСеть").(ИБотСеть),
+		вебВоркер: конт.Get("хттпВоркер").(ИХттпВоркер), //ботСеть.ВебВоркер(),
 		лог:       лог,
 	}
 	return сам
@@ -38,7 +39,7 @@ func (сам *АренаВебВоркер) Получ(ссылка string) (lst
 	сам.block.Lock()
 	defer сам.block.Unlock()
 	// if ссылка == "https://wartank.ru/production/Mine" {
-	сам.лог.Отладка("АренаВебВоркер.Получ(): link=%v\n", ссылка)
+	сам.лог.Debug("АренаВебВоркер.Получ(): link=%v\n", ссылка)
 	// }
 	списОтвет := сам.вебВоркер.Получ(ссылка)
 	return списОтвет, nil

+ 21 - 28
app/lev2/arena/arena_polygon/arena_polygon.go

@@ -6,13 +6,13 @@ import (
 	"strings"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/alias"
 	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
-	"wartank/app/lev1"
 	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 /*
@@ -33,22 +33,20 @@ type АренаПолигон struct {
 	ИАрена
 	бот           ИБот
 	танкСтат      ИТанкСтат
-	продуктСейчас ИБезопСтрока
-	продуктКол    ИБезопЦелое
-	уровень       ИСтатПарам
-	лог           ИЯдроЛог
+	продуктСейчас ISafeString
+	продуктКол    ISafeInt
+	лог           ILogBuf
 }
 
 // НовПолигон -- возвращает новый *Polygon
 func НовПолигон(конт ИБотКонтекст, база ИАренаБаза) *АренаПолигон {
-	лог := kernel.НовЛог("Полигон " + база.Бот().Имя())
-	лог.Инфо("НовПолигон(): бот=%s\n", база.Бот().Имя())
+	лог := NewLogBuf()
+	лог.Info("НовПолигон(): бот=%s\n", база.Бот().Имя())
 	сам := &АренаПолигон{
 		бот:           база.Бот(),
 		танкСтат:      база.Бот().Стата(),
-		продуктСейчас: kernel.НовБезопСтрока(),
-		продуктКол:    kernel.НовБезопЦелое(),
-		уровень:       lev1.НовСтатПарам("уровень"), // FIXME: вынести на уровень арены
+		продуктСейчас: NewSafeString(),
+		продуктКол:    NewSafeInt(),
 		лог:           лог,
 	}
 	аренаКонфиг := arena.АренаКонфиг{
@@ -63,19 +61,14 @@ func НовПолигон(конт ИБотКонтекст, база ИАрен
 	return сам
 }
 
-// Уровень -- возвращает уровень полигона
-func (сам *АренаПолигон) Уровень() ИСтатПарам {
-	return сам.уровень
-}
-
 // ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
 func (сам *АренаПолигон) ПродуктКолСейчас() int {
-	return сам.продуктКол.Получ()
+	return сам.продуктКол.Get()
 }
 
 // ПродуктИмяСейчас -- что именно сейчас производится на полигоне
 func (сам *АренаПолигон) ПродуктИмяСейчас() string {
-	return сам.продуктСейчас.Получ()
+	return сам.продуктСейчас.Get()
 }
 
 // ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
@@ -121,7 +114,7 @@ func (сам *АренаПолигон) пуск() {
 		сам.усилениеПровер()
 		сам.времяОбнов()
 
-		if сам.продуктСейчас.Получ() == стрАпгрейд {
+		if сам.продуктСейчас.Get() == стрАпгрейд {
 			ош := сам.ВремяОстат().Уст("00:10:00")
 			if ош != nil {
 				log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
@@ -236,7 +229,7 @@ func (сам *АренаПолигон) уровеньПолучить() bool {
 	if ош != nil {
 		return false
 	}
-	сам.уровень.Уст(цУров)
+	сам.Уровень().Уст(цУров)
 	return true
 }
 
@@ -255,8 +248,8 @@ func (сам *АренаПолигон) проверитьУскорение() b
 			}
 			сам.АренаСостояние().РаботаИмяУст("")
 			сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			сам.продуктСейчас.Уст(стрАпгрейд)
-			сам.продуктКол.Уст(0)
+			сам.продуктСейчас.Set(стрАпгрейд)
+			сам.продуктКол.Reset()
 			return true
 		}
 	}
@@ -276,8 +269,8 @@ func (сам *АренаПолигон) проверитьУскорение() b
 			return false
 		}
 		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктСейчас.Уст(стрАпгрейд)
-		сам.продуктКол.Уст(0)
+		сам.продуктСейчас.Set(стрАпгрейд)
+		сам.продуктКол.Reset()
 		lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
 		strLink := lstLink[1]
 		lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
@@ -294,7 +287,7 @@ func (сам *АренаПолигон) проверитьУскорение() b
 		}
 		сам.АренаСостояние().РаботаИмяУст("")
 		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктКол.Уст(0)
+		сам.продуктКол.Reset()
 		if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
 			log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
 		}
@@ -404,8 +397,8 @@ func (сам *АренаПолигон) усилениеПровер() {
 		return
 	}
 	сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
-	сам.продуктСейчас.Уст("усиление-" + форсажИмя)
-	сам.продуктКол.Уст(iForce)
+	сам.продуктСейчас.Set("усиление-" + форсажИмя)
+	сам.продуктКол.Set(iForce)
 }
 
 // Выбирает самый слабый параметр и усиливает его

+ 6 - 4
app/lev2/arena/arena_string/arena_string.go

@@ -6,7 +6,9 @@ import (
 	"strings"
 	"sync"
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 )
 
 // АренаСтроки -- потокобезопасный список строк арены
@@ -18,9 +20,9 @@ type АренаСтроки struct {
 
 // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
 func НовАренаСтроки(конт ИБотКонтекст, strControl string) *АренаСтроки {
-	лог := kernel.НовЛог("АренаСтроки")
-	лог.Отладка("НовАренаСтроки(): strControl=%q", strControl)
-	лог.Паника(strControl == "", "НовАренаСтроки(): strControl is empty")
+	лог := NewLogBuf()
+	лог.Debug("НовАренаСтроки(): strControl=%q", strControl)
+	Hassert(strControl != "", "НовАренаСтроки(): strControl is empty")
 	сам := &АренаСтроки{
 		val:        make([]string, 0),
 		strControl: strControl,

+ 13 - 11
app/lev2/arena/arena_upgrade/arena_upgrade.go

@@ -9,8 +9,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // ТанкПараметры -- параметры танка повышение
@@ -18,17 +20,17 @@ type АренаАпгрейд struct {
 	конт   ИБотКонтекст
 	прилож ИПриложение
 	номер  string // Номер танка в игре
-	лог    ИЯдроЛог
+	лог    ILogBuf
 }
 
 // НовТанкПараметры -- возвращает новые параметры танка
 func НовТанкПараметры(конт ИБотКонтекст) *АренаАпгрейд {
-	лог := kernel.НовЛог("ТанкПараметры")
-	лог.Инфо("НовТанкПараметры()\n")
+	лог := NewLogBuf()
+	лог.Info("НовТанкПараметры()\n")
 
 	сам := &АренаАпгрейд{
 		конт:   конт,
-		прилож: конт.Получ("прилож").(ИПриложение),
+		прилож: конт.Get("прилож").(ИПриложение),
 		лог:    лог,
 	}
 	return сам
@@ -45,12 +47,12 @@ func (сам *АренаАпгрейд) пуск() {
 	ош := сам.номерПолуч()
 	if ош != nil {
 		log.Printf("ТанкПараметры.пуск(): при получении параметров танка, ош=\n\t%v\n", ош)
-		сам.прилож.Отменить()
+		сам.прилож.Cancel()
 		return
 	}
 	for {
 		select {
-		case <-сам.прилож.Конт().Done():
+		case <-сам.прилож.Ctx().Done():
 			return
 		default:
 			сам.работать()
@@ -67,7 +69,7 @@ func (сам *АренаАпгрейд) работать() {
 // Улучшает параметры танка
 func (сам *АренаАпгрейд) улучшить() {
 	// https://wartank.ru/pimp/34479487
-	клиент := сам.конт.Получ("хттпВоркер").(ИХттпВоркер)
+	клиент := сам.конт.Get("хттпВоркер").(ИХттпВоркер)
 	фнУлучшить := func() bool {
 		лстСтр := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
 		var (
@@ -81,7 +83,7 @@ func (сам *АренаАпгрейд) улучшить() {
 				break
 			}
 		}
-		сам.лог.Паника(!еслиНашли, "ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
+		Hassert(еслиНашли, "ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
 		стрВых = strings.TrimPrefix(стрВых, `<a class="simple-but border mb5" href="`)
 		стрВых = strings.TrimSuffix(стрВых, `">`)
 		// https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
@@ -101,7 +103,7 @@ func (сам *АренаАпгрейд) улучшить() {
 
 // Получает собственный номер танка с сервера
 func (сам *АренаАпгрейд) номерПолуч() error {
-	клиент := сам.конт.Получ("хттпВоркер").(ИХттпВоркер)
+	клиент := сам.конт.Get("хттпВоркер").(ИХттпВоркер)
 	лстСтр := клиент.Получ("https://wartank.ru/angar")
 	var (
 		стрНомер  string

+ 23 - 22
app/lev2/arena/down_time/down_time.go

@@ -11,8 +11,9 @@ import (
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/product/parser_time"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 const (
@@ -25,9 +26,9 @@ type ВремОбрат struct {
 
 	остатПарсер ИПарсерВремя // Парсер значения (мсек)
 
-	текущ        ИБезопЦелое // Фактическое значение счётчика в мсек
-	лимит        ИБезопЦелое // Целевое время срабатывания в мсек
-	еслиРаботает ИБезопБул   // Признак работы
+	текущ        ISafeInt  // Фактическое значение счётчика в мсек
+	лимит        ISafeInt  // Целевое время срабатывания в мсек
+	еслиРаботает ISafeBool // Признак работы
 
 	канВызов chan int // Канал для отправки сигналов (для верхнего уровня)
 
@@ -45,17 +46,17 @@ func НовВремОбрат(сцена ИАренаКонтекст, врем
 	кнт, фнОтмена := context.WithCancel(сцена.Контекст())
 	сам := &ВремОбрат{
 		сцена:        сцена,
-		текущ:        kernel.НовБезопЦелое(),
+		текущ:        NewSafeInt(),
 		канВызов:     make(chan int, 2),
-		еслиРаботает: kernel.НовБезопБул(),
+		еслиРаботает: NewSafeBool(),
 		остатПарсер:  parser_time.НовПарсерВремя(),
-		лимит:        kernel.НовБезопЦелое(),
+		лимит:        NewSafeInt(),
 		кнт:          кнт,
 		фнОтмена:     фнОтмена,
 	}
 	мСек := АМилСек(time.Now().UTC().UnixMilli()) + время
-	сам.лимит.Уст(int(мСек))
-	сам.еслиРаботает.Уст()
+	сам.лимит.Set(int(мСек))
+	сам.еслиРаботает.Set()
 	go сам.пуск()
 	go сам.закрыть()
 	_ = ИВремяОстат(сам)
@@ -73,17 +74,17 @@ func (сам *ВремОбрат) пуск() {
 	фнЖдать := func() {
 		time.Sleep(спатьИнтервал)
 		timeNow := time.Now().UTC().UnixMilli()
-		цТекущ := сам.текущ.Получ()
+		цТекущ := сам.текущ.Get()
 		цТекущ -= 1000
 		if цТекущ < 0 {
 			цТекущ = 0
 		}
-		сам.текущ.Уст(цТекущ)
-		if сам.лимит.Получ() > int(timeNow) || цТекущ > 0 {
+		сам.текущ.Set(цТекущ)
+		if сам.лимит.Get() > int(timeNow) || цТекущ > 0 {
 			return
 		}
 		сам.канВызов <- 1
-		сам.лимит.Уст(int(timeNow) + int(сам.остатПарсер.ПолучМилСек()))
+		сам.лимит.Set(int(timeNow) + int(сам.остатПарсер.ПолучМилСек()))
 	}
 	for {
 		select {
@@ -98,8 +99,8 @@ func (сам *ВремОбрат) пуск() {
 // Сброс -- сбрасывает оставшееся время в ноль
 func (сам *ВремОбрат) Сброс() {
 	сам.остатПарсер.Сброс()
-	сам.текущ.Сброс()
-	сам.лимит.Сброс()
+	сам.текущ.Reset()
+	сам.лимит.Reset()
 }
 
 // Стоп -- останавливает работу счётчика
@@ -115,9 +116,9 @@ func (сам *ВремОбрат) Уст(время АВремя) error {
 		return fmt.Errorf("ВремОбрат(): ошибка при установке времени, ош=\n\t%w", ош)
 	}
 	_val := сам.остатПарсер.ПолучМилСек()
-	сам.текущ.Уст(int(_val))
-	val := int(time.Now().UTC().UnixMilli()) + сам.текущ.Получ()
-	сам.лимит.Уст(val)
+	сам.текущ.Set(int(_val))
+	val := int(time.Now().UTC().UnixMilli()) + сам.текущ.Get()
+	сам.лимит.Set(val)
 	return nil
 }
 
@@ -125,7 +126,7 @@ func (сам *ВремОбрат) Уст(время АВремя) error {
 func (сам *ВремОбрат) String() string {
 	сам.блок.RLock()
 	defer сам.блок.RUnlock()
-	цОстат := сам.текущ.Получ()
+	цОстат := сам.текущ.Get()
 	остат := time.Millisecond * time.Duration(цОстат)
 	стрВрем := остат.String()
 	return стрВрем
@@ -140,8 +141,8 @@ func (сам *ВремОбрат) закрыть() {
 	<-сам.кнт.Done()
 	сам.блок.Lock()
 	defer сам.блок.Unlock()
-	if !сам.еслиРаботает.Получ() {
+	if !сам.еслиРаботает.Get() {
 		return
 	}
-	сам.еслиРаботает.Сброс()
+	сам.еслиРаботает.Set()
 }

+ 45 - 42
app/lev3/bot/bot.go

@@ -8,47 +8,49 @@ import (
 	"strings"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena/arena_angar"
 	"wartank/app/lev3/bot/bot_config"
 	"wartank/app/lev3/bot/bot_net"
 	"wartank/app/lev3/bot/bot_stat/tank_stat"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // ВарБот -- бот для игры в вартанк
 type Бот struct {
 	прилож         ИПриложение
-	хран           ИЯдроХранилище
+	хран           IKernelStoreKv
 	стата          ИТанкСтат
 	errFinal       error // Финальная ошибка работы, если была
 	ангар          ИАренаАнгар
 	сеть           ИБотСеть
-	еслиРаботает   ИБезопБул
-	еслиАвтозапуск ИБезопБулНаблюд
+	еслиРаботает   ISafeBool
+	еслиАвтозапуск ISafeBoolReact
 	конфиг         *bot_config.БотКонфиг // Конфиг бота для хранения в базе
 	кнт            context.Context       // Контекст бота
 	фтОтмена       func()                // Функция отменя контекста бота
-	лог            ИЯдроЛог
+	лог            ILogBuf
 	конт           ИБотКонтекст
 }
 
 // ЗагрузитьВарБот -- загружает бота из базы
-func ЗагрузитьВарБот(конт ИЯдроКонтекст, номер АБотНомер) *Бот {
-	лог := kernel.НовЛог("ВарБот")
-	лог.Инфо("ЗагрузитьВарБот()\n")
-	лог.Паника(номер == 0, "ЗагрузитьВарБот(): номер пустой")
+func ЗагрузитьВарБот(конт IKernelCtx, номер АБотНомер) *Бот {
+	лог := NewLogBuf()
+	лог.Info("ЗагрузитьВарБот()\n")
+	Hassert(номер != 0, "ЗагрузитьВарБот(): номер пустой")
 	стрНомер := fmt.Sprint(номер)
-	лог.Инфо("ЗагрузитьВарБот(): номер=%q\n", стрНомер)
-	хран := конт.Получ("kernStore").(ИЯдроХранилище)
+	лог.Info("ЗагрузитьВарБот(): номер=%q\n", стрНомер)
+	хран := конт.Get("kernStore").Val().(IKernelStoreKv)
 	binData, err := хран.Get("/bots/" + стрНомер)
 	if err != nil {
 		if !strings.Contains(err.Error(), "not found") {
-			лог.Паника(true, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
+			Hassert(false, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
 		}
-		лог.Паника(err != nil, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
+		Hassert(err == nil, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
 	}
 	конфиг := &bot_config.БотКонфиг{}
 	конфиг.Unmarshal(binData)
@@ -61,17 +63,17 @@ func ЗагрузитьВарБот(конт ИЯдроКонтекст, ном
 // Каждые два часа перезапускает себя
 func (сам *Бот) рестарт() {
 	time.Sleep(time.Hour * 2)
-	сам.прилож.Отменить()
-	сам.лог.Инфо("рестарт(): бот %q перезагружен\n", сам.конфиг.Логин_)
+	сам.прилож.Cancel()
+	сам.лог.Info("рестарт(): бот %q перезагружен\n", сам.конфиг.Логин_)
 }
 
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(конт ИЯдроКонтекст, номер АБотНомер, логин, пароль string, еслиАвто bool) *Бот {
-	лог := kernel.НовЛог("ВарБот")
-	лог.Инфо("НовВарБот()\n")
-	лог.Паника(логин == "", "НовВарБот(): логин пустой")
-	лог.Паника(пароль == "", "НовВарБот(): пароль пустой")
-	лог.Инфо("НовВарБот(): name=%q\n", логин)
+func НовВарБот(конт IKernelCtx, номер АБотНомер, логин, пароль string, еслиАвто bool) *Бот {
+	лог := NewLogBuf()
+	лог.Info("НовВарБот()\n")
+	Hassert(логин != "", "НовВарБот(): логин пустой")
+	Hassert(пароль != "", "НовВарБот(): пароль пустой")
+	лог.Info("НовВарБот(): name=%q\n", логин)
 	config := &bot_config.БотКонфиг{
 		ЕслиАвтозапуск_: еслиАвто,
 		Логин_:          логин,
@@ -85,31 +87,32 @@ func НовВарБот(конт ИЯдроКонтекст, номер АБот
 }
 
 // Создаёт ядро бота
-func создатьЯдроВарБот(конт ИЯдроКонтекст, конфиг *bot_config.БотКонфиг) *Бот {
-	лог := kernel.НовЛог("ВарБот")
-	лог.Инфо("создатьЯдроВарБот()\n")
-	лог.Паника(конфиг == nil, "создатьЯдроВарБот(): ВарБотКонфиг==nil")
-	ctx, fnCancel := context.WithCancel(конт.Конт())
-	приложение := конт.Получ("приложение").(ИПриложение)
-	контБот := kernel.НовКонтекст()
+func создатьЯдроВарБот(конт IKernelCtx, конфиг *bot_config.БотКонфиг) *Бот {
+	лог := NewLogBuf()
+	лог.Info("создатьЯдроВарБот()\n")
+	Hassert(конфиг != nil, "создатьЯдроВарБот(): ВарБотКонфиг==nil")
+	ctx, fnCancel := context.WithCancel(конт.Ctx())
+	приложение := конт.Get("приложение").Val().(ИПриложение)
+	контБот := NewLocalCtx(конт.Ctx())
 	сам := &Бот{
 		конт:         контБот,
 		прилож:       приложение,
-		хран:         конт.Получ("kernStore").(ИЯдроХранилище),
+		хран:         конт.Get("kernStore").Val().(IKernelStoreKv),
 		стата:        tank_stat.НовТанкСтат(конт),
-		еслиРаботает: kernel.НовБезопБул(),
+		еслиРаботает: NewSafeBool(),
 		конфиг:       конфиг,
 		кнт:          ctx,
 		фтОтмена:     fnCancel,
 		лог:          лог,
 	}
-	сам.еслиАвтозапуск = kernel.НовБезопБулНаблюд(сам.Имя(), сам.автозапускИзм)
-	сам.конт.Уст("бот", сам)
-	сам.конт.Уст("приложение", приложение)
+	сам.еслиАвтозапуск = NewSafeBoolReact()
+	сам.еслиАвтозапуск.Add(сам.Имя(), сам.автозапускИзм)
+	сам.конт.Set("бот", сам, "создание ядра")
+	сам.конт.Set("приложение", приложение, "Приложение WarBot")
 	сам.сеть = bot_net.НовБотСеть(сам.конт)
 	сам.ангар = arena_angar.НовАнгар(сам.конт)
 	if сам.конфиг.ЕслиАвтозапуск_ {
-		сам.еслиАвтозапуск.Уст()
+		сам.еслиАвтозапуск.Set()
 		сам.Пуск()
 	}
 	return сам
@@ -117,7 +120,7 @@ func создатьЯдроВарБот(конт ИЯдроКонтекст, к
 
 // ЕслиРабота -- возвращает признак, что бот подключен
 func (сам *Бот) ЕслиРабота() bool {
-	return сам.еслиРаботает.Получ()
+	return сам.еслиРаботает.Get()
 }
 
 // Номер -- возвращает номер бота
@@ -137,11 +140,11 @@ func (сам *Бот) Пароль() string {
 
 // Пуск -- запускает бот в работу
 func (сам *Бот) Пуск() {
-	if сам.еслиРаботает.Получ() {
+	if сам.еслиРаботает.Get() {
 		return
 	}
 	сам.ангар.Пуск()
-	сам.еслиРаботает.Уст()
+	сам.еслиРаботает.Set()
 }
 
 // Error -- возвращает финальную ошибку работы, если была
@@ -165,13 +168,13 @@ func (сам *Бот) Сеть() ИБотСеть {
 }
 
 // Автозапуск -- возвращает признак автоматического запуска бота
-func (сам *Бот) Автозапуск() ИБезопБулНаблюд {
+func (сам *Бот) Автозапуск() ISafeBoolReact {
 	return сам.еслиАвтозапуск
 }
 
 // Обратный вызов автоматического запуска бота
 func (сам *Бот) автозапускИзм(знач bool) {
-	сам.лог.Отладка("Бот.автозапускИзм()")
+	сам.лог.Debug("Бот.автозапускИзм()")
 	// сам.еслиАвтозапуск.Уст()
 	сам.конфиг.ЕслиАвтозапуск_ = знач
 	сам.сохрКонфиг()
@@ -183,7 +186,7 @@ func (сам *Бот) сохрКонфиг() {
 	strConf := сам.конфиг.Marshall()
 	стрНомер := fmt.Sprint(сам.Номер())
 	err := сам.хран.Set("/bots/"+стрНомер, strConf)
-	сам.лог.Паника(err != nil, "ВарБот.сохрКонфиг(): err=\n\t%v\n", err)
+	Hassert(err == nil, "ВарБот.сохрКонфиг(): err=\n\t%v\n", err)
 }
 
 // Контекст -- возвращает контекст бота
@@ -197,6 +200,6 @@ func (сам *Бот) Закончить() {
 }
 
 // КонтБот -- возвращает контекст бота
-func (сам *Бот) КонтБот() ИБотКонтекст {
+func (сам *Бот) КонтБот() ILocalCtx {
 	return сам.конт
 }

+ 6 - 4
app/lev3/bot/bot_config/bot_config.go

@@ -5,8 +5,10 @@ import (
 	"encoding/json"
 	"sync"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+
 	. "wartank/app/lev0/alias"
-	"wartank/kernel"
 )
 
 // БотКонфиг -- конфиг бота для хранения в базе
@@ -26,10 +28,10 @@ func (сам *БотКонфиг) Marshall() []byte {
 
 // Unmarshal -- десериализует себя из байтового потока
 func (сам *БотКонфиг) Unmarshal(binData []byte) {
-	лог := kernel.НовЛог("БотКонфиг")
-	лог.Отладка("Unmarshal()")
+	лог := NewLogBuf()
+	лог.Debug("БотКонфиг.Unmarshal()")
 	err := json.Unmarshal(binData, сам)
-	лог.Паника(err != nil, "Unmarshal(): err=\n\t%v\n", err)
+	Hassert(err == nil, "Unmarshal(): err=\n\t%v\n", err)
 }
 
 // Логин -- возвращает логин

+ 7 - 6
app/lev3/bot/bot_net/bot_cookie/bot_cookie.go

@@ -4,8 +4,9 @@ import (
 	"net/http"
 	"sync"
 
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -16,13 +17,13 @@ import (
 type БотКуки struct {
 	куки []*http.Cookie
 	блок sync.RWMutex
-	лог  ИЯдроЛог
+	лог  ILogBuf
 }
 
 // НовБотКуки -- возвращает новый *БотКуки
 func НовБотКуки() БотКуки {
-	лог := kernel.НовЛог("БотКуки")
-	лог.Инфо("БотКуки()\n")
+	лог := NewLogBuf()
+	лог.Info("БотКуки()\n")
 	return БотКуки{
 		лог: лог,
 	}
@@ -32,7 +33,7 @@ func НовБотКуки() БотКуки {
 func (сам *БотКуки) Уст(cook []*http.Cookie) {
 	сам.блок.Lock()
 	defer сам.блок.Unlock()
-	сам.лог.Паника(cook == nil, "БотКуки.Уст(): cookie == nil")
+	Hassert(cook == nil, "БотКуки.Уст(): cookie == nil")
 	сам.куки = cook
 	cookie := http.Cookie{
 		Name:  "JSESSIONID",

+ 16 - 24
app/lev3/bot/bot_net/bot_net.go

@@ -1,14 +1,13 @@
 package bot_net
 
 import (
-	"context"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/bot/bot_net/bot_http_conn"
 	"wartank/app/lev3/bot/bot_net/bot_net_login"
 	"wartank/app/lev3/bot/bot_net/http_worker"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 /*
@@ -20,36 +19,34 @@ type БотСеть struct {
 	бот        ИБот
 	соедХттп   *bot_http_conn.БотХттпСоед
 	логин      *bot_net_login.БотСетьЛогин
-	еслиОнлайн ИБезопБул
+	еслиОнлайн ISafeBool
 	вебВоркер  ИХттпВоркер
-	ctx        context.Context
-	фнОтмена   func()
-	лог        ИЯдроЛог
+	ctx        ILocalCtx
+	лог        ILogBuf
 }
 
 // НовБотСеть -- возвращает новый коннект к сети бота
 func НовБотСеть(конт ИБотКонтекст) *БотСеть {
-	лог := kernel.НовЛог("ВарБотСеть")
-	лог.Инфо("НовБотСеть()\n")
-	бот := конт.Получ("юот").(ИБот)
-	лог.Инфо("НовБотСеть(): имя=%q\n", бот.Имя())
-	ctx, фнОтмена := context.WithCancel(бот.Контекст())
+	лог := NewLogBuf()
+	лог.Info("НовБотСеть()\n")
+	бот := конт.Get("юот").(ИБот)
+	лог.Info("НовБотСеть(): имя=%q\n", бот.Имя())
+	ctx := NewLocalCtx(конт.Ctx())
 	сам := &БотСеть{
 		бот:        бот,
 		соедХттп:   bot_http_conn.НовБотХттпСоед(),
-		еслиОнлайн: kernel.НовБезопБул(),
+		еслиОнлайн: NewSafeBool(),
 		ctx:        ctx,
-		фнОтмена:   фнОтмена,
 		лог:        лог,
 	}
-	конт.Уст("хттпКлиент", сам.соедХттп.ХттпКлиент())
+	конт.Set("хттпКлиент", сам.соедХттп.ХттпКлиент(), "HTTP-клиент для запросов")
 	сам.вебВоркер = http_worker.НовХттпВоркер(конт)
 
 	// Подключаем сетевой логин
-	конт.Уст("ботСеть", сам)
+	конт.Set("ботСеть", сам, "Сеть бота")
 	сам.логин = bot_net_login.НовБотСетьЛогин(конт)
 
-	сам.еслиОнлайн.Уст()
+	сам.еслиОнлайн.Set()
 	_ = ИБотСеть(сам)
 	return сам
 }
@@ -60,17 +57,12 @@ func (сам *БотСеть) Бот() ИБот {
 }
 
 // Контекст -- контекст сети бота
-func (сам *БотСеть) Контекст() context.Context {
+func (сам *БотСеть) Контекст() ILocalCtx {
 	return сам.ctx
 }
 
-// Отмена -- отменяет контекст сети бота
-func (сам *БотСеть) Отмена() {
-	сам.фнОтмена()
-}
-
 // ЕслиОнлайн -- возвращает признак нахождения в онлайне
-func (сам *БотСеть) ЕслиОнлайн() ИБезопБул {
+func (сам *БотСеть) ЕслиОнлайн() ISafeBool {
 	return сам.еслиОнлайн
 }
 

+ 18 - 16
app/lev3/bot/bot_net/bot_net_login/bot_net_login.go

@@ -8,8 +8,10 @@ import (
 	"strings"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // БотСетьЛогин -- объект сетевого входа на сервер
@@ -17,16 +19,16 @@ type БотСетьЛогин struct {
 	сеть       ИБотСеть
 	хттпКлиент *http.Client // Сырой клиент HTTP
 	куки       ИБотКуки
-	лог        ИЯдроЛог
+	лог        ILogBuf
 }
 
 // НовБотСетьЛогин -- возвращает новый *БотСетьЛогин
 func НовБотСетьЛогин(конт ИБотКонтекст) *БотСетьЛогин {
-	лог := kernel.НовЛог("БотСетьЛогин")
-	лог.Инфо("НовБотСетьЛогин()\n")
+	лог := NewLogBuf()
+	лог.Info("НовБотСетьЛогин()\n")
 
-	ботСеть := конт.Получ("ботСеть").(ИБотСеть)
-	хттпКлиент := конт.Получ("хттпКлиент").(*http.Client)
+	ботСеть := конт.Get("ботСеть").(ИБотСеть)
+	хттпКлиент := конт.Get("хттпКлиент").Val().(*http.Client)
 	сам := &БотСетьЛогин{
 		сеть:       ботСеть,
 		хттпКлиент: хттпКлиент,
@@ -47,18 +49,18 @@ func (сам *БотСетьЛогин) подключить() {
 	}
 	// Логин уже был
 	запр, ош1 := http.NewRequest("GET", "https://wartank.ru/angar", nil)
-	сам.лог.Паника(ош1 != nil, "БотСетьЛогин.подключить(): при получении страницы ангара, err=\n\t%v\n", ош1)
+	Hassert(ош1 == nil, "БотСетьЛогин.подключить(): при получении страницы ангара, err=\n\t%v\n", ош1)
 	resp, ош2 := сам.хттпКлиент.Do(запр)
-	сам.лог.Паника(ош2 != nil, "БотСетьЛогин.подключить(): при выполнении запроса, err=\n\t%v\n", ош2)
+	Hassert(ош2 == nil, "БотСетьЛогин.подключить(): при выполнении запроса, err=\n\t%v\n", ош2)
 	defer resp.Body.Close()
 	_, ош := io.ReadAll(resp.Body)
-	сам.лог.Паника(ош != nil, "БотСетьЛогин.подключить(): при получении тела страницы ангара, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "БотСетьЛогин.подключить(): при получении тела страницы ангара, err=\n\t%v\n", ош)
 }
 
 // Прочитать главную страницу для получения кукисов
 func (сам *БотСетьЛогин) получСтрГлав() string {
 	ответ, ош := сам.хттпКлиент.Get("https://wartank.ru/")
-	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрГлав(): err=\n\t%v\n", ош)
+	Hassert(ош == nil, "БотСетьЛогин.получСтрГлав(): err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
 	// Получить куки из ответа
 	куки := ответ.Cookies()
@@ -66,7 +68,7 @@ func (сам *БотСетьЛогин) получСтрГлав() string {
 		сам.куки.Уст(куки)
 	}
 	бинДанные, ош := io.ReadAll(ответ.Body)
-	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрГлав(): при чтении тела ответа, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "БотСетьЛогин.получСтрГлав(): при чтении тела ответа, err=\n\t%v\n", ош)
 	// Вырезать из тела страницы ссылку на вход
 	списСтр := strings.Split(string(бинДанные), "\n")
 	var (
@@ -94,10 +96,10 @@ func (сам *БотСетьЛогин) получСтрГлав() string {
 func (сам *БотСетьЛогин) получСтрЛогин(linkBegin string) string {
 	// _mt.Println("\БотСетьЛогин.getPageLogin()")
 	ответ, ош := сам.хттпКлиент.Get(linkBegin)
-	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрЛогин(): in make GET-request for send login page, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "БотСетьЛогин.получСтрЛогин(): in make GET-request for send login page, err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
 	данные, ош := io.ReadAll(ответ.Body)
-	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрЛогин(): in read body response, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "БотСетьЛогин.получСтрЛогин(): in read body response, err=\n\t%v\n", ош)
 	стрТелоЛогин := string(данные)
 	return стрТелоЛогин
 }
@@ -129,9 +131,9 @@ func (сам *БотСетьЛогин) выполнитьЛогин(strBody str
 	form.Add("password", сам.сеть.Бот().Пароль())
 
 	resp, err := сам.хттпКлиент.PostForm(postLink, form)
-	сам.лог.Паника(resp.StatusCode != 200, "БотСетьЛогин.makePostLogin():  in get POST-login response, err=\n\t%v\n", err)
+	Hassert(resp.StatusCode == 200, "БотСетьЛогин.makePostLogin():  in get POST-login response, err=\n\t%v\n", err)
 	defer resp.Body.Close()
-	сам.лог.Паника(err != nil, "БотСетьЛогин.makePostLogin(): in read body POST-login response, err=\n\t%v\n", err)
+	Hassert(err == nil, "БотСетьЛогин.makePostLogin(): in read body POST-login response, err=\n\t%v\n", err)
 	urlObj, _ := url.Parse("https://wartank.ru/")
 	сам.хттпКлиент.Jar.SetCookies(urlObj, сам.куки.Получ())
 

+ 20 - 17
app/lev3/bot/bot_net/bot_net_stat/net_stat.go

@@ -6,8 +6,10 @@ import (
 	"strings"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -18,16 +20,16 @@ import (
 type БотСетьСтат struct {
 	прилож ИПриложение
 	бот    ИБот
-	лог    ИЯдроЛог
+	лог    ILogBuf
 }
 
 // НовБотСетьСтат -- возвращает новый *NetStat
 func НовБотСетьСтат(конт ИБотКонтекст) *БотСетьСтат {
-	лог := kernel.НовЛог("БотСетьСтат")
-	лог.Инфо("НовБотСетьСтат()\n")
-	bot := конт.Получ("бот").(ИБот)
+	лог := NewLogBuf()
+	лог.Info("НовБотСетьСтат()\n")
+	bot := конт.Get("бот").(ИБот)
 	сам := &БотСетьСтат{
-		прилож: конт.Получ("сервер").(ИПриложение),
+		прилож: конт.Get("сервер").(ИПриложение),
 		бот:    bot,
 		лог:    лог,
 	}
@@ -66,7 +68,7 @@ func (сам *БотСетьСтат) мощностьНайти() {
 	lstPower = strings.Split(strPower, `</span>`)
 	strPower = lstPower[0]
 	iPower, ош := strconv.Atoi(strPower)
-	сам.лог.Паника(ош != nil, "NetStat.мощностьНайти(): мощность(%v) не число, ош=\n\t%v\n", strPower, ош)
+	Hassert(ош == nil, "NetStat.мощностьНайти(): мощность(%v) не число, ош=\n\t%v\n", strPower, ош)
 	сам.бот.Стата().Мощь().Уст(iPower)
 }
 
@@ -96,7 +98,7 @@ func (сам *БотСетьСтат) прочностьНайти() {
 	lstHard = strings.Split(strHard, `</span><br/>`)
 	strHard = lstHard[0]
 	iHard, ош := strconv.Atoi(strHard)
-	сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): прочность(%v) не число, ош=\n\t%v\n", strHard, ош)
+	Hassert(ош == nil, "NetStat.прочностьНайти(): прочность(%v) не число, ош=\n\t%v\n", strHard, ош)
 	сам.бот.Стата().Прочность().Уст(iHard)
 }
 
@@ -126,7 +128,7 @@ func (сам *БотСетьСтат) точностьНайти() {
 	lstFyne = strings.Split(strFyne, `</span><br/>`)
 	strFyne = lstFyne[0]
 	iFyne, ош := strconv.Atoi(strFyne)
-	сам.лог.Паника(ош != nil, "NetStat.точностьНайти(): точность(%v) не число, ош=\n\t%v\n", strFyne, ош)
+	Hassert(ош == nil, "NetStat.точностьНайти(): точность(%v) не число, ош=\n\t%v\n", strFyne, ош)
 	сам.бот.Стата().Точность().Уст(iFyne)
 }
 
@@ -155,7 +157,7 @@ func (сам *БотСетьСтат) броняНайти() {
 	lstArmor = strings.Split(strArmor, `</span><br/>`)
 	strArmor = lstArmor[0]
 	iArmor, ош := strconv.Atoi(strArmor)
-	сам.лог.Паника(ош != nil, "NetStat.броняНайти(): броня(%v) не число, ош=\n\t%v\n", strArmor, ош)
+	Hassert(ош == nil, "NetStat.броняНайти(): броня(%v) не число, ош=\n\t%v\n", strArmor, ош)
 	сам.бот.Стата().Броня().Уст(iArmor)
 }
 
@@ -179,14 +181,14 @@ func (сам *БотСетьСтат) findLevelTank() {
 	lstLevel = strings.Split(strLevel, `</span></span></div></td>`)
 	strLevel = lstLevel[0]
 	iLevel, ош := strconv.Atoi(strLevel)
-	сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): уровень(%v) не число, ош=\n\t%v\n", strLevel, ош)
+	Hassert(ош == nil, "NetStat.прочностьНайти(): уровень(%v) не число, ош=\n\t%v\n", strLevel, ош)
 	сам.бот.Ангар().Уровень().Уст(iLevel)
 }
 
 // Ищет в теле текста ангара прогресс уровня танка танка
 func (сам *БотСетьСтат) findLevelProgress() {
 	lstAngar := сам.бот.Ангар().СписПолучить()
-	сам.лог.Паника(len(lstAngar) == 0, "lstAngar пустой")
+	Hassert(len(lstAngar) != 0, "lstAngar пустой")
 	var strOut string
 	for _, strProg := range lstAngar {
 		if strings.Contains(strProg, `class="progr"`) {
@@ -200,7 +202,7 @@ func (сам *БотСетьСтат) findLevelProgress() {
 	lstProg = strings.Split(strProg, `%;">&nbsp;</div></div></td>`)
 	strProg = lstProg[0]
 	iProg, ош := strconv.Atoi(strProg)
-	сам.лог.Паника(ош != nil, "NetStat.прогрессНайти(): прогресс(%v) не число, ош=\n\t%v\n", strProg, ош)
+	Hassert(ош == nil, "NetStat.прогрессНайти(): прогресс(%v) не число, ош=\n\t%v\n", strProg, ош)
 	сам.бот.Ангар().Прогресс().Уст(iProg)
 }
 
@@ -226,7 +228,7 @@ func (сам *БотСетьСтат) атакаНайти() {
 	списАтака = strings.Split(стрАтака, `</span><br/>`)
 	стрАтака = списАтака[0]
 	целАтака, ош := strconv.Atoi(стрАтака)
-	сам.лог.Паника(ош != nil, "NetStat.атакаНайти(): атака(%v) не число, ош=\n\t%v\n", стрАтака, ош)
+	Hassert(ош != nil, "NetStat.атакаНайти(): атака(%v) не число, ош=\n\t%v\n", стрАтака, ош)
 	сам.бот.Стата().Атака().Уст(целАтака)
 }
 
@@ -243,13 +245,14 @@ func (сам *БотСетьСтат) игроковОнлайнНайти() {
 	// Выделить число игроков онлайн
 	lstAngar = strings.Split(strOut, `<span class="yellow1">`)
 	if len(lstAngar) <= 1 {
-		сам.прилож.Отменить()
+		сам.прилож.Cancel()
 		return
 	}
 	strOnline := lstAngar[1]
 	lstAngar = strings.Split(strOnline, `</span>`)
 	strOnline = lstAngar[0]
 	iOnline, ош := strconv.Atoi(strOnline)
-	сам.лог.Паника(ош != nil, "NetStat.findOnline(): игроков онлайн(%v) не число, ош=\n\t%v\n", strOnline, ош)
+
+	Hassert(ош == nil, "NetStat.findOnline(): игроков онлайн(%v) не число, ош=\n\t%v\n", strOnline, ош)
 	сам.бот.Ангар().ИгрокиОнлайн().Уст(iOnline)
 }

+ 17 - 14
app/lev3/bot/bot_net/http_worker/http_worker.go

@@ -11,8 +11,10 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/bot/bot_net/http_worker/net_stat"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 var (
@@ -24,16 +26,16 @@ type ХттпВоркер struct {
 	ботСеть    ИБотСеть
 	хттпКлиент *http.Client
 	статистика *net_stat.СетьСтата
-	лог        ИЯдроЛог
+	лог        ILogBuf
 }
 
 // НовХттпВоркер -- возвращает веб-воркера бота
 func НовХттпВоркер(конт ИБотКонтекст) *ХттпВоркер {
-	лог := kernel.НовЛог("ХттпВоркер")
-	лог.Инфо("НовХттпВоркер()\n")
+	лог := NewLogBuf()
+	лог.Info("НовХттпВоркер()\n")
 
-	ботСеть := конт.Получ("ботСеть").(ИБотСеть)
-	хттпКлиент := конт.Получ("хттпКлиент").(*http.Client)
+	ботСеть := конт.Get("ботСеть").(ИБотСеть)
+	хттпКлиент := конт.Get("хттпКлиент").Val().(*http.Client)
 
 	сам := &ХттпВоркер{
 		ботСеть:    ботСеть,
@@ -50,22 +52,23 @@ func (сам *ХттпВоркер) Получ(strLink string) []string {
 	блок.Lock()
 	defer блок.Unlock()
 
-	ctxCancel, fnCancel := context.WithTimeout(сам.ботСеть.Контекст(), time.Second*10)
+	ctxCancel, fnCancel := context.WithTimeout(сам.ботСеть.Контекст().Ctx(), time.Second*10)
 	defer fnCancel()
 	запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
-	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
 	запрос.Header.Set("User-Agent", "Mozilla Firefox 106.1")
 	ответ, ош := сам.хттпКлиент.Do(запрос)
-	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
+	Hassert(ош == nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
-	сам.лог.Паника(ответ.StatusCode != http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
+	Hassert(ответ.StatusCode != http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
 	binData, ош := io.ReadAll(ответ.Body)
-	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при чтении тела ответа, err=\n\t%v\n", ош)
-	сам.лог.Паника(len(binData) == 0, "ХттпВоркер.Получ(): пустое тело ответа")
+	Hassert(ош != nil, "ХттпВоркер.Получ(): при чтении тела ответа, err=\n\t%v\n", ош)
+
+	Hassert(len(binData) != 0, "ХттпВоркер.Получ(): пустое тело ответа")
 	lenData := len(binData) + len(strLink)
 	сам.статистика.AddByte(lenData)
 
 	lstString := strings.Split(string(binData), "\n")
-	сам.лог.Паника(len(lstString) == 0, "ХттпВоркер.Получ(): пустая строка ответа")
+	Hassert(len(lstString) != 0, "ХттпВоркер.Получ(): пустая строка ответа")
 	return lstString
 }

+ 10 - 9
app/lev3/bot/bot_net/http_worker/net_stat/net_stat.go

@@ -6,8 +6,9 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 /*
@@ -24,15 +25,15 @@ type СетьСтата struct {
 	countErr             int      // Число зафиксированных ошибок
 	chTick               chan int // Сигналы времени 1 раз в 5 минут
 	block                sync.Mutex
-	лог                  ИЯдроЛог
+	лог                  ILogBuf
 }
 
 // НовСетьСтата -- возвращает новый *NetStat
 func НовСетьСтата(конт ИБотКонтекст) *СетьСтата {
-	лог := kernel.НовЛог("СетьСтата")
-	лог.Инфо("НовСетьСтата()\n")
+	лог := NewLogBuf()
+	лог.Info("НовСетьСтата()\n")
 
-	ботСеть := конт.Получ("ботСеть").(ИБотСеть)
+	ботСеть := конт.Get("ботСеть").(ИБотСеть)
 	сам := &СетьСтата{
 		ботСеть: ботСеть,
 		chTick:  make(chan int, 2),
@@ -48,7 +49,7 @@ func (сам *СетьСтата) makeTick() {
 	defer close(сам.chTick)
 	for {
 		select {
-		case <-сам.ботСеть.Контекст().Done():
+		case <-сам.ботСеть.Контекст().Ctx().Done():
 			return
 		default:
 			time.Sleep(time.Second * 5 * 60)
@@ -64,7 +65,7 @@ func (сам *СетьСтата) пуск() {
 		defer сам.block.Unlock()
 		сам.всегоМинут += 5
 		_МБ := float32(сам.totalByte) / float32(сам.всегоМинут*60) * (3600 * 24 * 30.5) / (1024 * 1024)
-		сам.лог.Инфо("пуск().fnCalc(): запросы=%0.2f/сек\t траф0=%0.2f бит/сек\tтраф1=%0.2f МБ/мес\tошибки=%v\n",
+		сам.лог.Info("пуск().fnCalc(): запросы=%0.2f/сек\t траф0=%0.2f бит/сек\tтраф1=%0.2f МБ/мес\tошибки=%v\n",
 			float32(сам.countRequestInterval)/300,
 			float32(сам.countByteInterval*8)/300,
 			_МБ,
@@ -74,7 +75,7 @@ func (сам *СетьСтата) пуск() {
 	}
 	for range сам.chTick {
 		select {
-		case <-сам.ботСеть.Контекст().Done():
+		case <-сам.ботСеть.Контекст().Ctx().Done():
 			return
 		case <-сам.chTick:
 			fnCalc()

+ 16 - 14
app/lev3/farm_bots/dict_bot/dict_bot.go

@@ -7,11 +7,13 @@ import (
 	"strings"
 	"sync"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/bot"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 const (
@@ -20,22 +22,22 @@ const (
 
 // СловарьБотов -- потокобезопасный словарь ботов
 type СловарьБотов struct {
-	конт    ИЯдроКонтекст
+	конт    IKernelCtx
 	прилож  ИПриложение
-	хран    ИЯдроХранилище
+	хран    IKernelStoreKv
 	словарь map[АБотНомер]ИБот
 	блок    sync.RWMutex
-	лог     ИЯдроЛог
+	лог     ILogBuf
 }
 
 // НовСловарьБотов -- возвращает новый потокобезопасный словарь ботов
-func НовСловарьБотов(конт ИЯдроКонтекст) *СловарьБотов {
-	лог := kernel.НовЛог("СловарьБотов")
-	лог.Инфо("НовСловарьБотов()\n")
+func НовСловарьБотов(конт IKernelCtx) *СловарьБотов {
+	лог := NewLogBuf()
+	лог.Info("НовСловарьБотов()\n")
 	сам := &СловарьБотов{
 		конт:    конт,
-		прилож:  конт.Получ("приложение").(ИПриложение),
-		хран:    конт.Получ("kernStore").(ИЯдроХранилище),
+		прилож:  конт.Get("приложение").Val().(ИПриложение),
+		хран:    конт.Get("kernStore").Val().(IKernelStoreKv),
 		словарь: map[АБотНомер]ИБот{},
 		лог:     лог,
 	}
@@ -82,7 +84,7 @@ func (сам *СловарьБотов) save() {
 	strNumber = strNumber[:len(strNumber)-1]
 	err := сам.хран.Set(strBotList, []byte(strNumber))
 	if err != nil {
-		сам.прилож.Отменить()
+		сам.прилож.Cancel()
 	}
 }
 
@@ -91,7 +93,7 @@ func (сам *СловарьБотов) load() {
 	binNumber, err := сам.хран.Get(strBotList)
 	if err != nil {
 		if !strings.Contains(err.Error(), "not found") {
-			сам.лог.Паника(true, "СловарьБотов.load(): при загрузке списка ботов, ош=\n\t%n\t", err)
+			Hassert(false, "СловарьБотов.load(): при загрузке списка ботов, ош=\n\t%n\t", err)
 		}
 	}
 	strNumbers := string(binNumber)
@@ -104,14 +106,14 @@ func (сам *СловарьБотов) load() {
 			continue
 		}
 		иНомер, err := strconv.Atoi(стрНомер)
-		сам.лог.Паника(err != nil, "СловарьБотов.load(): при получении номера бота, ош=\n\t%v\n", err)
+		Hassert(err == nil, "СловарьБотов.load(): при получении номера бота, ош=\n\t%v\n", err)
 		ботНомер := АБотНомер(иНомер)
 		_, isOk := сам.словарь[ботНомер]
 		if isOk {
 			continue
 		}
 		bot := bot.ЗагрузитьВарБот(сам.конт, ботНомер)
-		if bot.Автозапуск().Получ() {
+		if bot.Автозапуск().Get() {
 			go bot.Пуск()
 		}
 		сам.словарь[ботНомер] = bot

+ 6 - 5
app/lev3/farm_bots/farm_bots.go

@@ -9,25 +9,26 @@ import (
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/bot"
 	"wartank/app/lev3/farm_bots/dict_bot"
-	. "wartank/kernel/kernel_types"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // БотоФерма -- бото-ферма
 type БотоФерма struct {
-	конт ИЯдроКонтекст
+	конт IKernelCtx
 	// прилож  ИПриложение
-	хран    ИЯдроХранилище
+	хран    IKernelStoreKv
 	словБот *dict_bot.СловарьБотов
 }
 
 // НовБотоФерма -- возвращает новую бото-ферму
-func НовБотоФерма(конт ИЯдроКонтекст) *БотоФерма {
+func НовБотоФерма(конт IKernelCtx) *БотоФерма {
 	log.Println("НовБотоФерма()")
 	// приложение := конт.Получ("приложение").(ИПриложение)
 	сам := &БотоФерма{
 		конт: конт,
 		// прилож: приложение,
-		хран: конт.Получ("kernStore").(ИЯдроХранилище),
+		хран: конт.Get("kernStore").(IKernelStoreKv),
 	}
 	сам.словБот = dict_bot.НовСловарьБотов(конт)
 	return сам

+ 17 - 16
app/lev3/serv_web/serv_web.go

@@ -5,26 +5,27 @@ import (
 	"fmt"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/serv_web/web_api"
 	"wartank/app/lev3/serv_web/web_gui"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 type СервВеб struct {
-	конт ИЯдроКонтекст
+	конт IKernelCtx
 	серв ИПриложение
-	лог  ИЯдроЛог
+	лог  ILogBuf
 }
 
 // НовСервВеб -- возвращает новый веб-сервер
 func НовСервВеб(серв ИПриложение) *СервВеб {
-	лог := kernel.НовЛог("СервВеб")
-	лог.Инфо("НовСервВеб()\n")
-	лог.Паника(серв == nil, "НовСервВеб(): ИСервер==nil")
+	лог := NewLogBuf()
+	лог.Info("НовСервВеб()\n")
+	Hassert(серв != nil, "НовСервВеб(): ИСервер==nil")
 
 	сам := &СервВеб{
 		конт: серв,
@@ -32,7 +33,7 @@ func НовСервВеб(серв ИПриложение) *СервВеб {
 		лог:  лог,
 	}
 
-	файбер := серв.Получ("fiberApp").(*fiber.App)
+	файбер := серв.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/list_bot/get", сам.гетСписБот)
 	файбер.Post("/list_bot/add", сам.постБотНов)
 	файбер.Post("/bot/stat", сам.постБотСтат)
@@ -63,7 +64,7 @@ func (сам *СервВеб) постБотСтат(кнт *fiber.Ctx) error {
 		})
 	}
 	диктБот := map[string]string{}
-	диктБот["isAuto"] = fmt.Sprint(бот.Автозапуск().Получ())
+	диктБот["isAuto"] = fmt.Sprint(бот.Автозапуск().Get())
 	диктБот["isWork"] = fmt.Sprint(бот.ЕслиРабота())
 	топливо := бот.Ангар().Топливо().Получ()
 	if топливо == 0 {
@@ -72,11 +73,11 @@ func (сам *СервВеб) постБотСтат(кнт *fiber.Ctx) error {
 	}
 	диктБот["топливо"] = fmt.Sprint(топливо)
 	диктБот["золото"] = fmt.Sprint(бот.Ангар().Золото().Получ())
-	диктБот["серебро"] = fmt.Sprint(бот.КонтБот().Получ("серебро").(int))
-	слава := бот.КонтБот().Получ("слава").(int)
+	диктБот["серебро"] = fmt.Sprint(бот.КонтБот().Get("серебро").Val().(int))
+	слава := бот.КонтБот().Get("слава").Val().(int)
 	if слава == 0 {
 		бот.Ангар().Обновить()
-		слава = бот.КонтБот().Получ("слава").(int)
+		слава = бот.КонтБот().Get("слава").Val().(int)
 	}
 	диктБот["слава"] = fmt.Sprint(слава)
 	диктБот["прогресс"] = fmt.Sprintf("%v%%", бот.Ангар().Прогресс().Получ())
@@ -87,14 +88,14 @@ func (сам *СервВеб) постБотСтат(кнт *fiber.Ctx) error {
 	диктБот["прочность"] = fmt.Sprintf("%v", бот.Стата().Прочность().Получ())
 	диктБот["мощь"] = fmt.Sprintf("%v", бот.Стата().Мощь().Получ())
 
-	шахта:= бот.КонтБот().Получ("шахта").(ИАренаШахта)
-	диктБот["шахта_уровень"] =шахта.Уровень().ЗначСтр()
+	шахта := бот.КонтБот().Get("шахта").(ИАренаШахта)
+	диктБот["шахта_уровень"] = шахта.Уровень().ЗначСтр()
 	диктБот["шахта_режим"] = string(шахта.АренаСостояние().Состояние())
 	диктБот["шахта_сделать_кол"] = fmt.Sprint(шахта.ПродуктКолСейчас())
 	диктБот["шахта_сделать_назв"] = шахта.ПродуктИмяСейчас()
 	диктБот["шахта_сделать_время"] = шахта.ПродуктВремяСейчас()
 
-	полигон:=бот.КонтБот().Получ("полигон").(ИАренаПолигон)
+	полигон := бот.КонтБот().Get("полигон").(ИАренаПолигон)
 	диктБот["полигон_уровень"] = полигон.Уровень().ЗначСтр()
 	диктБот["полигон_режим"] = string(полигон.АренаСостояние().Состояние())
 	диктБот["полигон_сделать_кол"] = fmt.Sprint(полигон.ПродуктКолСейчас())
@@ -154,7 +155,7 @@ func (сам *СервВеб) гетСписБот(кнт *fiber.Ctx) error {
 	for _, бот := range списБот {
 		_бот := map[string]string{}
 		_бот["name"] = бот.Имя()
-		_бот["isAuto"] = fmt.Sprint(бот.Автозапуск().Получ())
+		_бот["isAuto"] = fmt.Sprint(бот.Автозапуск().Get())
 		_бот["isWork"] = fmt.Sprint(бот.ЕслиРабота())
 		_бот["gold"] = fmt.Sprint(бот.Ангар().Золото().Получ())
 		_бот["fuel"] = fmt.Sprint(бот.Ангар().Топливо().Получ())

+ 41 - 24
app/lev3/serv_web/web_api/web_api.go

@@ -6,28 +6,29 @@ import (
 	"strings"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // ВебАпи -- веб-сервер для API
 type ВебАпи struct {
 	прилож ИПриложение
-	лог    ИЯдроЛог
+	лог    ILogBuf
 }
 
 // НовВебАпи -- возвращает новый веб-сервер для API
 func НовВебАпи(конт ИБотКонтекст) *ВебАпи {
-	лог := kernel.НовЛог("ВебАпи")
-	лог.Паника(конт == nil, "НовВебАпи(): ИВебСервер==nil")
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовВебАпи(): ИВебСервер==nil")
 	сам := &ВебАпи{
-		прилож: конт.Получ("приложение").(ИПриложение),
+		прилож: конт.Get("приложение").(ИПриложение),
 		лог:    лог,
 	}
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/api/uptime", сам.аптаймСервер)
 	файбер.Get("/api/count_start", сам.стартНомер)
 
@@ -68,7 +69,8 @@ func (сам *ВебАпи) арсеналРаботаИмя(кнт *fiber.Ctx)
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
-	имя := бот.Ангар().База().Арсенал().ПродуктИмяСейчас()
+	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
+	имя := арсенал.ПродуктИмяСейчас()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -87,7 +89,8 @@ func (сам *ВебАпи) арсеналРежим(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 	}
-	сценаРежим := бот.Ангар().База().Арсенал().АренаСостояние()
+	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
+	сценаРежим := арсенал.АренаСостояние()
 	стрРежим := fmt.Sprint(сценаРежим.Состояние())
 	if стрРежим == "" {
 		return кнт.SendString("[Режим: пустой режим]")
@@ -107,7 +110,8 @@ func (сам *ВебАпи) арсеналУровень(кнт *fiber.Ctx) erro
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 	}
-	уровень := бот.Ангар().База().Арсенал().Уровень()
+	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
+	уровень := арсенал.Уровень()
 	стрУровень := fmt.Sprint(уровень.Получ())
 	if стрУровень == "" {
 		return кнт.SendString("[Уровень: пустой уровень]")
@@ -127,7 +131,8 @@ func (сам *ВебАпи) арсеналВремяОсталось(кнт *fib
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 	}
-	время := бот.Ангар().База().Арсенал().ВремяОстат()
+	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
+	время := арсенал.ВремяОстат()
 	стрВремя := время.String()
 	if стрВремя == "" {
 		return кнт.SendString("[Время: пустой остаток времени]")
@@ -147,7 +152,8 @@ func (сам *ВебАпи) арсеналЛог(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 	}
-	лог := бот.Ангар().База().Арсенал().ВебЛог().Отладка()
+	арсенал := бот.КонтБот().Get("арсенал").Val().(ИАренаАрсенал)
+	лог := арсенал.ВебЛог().Отладка()
 	if лог == "" {
 		return кнт.SendString("[Пустой лог арсенала]")
 	}
@@ -168,7 +174,8 @@ func (сам *ВебАпи) полигонВремяОсталось(кнт *fib
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 	}
-	время := бот.Ангар().База().Полигон().ВремяОстат()
+	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
+	время := полигон.ВремяОстат()
 	стрВремя := время.String()
 	if стрВремя == "" {
 		return кнт.SendString("[Время: пустой остаток времени]")
@@ -188,7 +195,8 @@ func (сам *ВебАпи) полигонРаботаИмя(кнт *fiber.Ctx)
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
-	имя := бот.Ангар().База().Полигон().ПродуктИмяСейчас()
+	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
+	имя := полигон.ПродуктИмяСейчас()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -207,7 +215,8 @@ func (сам *ВебАпи) полигонРаботаКоличество(кн
 	if бот == nil {
 		return кнт.SendString("[Кол: нет такого бота]")
 	}
-	колич := бот.Ангар().База().Полигон().ПродуктКолСейчас()
+	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
+	колич := полигон.ПродуктКолСейчас()
 	стрКолич := fmt.Sprint(колич)
 	if стрКолич == "" {
 		return кнт.SendString("[Кол: пустое кол]")
@@ -227,7 +236,8 @@ func (сам *ВебАпи) полигонРежим(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 	}
-	сценаРежим := бот.Ангар().База().Полигон().АренаСостояние()
+	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
+	сценаРежим := полигон.АренаСостояние()
 	стрРежим := fmt.Sprint(сценаРежим.Состояние())
 	if стрРежим == "" {
 		return кнт.SendString("[Режим: пустой режим]")
@@ -247,7 +257,8 @@ func (сам *ВебАпи) полигонУровень(кнт *fiber.Ctx) erro
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 	}
-	уровень := бот.Ангар().База().Полигон().Уровень()
+	полигон := бот.КонтБот().Get("полигон").Val().(ИАренаПолигон)
+	уровень := полигон.Уровень()
 	стрУровень := fmt.Sprint(уровень.Получ())
 	if стрУровень == "" {
 		return кнт.SendString("[Уровень: пустой уровень]")
@@ -267,7 +278,7 @@ func (сам *ВебАпи) ангарСеребро(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Серебро: нет такого бота]")
 	}
-	серебро := бот.Ангар().СереброВсего().Получ()
+	серебро := бот.Ангар().Серебро().Получ()
 	if серебро == 0 {
 		return кнт.SendString("[Серебро: пустое кол]")
 	}
@@ -307,7 +318,8 @@ func (сам *ВебАпи) шахтаРаботаИмя(кнт *fiber.Ctx) erro
 	if бот == nil {
 		return кнт.SendString("[Тип: нет такого бота]")
 	}
-	имя := бот.Ангар().База().Шахта().ПродуктИмяСейчас()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	имя := шахта.ПродуктИмяСейчас()
 	if имя == "" {
 		return кнт.SendString("[Тип: пустое имя]")
 	}
@@ -326,7 +338,8 @@ func (сам *ВебАпи) шахтаРаботаКоличество(кнт *f
 	if бот == nil {
 		return кнт.SendString("[Кол: нет такого бота]")
 	}
-	колич := бот.Ангар().База().Шахта().ПродуктКолСейчас()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	колич := шахта.ПродуктКолСейчас()
 	стрКолич := fmt.Sprint(колич)
 	if стрКолич == "" {
 		return кнт.SendString("[Кол: пустое кол]")
@@ -346,7 +359,8 @@ func (сам *ВебАпи) шахтаРежим(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Режим: нет такого бота]")
 	}
-	сценаРежим := бот.Ангар().База().Шахта().АренаСостояние()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	сценаРежим := шахта.АренаСостояние()
 	стрРежим := fmt.Sprint(сценаРежим.Состояние())
 	if стрРежим == "" {
 		return кнт.SendString("[Режим: пустой режим]")
@@ -366,7 +380,8 @@ func (сам *ВебАпи) шахтаУровень(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Уровень: нет такого бота]")
 	}
-	уровень := бот.Ангар().База().Шахта().Уровень()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	уровень := шахта.Уровень()
 	стрУровень := fmt.Sprint(уровень.Получ())
 	if стрУровень == "" {
 		return кнт.SendString("[Уровень: пустой уровень]")
@@ -386,7 +401,8 @@ func (сам *ВебАпи) шахтаЛог(кнт *fiber.Ctx) error {
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 	}
-	лог := бот.Ангар().База().Шахта().ВебЛог().Отладка()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	лог := шахта.ВебЛог().Отладка()
 	if лог == "" {
 		return кнт.SendString("[Пустой лог шахты]")
 	}
@@ -407,7 +423,8 @@ func (сам *ВебАпи) шахтаВремяОсталось(кнт *fiber.C
 	if бот == nil {
 		return кнт.SendString("[Время: нет такого бота]")
 	}
-	время := бот.Ангар().База().Шахта().ВремяОстат()
+	шахта := бот.КонтБот().Get("шахта").Val().(ИАренаШахта)
+	время := шахта.ВремяОстат()
 	стрВремя := время.String()
 	if стрВремя == "" {
 		return кнт.SendString("[Время: пустой остаток времени]")

+ 12 - 11
app/lev3/serv_web/web_gui/page_bot_add/page_bot_add.go

@@ -6,16 +6,17 @@ import (
 	"net/http"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/web_render"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // СтраницаДобавлениеБота -- страница добавления бота
 type СтраницаБотаДобавить struct {
-	лог    ИЯдроЛог
+	лог    ILogBuf
 	прилож ИПриложение
 	рендер ИВебРендер
 }
@@ -24,15 +25,15 @@ type СтраницаБотаДобавить struct {
 var стрБотДобавить string
 
 // НовСтраницаБотовДобавить
-func НовСтраницаБотовДобавить(конт ИЯдроКонтекст) *СтраницаБотаДобавить {
-	лог := kernel.НовЛог("СтраницаДобавлениеБота")
-	лог.Паника(конт == nil, "НовСтраницаБотовДобавить(): ИЯдроКонтекст==nil")
+func НовСтраницаБотовДобавить(конт IKernelCtx) *СтраницаБотаДобавить {
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовСтраницаБотовДобавить(): ИЯдроКонтекст==nil")
 	сам := &СтраницаБотаДобавить{
 		лог:    лог,
-		прилож: конт.Получ("приложение").(ИПриложение),
+		прилож: конт.Get("приложение").(ИПриложение),
 		рендер: web_render.НовВебРендер(стрБотДобавить),
 	}
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/gui/bot/add", сам.кукиПроверить, сам.гетБотНов)
 	файбер.Post("/gui/bot/add", сам.кукиПроверить, сам.постДобавитьБота)
 	return сам
@@ -49,7 +50,7 @@ func (сам *СтраницаБотаДобавить) постДобавить
 	if err := кнт.BodyParser(запрос); err != nil {
 		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
 	}
-	сам.лог.Отладка("добавитьБота(): : %#+v\n", запрос)
+	сам.лог.Debug("добавитьБота(): : %#+v\n", запрос)
 	if запрос.Логин_ == "" {
 		return кнт.Redirect("/gui/bot/add", http.StatusSeeOther)
 	}
@@ -64,7 +65,7 @@ func (сам *СтраницаБотаДобавить) постДобавить
 
 // Показывает страницу добавления бота
 func (сам *СтраницаБотаДобавить) гетБотНов(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаБотаДобавить.гетБотНов()\n")
+	сам.лог.Debug("СтраницаБотаДобавить.гетБотНов()\n")
 	кнт.Set("Content-type", "text/html; charset=utf8;")
 	стрРез := сам.рендер.Получ()
 	return кнт.SendString(стрРез)
@@ -72,7 +73,7 @@ func (сам *СтраницаБотаДобавить) гетБотНов(кн
 
 // Проверка на куки
 func (сам *СтраницаБотаДобавить) кукиПроверить(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаБотаДобавить.кукиПроверить()\n")
+	сам.лог.Debug("СтраницаБотаДобавить.кукиПроверить()\n")
 	имя := кнт.Cookies("login")
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)

+ 11 - 10
app/lev3/serv_web/web_gui/page_bot_list/page_bot_list.go

@@ -8,16 +8,17 @@ import (
 	"strings"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/web_render"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // СтраницаЛогин -- страница списка ботов
 type СтраницаСписокБотов struct {
-	лог    ИЯдроЛог
+	лог    ILogBuf
 	прилож ИПриложение
 	рендер ИВебРендер
 }
@@ -26,15 +27,15 @@ type СтраницаСписокБотов struct {
 var стрСписок string
 
 // НовСтраницаСписокБотов
-func НовСтраницаСписокБотов(конт ИЯдроКонтекст) *СтраницаСписокБотов {
-	лог := kernel.НовЛог("СтраницаСписокБотов")
-	лог.Паника(конт == nil, "НовСтраницаСписокБотов(): ИЯдроКонтекст==nil")
+func НовСтраницаСписокБотов(конт IKernelCtx) *СтраницаСписокБотов {
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовСтраницаСписокБотов(): ИЯдроКонтекст==nil")
 	сам := &СтраницаСписокБотов{
 		лог:    лог,
-		прилож: конт.Получ("приложение").(ИПриложение),
+		прилож: конт.Get("приложение").(ИПриложение),
 		рендер: web_render.НовВебРендер(стрСписок),
 	}
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/gui/bot", сам.кукиПроверить, сам.получСписокБотов)
 	return сам
 }
@@ -47,7 +48,7 @@ var стрСсылкаШаблон = `
 
 // Возвращает страницу логина
 func (сам *СтраницаСписокБотов) получСписокБотов(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаСписокБотов.получСписокБотов()\n")
+	сам.лог.Debug("СтраницаСписокБотов.получСписокБотов()\n")
 	кнт.Set("Content-type", "text/html; charset=utf8;")
 	списокБотов := сам.прилож.ServBots().ListBot()
 	стрСсылки := ""
@@ -65,7 +66,7 @@ func (сам *СтраницаСписокБотов) получСписокБо
 
 // Проверка на куки
 func (сам *СтраницаСписокБотов) кукиПроверить(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаСписокБотов.кукиПроверить()\n")
+	сам.лог.Debug("СтраницаСписокБотов.кукиПроверить()\n")
 	имя := кнт.Cookies("login")
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)

+ 16 - 15
app/lev3/serv_web/web_gui/page_bot_show/page_bot_show.go

@@ -7,17 +7,18 @@ import (
 	"strconv"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/web_render"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // СтраницаБотПоказать -- страница показа бота
 type СтраницаБотПоказать struct {
-	лог    ИЯдроЛог
+	лог    ILogBuf
 	прилож ИПриложение
 	рендер ИВебРендер
 }
@@ -26,15 +27,15 @@ type СтраницаБотПоказать struct {
 var стрБотПоказать string
 
 // НовСтраницаБотПоказать
-func НовСтраницаБотПоказать(конт ИЯдроКонтекст) *СтраницаБотПоказать {
-	лог := kernel.НовЛог("СтраницаБотПоказать")
-	лог.Паника(конт == nil, "НовСтраницаБотПоказать(): ИЯдроКонтекст==nil")
+func НовСтраницаБотПоказать(конт IKernelCtx) *СтраницаБотПоказать {
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовСтраницаБотПоказать(): ИЯдроКонтекст==nil")
 	сам := &СтраницаБотПоказать{
 		лог:    лог,
-		прилож: конт.Получ("приложение").(ИПриложение),
+		прилож: конт.Get("приложение").(ИПриложение),
 		рендер: web_render.НовВебРендер(стрБотПоказать),
 	}
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/gui/bot/:number", сам.кукиПроверить, сам.гетБотПоказ)
 	// файбер.Post("/gui/bot/add", сам.кукиПроверить, сам.постДобавитьБота)
 	return сам
@@ -42,14 +43,14 @@ func НовСтраницаБотПоказать(конт ИЯдроКонте
 
 // Показывает состояние бота по имени
 func (сам *СтраницаБотПоказать) гетБотПоказ(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаБотПоказать.гетБотПоказ()\n")
+	сам.лог.Debug("СтраницаБотПоказать.гетБотПоказ()\n")
 	стрНомер := кнт.Params("number")
 	иНомер, ош := strconv.Atoi(стрНомер)
 	if ош != nil {
 		return кнт.Redirect("/gui/bot", http.StatusSeeOther)
 	}
 	ботНомер := АБотНомер(иНомер)
-	сам.лог.Отладка("СтраницаБотПоказать.гетБотПоказ(): ботНомер=%d\n", стрНомер)
+	сам.лог.Debug("СтраницаБотПоказать.гетБотПоказ(): ботНомер=%d\n", стрНомер)
 	бот := сам.прилож.ServBots().Get(ботНомер)
 	if бот == nil {
 		return кнт.Redirect("/gui/bot", http.StatusSeeOther)
@@ -61,7 +62,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("{.золото}", ангар.Золото().ЗначСтр())
 		сам.рендер.Доб("{.серебро}", ангар.Серебро().ЗначСтр())
 		сам.рендер.Доб("{.топливо}", ангар.Топливо().ЗначСтр())
-		сам.рендер.Доб("{.слава}", бот.КонтБот().Получ("слава").(int))
+		сам.рендер.Доб("{.слава}", бот.КонтБот().Get("слава").Val().(int))
 	}
 	{ // Сила танка
 		стата := бот.Стата()
@@ -72,7 +73,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("{.мощь}", стата.Мощь().ЗначСтр())
 	}
 	{ // Шахта
-		шахта := бот.КонтБот().Получ("шахта").(ИАренаШахта)
+		шахта := бот.КонтБот().Get("шахта").(ИАренаШахта)
 		сам.рендер.Доб("{.шахта_уровень}", шахта.Уровень().Получ())
 		сам.рендер.Доб("{.шахта_режим}", шахта.АренаСостояние().Состояние())
 		сам.рендер.Доб("{.шахта_сделать_кол}", шахта.ПродуктКолСейчас())
@@ -80,7 +81,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("{.шахта_сделать_время}", шахта.ПродуктВремяСейчас())
 	}
 	{ // Полигон
-		полигон := бот.КонтБот().Получ("полигон").(ИАренаПолигон)
+		полигон := бот.КонтБот().Get("полигон").(ИАренаПолигон)
 		сам.рендер.Доб("полигон_уровень", полигон.Уровень().ЗначСтр())
 		сам.рендер.Доб("полигон_режим", полигон.АренаСостояние().Состояние())
 		сам.рендер.Доб("полигон_сделать_кол", полигон.ПродуктКолСейчас())
@@ -88,7 +89,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 		сам.рендер.Доб("полигон_сделать_время", полигон.ПродуктВремяСейчас())
 	}
 	{ // Арсенал
-		арс := бот.КонтБот().Получ("арсенал").(ИАренаАрсенал)
+		арс := бот.КонтБот().Get("арсенал").(ИАренаАрсенал)
 		сам.рендер.Доб("оружейная_уровень", арс.Уровень().ЗначСтр())
 		сам.рендер.Доб("оружейная_работа", арс.АренаСостояние().РаботаИмя())
 		сам.рендер.Доб("оружейная_режим", арс.АренаСостояние().Состояние())
@@ -106,7 +107,7 @@ func (сам *СтраницаБотПоказать) гетБотПоказ(к
 
 // Проверка на куки
 func (сам *СтраницаБотПоказать) кукиПроверить(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаБотПоказать.кукиПроверить()\n")
+	сам.лог.Debug("СтраницаБотПоказать.кукиПроверить()\n")
 	имя := кнт.Cookies("login")
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)

+ 10 - 9
app/lev3/serv_web/web_gui/page_login/page_login.go

@@ -7,16 +7,17 @@ import (
 	"time"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/web_render"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // СтраницаЛогин -- страница логина
 type СтраницаЛогин struct {
-	лог    ИЯдроЛог
+	лог    ILogBuf
 	рендер ИВебРендер
 }
 
@@ -24,15 +25,15 @@ type СтраницаЛогин struct {
 var стрЛогин string
 
 // НовСтраницаЛогин
-func НовСтраницаЛогин(конт ИЯдроКонтекст) *СтраницаЛогин {
-	лог := kernel.НовЛог("СтраницаЛогин")
-	лог.Паника(конт == nil, "НовСтраницаЛогин(): ИЯдроКонтекст==nil")
+func НовСтраницаЛогин(конт IKernelCtx) *СтраницаЛогин {
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовСтраницаЛогин(): ИЯдроКонтекст==nil")
 	сам := &СтраницаЛогин{
 		лог:    лог,
 		рендер: web_render.НовВебРендер(стрЛогин),
 	}
 	сам.рендер.Доб("{.err}", "")
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/gui/login", сам.получЛогин)
 	файбер.Post("/gui/login", сам.постЛогин)
 	return сам
@@ -40,7 +41,7 @@ func НовСтраницаЛогин(конт ИЯдроКонтекст) *Ст
 
 // Возвращает страницу логина
 func (сам *СтраницаЛогин) получЛогин(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("СтраницаЛогин.логин()\n")
+	сам.лог.Debug("СтраницаЛогин.логин()\n")
 	кнт.Set("Content-type", "text/html; charset=utf8;")
 	стрРез := сам.рендер.Получ()
 	return кнт.SendString(стрРез)
@@ -58,7 +59,7 @@ func (сам *СтраницаЛогин) постЛогин(кнт *fiber.Ctx)
 	if err := кнт.BodyParser(запрос); err != nil {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)
 	}
-	сам.лог.Инфо("СтраницаЛогин.логин(): : %#+v\n", *запрос)
+	сам.лог.Info("СтраницаЛогин.логин(): : %#+v\n", *запрос)
 	if запрос.Логин_ == "" || запрос.Пароль_ == "" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)
 	}

+ 11 - 10
app/lev3/serv_web/web_gui/web_gui.go

@@ -5,31 +5,32 @@ import (
 	"net/http"
 
 	"github.com/gofiber/fiber/v2"
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/serv_web/web_gui/page_bot_add"
 	"wartank/app/lev3/serv_web/web_gui/page_bot_list"
 	"wartank/app/lev3/serv_web/web_gui/page_bot_show"
 	"wartank/app/lev3/serv_web/web_gui/page_login"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // ВебГип -- веб-сервер для графики
 type ВебГуи struct {
 	прилож ИПриложение
-	лог    ИЯдроЛог
+	лог    ILogBuf
 }
 
 // НовВебГуи -- возвращает новый веб-сервер для графики
-func НовВебГуи(конт ИЯдроКонтекст) *ВебГуи {
-	лог := kernel.НовЛог("ВебГуи")
-	лог.Паника(конт == nil, "НовВебГуи(): ИЯдроКонтекст==nil")
+func НовВебГуи(конт IKernelCtx) *ВебГуи {
+	лог := NewLogBuf()
+	Hassert(конт != nil, "НовВебГуи(): ИЯдроКонтекст==nil")
 	сам := &ВебГуи{
-		прилож: конт.Получ("приложение").(ИПриложение),
+		прилож: конт.Get("приложение").(ИПриложение),
 		лог:    лог,
 	}
-	файбер := конт.Получ("fiberApp").(*fiber.App)
+	файбер := конт.Get("fiberApp").Val().(*fiber.App)
 	файбер.Get("/", сам.кукиПроверить, сам.индекс)
 	_ = page_login.НовСтраницаЛогин(конт)
 	_ = page_bot_list.НовСтраницаСписокБотов(конт)
@@ -40,7 +41,7 @@ func НовВебГуи(конт ИЯдроКонтекст) *ВебГуи {
 
 // Возвращает индексную страницу
 func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("ВебГуи.индекс()\n")
+	сам.лог.Debug("ВебГуи.индекс()\n")
 	имя := кнт.Cookies("login")
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)
@@ -50,7 +51,7 @@ func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
 
 // Проверка на куки
 func (сам *ВебГуи) кукиПроверить(кнт *fiber.Ctx) error {
-	сам.лог.Отладка("ВебГуи.кукиПроверить()\n")
+	сам.лог.Debug("ВебГуи.кукиПроверить()\n")
 	имя := кнт.Cookies("login")
 	if имя != "svi" {
 		return кнт.Redirect("/gui/login", http.StatusSeeOther)

+ 15 - 13
app/lev3/server_stat/server_stat.go

@@ -7,9 +7,11 @@ import (
 	"sync"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // СерверСтат -- структура статистики сервера
@@ -19,14 +21,14 @@ type СерверСтат struct {
 	ВремяВсего_  time.Duration `json:"time_total"`   // Общее время работы в секундах
 	ВремяСессия_ time.Duration `json:"time_session"` // Время сессии в секундах
 	блок         sync.RWMutex
-	лог          ИЯдроЛог
+	лог          ILogBuf
 }
 
 // НовСерверСтат -- возвращает структуру статистики сервера
 func НовСерверСтат(серв ИПриложение) *СерверСтат {
-	лог := kernel.НовЛог("СерверСтат")
-	лог.Инфо("НовСерверСтат()\n")
-	лог.Паника(серв == nil, "НовСерверСтат: ИСервер == nil")
+	лог := NewLogBuf()
+	лог.Info("НовСерверСтат()\n")
+	Hassert(серв != nil, "НовСерверСтат: ИСервер == nil")
 	сам := &СерверСтат{
 		серв:         серв,
 		CчётСтарт_:   0,
@@ -43,16 +45,16 @@ func НовСерверСтат(серв ИПриложение) *СерверС
 
 // Загружает статистику сервера
 func (сам *СерверСтат) загр() {
-	store := сам.серв.Получ("kernStore").(ИЯдроХранилище)
+	store := сам.серв.Get("kernStore").(IKernelStoreKv)
 	бинДанные, ош := store.Get("server_stat")
 	if ош != nil {
 		if strings.Contains(ош.Error(), "not found") {
 			return
 		}
-		сам.лог.Паника(true, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
+		Hassert(false, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
 	}
 	ош = json.Unmarshal(бинДанные, сам)
-	сам.лог.Паника(ош != nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
+	Hassert(ош == nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
 	go сам.пуск()
 }
 
@@ -68,7 +70,7 @@ func (сам *СерверСтат) пуск() {
 	}
 	for {
 		select {
-		case <-сам.серв.Конт().Done():
+		case <-сам.серв.Ctx().Done():
 			return
 		default:
 			фнПуск()
@@ -79,10 +81,10 @@ func (сам *СерверСтат) пуск() {
 // Сохраняет статистику сервера
 func (сам *СерверСтат) сохр() {
 	бинДанные, ош := json.Marshal(сам)
-	сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
-	store := сам.серв.Получ("kernStore").(ИЯдроХранилище)
+	Hassert(ош == nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
+	store := сам.серв.Get("kernStore").(IKernelStoreKv)
 	ош = store.Set("server_stat", бинДанные)
-	сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
+	Hassert(ош == nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
 }
 
 // СчётСтарт -- счётчик запусков

+ 15 - 14
app/lev4/applic/applic.go

@@ -2,34 +2,35 @@
 package applic
 
 import (
+	. "gitp78su.ipnodns.ru/svi/kern"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+
 	. "wartank/app/lev0/types"
 	"wartank/app/lev3/farm_bots"
 	"wartank/app/lev3/serv_web"
 	"wartank/app/lev3/server_stat"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 // Приложение -- главный тип приложения
 type Приложение struct {
-	ИЯдроКонтекст
+	IKernelCtx
 	ботоФерма *farm_bots.БотоФерма
 	сервСтат  ИСерверСтат
-	лог       ИЯдроЛог
-	ядроВеб   ИЯдроСерверВеб
+	лог       ILogBuf
+	ядроВеб   IKernelServerHttp
 }
 
 // НовПриложение -- возвращает новый объект приложения
 func НовПриложение() *Приложение {
-	лог := kernel.НовЛог("Приложение")
-	лог.Инфо("НовПриложение()\n")
+	лог := NewLogBuf()
+	лог.Info("НовПриложение()\n")
 	сам := &Приложение{
-		ИЯдроКонтекст: kernel.НовКонтекст(),
-		лог:           лог,
+		IKernelCtx: GetKernelCtx(),
+		лог:        лог,
 	}
-	_ = kernel.НовХранилище(сам)
-	сам.ядроВеб = kernel.НовСервХттп(сам)
-	сам.Уст("приложение", сам)
+	_ = GetKernelStoreKv()
+	сам.ядроВеб = GetKernelServerHttp()
+	сам.Set("приложение", сам, "Приложение WarTank")
 	сам.ботоФерма = farm_bots.НовБотоФерма(сам)
 	_ = serv_web.НовСервВеб(сам)
 	сам.сервСтат = server_stat.НовСерверСтат(сам)
@@ -39,9 +40,9 @@ func НовПриложение() *Приложение {
 
 // Пуск -- запускает сервер бота в работу
 func (сам *Приложение) Пуск() {
-	сам.лог.Инфо("НовПриложение.Пуск()\n")
+	сам.лог.Info("НовПриложение.Пуск()\n")
 	сам.ядроВеб.Run()
-	<-сам.Конт().Done()
+	<-сам.Ctx().Done()
 }
 
 // Стат -- возвращает статистику сервера

+ 7 - 12
app/lev4/build/build.go

@@ -7,37 +7,32 @@ import (
 	"runtime/debug"
 	"time"
 
+	. "gitp78su.ipnodns.ru/svi/kern"
+
 	. "wartank/app/lev0/types"
 	"wartank/app/lev4/applic"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
 )
 
 func СобратьПриложение() ИПриложение {
 	go ЗапуститьПрофиль()
 	bi, _ := debug.ReadBuildInfo()
-	лог := СобратьЛог("main")
-	лог.Инфо("ИНФО \tgo = %v\n\tvers = %v\n", bi.GoVersion, bi.Main.Version)
+	лог := NewLogBuf()
+	лог.Info("ИНФО \tgo = %v\n\tvers = %v\n", bi.GoVersion, bi.Main.Version)
 	прил := applic.НовПриложение()
 	go func() {
 		time.Sleep(time.Minute * 20)
-		прил.Отменить()
+		прил.Cancel()
 	}()
 	return прил
 }
 
-func СобратьЛог(префикс string) ИЯдроЛог {
-	лог := kernel.НовЛог(префикс)
-	return лог
-}
-
 func ЗапуститьПрофиль() {
-	лог := СобратьЛог("ПРОФИЛЬ")
+	лог := NewLogBuf()
 	port := "29081"
 	for {
 		err := http.ListenAndServe("0.0.0.0:"+port, nil)
 		if err != nil {
-			лог.Ошибка("profile(): ошибка при запуске профилировщика, err=\n\t%v\n", err)
+			лог.Err("profile(): ошибка при запуске профилировщика, err=\n\t%v\n", err)
 		}
 		time.Sleep(time.Second * 1)
 	}

+ 76 - 0
doc/svi.md

@@ -0,0 +1,76 @@
+# SVI
+
+Шипков В.И.
+
+Заметки, чтобы не забыть.
+
+## Ускорение фильтра Блума
+
+Фильтр Блума не может откатывать признаки, при удалении ключа.
+
+**Идея**: Можно просчитывать фильтр Блума в зафиксированных слоях LSM. Тогда количество
+сложений фильтров из отдельных слоёв резко сокращается. Фактически фильтр Блума будет пересчитываться только в горячем слое L0.
+
+### Работа фильтра Блума
+
+Все частные хэши ключей складываются по OR в общую маску.
+Если частный хэш ключа наложен на общую маску
+
+### Недостатки фильтра Блума
+
+Для различения ключей в количестве 1 млрд (при наличии нормальной хэш-функции) --
+надо иметь около 1.8 млрд бит. Т.е. около 200 МБ памяти. Сканировать такой объём памяти
+за разумные сроки -- не реально. Здесь проще пойти по пути префиксного дерева.
+
+## Иерархия ключей
+
+<img src="./nosql_keys_ierarchy.png" alt="drawing" width="200"/>
+
+## Интерфейсы иерархии ключей
+
+<img src="./nosql_model_interfaces.png" alt="drawing" width="600"/>
+
+## Структура индексного файла
+
+## Устройство NoSQL
+
+![Схема БД](./nosql_model_lsm.png)
+
+## Запуск zapret
+
+```bash
+export NFQWS_OPT="
+--filter-tcp=80 --dpi-desync=fake,multisplit --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig,badsum <HOSTLIST> --new
+--filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=method+2,midsld,5 --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig,badsum,badseq --dpi-desync-repeats=15 --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin <HOSTLIST> --new
+--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=15 --dpi-desync-ttl=0  --dpi-desync-any-protocol --dpi-desync-cutoff=d4 --dpi-desync-fooling=md5sig,badsum --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin <HOSTLIST>
+" & sudo /opt/zapret/init.d/sysv/zapret start
+```
+
+## Языковые модели
+
+```text
+llama3.1:8b
+qwen2.5-coder:1.5b-base
+qwen2.5-coder:7b (на тестах заявлено, что это самая крутая модель!!!)
+~ (долго думает) deepseek-r1:8b
+```
+
+Запуск сервера `ollama`:
+
+```bash
+ollama serve
+```
+
+## VPN
+
+### Запуск
+
+```bash
+sudo wg-quick up wg0
+```
+
+### Отключение
+
+```bash
+sudo wg-quick down wg0
+```

+ 11 - 6
go.mod

@@ -3,18 +3,20 @@ module wartank
 go 1.24.0
 
 require (
-	github.com/dgraph-io/badger/v4 v4.5.1
 	github.com/gofiber/fiber/v2 v2.52.6
-	github.com/sirupsen/logrus v1.9.3
+	gitp78su.ipnodns.ru/svi/kern v1.5.0
 )
 
 require (
+	github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect
 	github.com/andybalholm/brotli v1.1.1 // indirect
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+	github.com/dgraph-io/badger/v4 v4.6.0 // indirect
 	github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect
 	github.com/dustin/go-humanize v1.0.1 // indirect
-	github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/google/flatbuffers v25.2.10+incompatible // indirect
 	github.com/google/uuid v1.6.0 // indirect
 	github.com/klauspost/compress v1.18.0 // indirect
@@ -26,8 +28,11 @@ require (
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasthttp v1.59.0 // indirect
-	go.opencensus.io v0.24.0 // indirect
-	golang.org/x/net v0.35.0 // indirect
-	golang.org/x/sys v0.30.0 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.35.0 // indirect
+	go.opentelemetry.io/otel/metric v1.35.0 // indirect
+	go.opentelemetry.io/otel/trace v1.35.0 // indirect
+	golang.org/x/net v0.37.0 // indirect
+	golang.org/x/sys v0.31.0 // indirect
 	google.golang.org/protobuf v1.36.5 // indirect
 )

+ 41 - 95
go.sum

@@ -1,57 +1,36 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
+github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
+github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw=
+github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
 github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
 github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgraph-io/badger/v4 v4.5.1 h1:7DCIXrQjo1LKmM96YD+hLVJ2EEsyyoWxJfpdd56HLps=
-github.com/dgraph-io/badger/v4 v4.5.1/go.mod h1:qn3Be0j3TfV4kPbVoK0arXCD1/nr1ftth6sbL5jxdoA=
+github.com/dgraph-io/badger/v4 v4.6.0 h1:acOwfOOZ4p1dPRnYzvkVm7rUk2Y21TgPVepCy5dJdFQ=
+github.com/dgraph-io/badger/v4 v4.6.0/go.mod h1:KSJ5VTuZNC3Sd+YhvVjk2nYua9UZnnTr/SkXvdtiPgI=
 github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I=
 github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4=
 github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
 github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
 github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI=
 github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
-github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
 github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
 github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
 github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
@@ -62,22 +41,11 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
 github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
 github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
-github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
-github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@@ -86,67 +54,45 @@ github.com/valyala/fasthttp v1.59.0 h1:Qu0qYHfXvPk1mSLNqcFtEk6DpxgA26hy6bmydotDp
 github.com/valyala/fasthttp v1.59.0/go.mod h1:GTxNb9Bc6r2a9D0TWNSPwDz78UxnTGBViY3xZNEqyYU=
 github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
 github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
-go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
-go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+gitp78su.ipnodns.ru/svi/kern v1.5.0 h1:2+HRRj5T7ON8OqZMl8gwa+omNG2WTqhTdRmdkyrFu80=
+gitp78su.ipnodns.ru/svi/kern v1.5.0/go.mod h1:+8wsxQThUx9wegfPZffhRJx+s+hnyDHv4n3ODMQm6+w=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
+golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
 google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=

+ 0 - 21
kernel/helpers/helper.go

@@ -1,21 +0,0 @@
-// package helper -- всякие помощнички
-package helpers
-
-import (
-	"fmt"
-)
-
-// Печатает башку приложухи
-func PrintHeader(port string) {
-	fmt.Println()
-	fmt.Println()
-	fmt.Println("/=================================[ wartank.ru ] ================================\\")
-	fmt.Println("|                                                                                |")
-	fmt.Println("|                                                                                |")
-	fmt.Printf("|        Для слежения за ботом открыть ссылку: http://localhost:%v/           |\n", port)
-	fmt.Println("|                                                                                |")
-	fmt.Println("|                                                                                |")
-	fmt.Println("\\===============================[ FunnyBot Soft ]================================/")
-	fmt.Println()
-	fmt.Println()
-}

+ 0 - 56
kernel/helpers/helpers.go

@@ -1,56 +0,0 @@
-// package helpers -- содержит всякие полезняшки
-//
-// Пакет импортировать где нужно в нотации `. "gitlab.c2g.pw/back/uaj-abstract-client/pkg/helpers"`
-package helpers
-
-import (
-	"fmt"
-	"os"
-)
-
-var (
-	IsStageLocal bool
-	IsStageProd  bool
-)
-
-// Провер -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
-func Провер(isCond bool, msgFormat string, args ...interface{}) {
-	if isCond {
-		return
-	}
-	msg := fmt.Sprintf("МЯГКАЯ ПРОВЕРКА "+msgFormat+"\n", args...)
-	if IsStageLocal {
-		panic(msg)
-	}
-	fmt.Print(msg)
-}
-
-// Паника -- проверка на правильность утверждения с безусловным падением в панику (hard assert)
-func Паника(isCond bool, msgFormat string, args ...interface{}) {
-	if isCond {
-		return
-	}
-	msg := fmt.Sprintf("ТВЁРДАЯ ПРОВЕРКА "+msgFormat+"\n", args...)
-	panic(msg)
-}
-
-func init_() {
-	strStage := os.Getenv("STAGE")
-	switch strStage {
-	case "local":
-		IsStageLocal = true
-		IsStageProd = false
-	case "prod":
-		IsStageProd = true
-		IsStageLocal = false
-	case "":
-		IsStageLocal = true
-		IsStageProd = false
-	default:
-		panic(fmt.Sprintf("helpers.init_(): unknown env STAGE (%v)\n", strStage))
-	}
-}
-
-func init() {
-	init_()
-}

+ 0 - 119
kernel/helpers/helpers_test.go

@@ -1,119 +0,0 @@
-package helpers
-
-import (
-	"os"
-	"testing"
-)
-
-type tester struct {
-	t *testing.T
-}
-
-func TestHelpers(t *testing.T) {
-	sf := &tester{
-		t: t,
-	}
-	sf.assert()
-	sf.hassert()
-	sf.init_()
-}
-
-// Неизвестное значение STAGE
-func (sf *tester) init_() {
-	sf.t.Log("init_")
-	sf.initBad1()
-	_ = os.Unsetenv("STAGE")
-	_ = os.Setenv("STAGE", "local")
-	init_()
-}
-
-func (sf *tester) initBad1() {
-	sf.t.Log("initBad1")
-	defer func() {
-		if panic_ := recover(); panic_ == nil {
-			sf.t.Fatalf("initBad1(): panic==nil")
-		}
-	}()
-	_ = os.Unsetenv("STAGE")
-	_ = os.Setenv("STAGE", "tra-lala")
-	init_()
-}
-
-// Проверка мягкого ассерта
-func (sf *tester) hassert() {
-	sf.t.Log("assert")
-	sf.hassertLocal()
-	sf.hassertProd()
-	sf.hassertProdGood1()
-}
-
-// Мягкая ТВЁРДАЯ проверка на ок
-func (sf *tester) hassertProdGood1() {
-	sf.t.Log("hassertProdGood1")
-	Паника(true, "tra-la-la")
-}
-
-// Твёрдая проверка
-func (sf *tester) hassertProd() {
-	sf.t.Log("hassertProd")
-	err := os.Setenv("STAGE", "prod")
-	if err != nil {
-		sf.t.Fatalf("hassertProd(): err=%v", err)
-	}
-	init_()
-	defer func() {
-		if panic_ := recover(); panic_ == nil {
-			sf.t.Fatalf("assertLocal(): panic==nil")
-		}
-	}()
-	Паника(false, "tra-la-la")
-}
-
-// ТВЁРДАЯ проверка
-func (sf *tester) hassertLocal() {
-	sf.t.Log("hassertLocal")
-	defer func() {
-		if panic_ := recover(); panic_ == nil {
-			sf.t.Fatalf("assertLocal(): panic==nil")
-		}
-	}()
-	Паника(false, "tra-la-la")
-}
-
-//========================================================================
-
-// Проверка мягкого ассерта
-func (sf *tester) assert() {
-	sf.t.Log("assert")
-	sf.assertLocal()
-	sf.assertProd()
-	sf.assertProdGood1()
-}
-
-// Мягкая ТВЁРДАЯ проверка на ок
-func (sf *tester) assertProdGood1() {
-	sf.t.Log("assertProdGood1")
-	Провер(true, "tra-la-la")
-}
-
-// Мягкая мягка проверка (на проде)
-func (sf *tester) assertProd() {
-	sf.t.Log("assertProd")
-	err := os.Setenv("STAGE", "prod")
-	if err != nil {
-		sf.t.Fatalf("assertProd(): err=%v", err)
-	}
-	init_()
-	Провер(false, "tra-la-la")
-}
-
-// Мягкая ТВЁРДАЯ локальная проверка (локально)
-func (sf *tester) assertLocal() {
-	sf.t.Log("assertLocal")
-	defer func() {
-		if panic_ := recover(); panic_ == nil {
-			sf.t.Fatalf("assertLocal(): panic==nil")
-		}
-	}()
-	Провер(false, "tra-la-la")
-}

+ 0 - 5
kernel/internal/kernel_alias/kermel_alias.go

@@ -1,5 +0,0 @@
-// package kernel_alias -- алиасы типов ядра
-package kernel_alias
-
-// AStreamName -- имя потока для ожидания
-type AStreamName string

+ 0 - 7
kernel/internal/kernel_alias/kernel_alias_test.go

@@ -1,7 +0,0 @@
-package kernel_alias
-
-import (
-	"testing"
-)
-
-func TestKernelAlias(t *testing.T) {}

+ 0 - 90
kernel/internal/kernel_ctx/kernel_ctx.go

@@ -1,90 +0,0 @@
-// package kernel_ctx -- контекст ядра
-package kernel_ctx
-
-import (
-	"context"
-	"log"
-	"sync"
-
-	"wartank/kernel/internal/kernel_ctx/kernel_keeper"
-	"wartank/kernel/internal/kernel_ctx/kernel_wg"
-	. "wartank/kernel/kernel_types"
-)
-
-// kernelCtx -- контекст ядра
-type kernelCtx struct {
-	ctxBg      context.Context        // Неотменяемый контекст ядра
-	ctx        context.Context        // Отменяемый контекст ядра
-	fnCancel   func()                 // Функция отмены контекста ядра
-	dictVal    map[string]interface{} // Словарь различных значений
-	kernKeeper IKernelKeeper          // Встроенный сторож отмены контекста системным сигналом
-	kernWg     IKernelWg              // Встроенный ожидатель потока
-	block      sync.RWMutex
-}
-
-var (
-	kernCtx *kernelCtx // Глобальный объект контекста приложения
-	block   sync.Mutex
-)
-
-// ПолучЯдроКонтекст -- возвращает контекст ядра
-func ПолучЯдроКонтекст() ИЯдроКонтекст {
-	block.Lock()
-	defer block.Unlock()
-	if kernCtx != nil {
-		return kernCtx
-	}
-	ctxBg := context.Background()
-	ctx, fnCancel := context.WithCancel(ctxBg)
-	sf := &kernelCtx{
-		ctxBg:    ctxBg,
-		ctx:      ctx,
-		fnCancel: fnCancel,
-		dictVal:  map[string]interface{}{},
-	}
-	sf.kernWg = kernel_wg.GetKernelWg(sf.ctx)
-	sf.kernKeeper = kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
-	kernCtx = sf
-	return kernCtx
-}
-
-// Оп -- возвращает ожидатель потоков
-func (sf *kernelCtx) Оп() IKernelWg {
-	return sf.kernWg
-}
-
-// Получ -- возвращает хранимое значение
-func (sf *kernelCtx) Получ(key string) interface{} {
-	sf.block.RLock()
-	defer sf.block.RUnlock()
-	return sf.dictVal[key]
-}
-
-// Уст -- устанавливает значение в контекст
-func (sf *kernelCtx) Уст(key string, val interface{}) {
-	sf.block.Lock()
-	defer sf.block.Unlock()
-	sf.dictVal[key] = val
-}
-
-// Ждать -- блокирующий вызов ожидания отмены контекста ядра
-func (sf *kernelCtx) Ждать() {
-	<-sf.ctx.Done()
-	log.Println("kernelCtx.Done()")
-}
-
-// КонтФон -- возвращает неотменяемый контекст ядра (лучше не использовать)
-func (sf *kernelCtx) КонтФон() context.Context {
-	return sf.ctxBg
-}
-
-// Конт -- возвращает контекст ядра
-func (sf *kernelCtx) Конт() context.Context {
-	return sf.ctx
-}
-
-// Отменить -- отменяет контекст ядра
-func (sf *kernelCtx) Отменить() {
-	log.Println("kernelCtx.Cancel()")
-	sf.fnCancel()
-}

+ 0 - 45
kernel/internal/kernel_ctx/kernel_ctx_test.go

@@ -1,45 +0,0 @@
-package kernel_ctx
-
-import (
-	"testing"
-)
-
-type tester struct {
-	t *testing.T
-}
-
-func TestKernelCtx(t *testing.T) {
-	sf := &tester{
-		t: t,
-	}
-	sf.new()
-}
-
-// Создание контекста ядра
-func (sf *tester) new() {
-	sf.t.Log("new")
-	ctx := ПолучЯдроКонтекст()
-	if ctx == nil {
-		sf.t.Fatalf("new(): KernelCtx==nil")
-	}
-	if ctx := ctx.КонтФон(); ctx != kernCtx.ctxBg {
-		sf.t.Fatalf("new(): ctx!=ctxBg")
-	}
-	if ctx := ctx.Конт(); ctx != kernCtx.ctx {
-		sf.t.Fatalf("new(): ctx!=kernel.ctx")
-	}
-	ctx.Уст("counter", 5)
-	counter := ctx.Получ("counter").(int)
-	if counter != 5 {
-		sf.t.Fatalf("new(): counter(%v)!=5", counter)
-	}
-	ctx.Отменить()
-	ctx.Ждать()
-	ctx = ПолучЯдроКонтекст()
-	if ctx == nil {
-		sf.t.Fatalf("new(): KernelCtx==nil")
-	}
-	if wg := ctx.Оп(); wg == nil {
-		sf.t.Fatalf("new(): IKernelWg==nil")
-	}
-}

+ 0 - 64
kernel/internal/kernel_ctx/kernel_keeper/kernel_keeper_test.go

@@ -1,64 +0,0 @@
-package kernel_keeper
-
-import (
-	"context"
-	"os"
-	"testing"
-	"time"
-
-	"wartank/kernel/internal/kernel_ctx/kernel_wg"
-	. "wartank/kernel/kernel_types"
-)
-
-type tester struct {
-	t        *testing.T
-	ctx      context.Context
-	fnCancel func()
-	wg       IKernelWg
-}
-
-func TestKernelKeeper(t *testing.T) {
-	ctxBg := context.Background()
-	ctx, fnCancel := context.WithCancel(ctxBg)
-	wg := kernel_wg.GetKernelWg(ctx)
-	defer fnCancel()
-	sf := &tester{
-		t:        t,
-		ctx:      ctx,
-		fnCancel: fnCancel,
-		wg:       wg,
-	}
-	sf.get()
-	sf.get2()
-}
-
-type sysSig struct {
-}
-
-func (sf *sysSig) String() string {
-	return "test_sig"
-}
-
-func (sf *sysSig) Signal() {
-}
-func (sf *tester) get2() {
-	sf.t.Log("get2")
-	chSys := make(chan os.Signal, 2)
-	sig := &sysSig{}
-	chSys <- sig
-	go kernKeep.run(chSys)
-	sf.fnCancel()
-	sf.wg.Wait()
-}
-
-// Получает сторож ядра
-func (sf *tester) get() {
-	sf.t.Log("get")
-	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg)
-	if keep == nil {
-		sf.t.Fatalf("get(): IKernelKeeper==nil")
-	}
-	_ = GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg)
-	close(keep.chSys_)
-	time.Sleep(time.Millisecond * 10)
-}

+ 0 - 123
kernel/internal/kernel_ctx/kernel_wg/kernel_wg.go

@@ -1,123 +0,0 @@
-// package kernel_wg -- именованный ожидатель потоков ядра
-//
-// Не позволяет завершиться ядру, если есть хоть один работающий поток
-package kernel_wg
-
-import (
-	"context"
-	"fmt"
-	"log"
-	"sync"
-	"time"
-
-	. "wartank/kernel/helpers"
-	. "wartank/kernel/internal/kernel_alias"
-	"wartank/kernel/internal/safe_bool"
-	. "wartank/kernel/kernel_types"
-)
-
-// ядроОп -- именованный ожидатель потоков ядра
-type ядроОп struct {
-	ctx          context.Context
-	dictStream   map[AStreamName]bool // Словарь имён потоков с признаком работы
-	еслиРаботает ИБезопБул
-	block        sync.RWMutex
-}
-
-var (
-	kernWg *ядроОп // Глобальный объект
-)
-
-// GetKernelWg -- возвращает новый именованный ожидатель потоков ядра
-func GetKernelWg(ctx context.Context) IKernelWg {
-	log.Println("NewKernelWg()")
-	if kernWg != nil {
-		return kernWg
-	}
-	Паника(ctx != nil, "GetKernelWg(): ctx==nil")
-	сам := &ядроОп{
-		ctx:          ctx,
-		dictStream:   map[AStreamName]bool{},
-		еслиРаботает: safe_bool.НовБезопБул_(),
-	}
-	go сам.close()
-	сам.еслиРаботает.Уст()
-	kernWg = сам
-	return kernWg
-}
-
-// Len -- возвращает размер списка ожидания потоков
-func (сам *ядроОп) Len() int {
-	сам.block.RLock()
-	defer сам.block.RUnlock()
-	return len(сам.dictStream)
-}
-
-// IsWork -- возвращает признак работы ядра
-func (сам *ядроОп) IsWork() bool {
-	return сам.еслиРаботает.Получ()
-}
-
-// List -- возвращает список имён потоков на ожидании
-func (сам *ядроОп) List() []AStreamName {
-	сам.block.RLock()
-	defer сам.block.RUnlock()
-	lst := []AStreamName{}
-	for name := range сам.dictStream {
-		lst = append(lst, name)
-	}
-	return lst
-}
-
-// Done -- удаляет поток из ожидания
-func (сам *ядроОп) Done(name AStreamName) {
-	сам.block.Lock()
-	defer сам.block.Unlock()
-	delete(сам.dictStream, name)
-}
-
-// Wait -- блокирующий вызов; возвращает управление, только когда все потоки завершили работу
-func (сам *ядроОп) Wait() {
-	for {
-		time.Sleep(time.Millisecond * 5)
-		if !сам.еслиРаботает.Получ() {
-			break
-		}
-	}
-	log.Println("ядроОп.Wait(): done")
-}
-
-// Add -- добавляет поток в ожидание
-func (сам *ядроОп) Add(name AStreamName) error {
-	log.Printf("ядроОп.Add(): stream='%v'\n", name)
-	сам.block.Lock()
-	defer сам.block.Unlock()
-	if !сам.еслиРаботает.Получ() {
-		return fmt.Errorf("ядроОп.Add(): stream=%v, work end", name)
-	}
-	Паника(name != "", "ядроОп.Add(): name stream is empty")
-	_, isOk := сам.dictStream[name]
-	Паника(!isOk, "ядроОп.Add(): stream '%v' already exists", name)
-	сам.dictStream[name] = true
-	return nil
-}
-
-// Ожидает окончания работы ожидателя групп
-func (сам *ядроОп) close() {
-	<-сам.ctx.Done()
-	fnDone := func() bool {
-		сам.block.Lock()
-		defer сам.block.Unlock()
-		return len(сам.dictStream) == 0
-	}
-	for {
-		time.Sleep(time.Millisecond * 1)
-		if fnDone() {
-			break
-		}
-	}
-	сам.block.Lock()
-	defer сам.block.Unlock()
-	сам.еслиРаботает.Сброс()
-	log.Println("ядроОп.close(): done")
-}

+ 0 - 149
kernel/internal/kernel_ctx/kernel_wg/kernel_wg_test.go

@@ -1,149 +0,0 @@
-package kernel_wg
-
-import (
-	"context"
-	"testing"
-	"time"
-
-	. "wartank/kernel/kernel_types"
-)
-
-type tester struct {
-	t        *testing.T
-	ctx      context.Context
-	fnCancel func()
-	wg       IKernelWg
-}
-
-func TestKernelWG(t *testing.T) {
-	ctxBg := context.Background()
-	ctx, fnCancel := context.WithCancel(ctxBg)
-	defer fnCancel()
-	sf := &tester{
-		t:        t,
-		ctx:      ctx,
-		fnCancel: fnCancel,
-	}
-	sf.new()
-	sf.add()
-	sf.done()
-	sf.wait()
-	sf.addBad3()
-}
-
-// Попытка добавления после закрытия ожидателя
-func (sf *tester) addBad3() {
-	sf.t.Log("addBad3")
-	err := sf.wg.Add("test_stream")
-	if err == nil {
-		sf.t.Fatalf("addBad3(): err==nil")
-	}
-	_len := sf.wg.Len()
-	if _len != 0 {
-		sf.t.Fatalf("addBad3(): len(%v)!=0", _len)
-	}
-}
-
-// Убирает имя потока из ожидателя
-func (sf *tester) done() {
-	sf.t.Log("done")
-	sf.wg.Done("test_stream")
-	lst := sf.wg.List()
-	if len(lst) != 0 {
-		sf.t.Fatalf("addBad1(): len(lst)!=0, lst=%#v", lst)
-	}
-}
-
-// Добавление потока ожидания
-func (sf *tester) add() {
-	sf.t.Log("add")
-	sf.addGood1()
-	sf.addBad1()
-	sf.addBad2()
-}
-
-// Уже есть такое имя потока
-func (sf *tester) addBad2() {
-	sf.t.Log("addBad2")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("addBad1(): panic==nil")
-		}
-		lst := sf.wg.List()
-		if len(lst) != 1 {
-			sf.t.Fatalf("addBad1(): len(lst)!=1, lst=%#v", lst)
-		}
-	}()
-	_ = sf.wg.Add("test_stream")
-}
-
-// Пустое имя потока
-func (sf *tester) addBad1() {
-	sf.t.Log("addBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("addBad1(): panic==nil")
-		}
-	}()
-	_ = sf.wg.Add("")
-}
-
-func (sf *tester) addGood1() {
-	sf.t.Log("addGood1")
-	err := sf.wg.Add("test_stream")
-	if err != nil {
-		sf.t.Fatalf("addGood1(): err=%v", err)
-	}
-}
-
-// Ожидание завершения ожидателя потоков
-func (sf *tester) wait() {
-	sf.t.Log("wait")
-	go sf.wg.Wait()
-	time.Sleep(time.Millisecond * 10)
-	sf.fnCancel()
-	time.Sleep(time.Millisecond * 10)
-	if sf.wg.IsWork() {
-		sf.t.Fatalf("wait(): isWork==true")
-	}
-}
-
-// Создаёт ожидатель потоков ядра
-func (sf *tester) new() {
-	sf.t.Log("new")
-	sf.newBad1()
-	sf.newGood1()
-}
-
-func (sf *tester) newGood1() {
-	sf.t.Log("newGood1")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("newGood1(): panic=%v", _panic)
-		}
-	}()
-	sf.wg = GetKernelWg(sf.ctx)
-	if sf.wg == nil {
-		sf.t.Fatalf("newGood1(): KernelWg==nil")
-	}
-	if !sf.wg.IsWork() {
-		sf.t.Fatalf("wait(): isWork==false")
-	}
-	wg := GetKernelWg(sf.ctx)
-	if sf.wg != wg {
-		sf.t.Fatalf("newGood1(): bad IKernelWg")
-	}
-}
-
-// Нет контекста ядра
-func (sf *tester) newBad1() {
-	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic=nil")
-		}
-	}()
-	// defer sf.panicUse("newBad1(): ")
-	var ctx context.Context
-	_ = GetKernelWg(ctx)
-}

+ 0 - 37
kernel/internal/kernel_dict/kernel_dict.go

@@ -1,37 +0,0 @@
-// package kernel_dict -- потокобезопасный автономный словарь
-package kernel_dict
-
-import (
-	"sync"
-
-	. "wartank/kernel/kernel_types"
-)
-
-// ЯдроСловаря -- потокобезопасный автономный словарь
-type ЯдроСловарь struct {
-	dictVal map[string]interface{} // Словарь различных значений
-	block   sync.RWMutex
-}
-
-// НовЯдроСловарь -- возвращает новый потокобезопасный автономный словарь
-func НовЯдроСловарь() *ЯдроСловарь {
-	sf := &ЯдроСловарь{
-		dictVal: map[string]interface{}{},
-	}
-	_ = ИЯдроСловарь(sf)
-	return sf
-}
-
-// Получ -- возвращает хранимое значение
-func (sf *ЯдроСловарь) Получ(key string) interface{} {
-	sf.block.RLock()
-	defer sf.block.RUnlock()
-	return sf.dictVal[key]
-}
-
-// Уст -- устанавливает значение в контекст
-func (sf *ЯдроСловарь) Уст(key string, val interface{}) {
-	sf.block.Lock()
-	defer sf.block.Unlock()
-	sf.dictVal[key] = val
-}

+ 0 - 60
kernel/internal/kernel_log/logger.go

@@ -1,60 +0,0 @@
-// package kernel_log -- логгер ядра
-package kernel_log
-
-import (
-	"fmt"
-	"sync"
-
-	. "wartank/kernel/kernel_types"
-)
-
-var блок sync.Mutex
-
-type Логгер struct {
-	префикс string
-}
-
-func НовЛоггер(префикс string) *Логгер {
-	сам := &Логгер{
-		префикс: префикс,
-	}
-	_ = ИЯдроЛог(сам)
-	return сам
-}
-
-// Паника -- проверяет на совпадение условия
-func (сам *Логгер) Паника(условие bool, формат string, аргументы ...interface{}) {
-	блок.Lock()
-	defer блок.Unlock()
-	if условие {
-		panic(fmt.Sprintf("ПАНИК "+сам.префикс+"."+формат, аргументы...))
-	}
-}
-
-// Ошибка -- выводит в консоль ошибку
-func (сам *Логгер) Ошибка(формат string, аргументы ...interface{}) {
-	блок.Lock()
-	defer блок.Unlock()
-	fmt.Printf("ОШИБК "+сам.префикс+"."+формат, аргументы...)
-}
-
-// Отладка -- выводит в консоль отладку
-func (сам *Логгер) Отладка(формат string, аргументы ...interface{}) {
-	блок.Lock()
-	defer блок.Unlock()
-	fmt.Printf("ОТЛАД "+сам.префикс+"."+формат, аргументы...)
-}
-
-// Инфо -- выводит в консоль информацию
-func (сам *Логгер) Инфо(формат string, аргументы ...interface{}) {
-	блок.Lock()
-	defer блок.Unlock()
-	fmt.Printf("ИНФО  "+сам.префикс+"."+формат, аргументы...)
-}
-
-// Внимание -- выводит в консоль предупреждение
-func (сам *Логгер) Внимание(формат string, аргументы ...interface{}) {
-	блок.Lock()
-	defer блок.Unlock()
-	fmt.Printf("ВНИМА "+сам.префикс+"."+формат, аргументы...)
-}

+ 0 - 115
kernel/internal/kernel_serv_http/kernel_serv_http.go

@@ -1,115 +0,0 @@
-// package kernel_serv_http -- встроенный HTTP-сервер
-package kernel_serv_http
-
-import (
-	"embed"
-	"log"
-	"net/http"
-	"os"
-	"sync"
-	"time"
-
-	"github.com/gofiber/fiber/v2"
-	"github.com/gofiber/fiber/v2/middleware/compress"
-	"github.com/gofiber/fiber/v2/middleware/filesystem"
-	"github.com/gofiber/fiber/v2/middleware/monitor"
-
-	. "wartank/kernel/helpers"
-	"wartank/kernel/internal/safe_bool"
-	. "wartank/kernel/kernel_types"
-)
-
-const (
-	streamName = "kernel_server_http" // Контрольная строка для ожидателя потока
-)
-
-// kernelServHttp -- встроенный HTTP-сервер
-type kernelServHttp struct {
-	ctx      ИЯдроКонтекст
-	strPort  string // Порт ,на котором слушает HTTP-сервер
-	fiberApp *fiber.App
-	isWork   ИБезопБул
-	block    sync.Mutex
-}
-
-//go:embed static/*
-var embedDirStatic embed.FS
-
-var (
-	kernServHttp *kernelServHttp
-	block        sync.Mutex
-)
-
-// GetKernelServHttp -- возвращает  встроенный HTTP-сервер
-func GetKernelServHttp(ctx ИЯдроКонтекст) ИЯдроСерверВеб {
-	log.Println("NewKernelServHttp()")
-	block.Lock()
-	defer block.Unlock()
-	if kernServHttp != nil {
-		return kernServHttp
-	}
-	strPort := os.Getenv("SERVER_HTTP_PORT")
-	Паника(strPort != "", "NewKernelServHttp(): env SERVER_HTTP_PORT not set")
-	confFiber := fiber.Config{
-		ServerHeader:      "KernelServerWeb",
-		UnescapePath:      true,
-		ReadTimeout:       time.Second * 15,
-		WriteTimeout:      time.Second * 15,
-		AppName:           "KernelServerWeb",
-		Network:           "tcp4",
-		EnablePrintRoutes: true,
-	}
-	sf := &kernelServHttp{
-		ctx:      ctx,
-		strPort:  strPort,
-		fiberApp: fiber.New(confFiber),
-		isWork:   safe_bool.НовБезопБул_(),
-	}
-	sf.fiberApp.Use(compress.New(compress.Config{
-		Level: compress.LevelBestCompression, // 2
-	}))
-	sf.fiberApp.Use("/static", filesystem.New(filesystem.Config{
-		Root:       http.FS(embedDirStatic),
-		PathPrefix: "static",
-		Browse:     true,
-		MaxAge:     3600 * 24,
-	}))
-	sf.fiberApp.Get("/monitor", monitor.New(monitor.Config{Title: "KernelServerWeb"}))
-	err := sf.ctx.Оп().Add(streamName)
-	Паника(err == nil, "NewKernelServHttp(): in add stream %v, err=\n\t%v", streamName, err)
-	ctx.Уст("fiberApp", sf.fiberApp)
-	kernServHttp = sf
-	ctx.Уст("kernServHttp", kernServHttp)
-	return kernServHttp
-}
-
-// Fiber -- возвращает объект веб-приложения fiber
-func (sf *kernelServHttp) Fiber() *fiber.App {
-	return sf.fiberApp
-}
-
-// Run -- запускает сервер в работу (блокирующий вызов)
-func (sf *kernelServHttp) Run() {
-	go sf.close()
-	sf.isWork.Уст()
-	err := sf.fiberApp.Listen(":" + sf.strPort)
-	if err != nil {
-		log.Printf("kernelServHttp.Run(): in listen, err=\n\t%v\n", err)
-		sf.ctx.Отменить()
-	}
-}
-
-// Ожидает окончания работы
-func (sf *kernelServHttp) close() {
-	<-sf.ctx.Конт().Done()
-	sf.block.Lock()
-	defer sf.block.Unlock()
-	if !sf.isWork.Получ() {
-		return
-	}
-	sf.isWork.Сброс()
-	err := sf.fiberApp.Server().Shutdown()
-	Провер(err == nil, "kernelServHttp.close(): in close server, err=\n\t%v", err)
-	sf.ctx.Оп().Done(streamName)
-	log.Println("kernelServHttp.close(): end")
-}

+ 0 - 95
kernel/internal/kernel_serv_http/kernel_serv_http_test.go

@@ -1,95 +0,0 @@
-package kernel_serv_http
-
-import (
-	"testing"
-	"time"
-
-	"wartank/kernel/internal/kernel_ctx"
-	. "wartank/kernel/kernel_types"
-	"wartank/pkg/mock/mock_env"
-)
-
-type tester struct {
-	t   *testing.T
-	ctx ИЯдроКонтекст
-	wg  IKernelWg
-	me  *mock_env.МокОкружение
-}
-
-func TestKernelServHttp(t *testing.T) {
-	ctx := kernel_ctx.ПолучЯдроКонтекст()
-	sf := &tester{
-		t:   t,
-		ctx: ctx,
-		wg:  ctx.Оп(),
-	}
-	sf.new()
-	sf.close()
-}
-
-// Закрытие HTTP-сервера
-func (sf *tester) close() {
-	sf.t.Log("close")
-	sf.ctx.Отменить()
-	sf.ctx.Ждать()
-	kernServHttp.close()
-}
-
-// Создание сервера HTTP
-func (sf *tester) new() {
-	sf.t.Log("new()")
-	sf.newBad1()
-	sf.newBad2()
-	sf.newGood1()
-	sf.newBad3()
-}
-
-// Повторный запуск сервера на том же порту
-func (sf *tester) newBad3() {
-	sf.t.Log("newBad3()")
-	ctx := kernel_ctx.ПолучЯдроКонтекст()
-	serv := GetKernelServHttp(ctx)
-	go serv.Run()
-	time.Sleep(time.Millisecond * 20)
-}
-
-func (sf *tester) newGood1() {
-	sf.t.Log("newGood1()")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("newGood1(): panic=%v", _panic)
-		}
-	}()
-	sf.me = mock_env.СделатьОкружение()
-	serv := GetKernelServHttp(sf.ctx)
-	if serv != kernServHttp {
-		sf.t.Fatalf("newGood1(): bad IKernelServHttp")
-	}
-	if webFiber := serv.Fiber(); webFiber != kernServHttp.fiberApp {
-		sf.t.Fatalf("newGood1(): webFiber==serv.appFiber")
-	}
-	go serv.Run()
-}
-
-// Не указана SERVER_HTTP_PORT
-func (sf *tester) newBad2() {
-	sf.t.Log("newBad2()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad2(): panic==nil")
-		}
-	}()
-	_ = GetKernelServHttp(sf.ctx)
-}
-
-// Нет контекста ядра
-func (sf *tester) newBad1() {
-	sf.t.Log("newBad1()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	var ctx ИЯдроКонтекст
-	_ = GetKernelServHttp(ctx)
-}

+ 0 - 180
kernel/internal/kernel_store/kernel_store.go

@@ -1,180 +0,0 @@
-// package kernel_store -- локальное хранилище ядра
-package kernel_store
-
-import (
-	"fmt"
-	"log"
-	"os"
-	"sync"
-	"time"
-
-	"github.com/dgraph-io/badger/v4"
-
-	. "wartank/kernel/helpers"
-	"wartank/kernel/internal/safe_bool"
-	. "wartank/kernel/kernel_types"
-)
-
-const (
-	storeStreamName = "kernel_store" // Имя потока для ожидателя потоков
-)
-
-// kernelStore -- локальное хранилище ядра
-type kernelStore struct {
-	ctx        ИЯдроКонтекст
-	wg         IKernelWg
-	storePath  string
-	db         *badger.DB
-	isWork     ИБезопБул
-	block      sync.RWMutex
-	blockClose sync.Mutex
-}
-
-var (
-	kernStore *kernelStore // Глобальный объект
-	block     sync.Mutex
-)
-
-// GetKernelStore -- возвращает новое локальное хранилище ядра
-func GetKernelStore(ctx ИЯдроКонтекст) ИЯдроХранилище {
-	log.Println("GetKernelStore()")
-	block.Lock()
-	defer block.Unlock()
-	if kernStore != nil {
-		return kernStore
-	}
-	Паника(ctx != nil, "GetKernelStore(): IKernelCtx==nil")
-	sf := &kernelStore{
-		ctx:    ctx,
-		wg:     ctx.Оп(),
-		isWork: safe_bool.НовБезопБул_(),
-	}
-	sf.open()
-	kernStore = sf
-	ctx.Уст("kernStore", kernStore)
-	return kernStore
-}
-
-// Set -- устанавливает значение по ключу
-func (sf *kernelStore) Set(key string, val []byte) error {
-	sf.block.Lock()
-	defer sf.block.Unlock()
-	// if !sf.isWork.Get() {
-	// 	return fmt.Errorf("kernelStore.Set(): DB already close")
-	// }
-	fnSet := func(txn *badger.Txn) error {
-		err := txn.Set([]byte(key), val)
-		return err
-	}
-	err := sf.db.Update(fnSet)
-	if err != nil {
-		return fmt.Errorf("kernelStore.Set(): key=%v, err=\n\t%w", key, err)
-	}
-	return nil
-}
-
-// Get -- возвращает значение по ключу
-func (sf *kernelStore) Get(key string) ([]byte, error) {
-	sf.block.RLock()
-	defer sf.block.RUnlock()
-	var binVal []byte
-	fnGet := func(txn *badger.Txn) error {
-		item, err := txn.Get([]byte(key))
-		if err != nil {
-			return err
-		}
-		binVal, err = item.ValueCopy(binVal)
-		return err
-	}
-	err := sf.db.View(fnGet)
-	if err != nil {
-		return nil, fmt.Errorf("kernelStore.Delete(): key=%v, err=\n\t%w", key, err)
-	}
-	return binVal, nil
-}
-
-// Delete -- удалить ключ из хранилища
-func (sf *kernelStore) Delete(key string) error {
-	sf.block.Lock()
-	defer sf.block.Unlock()
-
-	fnDelete := func(txn *badger.Txn) error {
-		err := txn.Delete([]byte(key))
-		return err
-	}
-	err := sf.db.Update(fnDelete)
-	if err != nil {
-		return fmt.Errorf("kernelStore.Delete(): key=%v, err=\n\t%w", key, err)
-	}
-	return nil
-}
-
-// Открывает базу при создании
-func (sf *kernelStore) open() {
-	sf.block.Lock()
-	defer sf.block.Unlock()
-	strPath := os.Getenv("LOCAL_STORE_PATH")
-	Паника(strPath != "", "kernelStore.open(): env LOCAL_STORE_PATH not set")
-	pwd, err := os.Getwd()
-	Паника(err == nil, "kernelStore.open(): in get PWD, err=\n\t%v", err)
-	sf.storePath = pwd + strPath + "/db_local"
-	err = os.MkdirAll(sf.storePath, 0750)
-	Паника(err == nil, "kernelStore.open(): in make dir %v, err=\n\t%v", sf.storePath, err)
-	sf.db, err = badger.Open(badger.DefaultOptions(sf.storePath))
-	Паника(err == nil, "kernelStore.open(): in open DB %v, err=\n\t%v", sf.storePath, err)
-	err = sf.wg.Add(storeStreamName)
-	Паника(err == nil, "kernelStore.open(): in add name stream to IKernelWg, err=\n\t%v", err)
-	sf.isWork.Уст()
-	go sf.close()
-	go sf.clean()
-}
-
-// Выполняет периодическую сборку мусора в файле
-func (sf *kernelStore) clean() {
-	chRun := make(chan int, 2)
-	defer close(chRun)
-	fnClean := func() {
-		sf.block.Lock()
-		defer sf.block.Unlock()
-		_ = sf.db.RunValueLogGC(0.7)
-	}
-	chRun <- 1
-	for {
-		select {
-		case <-sf.ctx.Конт().Done(): // надо прекратить работу
-			return
-		case <-chRun: // Пора поработать
-			fnClean()
-		}
-		time.Sleep(time.Second * 1)
-	}
-}
-
-// Ожидает последнего потока под отдельной блокировкой
-func (sf *kernelStore) wait(chWait chan int) {
-	for {
-		time.Sleep(time.Millisecond * 5)
-		if sf.wg.Len() <= 1 {
-			break
-		}
-	}
-	close(chWait)
-}
-
-// Ожидает закрытия контекста ядра, закрывает хранилище
-func (sf *kernelStore) close() {
-	<-sf.ctx.Конт().Done()
-	sf.blockClose.Lock()
-	defer sf.blockClose.Unlock()
-	if !sf.isWork.Получ() {
-		return
-	}
-	chWait := make(chan int, 2)
-	go sf.wait(chWait)
-	<-chWait
-	sf.isWork.Сброс()
-	err := sf.db.Close()
-	Провер(err == nil, "kernelStore.close(): in close DB, err=\n\t%v", err)
-	sf.wg.Done(storeStreamName)
-	log.Println("kernelStore.close(): done")
-}

+ 0 - 143
kernel/internal/kernel_store/kernel_store_test.go

@@ -1,143 +0,0 @@
-package kernel_store
-
-import (
-	"os"
-	"testing"
-	"time"
-
-	"wartank/kernel/internal/kernel_ctx"
-	. "wartank/kernel/kernel_types"
-	"wartank/pkg/mock/mock_env"
-)
-
-type tester struct {
-	t   *testing.T
-	me  *mock_env.МокОкружение
-	ctx ИЯдроКонтекст
-	wg  IKernelWg
-}
-
-func TestKernelStore(t *testing.T) {
-	ctx := kernel_ctx.ПолучЯдроКонтекст()
-	sf := &tester{
-		t:   t,
-		me:  mock_env.СделатьОкружение(),
-		ctx: ctx,
-		wg:  ctx.Оп(),
-	}
-	_ = os.Unsetenv("LOCAL_STORE_PATH")
-	_ = os.Setenv("LOCAL_STORE_PATH", "/store/store_kernel")
-	fnClear := func() {
-		pwd := sf.me.Pwd() + "/store/store_kernel"
-		_ = os.RemoveAll(pwd)
-	}
-	fnClear()
-	sf.new()
-	sf.set()
-	sf.get()
-	sf.del()
-	sf.close()
-	sf.workBad1()
-	time.Sleep(time.Second * 2)
-}
-
-// Установка ключа после закрытия хранилища
-func (sf *tester) workBad1() {
-	sf.t.Log("workBad1")
-	err := kernStore.Set("test_key", []byte("test_val"))
-	if err == nil {
-		sf.t.Fatalf("workBad1(): set, err==nil")
-	}
-	_, err = kernStore.Get("test_key")
-	if err == nil {
-		sf.t.Fatalf("workBad1(): get, err==nil")
-	}
-	err = kernStore.Delete("test_key")
-	if err == nil {
-		sf.t.Fatalf("workBad1(): del, err==nil")
-	}
-}
-
-// Удаляет значение
-func (sf *tester) del() {
-	sf.t.Log("del")
-	err := kernStore.Delete("test_key")
-	if err != nil {
-		sf.t.Fatalf("del(): err=%v", err)
-	}
-	_, err = kernStore.Get("test_key")
-	if err == nil {
-		sf.t.Fatalf("del(): err==nil")
-	}
-}
-
-// Получение значения по ключу
-func (sf *tester) get() {
-	sf.t.Log("get")
-	binVal, err := kernStore.Get("test_key")
-	if err != nil {
-		sf.t.Fatalf("get(): err=%v", err)
-	}
-	strVal := string(binVal)
-	if strVal != "test_val" {
-		sf.t.Fatalf("get(): strVal(%v)!='test_val'", strVal)
-	}
-}
-
-// Добавление ключа в хранилище
-func (sf *tester) set() {
-	sf.t.Log("set")
-	err := kernStore.Set("test_key", []byte("test_val"))
-	if err != nil {
-		sf.t.Fatalf("set(): err=%v", err)
-	}
-}
-
-// Закрытие хранилища
-func (sf *tester) close() {
-	sf.t.Log("close")
-	err := sf.wg.Add("123")
-	if err != nil {
-		sf.t.Fatalf("close(): err=%v", err)
-	}
-	sf.ctx.Отменить()
-	time.Sleep(time.Millisecond * 20)
-	go sf.wg.Done("123")
-	sf.wg.Wait()
-	kernStore.close()
-}
-
-// Создаёт новое хранилище ядра
-func (sf *tester) new() {
-	sf.t.Log("new")
-	sf.newBad1()
-	sf.newGood1()
-}
-
-func (sf *tester) newGood1() {
-	sf.t.Log("newGood1")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("newGood1(): panic=%v", _panic)
-		}
-	}()
-	store := GetKernelStore(sf.ctx)
-	if store == nil {
-		sf.t.Fatalf("newGood1(): KernelStore==nil")
-	}
-	store = GetKernelStore(sf.ctx)
-	if store == nil {
-		sf.t.Fatalf("newGood1(): KernelStore==nil")
-	}
-}
-
-// Нет ядра
-func (sf *tester) newBad1() {
-	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = GetKernelStore(nil)
-}

+ 0 - 41
kernel/internal/safe_bool/safe_bool.go

@@ -1,41 +0,0 @@
-// package safe_bool -- потокобезопасный булевый признак
-package safe_bool
-
-import (
-	"sync"
-	. "wartank/kernel/kernel_types"
-)
-
-// безопБул -- потокобезопасный булевый признак
-type безопБул struct {
-	знач bool
-	блок sync.RWMutex
-}
-
-// НовБезопБул -- возвращает новый потокобезопасный булевый признак
-func НовБезопБул_() ИБезопБул {
-	сам := &безопБул{}
-	_ = ИБезопБул(сам)
-	return сам
-}
-
-// Получ -- возвращает хранимый булевый признак
-func (сам *безопБул) Получ() bool {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
-	return сам.знач
-}
-
-// Уст -- устанавливает булевый признак
-func (сам *безопБул) Уст() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = true
-}
-
-// Сброс -- сбрасывает булевый признак
-func (сам *безопБул) Сброс() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = false
-}

+ 0 - 58
kernel/internal/safe_bool/safe_bool_test.go

@@ -1,58 +0,0 @@
-package safe_bool
-
-import (
-	"testing"
-	. "wartank/kernel/kernel_types"
-)
-
-type tester struct {
-	t  *testing.T
-	sb ИБезопБул
-}
-
-func TestSAfeBool(t *testing.T) {
-	sf := &tester{
-		t: t,
-	}
-	sf.create()
-	sf.set()
-	sf.reset()
-}
-
-// Сбрасывает хранимое значение
-func (sf *tester) reset() {
-	sf.t.Log("reset")
-	sf.sb.Сброс()
-	if sf.sb.Получ() {
-		sf.t.Fatalf("reset(): SafeBool==true")
-	}
-	sf.sb.Сброс()
-	if sf.sb.Получ() {
-		sf.t.Fatalf("reset(): SafeBool==true")
-	}
-}
-
-// Установка хранимого значения
-func (sf *tester) set() {
-	sf.t.Log("set")
-	sf.sb.Уст()
-	if !sf.sb.Получ() {
-		sf.t.Fatalf("set(): SafeBool==true")
-	}
-	sf.sb.Уст()
-	if !sf.sb.Получ() {
-		sf.t.Fatalf("set(): SafeBool==true")
-	}
-}
-
-// Создаёт потокобезопасный булевый признак
-func (sf *tester) create() {
-	sf.t.Log("create")
-	sf.sb = НовБезопБул_()
-	if sf.sb == nil {
-		sf.t.Fatalf("create(): SafeBool==nil")
-	}
-	if sf.sb.Получ() {
-		sf.t.Fatalf("create(): SafeBool==true")
-	}
-}

+ 0 - 67
kernel/internal/safe_bool_observer/safe_bool_observer.go

@@ -1,67 +0,0 @@
-// package safe_bool_observer -- безопасное булево значение с наблюдателями
-package safe_bool_observer
-
-import (
-	"sync"
-	. "wartank/kernel/helpers"
-	. "wartank/kernel/kernel_types"
-)
-
-// БезопБулНаблюд -- безопасное булево значение с наблюдателями
-type БезопБулНаблюд struct {
-	знач      bool
-	слвНаблюд map[string]func(bool) // Словарь наблюдателей
-	блок      sync.RWMutex
-}
-
-// НовБезопБулНаблюд -- возвращает новое безопасное булево значение с наблюдателями
-func НовБезопБулНаблюд(ключ string, фнНаблюд func(bool)) ИБезопБулНаблюд {
-	сам := &БезопБулНаблюд{
-		слвНаблюд: map[string]func(bool){},
-	}
-	сам.Зарегать(ключ, фнНаблюд)
-	return сам
-}
-
-// Уст -- устанавливает хранимое значение
-func (сам *БезопБулНаблюд) Уст() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = true
-	for _, фнНаблюд := range сам.слвНаблюд {
-		фнНаблюд(true)
-	}
-}
-
-// Сброс -- сбрасывает хранимое значение
-func (сам *БезопБулНаблюд) Сброс() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = false
-	for _, фнНаблюд := range сам.слвНаблюд {
-		фнНаблюд(false)
-	}
-}
-
-// Получ -- возвращает хранимое значение
-func (сам *БезопБулНаблюд) Получ() bool {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
-	return сам.знач
-}
-
-// Зарегать -- зарегистрировать наблюдателя
-func (сам *БезопБулНаблюд) Зарегать(ключ string, фнНаблюд func(bool)) {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	Паника(ключ == "", "БезопБулНаблюд.Зарегать(): ключ пустой")
-	Паника(фнНаблюд == nil, "БезопБулНаблюд.Зарегать(): фнНаблюд == nil")
-	сам.слвНаблюд[ключ] = фнНаблюд
-}
-
-// Разрегать -- удалить регистрацию наблюдателя
-func (сам *БезопБулНаблюд) Разрегать(ключ string) {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	delete(сам.слвНаблюд, ключ)
-}

+ 0 - 45
kernel/internal/safe_int/safe_int.go

@@ -1,45 +0,0 @@
-package safe_int
-
-import (
-	"sync"
-
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Потокобезопасное целое
-*/
-
-// безопЦелое -- потокобезопасное целое
-type безопЦелое struct {
-	знач int
-	блок sync.RWMutex
-}
-
-// НовБезопЦелое -- возвращает новый *безопЦелое
-func НовБезопЦелое() ИБезопЦелое {
-	сам := &безопЦелое{}
-	_ = ИБезопЦелое(сам)
-	return сам
-}
-
-// Сброс -- сбрасывает в исходное значение
-func (сам *безопЦелое) Сброс() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = 0
-}
-
-// Получ -- возвращает хранимое значение
-func (сам *безопЦелое) Получ() int {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
-	return сам.знач
-}
-
-// Уст -- устанавливает хранимое значение
-func (сам *безопЦелое) Уст(val int) {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = val
-}

+ 0 - 45
kernel/internal/safe_int/safe_int_test.go

@@ -1,45 +0,0 @@
-package safe_int
-
-import (
-	"testing"
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Тест для безопасного целого
-*/
-
-// Тестер для безопасного целого
-type tester struct {
-	t  *testing.T
-	si ИБезопЦелое
-}
-
-func TestSafeInt(t *testing.T) {
-	test := &tester{
-		t: t,
-	}
-	test.create()
-	test.set()
-}
-
-// Установка значения
-func (сам *tester) set() {
-	сам.t.Logf("=set=\n")
-	сам.si.Уст(-8)
-	if val := сам.si.Получ(); val != -8 {
-		сам.t.Errorf("create(): val(%d)!=-8\n", val)
-	}
-}
-
-// Создание целого
-func (сам *tester) create() {
-	сам.t.Logf("=create=\n")
-	сам.si = НовБезопЦелое()
-	if сам.si == nil {
-		сам.t.Errorf("create(): safeInt==nil\n")
-	}
-	if val := сам.si.Получ(); val != 0 {
-		сам.t.Errorf("create(): val(%d)!=0\n", val)
-	}
-}

+ 0 - 44
kernel/internal/safe_string/safe_string.go

@@ -1,44 +0,0 @@
-package safe_string
-
-import (
-	"sync"
-
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Потокобезопасная строка
-*/
-
-// безопСтрока -- потокобезопасная строка
-type безопСтрока struct {
-	знач string
-	блок sync.RWMutex
-}
-
-// НовБезопСтрока -- возвращает новый *SafeString
-func НовБезопСтрока() ИБезопСтрока {
-	сам := &безопСтрока{}
-	return сам
-}
-
-// Сброс -- сбрасывает в исходное значение
-func (сам *безопСтрока) Сброс() {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = ""
-}
-
-// Получ -- возвращает хранимое значение
-func (сам *безопСтрока) Получ() string {
-	сам.блок.RLock()
-	defer сам.блок.RUnlock()
-	return сам.знач
-}
-
-// Уст -- устанавливает хранимое значение
-func (сам *безопСтрока) Уст(знач string) {
-	сам.блок.Lock()
-	defer сам.блок.Unlock()
-	сам.знач = знач
-}

+ 0 - 46
kernel/internal/safe_string/safe_string_test.go

@@ -1,46 +0,0 @@
-package safe_string
-
-import (
-	"testing"
-
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Тест для безопасной строки
-*/
-
-// Тестер для безопасной строки
-type tester struct {
-	t  *testing.T
-	si ИБезопСтрока
-}
-
-func TestSafeString(t *testing.T) {
-	test := &tester{
-		t: t,
-	}
-	test.create()
-	test.set()
-}
-
-// Установка значения
-func (сам *tester) set() {
-	сам.t.Logf("=set=\n")
-	сам.si.Уст("test_str")
-	if val := сам.si.Получ(); val != "test_str" {
-		сам.t.Errorf("create(): val(%s)!='test_str'\n", val)
-	}
-}
-
-// Создание целого
-func (сам *tester) create() {
-	сам.t.Logf("=create=\n")
-	сам.si = НовБезопСтрока()
-	if сам.si == nil {
-		сам.t.Errorf("create(): safeString==nil\n")
-	}
-	if val := сам.si.Получ(); val != "" {
-		сам.t.Errorf("create(): val(%s)!=``\n", val)
-	}
-}

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels