Parcourir la source

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

SVI il y a 1 an
Parent
commit
b4070fd715
100 fichiers modifiés avec 1387 ajouts et 226 suppressions
  1. 1 0
      .gitignore
  2. 12 0
      Makefile
  3. 1 1
      app/lev0/types/iapp.go
  4. 3 3
      app/lev1/arena/arena.go
  5. 39 37
      app/lev1/arena/arena_angar/arena_angar.go
  6. 2 2
      app/lev1/arena/arena_angar/base/arsenal/arsenal.go
  7. 3 3
      app/lev1/arena/arena_angar/base/bank/bank.go
  8. 1 1
      app/lev1/arena/arena_angar/base/bank/bank_mode/bank_mode.go
  9. 8 8
      app/lev1/arena/arena_angar/base/base.go
  10. 2 2
      app/lev1/arena/arena_angar/base/fuel/fuel.go
  11. 0 0
      app/lev1/arena/arena_angar/base/labor/labor.go
  12. 2 2
      app/lev1/arena/arena_angar/base/market/market.go
  13. 2 2
      app/lev1/arena/arena_angar/base/mine/mine.go
  14. 2 2
      app/lev1/arena/arena_angar/base/polygon/polygon.go
  15. 4 4
      app/lev1/arena/arena_angar/battle/battle.go
  16. 0 0
      app/lev1/arena/arena_angar/battle/battle_net/battle_net.go
  17. 1 1
      app/lev1/arena/arena_angar/battle/battle_register/battle_register.go
  18. 1 1
      app/lev1/arena/arena_angar/battle/battle_wait/battle_wait.go
  19. 4 4
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker.go
  20. 1 1
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_sound/battle_sound.go
  21. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play/is_sound_play.go
  22. 5 5
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_worker.go
  23. 1 1
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battlesound/battlesound.go
  24. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/health.go
  25. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/healthtime/healthtime.go
  26. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/isrepair/isrepair.go
  27. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/repair_time/repair_time.go
  28. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/manevr/is_manevr/is_manevr.go
  29. 2 2
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/manevr/manevr.go
  30. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/damage/damage.go
  31. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/is_shot/is_shot.go
  32. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/shot.go
  33. 0 0
      app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shottime/shottime.go
  34. 5 5
      app/lev1/arena/arena_angar/battle/battle_worker/battleon/battleon.go
  35. 0 0
      app/lev1/arena/arena_angar/battle/isrun/isrun.go
  36. 0 0
      app/lev1/arena/arena_angar/bot_net_stat/net_stat.go
  37. 2 2
      app/lev1/arena/arena_angar/convoy/convoy.go
  38. 4 4
      app/lev1/arena/arena_angar/death_match/battle.go
  39. 1 1
      app/lev1/arena/arena_angar/death_match/battle_wait/battle_wait.go
  40. 0 0
      app/lev1/arena/arena_angar/death_match/death_net/death_net.go
  41. 1 1
      app/lev1/arena/arena_angar/death_match/death_register/death_register.go
  42. 1 1
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/battle_sound/battle_sound.go
  43. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/battle_sound/is_play/is_play.go
  44. 1 1
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/battlesound/battlesound.go
  45. 5 5
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/death_on.go
  46. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/health.go
  47. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/healthtime/healthtime.go
  48. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/isrepair/isrepair.go
  49. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/repairtime/repairtime.go
  50. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/manevr/ismanevr/ismanevr.go
  51. 2 2
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/manevr/manevr.go
  52. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/damage/damage.go
  53. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/is_shot/is_shot.go
  54. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/shot.go
  55. 0 0
      app/lev1/arena/arena_angar/death_match/death_worker/death_on/shottime/shottime.go
  56. 4 4
      app/lev1/arena/arena_angar/death_match/death_worker/death_worker.go
  57. 0 0
      app/lev1/arena/arena_angar/death_match/isrun/isrun.go
  58. 5 5
      app/lev1/arena/arena_angar/division/div_war/div_war.go
  59. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_net/div_war_net.go
  60. 4 4
      app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_on.go
  61. 1 1
      app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_sound/div_war_sound.go
  62. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_sound/isplay/isplay.go
  63. 1 1
      app/lev1/arena/arena_angar/division/div_war/div_war_on/divwarsound/divwarsound.go
  64. 2 2
      app/lev1/arena/arena_angar/division/div_war/div_war_on/health/health.go
  65. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/health/health_time/health_time.go
  66. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/health/repair_time/repair_time.go
  67. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/manevr/is_manevr/ismanevr.go
  68. 2 2
      app/lev1/arena/arena_angar/division/div_war/div_war_on/manevr/manevr.go
  69. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/shot/damage/damage.go
  70. 2 2
      app/lev1/arena/arena_angar/division/div_war/div_war_on/shot/shot.go
  71. 0 0
      app/lev1/arena/arena_angar/division/div_war/div_war_on/shot_time/shot_time.go
  72. 4 4
      app/lev1/arena/arena_angar/division/div_war/divwaron/divwaron.go
  73. 0 0
      app/lev1/arena/arena_angar/division/division.go
  74. 4 4
      app/lev1/arena/arena_angar/division/divwar/div_war_on/div_war_on.go
  75. 5 5
      app/lev1/arena/arena_angar/division/divwar/divwar.go
  76. 0 0
      app/lev1/arena/arena_angar/division/divwar/divwarnet/divwarnet.go
  77. 4 4
      app/lev1/arena/arena_angar/division/divwar/divwaron/divwaron.go
  78. 1 1
      app/lev1/arena/arena_angar/fuel/fuel.go
  79. 1 1
      app/lev1/arena/arena_angar/fuel_attack/fuel_attack.go
  80. 1 1
      app/lev1/arena/arena_angar/masters/bat_masters.go
  81. 1 1
      app/lev1/arena/arena_angar/missions/missions.go
  82. 13 11
      app/lev1/arena/arena_angar/tank_params/tank_params.go
  83. 1 1
      app/lev1/arena/arena_context/arena_context.go
  84. 0 0
      app/lev1/arena/arena_context/arena_state/arena_state.go
  85. 0 0
      app/lev1/arena/arena_string/arena_string.go
  86. 0 0
      app/lev1/arena/down_time/down_time.go
  87. 39 40
      app/lev2/bot/bot.go
  88. 0 0
      app/lev2/bot/bot_stat/stat_param/stat_param.go
  89. 2 2
      app/lev2/bot/bot_stat/stat_resurs/stat_resurs.go
  90. 1 1
      app/lev2/bot/bot_stat/tank_stat/tank_stat.go
  91. 0 0
      app/lev2/bot/warbot_config/warbot_config.go
  92. 68 0
      app/lev2/bot/warbot_net/bot_cookie/bot_cookie.go
  93. 46 0
      app/lev2/bot/warbot_net/bot_http_conn/bot_http_conn.go
  94. 0 0
      app/lev2/bot/warbot_net/bot_net_conn.zip
  95. 16 15
      app/lev2/bot/warbot_net/bot_net_login/bot_net_login.go
  96. 0 0
      app/lev2/bot/warbot_net/bot_web_conn.zip
  97. 12 10
      app/lev2/bot/warbot_net/warbot_net.go
  98. 666 0
      app/lev2/farm_bots/bot/angar/base/arsenal/arsenal.go
  99. 324 0
      app/lev2/farm_bots/bot/angar/base/bank/bank.go
  100. 38 0
      app/lev2/farm_bots/bot/angar/base/bank/bank_mode/bank_mode.go

+ 1 - 0
.gitignore

@@ -16,3 +16,4 @@ tmp.tex
 cover.out
 bin_dev
 sqlite
+graph.svg

+ 12 - 0
Makefile

@@ -57,3 +57,15 @@ lint:
 	golangci-lint run ./cmd/server/...
 	golangci-lint run ./pkg/...
 	golangci-lint run ./server/...
+.PHONY: graph
+graph:
+	# #go install github.com/kisielk/godepgraph@latest
+	# #go mod graph | modgraphviz | dot -Tsvg -o graph.svg
+	# godepgraph ./cmd/server | dot -Tsvg -o graph.svg
+	clear
+	go fmt ./...
+	# http://localhost:7878/
+	# go-callvis ./...
+	#
+	#
+	godepgraph ./cmd/server | dot -Tsvg -o graph.svg

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

@@ -10,7 +10,7 @@ import "wartank/pkg/kernel/kernel_types"
 type ИПриложение interface {
 	kernel_types.ИЯдроКонтекст
 	// Пуск -- запускает приложение в работу
-	Пуск() error
+	Пуск()
 	// ServBots -- словарь имеющихся ботов
 	ServBots() ИБотоФерма
 	// Стат -- возвращает статистику сервера

+ 3 - 3
pkg/arena/arena.go → app/lev1/arena/arena.go

@@ -6,10 +6,10 @@ import (
 	"log"
 	"sync"
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena/arena_context"
+	"wartank/app/lev1/arena/arena_string"
+	"wartank/app/lev1/arena/down_time"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena/arena_context"
-	"wartank/pkg/arena/arena_string"
-	"wartank/pkg/arena/down_time"
 	. "wartank/pkg/helpers"
 )
 

+ 39 - 37
app/lev2/farm_bots/warbot/angar/angar.go → app/lev1/arena/arena_angar/arena_angar.go

@@ -1,4 +1,4 @@
-package angar
+package arena_angar
 
 import (
 	"fmt"
@@ -8,18 +8,18 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/base"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle"
-	"wartank/app/lev2/farm_bots/warbot/angar/bot_net_stat"
-	"wartank/app/lev2/farm_bots/warbot/angar/convoy"
-	"wartank/app/lev2/farm_bots/warbot/angar/fuel_attack"
-	"wartank/app/lev2/farm_bots/warbot/angar/masters"
-	"wartank/app/lev2/farm_bots/warbot/angar/missions"
-	"wartank/app/lev2/farm_bots/warbot/angar/tank_params"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_resurs"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/base"
+	"wartank/app/lev2/bot/arena_angar/battle"
+	"wartank/app/lev2/bot/arena_angar/bot_net_stat"
+	"wartank/app/lev2/bot/arena_angar/convoy"
+	"wartank/app/lev2/bot/arena_angar/fuel_attack"
+	"wartank/app/lev2/bot/arena_angar/masters"
+	"wartank/app/lev2/bot/arena_angar/missions"
+	"wartank/app/lev2/bot/arena_angar/tank_params"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
+	"wartank/app/lev2/bot/bot_stat/stat_resurs"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 
@@ -28,10 +28,11 @@ import (
 */
 
 // Ангар -- ангар для танка
-type Ангар struct {
+type АренаАнгар struct {
 	ИАрена
-	сеть ИАренаСеть
-	бот  ИБот
+	прилож ИПриложение
+	сеть   ИАренаСеть
+	бот    ИБот
 
 	уровень  ИСтатПарам
 	progress ИСтатПарам
@@ -47,9 +48,10 @@ type Ангар struct {
 }
 
 // НовАнгар -- возвращает новый *Angar
-func НовАнгар(конт ИБотКонтекст, бот ИБот) (*Ангар, error) {
-	танкПарам := tank_params.НовТанкПараметры(бот)
-	сам := &Ангар{
+func НовАнгар(конт ИБотКонтекст) (*АренаАнгар, error) {
+	танкПарам := tank_params.НовТанкПараметры(конт)
+	бот := конт.Получ("бот").(ИБот)
+	сам := &АренаАнгар{
 		бот:           бот,
 		уровень:       stat_param.НовСтатПарам("уровень"),
 		progress:      stat_param.НовСтатПарам("прогресс"),
@@ -99,7 +101,7 @@ func НовАнгар(конт ИБотКонтекст, бот ИБот) (*Ан
 }
 
 // Обновить -- обновить ангар принудительно
-func (сам *Ангар) Обновить() {
+func (сам *АренаАнгар) Обновить() {
 	сам.РесурсыОбновить()
 	сам.сетьТанкСтат.Update()
 	сам.словАрена["конвой"].Пуск()
@@ -107,7 +109,7 @@ func (сам *Ангар) Обновить() {
 }
 
 // Запускает обработку ангара
-func (сам *Ангар) пуск() {
+func (сам *АренаАнгар) пуск() {
 	{ // Запуск компонентов
 		сам.танкПарам.Пуск()
 		go сам.ресурсы.Топливо().Run()
@@ -129,12 +131,12 @@ func (сам *Ангар) пуск() {
 		ош := сам.ОбратВремяУст("01")
 		if ош != nil {
 			log.Printf("Ангар.Run(): in update ICountTime, ош=\n\t%v\n", ош)
-			сам.бот.Сервер().Отменить()
+			сам.прилож.Отменить()
 			return
 		}
 		for {
 			select {
-			case <-сам.бот.Контекст().Done(): // Отмена контекста
+			case <-сам.прилож.Конт().Done(): // Отмена контекста
 				return
 			case <-сам.ВремяОстат().КаналСиг(): // Метка времени
 				if !фнЦикл() {
@@ -151,64 +153,64 @@ func (сам *Ангар) пуск() {
 }
 
 // Обновляет ресурсы ангара
-func (сам *Ангар) РесурсыОбновить() {
+func (сам *АренаАнгар) РесурсыОбновить() {
 	сам.сеть.Обновить()
 	сам.золотоНайти()
 	сам.сереброНайти()
 }
 
 // IMissions -- возвращает ссылку на объект миссий
-func (сам *Ангар) Миссии() ИМиссии {
+func (сам *АренаАнгар) Миссии() ИМиссии {
 	return сам.словАрена["миссии"].(ИМиссии)
 }
 
 // Сражение -- возвращает объект сражения
-func (сам *Ангар) Сражение() ИСражениеСцена {
+func (сам *АренаАнгар) Сражение() ИСражениеСцена {
 	return сам.словАрена["сражение"].(ИСражениеСцена)
 }
 
 // Конвой -- возвращает объект конвоя
-func (сам *Ангар) Конвой() ИАренаКонвой {
+func (сам *АренаАнгар) Конвой() ИАренаКонвой {
 	return сам.словАрена["конвой"].(ИАренаКонвой)
 }
 
 // Золото -- возвращает объект золота
-func (сам *Ангар) Золото() ИСтатПарам {
+func (сам *АренаАнгар) Золото() ИСтатПарам {
 	return сам.ресурсы.Золото()
 }
 
 // Топливо -- возвращает объект топлива
-func (сам *Ангар) Топливо() ИСтатПарам {
+func (сам *АренаАнгар) Топливо() ИСтатПарам {
 	return сам.ресурсы.Топливо().Fuel()
 }
 
 // Уровень -- возвращает объект уровня игрока
-func (сам *Ангар) Уровень() ИСтатПарам {
+func (сам *АренаАнгар) Уровень() ИСтатПарам {
 	return сам.уровень
 }
 
 // Прогресс -- возвращает прогресс уровня игрока
-func (сам *Ангар) Прогресс() ИСтатПарам {
+func (сам *АренаАнгар) Прогресс() ИСтатПарам {
 	return сам.progress
 }
 
 // ИгрокиОнлайн -- возвращает количество игроков онлайн
-func (сам *Ангар) ИгрокиОнлайн() ИСтатПарам {
+func (сам *АренаАнгар) ИгрокиОнлайн() ИСтатПарам {
 	return сам.игроковОнлайн
 }
 
 // СереброВсего -- возвращает объект всего серебра в ангаре
-func (сам *Ангар) СереброВсего() ИСтатПарам {
+func (сам *АренаАнгар) СереброВсего() ИСтатПарам {
 	return сам.ресурсы.СереброВсего()
 }
 
 // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре
-func (сам *Ангар) СереброЗаработаноСессия() ИСтатПарам {
+func (сам *АренаАнгар) СереброЗаработаноСессия() ИСтатПарам {
 	return сам.silverOnline
 }
 
 // СереброОбновить -- на основе фактического серебра -- обновляет выработанное серебро
-func (сам *Ангар) СереброОбновить(silverFact int) {
+func (сам *АренаАнгар) СереброОбновить(silverFact int) {
 	if сам.СереброВсего().Получ() == 0 { // Если запуск
 		сам.СереброВсего().Уст(silverFact)
 		return
@@ -226,7 +228,7 @@ func (сам *Ангар) СереброОбновить(silverFact int) {
 }
 
 // База -- возвращает базу
-func (сам *Ангар) База() ИБаза {
+func (сам *АренаАнгар) База() ИБаза {
 	return сам.словАрена["база"].(ИБаза)
 }
 
@@ -254,7 +256,7 @@ func (сам *Ангар) конвойПроверить() {
 */
 
 // Ищет в теле текста ангара серебро
-func (сам *Ангар) сереброНайти() {
+func (сам *АренаАнгар) сереброНайти() {
 	// _mt.Println("\tAngarNet.findSilver()")
 	lstAngar := сам.СписПолучить()
 	var strOut string
@@ -276,7 +278,7 @@ func (сам *Ангар) сереброНайти() {
 }
 
 // Ищет в теле текста ангара золото
-func (сам *Ангар) золотоНайти() {
+func (сам *АренаАнгар) золотоНайти() {
 	var (
 		lstAngar    = сам.бот.Ангар().СписПолучить()
 		strOut      string

+ 2 - 2
app/lev2/farm_bots/warbot/angar/base/arsenal/arsenal.go → app/lev1/arena/arena_angar/base/arsenal/arsenal.go

@@ -10,8 +10,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/components/arena_net"
 	"wartank/pkg/components/web_log"
 	"wartank/pkg/kernel/kernel_log"

+ 3 - 3
app/lev2/farm_bots/warbot/angar/base/bank/bank.go → app/lev1/arena/arena_angar/base/bank/bank.go

@@ -8,10 +8,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/bank/bank_mode"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/base/bank/bank_mode"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 1 - 1
app/lev2/farm_bots/warbot/angar/base/bank/bank_mode/bank_mode.go → app/lev1/arena/arena_angar/base/bank/bank_mode/bank_mode.go

@@ -2,7 +2,7 @@ package bank_mode
 
 import (
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 )
 
 /*

+ 8 - 8
app/lev2/farm_bots/warbot/angar/base/base.go → app/lev1/arena/arena_angar/base/base.go

@@ -10,15 +10,15 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/arsenal"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/bank"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/fuel"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/labor"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/market"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/mine"
-	"wartank/app/lev2/farm_bots/warbot/angar/base/polygon"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/base/arsenal"
+	"wartank/app/lev2/bot/arena_angar/base/bank"
+	"wartank/app/lev2/bot/arena_angar/base/fuel"
+	"wartank/app/lev2/bot/arena_angar/base/labor"
+	"wartank/app/lev2/bot/arena_angar/base/market"
+	"wartank/app/lev2/bot/arena_angar/base/mine"
+	"wartank/app/lev2/bot/arena_angar/base/polygon"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 	"wartank/pkg/cons"
 )

+ 2 - 2
app/lev2/farm_bots/warbot/angar/base/fuel/fuel.go → app/lev1/arena/arena_angar/base/fuel/fuel.go

@@ -9,8 +9,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/components/arena_net"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/base/labor/labor.go → app/lev1/arena/arena_angar/base/labor/labor.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/base/market/market.go → app/lev1/arena/arena_angar/base/market/market.go

@@ -8,9 +8,9 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 2 - 2
app/lev2/farm_bots/warbot/angar/base/mine/mine.go → app/lev1/arena/arena_angar/base/mine/mine.go

@@ -9,9 +9,9 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 2 - 2
app/lev2/farm_bots/warbot/angar/base/polygon/polygon.go → app/lev1/arena/arena_angar/base/polygon/polygon.go

@@ -7,9 +7,9 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 	"wartank/pkg/cons"
 	"wartank/pkg/kernel/kernel_log"

+ 4 - 4
app/lev2/farm_bots/warbot/angar/battle/battle.go → app/lev1/arena/arena_angar/battle/battle.go

@@ -5,10 +5,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_register"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_wait"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_register"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_wait"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker"
 )
 
 // Сражение -- объект сражения

+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_net/battle_net.go → app/lev1/arena/arena_angar/battle/battle_net/battle_net.go


+ 1 - 1
app/lev2/farm_bots/warbot/angar/battle/battle_register/battle_register.go → app/lev1/arena/arena_angar/battle/battle_register/battle_register.go

@@ -7,7 +7,7 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 1 - 1
app/lev2/farm_bots/warbot/angar/battle/battle_wait/battle_wait.go → app/lev1/arena/arena_angar/battle/battle_wait/battle_wait.go

@@ -6,8 +6,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 4 - 4
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker.go

@@ -5,10 +5,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/components/arena_net"
 )
 

+ 1 - 1
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/battle_sound.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_sound/battle_sound.go

@@ -2,7 +2,7 @@ package battle_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play/is_sound_play.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play/is_sound_play.go


+ 5 - 5
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_worker.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battle_worker.go

@@ -5,11 +5,11 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot/is_shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/health"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/manevr"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/shot"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/shot/is_shot"
 	"wartank/pkg/components/arena_net"
 )
 

+ 1 - 1
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battlesound/battlesound.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/battlesound/battlesound.go

@@ -2,7 +2,7 @@ package battle_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/health.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/health.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/healthtime/healthtime.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/healthtime/healthtime.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/isrepair/isrepair.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/isrepair/isrepair.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/repair_time/repair_time.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/health/repair_time/repair_time.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr/is_manevr/is_manevr.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/manevr/is_manevr/is_manevr.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr/manevr.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/manevr/manevr.go

@@ -5,8 +5,8 @@ import (
 	"log"
 	"strings"
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/repair_time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr/is_manevr"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/health/repair_time"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/manevr/is_manevr"
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot/damage/damage.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/damage/damage.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot/is_shot/is_shot.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/is_shot/is_shot.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot/shot.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shot/shot.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shottime/shottime.go → app/lev1/arena/arena_angar/battle/battle_worker/battle_worker/shottime/shottime.go


+ 5 - 5
app/lev2/farm_bots/warbot/angar/battle/battle_worker/battleon/battleon.go → app/lev1/arena/arena_angar/battle/battle_worker/battleon/battleon.go

@@ -5,11 +5,11 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/shot/is_shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/health"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/manevr"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/shot"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/shot/is_shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/battle/isrun/isrun.go → app/lev1/arena/arena_angar/battle/isrun/isrun.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/bot_net_stat/net_stat.go → app/lev1/arena/arena_angar/bot_net_stat/net_stat.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/convoy/convoy.go → app/lev1/arena/arena_angar/convoy/convoy.go

@@ -8,9 +8,9 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 4 - 4
app/lev2/farm_bots/warbot/angar/death_match/battle.go → app/lev1/arena/arena_angar/death_match/battle.go

@@ -5,10 +5,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_register"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_wait"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_register"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_wait"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev2/farm_bots/warbot/angar/death_match/battle_wait/battle_wait.go → app/lev1/arena/arena_angar/death_match/battle_wait/battle_wait.go

@@ -6,8 +6,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_net/death_net.go → app/lev1/arena/arena_angar/death_match/death_net/death_net.go


+ 1 - 1
app/lev2/farm_bots/warbot/angar/death_match/death_register/death_register.go → app/lev1/arena/arena_angar/death_match/death_register/death_register.go

@@ -7,7 +7,7 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 1 - 1
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/battle_sound/battle_sound.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/battle_sound/battle_sound.go

@@ -2,7 +2,7 @@ package battle_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/battle_sound/is_play/is_play.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/battle_sound/is_play/is_play.go


+ 1 - 1
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/battlesound/battlesound.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/battlesound/battlesound.go

@@ -2,7 +2,7 @@ package battle_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 5 - 5
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/death_on.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/death_on.go

@@ -5,11 +5,11 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shot"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shot/is_shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on/health"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on/manevr"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on/shot"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on/shot/is_shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/health/health.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/health.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/health/healthtime/healthtime.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/healthtime/healthtime.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/health/isrepair/isrepair.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/isrepair/isrepair.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/health/repairtime/repairtime.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/health/repairtime/repairtime.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/manevr/ismanevr/ismanevr.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/manevr/ismanevr/ismanevr.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/manevr/manevr.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/manevr/manevr.go

@@ -8,8 +8,8 @@ import (
 
 	"github.com/sirupsen/logrus"
 
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/health/repair_time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/manevr/is_manevr"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/health/repair_time"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/manevr/is_manevr"
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shot/damage/damage.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/damage/damage.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shot/is_shot/is_shot.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/is_shot/is_shot.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shot/shot.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/shot/shot.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/shottime/shottime.go → app/lev1/arena/arena_angar/death_match/death_worker/death_on/shottime/shottime.go


+ 4 - 4
app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_worker.go → app/lev1/arena/arena_angar/death_match/death_worker/death_worker.go

@@ -5,10 +5,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on"
-	"wartank/app/lev2/farm_bots/warbot/angar/death_match/death_worker/death_on/battle_sound"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on"
+	"wartank/app/lev2/bot/arena_angar/death_match/death_worker/death_on/battle_sound"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 0 - 0
app/lev2/farm_bots/warbot/angar/death_match/isrun/isrun.go → app/lev1/arena/arena_angar/death_match/isrun/isrun.go


+ 5 - 5
app/lev2/farm_bots/warbot/angar/division/div_war/div_war.go → app/lev1/arena/arena_angar/division/div_war/div_war.go

@@ -8,12 +8,12 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_net"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/div_war_sound"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_net"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/div_war_sound"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_net/div_war_net.go → app/lev1/arena/arena_angar/division/div_war/div_war_net/div_war_net.go


+ 4 - 4
app/lev2/farm_bots/warbot/angar/division/divwar/div_war_on/div_war_on.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_on.go

@@ -7,10 +7,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/health"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/manevr"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_bool"

+ 1 - 1
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/div_war_sound/div_war_sound.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_sound/div_war_sound.go

@@ -2,7 +2,7 @@ package div_war_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/div_war_sound/isplay/isplay.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/div_war_sound/isplay/isplay.go


+ 1 - 1
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/divwarsound/divwarsound.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/divwarsound/divwarsound.go

@@ -2,7 +2,7 @@ package div_war_sound
 
 import (
 	"time"
-	"wartank/app/lev2/farm_bots/warbot/angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
+	"wartank/app/lev2/bot/arena_angar/battle/battle_worker/battle_worker/battle_sound/is_sound_play"
 	"wartank/pkg/components/sound"
 )
 

+ 2 - 2
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/health.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/health/health.go

@@ -8,8 +8,8 @@ import (
 	"strings"
 	"time"
 
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/health_time"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/repair_time"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/health/health_time"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/health/repair_time"
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"
 	"wartank/pkg/kernel/safe_bool"

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/health_time/health_time.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/health/health_time/health_time.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/repair_time/repair_time.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/health/repair_time/repair_time.go


+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr/is_manevr/ismanevr.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/manevr/is_manevr/ismanevr.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr/manevr.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/manevr/manevr.go

@@ -10,8 +10,8 @@ import (
 
 	"github.com/sirupsen/logrus"
 
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health/repair_time"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr/is_manevr"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/health/repair_time"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/manevr/is_manevr"
 
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot/damage/damage.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/shot/damage/damage.go


+ 2 - 2
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot/shot.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/shot/shot.go

@@ -8,8 +8,8 @@ import (
 	"strings"
 	"time"
 
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot/damage"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot_time"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/shot/damage"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/shot_time"
 	// "wartank/internal/components/sound"
 	. "wartank/app/lev0/types"
 	"wartank/pkg/alias"

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot_time/shot_time.go → app/lev1/arena/arena_angar/division/div_war/div_war_on/shot_time/shot_time.go


+ 4 - 4
app/lev2/farm_bots/warbot/angar/division/divwar/divwaron/divwaron.go → app/lev1/arena/arena_angar/division/div_war/divwaron/divwaron.go

@@ -7,10 +7,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/health"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/manevr"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_bool"

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/division.go → app/lev1/arena/arena_angar/division/division.go


+ 4 - 4
app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/div_war_on.go → app/lev1/arena/arena_angar/division/divwar/div_war_on/div_war_on.go

@@ -7,10 +7,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/health"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/manevr"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_bool"

+ 5 - 5
app/lev2/farm_bots/warbot/angar/division/divwar/divwar.go → app/lev1/arena/arena_angar/division/divwar/divwar.go

@@ -8,12 +8,12 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_net"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/div_war_sound"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_net"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on"
+	"wartank/app/lev2/bot/arena_angar/division/div_war/div_war_on/div_war_sound"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 0 - 0
app/lev2/farm_bots/warbot/angar/division/divwar/divwarnet/divwarnet.go → app/lev1/arena/arena_angar/division/divwar/divwarnet/divwarnet.go


+ 4 - 4
app/lev2/farm_bots/warbot/angar/division/div_war/divwaron/divwaron.go → app/lev1/arena/arena_angar/division/divwar/divwaron/divwaron.go

@@ -7,10 +7,10 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/health"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/manevr"
-	"wartank/app/lev2/farm_bots/warbot/angar/division/div_war/div_war_on/shot"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/health"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/manevr"
+	"wartank/app/lev2/farm_bots/bot/angar/division/div_war/div_war_on/shot"
 	"wartank/pkg/components/arena_net"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_bool"

+ 1 - 1
app/lev2/farm_bots/warbot/angar/fuel/fuel.go → app/lev1/arena/arena_angar/fuel/fuel.go

@@ -9,7 +9,7 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 )
 
 // Топливо -- топливо в баке, +1 каждые 15 сек

+ 1 - 1
app/lev2/farm_bots/warbot/angar/fuel_attack/fuel_attack.go → app/lev1/arena/arena_angar/fuel_attack/fuel_attack.go

@@ -9,7 +9,7 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/components/arena_net"
 	"wartank/pkg/cons"
 )

+ 1 - 1
app/lev2/farm_bots/warbot/angar/masters/bat_masters.go → app/lev1/arena/arena_angar/masters/bat_masters.go

@@ -6,8 +6,8 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena"
 	"wartank/pkg/components/arena_net"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"

+ 1 - 1
app/lev2/farm_bots/warbot/angar/missions/missions.go → app/lev1/arena/arena_angar/missions/missions.go

@@ -5,7 +5,7 @@ import (
 	"time"
 
 	. "wartank/app/lev0/types"
-	"wartank/pkg/arena"
+	"wartank/app/lev1/arena"
 	"wartank/pkg/components/arena_net"
 )
 

+ 13 - 11
app/lev2/farm_bots/warbot/angar/tank_params/tank_params.go → app/lev1/arena/arena_angar/tank_params/tank_params.go

@@ -15,19 +15,21 @@ import (
 
 // ТанкПараметры -- параметры танка повышение
 type ТанкПараметры struct {
-	бот   ИБот
-	номер string // Номер танка в игре
-	лог   ИЯдроЛог
+	конт   ИБотКонтекст
+	прилож ИПриложение
+	номер  string // Номер танка в игре
+	лог    ИЯдроЛог
 }
 
 // НовТанкПараметры -- возвращает новые параметры танка
-func НовТанкПараметры(бот ИБот) *ТанкПараметры {
+func НовТанкПараметры(конт ИБотКонтекст) *ТанкПараметры {
 	лог := kernel_log.НовЛоггер("ТанкПараметры")
 	лог.Инфо("НовТанкПараметры()\n")
-	лог.Паника(бот == nil, "НовТанкПараметры(): ИБот == nil")
+
 	сам := &ТанкПараметры{
-		бот: бот,
-		лог: лог,
+		конт:   конт,
+		прилож: конт.Получ("прилож").(ИПриложение),
+		лог:    лог,
 	}
 	return сам
 }
@@ -43,12 +45,12 @@ func (сам *ТанкПараметры) пуск() {
 	ош := сам.номерПолуч()
 	if ош != nil {
 		log.Printf("ТанкПараметры.пуск(): при получении параметров танка, ош=\n\t%v\n", ош)
-		сам.бот.Сервер().Отменить()
+		сам.прилож.Отменить()
 		return
 	}
 	for {
 		select {
-		case <-сам.бот.Контекст().Done():
+		case <-сам.прилож.Конт().Done():
 			return
 		default:
 			сам.работать()
@@ -65,7 +67,7 @@ func (сам *ТанкПараметры) работать() {
 // Улучшает параметры танка
 func (сам *ТанкПараметры) улучшить() {
 	// https://wartank.ru/pimp/34479487
-	клиент := сам.бот.Сеть().ВебВоркер()
+	клиент := сам.конт.Получ("хттпВоркер").(ИХттпВоркер)
 	фнУлучшить := func() bool {
 		лстСтр := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
 		var (
@@ -99,7 +101,7 @@ func (сам *ТанкПараметры) улучшить() {
 
 // Получает собственный номер танка с сервера
 func (сам *ТанкПараметры) номерПолуч() error {
-	клиент := сам.бот.Сеть().ВебВоркер()
+	клиент := сам.конт.Получ("хттпВоркер").(ИХттпВоркер)
 	лстСтр := клиент.Получ("https://wartank.ru/angar")
 	var (
 		стрНомер  string

+ 1 - 1
pkg/arena/arena_context/arena_context.go → app/lev1/arena/arena_context/arena_context.go

@@ -5,8 +5,8 @@ import (
 	"context"
 
 	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena/arena_context/arena_state"
 	"wartank/pkg/alias"
-	"wartank/pkg/arena/arena_context/arena_state"
 	"wartank/pkg/components/web_log"
 	. "wartank/pkg/helpers"
 	"wartank/pkg/kernel/kernel_log"

+ 0 - 0
pkg/arena/arena_context/arena_state/arena_state.go → app/lev1/arena/arena_context/arena_state/arena_state.go


+ 0 - 0
pkg/arena/arena_string/arena_string.go → app/lev1/arena/arena_string/arena_string.go


+ 0 - 0
pkg/arena/down_time/down_time.go → app/lev1/arena/down_time/down_time.go


+ 39 - 40
app/lev2/farm_bots/warbot/warbot.go → app/lev2/bot/bot.go

@@ -1,5 +1,5 @@
-// package warbot -- бот для игры в wartank
-package warbot
+// package bot -- бот для игры в wartank
+package bot
 
 import (
 	"context"
@@ -10,10 +10,10 @@ import (
 
 	. "wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/tank_stat"
-	"wartank/app/lev2/farm_bots/warbot/warbot_config"
-	"wartank/app/lev2/farm_bots/warbot/warbot_net"
+	"wartank/app/lev2/bot/arena_angar"
+	"wartank/app/lev2/bot/bot_stat/tank_stat"
+	"wartank/app/lev2/bot/warbot_config"
+	"wartank/app/lev2/bot/warbot_net"
 	"wartank/pkg/kernel/kernel_dict"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
@@ -21,9 +21,9 @@ import (
 )
 
 // ВарБот -- бот для игры в вартанк
-type ВарБот struct {
+type Бот struct {
 	прилож         ИПриложение
-	store          IKernelStore
+	хран           ИЯдроХранилище
 	стата          ИТанкСтат
 	errFinal       error // Финальная ошибка работы, если была
 	ангар          ИАнгар
@@ -38,15 +38,14 @@ type ВарБот struct {
 }
 
 // ЗагрузитьВарБот -- загружает бота из базы
-func ЗагрузитьВарБот(конт ИЯдроКонтекст, сервер ИПриложение, номер АБотНомер) *ВарБот {
+func ЗагрузитьВарБот(конт ИЯдроКонтекст, номер АБотНомер) *Бот {
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог.Инфо("ЗагрузитьВарБот()\n")
-	лог.Паника(сервер == nil, "ЗагрузитьВарБот(): ИСервер ==nil")
 	лог.Паника(номер == 0, "ЗагрузитьВарБот(): номер пустой")
 	стрНомер := fmt.Sprint(номер)
 	log.Printf("ЗагрузитьВарБот(): номер=%q\n", стрНомер)
-	store := сервер.Получ("kernStore").(IKernelStore)
-	binData, err := store.Get("/bots/" + стрНомер)
+	хран := конт.Получ("kernStore").(ИЯдроХранилище)
+	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)
@@ -55,21 +54,21 @@ func ЗагрузитьВарБот(конт ИЯдроКонтекст, сер
 	}
 	конфиг := &warbot_config.ВарБотКонфиг{}
 	конфиг.Unmarshal(binData)
-	сам := создатьЯдроВарБот(сервер, конфиг)
+	сам := создатьЯдроВарБот(конт, конфиг)
 	go сам.рестарт()
 	_ = ИБот(сам)
 	return сам
 }
 
 // Каждые два часа перезапускает себя
-func (сам *ВарБот) рестарт() {
+func (сам *Бот) рестарт() {
 	time.Sleep(time.Hour * 2)
 	сам.прилож.Отменить()
 	log.Printf("ВарБот.рестарт(): бот %q перезагружен\n", сам.конфиг.Логин_)
 }
 
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(конт ИЯдроКонтекст, номер АБотНомер, логин, пароль string, еслиАвто bool) *ВарБот {
+func НовВарБот(конт ИЯдроКонтекст, номер АБотНомер, логин, пароль string, еслиАвто bool) *Бот {
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог.Инфо("НовВарБот()\n")
 	лог.Паника(логин == "", "НовВарБот(): логин пустой")
@@ -88,17 +87,17 @@ func НовВарБот(конт ИЯдроКонтекст, номер АБот
 }
 
 // Создаёт ядро бота
-func создатьЯдроВарБот(конт ИЯдроКонтекст, конфиг *warbot_config.ВарБотКонфиг) *ВарБот {
+func создатьЯдроВарБот(конт ИЯдроКонтекст, конфиг *warbot_config.ВарБотКонфиг) *Бот {
 	лог := kernel_log.НовЛоггер("ВарБот")
 	лог.Инфо("создатьЯдроВарБот()\n")
 	лог.Паника(конфиг == nil, "создатьЯдроВарБот(): ВарБотКонфиг==nil")
 	ctx, fnCancel := context.WithCancel(конт.Конт())
 	приложение := конт.Получ("приложение").(ИПриложение)
 	контБот := kernel_dict.НовЯдроСловарь()
-	сам := &ВарБот{
+	сам := &Бот{
 		конт:           контБот,
 		прилож:         приложение,
-		store:          конт.Получ("kernStore").(IKernelStore),
+		хран:           конт.Получ("kernStore").(ИЯдроХранилище),
 		стата:          tank_stat.НовТанкСтат(конт),
 		еслиРаботает:   safe_bool.НовБезопБул(),
 		еслиАвтозапуск: safe_bool.НовБезопБул(),
@@ -111,8 +110,8 @@ func создатьЯдроВарБот(конт ИЯдроКонтекст, к
 	сам.конт.Уст("приложение", приложение)
 	var err error
 	// WarBotNet
-	сам.сеть = warbot_net.НовВарБотСеть(конт, сам)
-	сам.ангар, err = angar.НовАнгар(конт, сам)
+	сам.сеть = warbot_net.НовВарБотСеть(сам.конт)
+	сам.ангар, err = arena_angar.НовАнгар(сам.конт)
 	сам.лог.Паника(err != nil, "НовВарБот(): in make IAngar, err=\n\t%w", err)
 	if сам.конфиг.ЕслиАвтозапуск_ {
 		сам.еслиАвтозапуск.Уст()
@@ -122,32 +121,32 @@ func создатьЯдроВарБот(конт ИЯдроКонтекст, к
 }
 
 // Сервер -- возвращает ссылку на объект сервера
-func (сам *ВарБот) Сервер() ИПриложение {
+func (сам *Бот) Сервер() ИПриложение {
 	return сам.прилож
 }
 
 // ЕслиПуск -- возвращает признак, что бот подключен
-func (сам *ВарБот) ЕслиПуск() bool {
+func (сам *Бот) ЕслиПуск() bool {
 	return сам.еслиРаботает.Получ()
 }
 
 // Номер -- возвращает номер бота
-func (сам *ВарБот) Номер() АБотНомер {
+func (сам *Бот) Номер() АБотНомер {
 	return сам.конфиг.Номер()
 }
 
 // Имя -- возвращает имя бота
-func (сам *ВарБот) Имя() string {
+func (сам *Бот) Имя() string {
 	return сам.конфиг.Логин()
 }
 
 // Пароль -- возвращает пароль бота
-func (сам *ВарБот) Пароль() string {
+func (сам *Бот) Пароль() string {
 	return сам.конфиг.Пароль_
 }
 
 // Пуск -- запускает бот в работу
-func (сам *ВарБот) Пуск() {
+func (сам *Бот) Пуск() {
 	if сам.еслиРаботает.Получ() {
 		return
 	}
@@ -156,32 +155,32 @@ func (сам *ВарБот) Пуск() {
 }
 
 // Error -- возвращает финальную ошибку работы, если была
-func (сам *ВарБот) Error() error {
+func (сам *Бот) Error() error {
 	return сам.errFinal
 }
 
 // Ангар -- возвращает ангар игры
-func (сам *ВарБот) Ангар() ИАнгар {
+func (сам *Бот) Ангар() ИАнгар {
 	return сам.ангар
 }
 
 // Стата -- возвращает статистику танка
-func (сам *ВарБот) Стата() ИТанкСтат {
+func (сам *Бот) Стата() ИТанкСтат {
 	return сам.стата
 }
 
 // Сеть -- возвращает ссылку на свой сетевой клиент
-func (сам *ВарБот) Сеть() ИБотСеть {
+func (сам *Бот) Сеть() ИБотСеть {
 	return сам.сеть
 }
 
 // АвтоИграЕсли -- возвращает признак автоматического запуска бота
-func (сам *ВарБот) АвтоИграЕсли() bool {
+func (сам *Бот) АвтоИграЕсли() bool {
 	return сам.еслиАвтозапуск.Получ()
 }
 
 // АвтоИграУст -- устанавливает признак автоматического запуска бота
-func (сам *ВарБот) АвтоИграУст() {
+func (сам *Бот) АвтоИграУст() {
 	log.Printf("WarBot.SetAutoGame()")
 	сам.еслиАвтозапуск.Уст()
 	сам.конфиг.ЕслиАвтозапуск_ = true
@@ -189,7 +188,7 @@ func (сам *ВарБот) АвтоИграУст() {
 }
 
 // АвтоИграСброс -- сбрасывает признак автоматического запуска бота
-func (сам *ВарБот) АвтоИграСброс() {
+func (сам *Бот) АвтоИграСброс() {
 	log.Printf("WarBot.ResetAutoGame()")
 	сам.еслиАвтозапуск.Уст()
 	сам.конфиг.ЕслиАвтозапуск_ = false
@@ -197,33 +196,33 @@ func (сам *ВарБот) АвтоИграСброс() {
 }
 
 // Сохраняет конфиг бота
-func (сам *ВарБот) сохрКонфиг() {
+func (сам *Бот) сохрКонфиг() {
 	log.Printf("ВарБот.сохрКонфиг()")
 	strConf := сам.конфиг.Marshall()
-	err := сам.store.Set("/bots/"+сам.Имя(), strConf)
+	err := сам.хран.Set("/bots/"+сам.Имя(), strConf)
 	if err != nil {
 		log.Printf("ВарБот.сохрКонфиг(): err=\n\t%v\n", err)
 	}
 }
 
 // Контекст -- возвращает контекст бота
-func (сам *ВарБот) Контекст() context.Context {
+func (сам *Бот) Контекст() context.Context {
 	return сам.кнт
 }
 
 // Закончить -- отменяет контекст бота
-func (сам *ВарБот) Закончить() {
+func (сам *Бот) Закончить() {
 	сам.фтОтмена()
 }
 
 // Сохраняет себя в базу
-func (сам *ВарБот) сохр() {
+func (сам *Бот) сохр() {
 	стрНомер := fmt.Sprint(сам.Номер())
-	err := сам.store.Set("/bots/"+стрНомер, сам.конфиг.Marshall())
+	err := сам.хран.Set("/bots/"+стрНомер, сам.конфиг.Marshall())
 	сам.лог.Паника(err != nil, "ВарБот.сохр(): err=\n\t%v\n", err)
 }
 
 // КонтБот -- возвращает контекст бота
-func (сам *ВарБот) КонтБот() ИБотКонтекст {
+func (сам *Бот) КонтБот() ИБотКонтекст {
 	return сам.конт
 }

+ 0 - 0
app/lev2/farm_bots/warbot/bot_stat/stat_param/stat_param.go → app/lev2/bot/bot_stat/stat_param/stat_param.go


+ 2 - 2
app/lev2/farm_bots/warbot/bot_stat/stat_resurs/stat_resurs.go → app/lev2/bot/bot_stat/stat_resurs/stat_resurs.go

@@ -5,8 +5,8 @@ import (
 	"fmt"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/angar/fuel"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev2/arena/arena_angar/fuel"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 )
 
 // СтатРесурсы -- статистика ресурсов

+ 1 - 1
app/lev2/farm_bots/warbot/bot_stat/tank_stat/tank_stat.go → app/lev2/bot/bot_stat/tank_stat/tank_stat.go

@@ -3,7 +3,7 @@ package tank_stat
 
 import (
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/bot_stat/stat_param"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
 )
 
 // ТанкСтат -- статические параметры танка

+ 0 - 0
app/lev2/farm_bots/warbot/warbot_config/warbot_config.go → app/lev2/bot/warbot_config/warbot_config.go


+ 68 - 0
app/lev2/bot/warbot_net/bot_cookie/bot_cookie.go

@@ -0,0 +1,68 @@
+package bot_cookie
+
+import (
+	"net/http"
+	"sync"
+
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/pkg/kernel/kernel_types"
+)
+
+/*
+	Предоставляет разделяемый объект кукисов для соединения с игровым сервером
+*/
+
+// БотКуки -- кукисы для бота, ничего не требует для своей работы
+type БотКуки struct {
+	куки []*http.Cookie
+	блок sync.RWMutex
+	лог  ИЯдроЛог
+}
+
+// НовБотКуки -- возвращает новый *БотКуки
+func НовБотКуки() БотКуки {
+	лог := kernel_log.НовЛоггер("БотКуки")
+	лог.Инфо("БотКуки()\n")
+	return БотКуки{
+		лог: лог,
+	}
+}
+
+// Уст -- устанавливает кукисы
+func (сам *БотКуки) Уст(cook []*http.Cookie) {
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
+	сам.лог.Паника(cook == nil, "БотКуки.Уст(): cookie == nil")
+	сам.куки = cook
+	cookie := http.Cookie{
+		Name:  "JSESSIONID",
+		Value: сам.куки[0].Value,
+		Raw:   "JSESSIONID=" + сам.куки[0].Value + "; _ym_uid=1642083867571238834; _ym_d=1642083867; _ym_isad=2; _ym_visorc=w",
+	}
+	cookie1 := сам.куки[:0]
+	сам.куки = cookie1
+	сам.куки = append(сам.куки, &cookie)
+
+	cookie = http.Cookie{
+		Name:  "_ym_d",
+		Value: "1642083867",
+	}
+	сам.куки = append(сам.куки, &cookie)
+
+	cookie = http.Cookie{
+		Name:  "_ym_isad",
+		Value: "2",
+	}
+	сам.куки = append(сам.куки, &cookie)
+
+	cookie = http.Cookie{
+		Name:  "_ym_visorc",
+		Value: "w",
+	}
+	сам.куки = append(сам.куки, &cookie)
+}
+
+// Получ -- возвращает хранимые кукисы
+func (сам *БотКуки) Получ() []*http.Cookie {
+	return сам.куки
+}

+ 46 - 0
app/lev2/bot/warbot_net/bot_http_conn/bot_http_conn.go

@@ -0,0 +1,46 @@
+// package bot_http_conn -- HTTP-соединение бота
+package bot_http_conn
+
+import (
+	"net/http"
+	"net/http/cookiejar"
+	"time"
+
+	. "wartank/app/lev0/types"
+	"wartank/app/lev2/bot/warbot_net/bot_cookie"
+)
+
+// БотХттпСоед -- сетевое соединение бота
+type БотХттпСоед struct {
+	клиент *http.Client       // Фактический клиент бота
+	куки   bot_cookie.БотКуки // Кукисы бота
+}
+
+// НовБотХттпСоед -- возвращает новое сетевое соединение бота
+func НовБотХттпСоед() *БотХттпСоед {
+	клиент := &http.Client{
+		Transport: &http.Transport{
+			MaxIdleConns:      10,
+			IdleConnTimeout:   30 * time.Second,
+			DisableKeepAlives: false,
+		},
+		Jar:     nil,
+		Timeout: time.Second * 10,
+	}
+	сам := &БотХттпСоед{
+		клиент: клиент,
+		куки:   bot_cookie.НовБотКуки(),
+	}
+	сам.клиент.Jar, _ = cookiejar.New(nil)
+	return сам
+}
+
+// Клиент -- возвращает сетевого клиента
+func (сам *БотХттпСоед) ХттпКлиент() *http.Client {
+	return сам.клиент
+}
+
+// Куки -- возвращает куки клиента
+func (сам *БотХттпСоед) Куки() ИБотКуки {
+	return &сам.куки
+}

+ 0 - 0
app/lev2/farm_bots/warbot/warbot_net/bot_net_conn.zip → app/lev2/bot/warbot_net/bot_net_conn.zip


+ 16 - 15
app/lev2/farm_bots/warbot/warbot_net/bot_net_login/bot_net_login.go → app/lev2/bot/warbot_net/bot_net_login/bot_net_login.go

@@ -14,23 +14,24 @@ import (
 
 // БотСетьЛогин -- объект сетевого входа на сервер
 type БотСетьЛогин struct {
-	сеть ИБотСеть
-	conn *http.Client // Сырой клиент HTTP
-	куки ИБотКуки
-	лог  ИЯдроЛог
+	сеть       ИБотСеть
+	хттпКлиент *http.Client // Сырой клиент HTTP
+	куки       ИБотКуки
+	лог        ИЯдроЛог
 }
 
 // НовБотСетьЛогин -- возвращает новый *БотСетьЛогин
-func НовБотСетьЛогин(ботСеть ИБотСеть, conn *http.Client) *БотСетьЛогин {
+func НовБотСетьЛогин(конт ИБотКонтекст) *БотСетьЛогин {
 	лог := kernel_log.НовЛоггер("БотСетьЛогин")
 	лог.Инфо("НовБотСетьЛогин()\n")
-	лог.Паника(ботСеть == nil, "НовБотСетьЛогин(): ИБотСеть==nil")
 
+	ботСеть := конт.Получ("ботСеть").(ИБотСеть)
+	хттпКлиент := конт.Получ("хттпКлиент").(*http.Client)
 	сам := &БотСетьЛогин{
-		сеть: ботСеть,
-		conn: conn,
-		куки: ботСеть.Куки(),
-		лог:  лог,
+		сеть:       ботСеть,
+		хттпКлиент: хттпКлиент,
+		куки:       ботСеть.Куки(),
+		лог:        лог,
 	}
 	сам.подключить()
 	return сам
@@ -47,7 +48,7 @@ func (сам *БотСетьЛогин) подключить() {
 	// Логин уже был
 	запр, ош1 := http.NewRequest("GET", "https://wartank.ru/angar", nil)
 	сам.лог.Паника(ош1 != nil, "БотСетьЛогин.подключить(): при получении страницы ангара, err=\n\t%v\n", ош1)
-	resp, ош2 := сам.conn.Do(запр)
+	resp, ош2 := сам.хттпКлиент.Do(запр)
 	сам.лог.Паника(ош2 != nil, "БотСетьЛогин.подключить(): при выполнении запроса, err=\n\t%v\n", ош2)
 	defer resp.Body.Close()
 	_, ош := io.ReadAll(resp.Body)
@@ -56,7 +57,7 @@ func (сам *БотСетьЛогин) подключить() {
 
 // Прочитать главную страницу для получения кукисов
 func (сам *БотСетьЛогин) получСтрГлав() string {
-	ответ, ош := сам.conn.Get("https://wartank.ru/")
+	ответ, ош := сам.хттпКлиент.Get("https://wartank.ru/")
 	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрГлав(): err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
 	// Получить куки из ответа
@@ -92,7 +93,7 @@ func (сам *БотСетьЛогин) получСтрГлав() string {
 // Получает страницу логина
 func (сам *БотСетьЛогин) получСтрЛогин(linkBegin string) string {
 	// _mt.Println("\БотСетьЛогин.getPageLogin()")
-	ответ, ош := сам.conn.Get(linkBegin)
+	ответ, ош := сам.хттпКлиент.Get(linkBegin)
 	сам.лог.Паника(ош != nil, "БотСетьЛогин.получСтрЛогин(): in make GET-request for send login page, err=\n\t%v\n", ош)
 	defer ответ.Body.Close()
 	данные, ош := io.ReadAll(ответ.Body)
@@ -127,11 +128,11 @@ func (сам *БотСетьЛогин) выполнитьЛогин(strBody str
 	form.Add("login", сам.сеть.Бот().Имя())
 	form.Add("password", сам.сеть.Бот().Пароль())
 
-	resp, err := сам.conn.PostForm(postLink, form)
+	resp, err := сам.хттпКлиент.PostForm(postLink, form)
 	сам.лог.Паника(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)
 	urlObj, _ := url.Parse("https://wartank.ru/")
-	сам.conn.Jar.SetCookies(urlObj, сам.куки.Получ())
+	сам.хттпКлиент.Jar.SetCookies(urlObj, сам.куки.Получ())
 
 }

+ 0 - 0
app/lev2/farm_bots/warbot/warbot_net/bot_web_conn.zip → app/lev2/bot/warbot_net/bot_web_conn.zip


+ 12 - 10
app/lev2/farm_bots/warbot/warbot_net/warbot_net.go → app/lev2/bot/warbot_net/warbot_net.go

@@ -4,8 +4,8 @@ import (
 	"context"
 
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/farm_bots/warbot/warbot_net/bot_net_login"
-	"wartank/app/lev2/farm_bots/warbot/warbot_net/bot_web_conn"
+	"wartank/app/lev2/bot/warbot_net/bot_http_conn"
+	"wartank/app/lev2/bot/warbot_net/bot_net_login"
 	"wartank/pkg/components/arena_net/http_worker"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
@@ -19,7 +19,7 @@ import (
 // ВарБотСеть -- веб-клиент для выполнения запросов на веб-сервер
 type ВарБотСеть struct {
 	бот        ИБот
-	вебСокет   *bot_web_conn.БотВебСокет
+	соедХттп   *bot_http_conn.БотХттпСоед
 	логин      *bot_net_login.БотСетьЛогин
 	еслиОнлайн *safe_bool.БезопБул
 	вебВоркер  ИХттпВоркер
@@ -29,24 +29,26 @@ type ВарБотСеть struct {
 }
 
 // НовВарБотСеть -- возвращает новый коннект к сети бота
-func НовВарБотСеть(конт ИБотКонтекст, бот ИБот) *ВарБотСеть {
+func НовВарБотСеть(конт ИБотКонтекст) *ВарБотСеть {
 	лог := kernel_log.НовЛоггер("ВарБотСеть")
 	лог.Инфо("НовВарБотСеть()\n")
-	лог.Паника(бот == nil, "НовВарБотСеть(): ИБот == nil")
-
+	бот := конт.Получ("юот").(ИБот)
 	лог.Инфо("НовВарБотСеть(): имя=%q\n", бот.Имя())
 	ctx, фнОтмена := context.WithCancel(бот.Контекст())
 	сам := &ВарБотСеть{
 		бот:        бот,
-		вебСокет:   bot_web_conn.НовБотВебСокет(),
+		соедХттп:   bot_http_conn.НовБотХттпСоед(),
 		еслиОнлайн: safe_bool.НовБезопБул(),
 		ctx:        ctx,
 		фнОтмена:   фнОтмена,
 		лог:        лог,
 	}
-	сам.вебВоркер = http_worker.НовХттпВоркер(конт, сам, сам.вебСокет.ВебСокет())
+	конт.Уст("хттпКлиент", сам.соедХттп.ХттпКлиент())
+	сам.вебВоркер = http_worker.НовХттпВоркер(конт)
+
 	// Подключаем сетевой логин
-	сам.логин = bot_net_login.НовБотСетьЛогин(сам, сам.вебСокет.ВебСокет())
+	конт.Уст("ботСеть", сам)
+	сам.логин = bot_net_login.НовБотСетьЛогин(конт)
 
 	сам.еслиОнлайн.Уст()
 	_ = ИБотСеть(сам)
@@ -80,5 +82,5 @@ func (сам *ВарБотСеть) ВебВоркер() ИХттпВоркер
 
 // Куки -- возвращает куки для HTTP-коннект
 func (сам *ВарБотСеть) Куки() ИБотКуки {
-	return сам.вебСокет.Куки()
+	return сам.соедХттп.Куки()
 }

+ 666 - 0
app/lev2/farm_bots/bot/angar/base/arsenal/arsenal.go

@@ -0,0 +1,666 @@
+// package arsenal -- объект оружейной на базе
+package arsenal
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"strconv"
+	"strings"
+	"time"
+
+	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
+	"wartank/pkg/components/arena_net"
+	"wartank/pkg/components/web_log"
+	"wartank/pkg/kernel/kernel_log"
+	. "wartank/pkg/kernel/kernel_types"
+)
+
+const (
+	стрКумулятивы = "кумулятивы"
+	стрБронебойки = "бронебойки"
+	стрФугасы     = "фугасы"
+	стрРемки      = "ремки"
+)
+
+// Арсенал -- объект оружейной на базе
+type Арсенал struct {
+	ИАрена
+	вЛог         ИВебЛог
+	лог          ИЯдроЛог
+	бот          ИБот
+	база         ИБаза
+	сеть         ИАренаСеть
+	фугас        ИСтатПарам
+	бронебойка   ИСтатПарам
+	кумулятив    ИСтатПарам
+	ремка        ИСтатПарам
+	уровень      ИСтатПарам
+	продуктИмя   string          // Что сейчас делается
+	продуктКол   ИСтатПарам      // Сколько делается прямо сейчас
+	продуктВремя string          // Сколько осталось времени прямо сейчас
+	кнт          context.Context // контекст шахты
+	фнОтмена     func()          // Функция отмены шахты
+}
+
+// НовАрсенал -- возвращает новый *Arsenal
+func НовАрсенал(конт ИБотКонтекст, база ИБаза) (ИАренаАрсенал, error) {
+	лог := kernel_log.НовЛоггер("Арсенал")
+	лог.Инфо("НовАрсенал()\n")
+
+	кнт, фнОтмена := context.WithCancel(база.Контекст())
+	сам := &Арсенал{
+		бот:        база.Бот(),
+		база:       база,
+		фугас:      stat_param.НовСтатПарам(стрФугасы),
+		бронебойка: stat_param.НовСтатПарам(стрБронебойки),
+		кумулятив:  stat_param.НовСтатПарам(стрКумулятивы),
+		ремка:      stat_param.НовСтатПарам(стрРемки),
+		уровень:    stat_param.НовСтатПарам("уровень"), // FIXME: это должно быть на уровне арены
+		продуктКол: stat_param.НовСтатПарам("свинец"),
+		кнт:        кнт,
+		фнОтмена:   фнОтмена,
+
+		лог: лог,
+	}
+	аренаКонфиг := arena.АренаКонфиг{
+		Бот_:         база.Бот(),
+		АренаИмя_:    "Арсенал",
+		СтрКонтроль_: `<span class="green2">Ремкомплект</span><br/>`,
+		ФнПуск_:      сам.пуск,
+		СтрУрл_:      "https://wartank.ru/production/Armory",
+	}
+	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
+	сам.вЛог = web_log.НовВебЛог(true)
+	сам.сеть = arena_net.НовАренаСеть(конт, сам, "https://wartank.ru/production/Armory")
+	go сам.пуск()
+	сам.вЛог.Добавить("НовАрсенал(): Арсенал создан")
+	return сам, nil
+}
+
+// Уровень -- возвращает уровень шахты
+func (сам *Арсенал) Уровень() ИСтатПарам {
+	return сам.уровень
+}
+
+// ПродуктКолСейчас -- возвращает количество производимого продукта
+func (сам *Арсенал) ПродуктКолСейчас() int {
+	return сам.продуктКол.Получ()
+}
+
+// ПродуктИмяСейчас -- возвращает имя производимого продукта
+func (сам *Арсенал) ПродуктИмяСейчас() string {
+	return сам.продуктИмя
+}
+
+// ПродуктВремяСейчас -- сколько осталось времени до производства продукта
+func (сам *Арсенал) ПродуктВремяСейчас() string {
+	return сам.продуктВремя
+	// return сам.Секция.ВремяОпрос().Стр()
+}
+
+// запускает обработку арсенала
+func (сам *Арсенал) пуск() {
+	еслиПостроить := true
+	фнРабота := func() {
+		defer func() {
+			for сам.ВремяОстат().ПолучМилСек() > 0 {
+				select {
+				case <-сам.кнт.Done():
+					return
+				default:
+					time.Sleep(time.Second * 5)
+				}
+			}
+		}()
+		сам.вЛог.Добавить("Арсенал.пуск().фнРабота()\n")
+		еслиПостроить = сам.проверитьПостроить()
+		if еслиПостроить {
+			еслиПостроено, ош := сам.построить()
+			if ош != nil {
+				return
+			}
+			if еслиПостроено {
+				сам.вЛог.Добавить("построено")
+				return
+			}
+		}
+		{ // апгрейд
+			счёт := 5
+			for счёт > 0 {
+				if сам.проапгрейдить() {
+					break
+				}
+				счёт--
+			}
+		}
+		_ = сам.уровеньОбновить()
+		ош := сам.СтатаОбновить()
+		if ош != nil {
+			сам.лог.Ошибка("пуск(): при обновлении статы, ош=\n\t%v\n", ош)
+			сам.вЛог.Добавить("пуск(): при обновлении статы, ош=\n\t%w", ош)
+		}
+		сам.забрать()
+		сам.сделать()
+		сам.лог.Инфо("пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
+	}
+	for {
+		фнРабота()
+	}
+}
+
+// Проверяет необходимость постройки
+func (сам *Арсенал) проверитьПостроить() bool {
+	сам.вЛог.Добавить("Арсенал.проверитьПостроить()\n")
+	_ = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
+	return true
+}
+
+// Обновляет текущий уровень арсенала (может быть не построена)
+func (сам *Арсенал) уровеньОбновить() bool {
+	сам.вЛог.Добавить("Арсенал.уровеньОбновить()\n")
+	списСтр := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
+	// <span class="green2">Оружейная - 0</span><br/>
+	var (
+		еслиНайти = false
+		стр       = ""
+	)
+	for _, стр = range списСтр {
+		if strings.Contains(стр, `<span class="green2">Оружейная -`) {
+			еслиНайти = true
+			break
+		}
+	}
+	if !еслиНайти {
+		сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n")
+		return false
+	}
+	_стр := strings.TrimPrefix(стр, `<span class="green2">Оружейная - `)
+	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
+	иУровень, ош := strconv.Atoi(_стр)
+	if ош != nil {
+		сам.лог.Ошибка("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
+		return false
+	}
+	сам.уровень.Уст(иУровень)
+	сам.лог.Инфо("уровеньОбновить(): уровень=%d\n", иУровень)
+	сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень)
+	return true
+}
+
+// Строит арсенал при нулевом уровне
+func (сам *Арсенал) построить() (bool, error) {
+	сам.вЛог.Добавить("Арсенал.построить()\n")
+	списСтр := сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
+	// <span class="green2">Арсенал - 0</span><br/>
+	var (
+		еслиНайти = false
+		стр       = ""
+	)
+	for _, стр = range списСтр {
+		if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
+			еслиНайти = true
+			break
+		}
+	}
+	if !еслиНайти {
+		сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
+		return true, nil
+	}
+	// <a class="simple-but border mb5" href="Armory?30-1.ILinkListener-upgradeLink-link">
+	// Пробуем построить арсенал
+	_стр := strings.TrimPrefix(стр, `<a class="simple-but border mb5" href="`)
+	_стр = strings.TrimSuffix(_стр, `">`)
+	ссылка := "https://wartank.ru/building-upgrade/" + _стр
+	// https://wartank.ru/building-upgrade/Armory?35-1.ILinkListener-upgradeLink-link
+	списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
+	еслиНайти = false
+	// "<a class=\"simple-but border mb5\" href=\"Armory?14-1.ILinkListener-upgradeLink-link\">"
+	for _, стр = range списСтр {
+		if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
+			еслиНайти = true
+			break
+		}
+	}
+	if !еслиНайти {
+		сам.вЛог.Добавить("Арсенал.построить(): не надо\n")
+		return true, nil
+	}
+	сам.лог.Инфо("построить(): ок\n")
+	сам.вЛог.Добавить("Арсенал.построить(): ок\n")
+	return true, nil
+}
+
+// Пытается проапгрейдить арсенал
+func (сам *Арсенал) проапгрейдить() bool {
+	сам.вЛог.Добавить("Арсенал.проапгрейдить()\n")
+	var (
+		еслиНайти = false
+		списСтр   []string
+		стр       = ""
+	)
+	фнКупить := func() bool {
+		defer time.Sleep(time.Millisecond * 1000)
+		списСтр = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
+		for _, стр = range списСтр {
+			// <a class="simple-but border mb5" href="Armory?5-1.ILinkListener-upgradeLink-link">
+			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
+				еслиНайти = true
+				break
+			}
+		}
+		if !еслиНайти {
+			сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n")
+			return true
+		}
+		// Пробуем улучшить шахту
+		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
+		_стр = strings.TrimSuffix(_стр, "\">")
+		// https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
+		// <a class="simple-but border mb5" href="Armory?50-1.ILinkListener-upgradeLink-link">
+		ссылка := "https://wartank.ru/building-upgrade/" + _стр
+		списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
+		// Проверить, что постройка состоялась
+		for _, стр := range списСтр {
+			if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
+				log.Printf("Арсенал.проапгрейдить().фнКупить(): покупка арсенала не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
+				return false // Покупка не оплачена
+			}
+		}
+		сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n")
+		return true
+	}
+
+	фнПодтверждение := func() bool {
+		for _, стр = range списСтр {
+			// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
+			if strings.Contains(стр, `ILinkListener-confirmLink`) {
+				еслиНайти = true
+				break
+			}
+		}
+		if !еслиНайти {
+			сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n")
+			return true
+		}
+		// Пробуем построить шахту
+		_стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
+		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
+		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
+		ссылка := "https://wartank.ru" + _стр
+		списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
+		// Проверить, что постройка состоялась
+		for _, стр := range списСтр {
+			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
+				сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
+				return false // Покупка не оплачена
+			}
+		}
+		сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n")
+		return true
+	}
+
+	фнКомплекс := func() {
+		count := 5
+		for count > 0 {
+			if фнКупить() {
+				if фнПодтверждение() {
+					break
+				}
+			}
+			count--
+		}
+	}
+	фнКомплекс()
+	return true
+}
+
+// Проверяет на забрать оружейную
+func (сам *Арсенал) забрать() bool {
+	var (
+		strOut      string
+		ind         int
+		еслиНайдено bool
+		lstBase     = сам.СписПолучить()
+	)
+	for ind, strOut = range lstBase {
+		if strings.Contains(strOut, `Моя амуниция`) {
+			еслиНайдено = true
+			ind += 17
+			strOut = lstBase[ind]
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	if !strings.Contains(strOut, `"><span><span>Забрать</span></span></a>`) {
+		return false
+	}
+	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
+	strLink := lstLink[1]
+	lstLink = strings.Split(strLink, `"><span><span>Забрать</span></span></a>`)
+	// https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
+	strLink = "https://wartank.ru/" + lstLink[0]
+	var (
+		лстАрсенал []string
+		ош         error
+	)
+	time.Sleep(time.Millisecond * 100)
+	лстАрсенал, ош = сам.сеть.Get(strLink)
+	if ош != nil {
+		log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", ош)
+		return false
+	}
+	if len(лстАрсенал) == 0 {
+		log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase))
+		return false
+	}
+	for _, strOut = range лстАрсенал {
+		if strings.Contains(strOut, `<title>Производство</title>`) {
+			return false
+		}
+	}
+	if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
+		log.Printf("Арсенал.checkArsenalGet(): при обновлении lstBase, err=\n\t%v\n", ош)
+	}
+	if ош = сам.СтрОбновить(лстАрсенал); ош != nil {
+		log.Printf("Арсенал.checkArsenalGet(): при обновлении lstArsenal, err=\n\t%v\n", ош)
+	}
+	return true
+}
+
+// Фугасы -- возвращает объект числа фугасов
+func (сам *Арсенал) Фугасы() ИСтатПарам {
+	return сам.фугас
+}
+
+// Бронебойки -- возвращает объект бронебойных снарядов
+func (сам *Арсенал) Бронебойки() ИСтатПарам {
+	return сам.бронебойка
+}
+
+// Кумулятивы -- возвращает объект бронебойных снарядов
+func (сам *Арсенал) Кумулятивы() ИСтатПарам {
+	return сам.кумулятив
+}
+
+// Ремки -- возвращает объект ремкомплектов
+func (сам *Арсенал) Ремки() ИСтатПарам {
+	return сам.ремка
+}
+
+// Обновляет состояние арсенала по требованию
+func (сам *Арсенал) СтатаОбновить() (err error) {
+	сам.вЛог.Добавить("Арсенал.СтатаОбновить()\n")
+	сам.сеть.Обновить()
+	var (
+		strOut     string
+		lstArsenal = сам.СписПолучить()
+	)
+	{ // Найти маркер фугасного снаряда
+		for _, стрФугас := range lstArsenal {
+			if strings.Contains(стрФугас, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `) {
+				strOut = стрФугас
+				break
+			}
+		}
+		списФугас := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HighExplosive.png" alt="Фугасный снаряд" title="Фугасный снаряд"/> `)
+		стрФугас := списФугас[1]
+		списФугас = strings.Split(стрФугас, ` &nbsp;&nbsp;</span>`)
+		стрФугас = списФугас[0]
+		целФугас, err := strconv.Atoi(стрФугас)
+		if err != nil {
+			ош := fmt.Errorf("ОШИБКА Арсенал.СтатаОбновить(): фугас(%v) not number, err=\n\t%w", стрФугас, err)
+			сам.вЛог.Добавить("%v\n", ош)
+			return ош
+		}
+		сам.Фугасы().Уст(целФугас)
+	}
+	{ // Найти маркер бронебойного снаряда
+		for _, strArmor := range lstArsenal {
+			if strings.Contains(strArmor, `alt="Бронебойный снаряд"`) {
+				strOut = strArmor
+				break
+			}
+		}
+		lstArmor := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/ArmorPiercing.png" alt="Бронебойный снаряд" title="Бронебойный снаряд"/> `)
+		strArmor := lstArmor[1]
+		lstArmor = strings.Split(strArmor, ` &nbsp;&nbsp;</span>`)
+		strArmor = lstArmor[0]
+		iArmor, err := strconv.Atoi(strArmor)
+		if err != nil {
+			ош := fmt.Errorf("Арсенал.СтатаОбновить(): armor(%v) not number, err=\n\t%w", strArmor, err)
+			сам.вЛог.Добавить("%v\n", ош)
+			return ош
+		}
+		сам.Бронебойки().Уст(iArmor)
+		сам.вЛог.Добавить("Арсенал.СтатаОбновить(): бронебойки=%v\n", iArmor)
+	}
+	{ // Найти маркер кумулятивного снаряда
+		for _, стрКумул := range lstArsenal {
+			if strings.Contains(стрКумул, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `) {
+				strOut = стрКумул
+				break
+			}
+		}
+		списКумул := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/HollowCharge.png" alt="Кумулятивный снаряд" title="Кумулятивный снаряд"/> `)
+		стрКумул := списКумул[1]
+		списКумул = strings.Split(стрКумул, ` &nbsp;&nbsp;</span>`)
+		стрКумул = списКумул[0]
+		целКумул, err := strconv.Atoi(стрКумул)
+		if err != nil {
+			return fmt.Errorf("Арсенал.СтатаОбновить(): кумул(%v) not number, err=\n\t%w", стрКумул, err)
+		}
+		сам.Кумулятивы().Уст(целКумул)
+	}
+	{ // Найти маркер ремкомплекта
+		for ind, стрРемка := range lstArsenal {
+			if strings.Contains(стрРемка, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `) {
+				strOut = lstArsenal[ind]
+				break
+			}
+		}
+		списРемка := strings.Split(strOut, `<span class="nwr"><img class="rico vm" src="/images/shells/repairkit.gif"/> `)
+		стрРемка := списРемка[1]
+		списРемка = strings.Split(стрРемка, `</span>`)
+		стрРемка = списРемка[0]
+		целРемка, err := strconv.Atoi(стрРемка)
+		if err != nil {
+			return fmt.Errorf("Арсенал.СтатаОбновить(): ремка(%v) not number, err=\n\t%w", стрРемка, err)
+		}
+		сам.Ремки().Уст(целРемка)
+	}
+	return nil
+}
+
+// Выбирает что надо делать, запускает процесс изготовления
+func (сам *Арсенал) сделать() bool {
+	сам.сеть.Обновить()
+	// _mt.Println("\tArsenalNet.сделать()")
+	var (
+		ремкаКол  = сам.Ремки().Получ()
+		фугасКол  = сам.Фугасы().Получ()
+		кумульКол = сам.Кумулятивы().Получ()
+		ббКол     = сам.Бронебойки().Получ()
+		снарядТип string
+	)
+	if ремкаКол < 70 { // Контроль ремки по времени суток и минимальному количеству ремок
+		for !сам.сделатьРемку() {
+		}
+		сам.продуктИмя = стрРемки
+		return true
+	}
+	{ // Контроль по числу снарядов. В равных долях без приоритетов
+		// снарядТип = стрФугасы
+		снарядТип = стрБронебойки
+		if ббКол > фугасКол {
+			снарядТип = стрФугасы
+		}
+
+		if фугасКол > кумульКол {
+			снарядТип = стрКумулятивы
+		}
+
+		switch снарядТип {
+		case стрФугасы: // Мало фугасов
+			for !сам.сделатьФугасы() {
+			}
+		case стрКумулятивы: // Мало кумулятивов
+			for !сам.сделатьКумули() {
+			}
+		case стрБронебойки: // Мало бронебойных
+			for !сам.сделатьБронебойки() {
+			}
+		default:
+			// log._rintf("ERRO Арсенал.сделать(): неизвестный тип арсенала(%v)", typeArmor)
+		}
+		сам.продуктИмя = снарядТип
+	}
+	return true
+}
+
+// Создать бронебойные
+func (сам *Арсенал) сделатьБронебойки() bool {
+	var (
+		стрВых      string
+		lstArsenal  = сам.СписПолучить()
+		еслиНайдено bool
+		инд         int
+	)
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Бронебойный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	стрВых = lstArsenal[инд+10]
+	// Получить ссылку на бронебойные
+	lstArmor := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	if len(lstArmor) <= 1 { // Тут возможно есть пустая строка
+		return true // Считаем, что производство уже запущено
+	}
+	strLink := lstArmor[1]
+	lstArmor = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + lstArmor[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := сам.сеть.Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeArmor(): in update lstArsenal,  err=\n\t%v\n", err)
+		return false
+	}
+	сам.АренаСостояние().СостояниеУст(стрБронебойки)
+	return true
+}
+
+// Создать кумулятивные
+func (сам *Арсенал) сделатьКумули() bool {
+	var (
+		стрВых      string
+		lstArsenal  = сам.СписПолучить()
+		еслиНайдено bool
+		инд         int
+	)
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Кумулятивный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	стрВых = lstArsenal[инд+10]
+	if !strings.Contains(стрВых, `>Начать производство<`) {
+		return false
+	}
+	// Получить ссылку на кумулятив
+	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	strLink := списКумул[1]
+	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + списКумул[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := сам.сеть.Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeКумуль(): in make product arsenal кумуль , err=\n\t%v\n", err)
+		return false
+	}
+	сам.АренаСостояние().СостояниеУст(стрКумулятивы)
+	return true
+}
+
+// Создать фугасы
+func (сам *Арсенал) сделатьФугасы() bool {
+	var (
+		lstArsenal  = сам.СписПолучить()
+		стрВых      string
+		еслиНайдено bool
+		инд         int
+	)
+
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Фугасный снаряд</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	стрВых = lstArsenal[инд+10]
+	if !strings.Contains(стрВых, `"><span><span>Начать производство</span></span></a>`) {
+		return false
+	}
+	// Получить ссылку на ремку
+	списКумул := strings.Split(стрВых, `<a class="simple-but border" href="`)
+	strLink := списКумул[1]
+	списКумул = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "https://wartank.ru/production/" + списКумул[0]
+	time.Sleep(time.Millisecond * 50)
+	if _, err := сам.сеть.Get(strLink); err != nil {
+		// log._rintf("ERRO ArsenalNet.makeФугас(): in make request arsenal product, err=\n\t%v\n", err)
+		return false
+	}
+	сам.АренаСостояние().СостояниеУст(стрФугасы)
+	// log._rintf("INFO Арсенал.makeФугас()\n")
+	return true
+}
+
+// Создать ремку. Выполняется если подходят условия
+func (сам *Арсенал) сделатьРемку() bool {
+	// _mt.Println("\tArsenalNet.makeРемка()")
+	var (
+		стрВых      string
+		еслиНайдено bool
+		инд         int
+	)
+	lstArsenal := сам.сеть.ВебВоркер().Получ("https://wartank.ru/production/Armory")
+	// <span class="green2">Ремкомплект</span><br/>
+	for инд, стрВых = range lstArsenal {
+		if strings.Contains(стрВых, `<span class="green2">Ремкомплект</span><br/>`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	стрВых = lstArsenal[инд+10]
+	// Если кривая строка, то надо вернуться
+	if strings.Contains(стрВых, `</div></div></div></div></div></div></div></div>`) {
+		return true
+	}
+	// Получить ссылку на ремку
+	_ссылка := strings.TrimPrefix(стрВых, `<a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Начать производство</span></span></a>`)
+	// https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
+	ссылка := "https://wartank.ru/production/" + _ссылка
+	time.Sleep(time.Millisecond * 50)
+	_ = сам.сеть.ВебВоркер().Получ(ссылка)
+	сам.АренаСостояние().СостояниеУст(стрРемки)
+	return true
+}

+ 324 - 0
app/lev2/farm_bots/bot/angar/base/bank/bank.go

@@ -0,0 +1,324 @@
+package bank
+
+import (
+	"fmt"
+	"log"
+	"strconv"
+	"strings"
+	"time"
+
+	. "wartank/app/lev0/types"
+	"wartank/app/lev1/arena"
+	"wartank/app/lev2/bot/arena_angar/base/bank/bank_mode"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
+	"wartank/pkg/alias"
+	"wartank/pkg/components/arena_net"
+)
+
+/*
+	Предоставляет объект банка на базе
+*/
+
+// Банк -- объект банка на базе
+type Банк struct {
+	ИАрена
+	сеть       ИАренаСеть
+	сереброБот ИСтатПарам
+	режим1     *bank_mode.BankMode // 1 режим работы на выбор
+	режим2     *bank_mode.BankMode // 2 режим работы на выбор
+}
+
+// НовБанк -- возвращает новый *Bank
+func НовБанк(конт ИБотКонтекст, база ИБаза) (*Банк, error) {
+
+	сам := &Банк{
+		сереброБот: stat_param.НовСтатПарам("серебро бота"),
+		режим1:     bank_mode.NewBankMode(конт),
+		режим2:     bank_mode.NewBankMode(конт),
+	}
+	аренаКонфиг := arena.АренаКонфиг{
+		Бот_:         база.Бот(),
+		АренаИмя_:    "Банк",
+		СтрКонтроль_: `<span class="green2">Серебро</span><br/>`,
+		ФнПуск_:      сам.пуск,
+		СтрУрл_:      "https://wartank.ru/production/Bank",
+	}
+	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
+	сам.сеть = arena_net.НовАренаСеть(конт, сам, "https://wartank.ru/production/Bank")
+	return сам, nil
+}
+
+// Пуск -- запускает банк в работу
+func (сам *Банк) Пуск() error {
+	log.Printf("Банк.Run()\n")
+	go сам.пуск()
+	return nil
+}
+
+// UpdateLst -- принудительно обновляет состояние банка
+func (сам *Банк) UpdateLst() {
+	сам.сеть.Обновить()
+}
+
+// запускает банк в опрос
+func (сам *Банк) пуск() {
+	log.Printf("Банк.пуск()\n")
+	fnRun := func() {
+		defer time.Sleep(time.Minute * 5)
+		сам.забрать()
+		if сам.построитьУлучшить() {
+			time.Sleep(time.Minute * 25)
+			return
+		}
+		if сам.проверитьУскорить() {
+			time.Sleep(time.Minute * 25)
+			return
+		}
+		сам.сеть.Обновить()
+
+		if ош := сам.получитьВсеРежимы(); ош != nil {
+			log.Printf("ERRO Банк.пуск(): при получении списка режимов банка, err=\n\t%v\n", ош)
+		}
+		_, ош := сам.сделатьСеребро()
+		if ош != nil {
+			log.Printf("ERRO Банк.пуск(): при пуске производства банка, err=\n\t%v\n", ош)
+		}
+	}
+	for {
+		// <-сам.ВремяОпрос().КаналСиг()
+		fnRun()
+	}
+}
+
+// Проверка на ускорение строительства
+func (сам *Банк) проверитьУскорить() bool {
+	var (
+		стрСсылка   = ""
+		еслиНайдено = false
+	)
+	списБанк := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
+	// <td style="width:50%;padding-left:1px;"><a class="simple-but border" href="buildings?1-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-freeBoostLink"><span><span>Ускорение</span></span></a>
+	for _, стрСсылка = range списБанк {
+		if strings.Contains(стрСсылка, `.ILinkListener-buildings-1-building-rootBlock-actionPanel-freeBoostLink`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return false
+	}
+	_ссылка := strings.TrimPrefix(стрСсылка, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Ускорение</span></span></a>`)
+	ссылка := "https://wartank.ru/" + _ссылка
+	_ = сам.сеть.ВебВоркер().Получ(ссылка)
+	return true
+}
+
+// Забирает серебро
+func (сам *Банк) забрать() {
+	var (
+		strOut      string
+		еслиНайдено bool
+	)
+	списБанк := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
+	// <a class="simple-but border" href="buildings?0-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
+	for _, strOut = range списБанк {
+		if strings.Contains(strOut, `.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink`) {
+			еслиНайдено = true
+			break
+		}
+	}
+	if !еслиНайдено {
+		return
+	}
+	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
+	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
+	// https://wartank.ru/buildings?3-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink
+	ссылка := "https://wartank.ru/" + _ссылка
+	_ = сам.сеть.ВебВоркер().Получ(ссылка)
+}
+
+// Проверяет необходимость постройки полигона
+func (сам *Банк) построитьУлучшить() bool {
+	var списБанк []string
+
+	{ // Зайти на страницу постройки
+		// https://wartank.ru/building-upgrade/Bank
+		списБанк = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Bank")
+		стрСсылка := ""
+		еслиНайти := false
+		// <a class="simple-but border mb5" href="Bank?192-1.ILinkListener-upgradeLink-link">
+		for _, стрСсылка = range списБанк {
+			if strings.Contains(стрСсылка, `href="Bank?`) {
+				еслиНайти = true
+				break
+			}
+		}
+		if !еслиНайти { // Время полигона вышло
+			return false
+		}
+		_ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
+		_ссылка = strings.TrimSuffix(_ссылка, `">`)
+		ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
+		// https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
+		списБанк = сам.сеть.ВебВоркер().Получ(ссылка)
+	}
+	{ // Заказать постройку
+		// https://wartank.ru/building-upgrade/Bank
+		стрСсылка := ""
+		еслиНайти := false
+		// <a class="simple-but border mb5" href="Bank?163-1.ILinkListener-upgradeLink-link">
+		for _, стрСсылка = range списБанк {
+			if strings.Contains(стрСсылка, `href="Bank?`) {
+				еслиНайти = true
+				break
+			}
+		}
+		if еслиНайти { // Время полигона вышло
+			_ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border mb5" href="`)
+			_ссылка = strings.TrimSuffix(_ссылка, `">`)
+			ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
+			// https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
+			списБанк = сам.сеть.ВебВоркер().Получ(ссылка)
+		}
+	}
+	{ // подтверждение постройки
+		// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?187-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
+		стрСсылка := ""
+		еслиНайти := false
+		for _, стрСсылка = range списБанк {
+			if strings.Contains(стрСсылка, `.ILinkListener-confirmLink`) {
+				еслиНайти = true
+				break
+			}
+		}
+		if !еслиНайти { // Время полигона вышло
+			return false
+		}
+		_ссылка := strings.TrimPrefix(стрСсылка, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
+		_ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
+		ссылка := "https://wartank.ru/" + _ссылка
+		// https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
+		_ = сам.сеть.ВебВоркер().Получ(ссылка)
+	}
+	log.Printf("Банк.построитьПровер(): построен успешно\n")
+	return true
+}
+
+// РежимРаботы2 -- возвращает объект режима2
+func (сам *Банк) РежимРаботы2() ИБанкРежим {
+	return сам.режим2
+}
+
+// РежимРаботы1 -- возвращает объект режима1
+func (сам *Банк) РежимРаботы1() ИБанкРежим {
+	return сам.режим1
+}
+
+// СереброБот -- возвращает серебро от бота
+func (сам *Банк) СереброБот() ИСтатПарам {
+	return сам.сереброБот
+}
+
+// Запускает в производство серебро
+func (сам *Банк) сделатьСеребро() (alias.МилСек, error) {
+	var (
+		lstBank     = сам.СписПолучить()
+		ind         int
+		strOut      string
+		strLink     string
+		еслиНайдено bool
+	)
+	time1 := сам.РежимРаботы1().ВремяСделать()
+	time2 := сам.РежимРаботы2().ВремяСделать()
+	if time1 > time2 {
+		time1 = time2
+	}
+	for ind, strOut = range lstBank {
+		if strings.Contains(strOut, time1) {
+			ind += 7
+			strLink = lstBank[ind]
+			еслиНайдено = true
+			break
+		}
+	}
+	if еслиНайдено && strings.Contains(strLink, `>Начать производство</span>`) {
+		lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
+		strLink = lstLink[1]
+		lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+		strLink = "https://wartank.ru/production/" + lstLink[0]
+		lstBank, err := сам.сеть.Get(strLink)
+		if err != nil {
+			return 0, fmt.Errorf("BankNet.makeProduct(): при выполнении GET-запроса начать производство, err=%w", err)
+		}
+		for _, strOut := range lstBank {
+			if strings.Contains(strOut, `<title>База</title>`) { // Это база, а не банк
+				return 30, nil
+			}
+		}
+		if err = сам.СтрОбновить(lstBank); err != nil {
+			return 0, fmt.Errorf("BankNet.makeProduct(): при обновлении lstBank, err=%w", err)
+		}
+		if err := сам.ОбратВремяУст(alias.Время(time1)); err != nil {
+			log.Printf("WARN Банк.makeProduct(): при установке времени производства банка(%v)\n\terr=%v\n", time1, err)
+		}
+	}
+	return сам.ВремяОстат().ПолучМилСек(), nil
+}
+
+// Получает все режимы банка
+func (сам *Банк) получитьВсеРежимы() error {
+	var (
+		lstBank  = сам.СписПолучить()
+		ind      int
+		strMode  string
+		strMode1 string
+		strMode2 string
+	)
+	{ // Получить первый режим
+		for ind, strMode = range lstBank {
+			if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
+				strMode1 = strMode
+				break
+			}
+		}
+		lstMode := strings.Split(strMode1, `Кол-во: <span class="green2">`)
+		strMode1 = lstMode[1]
+		lstMode = strings.Split(strMode1, `</span><br/>`)
+		strMode1 = lstMode[0]
+		iNum1, err := strconv.Atoi(strMode1)
+		if err != nil {
+			return fmt.Errorf("BankNet.getAllMode(): numSilver1(%v) not number, err=\n\t%w", strMode1, err)
+		}
+		сам.РежимРаботы1().Серебро().Уст(iNum1)
+		// Установить время производства
+		strTime1 := lstBank[ind+2]
+		сам.РежимРаботы1().ВремяСделатьУст(strTime1)
+		if iNum1 <= 2 { // Если банк слишком слабый
+			return nil
+		}
+	}
+	{ // Получить второй режим
+		for _ind := ind + 2; _ind < len(lstBank); _ind++ {
+			strMode := lstBank[_ind]
+			if strings.Contains(strMode, `Кол-во: <span class="green2">`) {
+				strMode2 = strMode
+				ind = _ind
+				break
+			}
+		}
+		lstMode := strings.Split(strMode2, `Кол-во: <span class="green2">`)
+		strMode2 = lstMode[1]
+		lstMode = strings.Split(strMode2, `</span><br/>`)
+		strMode2 = lstMode[0]
+		iNum2, err := strconv.Atoi(strMode2)
+		if err != nil {
+			return fmt.Errorf("BankNet.getAllMode(): numSilver2(%v) not number, err=\n\t%w", strMode2, err)
+		}
+		сам.РежимРаботы2().Серебро().Уст(iNum2)
+		// Установить время производства
+		strTime2 := lstBank[ind+2]
+		сам.РежимРаботы2().ВремяСделатьУст(strTime2)
+	}
+	return nil
+}

+ 38 - 0
app/lev2/farm_bots/bot/angar/base/bank/bank_mode/bank_mode.go

@@ -0,0 +1,38 @@
+package bank_mode
+
+import (
+	. "wartank/app/lev0/types"
+	"wartank/app/lev2/bot/bot_stat/stat_param"
+)
+
+/*
+	Объект допустимого режима банка.
+*/
+
+// BankMode -- объект допустимого режима банка
+type BankMode struct {
+	серебро   ИСтатПарам
+	timeCount string
+}
+
+// NewBankMode -- возвращает новый *BankMode
+func NewBankMode(конт ИБотКонтекст) *BankMode {
+	return &BankMode{
+		серебро: stat_param.НовСтатПарам("серебро"),
+	}
+}
+
+// Серебро -- возвращает объект серебра режима
+func (сам *BankMode) Серебро() ИСтатПарам {
+	return сам.серебро
+}
+
+// ВремяСделать -- возвращает временя производства режима
+func (сам *BankMode) ВремяСделать() string {
+	return сам.timeCount
+}
+
+// ВремяСделатьУст -- устанавливает время производства режима
+func (сам *BankMode) ВремяСделатьУст(val string) {
+	сам.timeCount = val
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff