Sfoglia il codice sorgente

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

SVI 1 anno fa
parent
commit
e26ad98b33
51 ha cambiato i file con 136 aggiunte e 1844 eliminazioni
  1. 30 0
      app/lev0/alias/alias.go
  2. 9 0
      app/lev0/alias/msec.go
  3. 45 0
      app/lev0/cons/cons.go
  4. 1 1
      app/lev0/types/iarena.go
  5. 1 1
      app/lev0/types/iarena_ctx.go
  6. 1 1
      app/lev0/types/iarena_state.go
  7. 1 1
      app/lev0/types/iparser_hour.go
  8. 1 1
      app/lev0/types/iparser_min.go
  9. 1 1
      app/lev0/types/iparser_sec.go
  10. 1 1
      app/lev0/types/iparser_simple.go
  11. 1 1
      app/lev1/product/parser_time/parse_hour/parse_hour.go
  12. 1 1
      app/lev1/product/parser_time/parse_min/parse_min.go
  13. 1 1
      app/lev1/product/parser_time/parse_sec/parse_sec.go
  14. 1 1
      app/lev1/product/parser_time/parser_time.go
  15. 1 1
      app/lev2/arena/arena.go
  16. 2 2
      app/lev2/arena/arena_context/arena_context.go
  17. 1 1
      app/lev2/arena/arena_context/arena_state/arena_state.go
  18. 1 1
      app/lev2/arena/down_time/down_time.go
  19. 1 1
      app/lev2/arena_angar/arena_angar.go
  20. 1 1
      app/lev2/arena_angar/fuel_attack/fuel_attack.go
  21. 1 1
      app/lev2/arena_arsenal/arena_arsenal.go
  22. 1 1
      app/lev2/arena_bank/arena_bank.go
  23. 2 2
      app/lev2/arena_base/arena_base.go
  24. 1 1
      app/lev2/arena_battle/battle_wait/battle_wait.go
  25. 1 1
      app/lev2/arena_battle/battle_worker/battle_worker/shot/damage/damage.go
  26. 1 1
      app/lev2/arena_battle/battle_worker/battle_worker/shottime/shottime.go
  27. 1 1
      app/lev2/arena_convoy/arena_convoy.go
  28. 1 1
      app/lev2/arena_death/battle_wait/battle_wait.go
  29. 1 1
      app/lev2/arena_death/death_worker/death_on/shot/damage/damage.go
  30. 3 4
      app/lev2/arena_death/death_worker/death_on/shottime/shottime.go
  31. 1 1
      app/lev2/arena_division/div_war/div_war.go
  32. 1 1
      app/lev2/arena_division/div_war/div_war_on/shot/damage/damage.go
  33. 1 1
      app/lev2/arena_division/div_war/div_war_on/shot/shot.go
  34. 3 3
      app/lev2/arena_division/div_war/div_war_on/shot_time/shot_time.go
  35. 1 1
      app/lev2/arena_division/divwar/divwar.go
  36. 1 1
      app/lev2/arena_market/arena_market.go
  37. 1 1
      app/lev2/arena_masters/arena_masters.go
  38. 1 1
      app/lev2/arena_mine/arena_mine.go
  39. 2 2
      app/lev2/arena_polygon/arena_polygon.go
  40. 0 663
      app/lev3/bot/angar/base/arsenal/arsenal.go
  41. 0 321
      app/lev3/bot/angar/base/bank/bank.go
  42. 0 38
      app/lev3/bot/angar/base/bank/bank_mode/bank_mode.go
  43. 2 2
      app/lev3/bot/angar/base/base.go
  44. 0 355
      app/lev3/bot/angar/base/fuel/fuel.go
  45. 0 414
      app/lev3/bot/angar/base/market/market.go
  46. 1 1
      app/lev3/bot/angar/base/mine/mine.go
  47. 2 2
      app/lev3/bot/angar/base/polygon/polygon.go
  48. 1 1
      app/lev3/bot/angar/division/div_war/div_war.go
  49. 1 1
      app/lev3/bot/angar/division/div_war/div_war_on/shot/shot.go
  50. 1 1
      app/lev3/bot/angar/division/divwar/divwar.go
  51. 1 1
      app/lev3/bot/angar/stat_convoy_fixme/stat_convoy_fixme.go

+ 30 - 0
app/lev0/alias/alias.go

@@ -3,3 +3,33 @@ package alias
 
 // АБотНомер -- номер бота
 type АБотНомер int
+
+// ADAmage -- урон от выстрела
+type Урон int
+
+// ОкноИмя -- имя окно показа
+type ОкноИмя string
+
+// Время -- строковый тип количества времени
+type Время string
+
+// Час -- количество часов
+type Час uint
+
+// Мин -- количество минут
+type Мин uint
+
+// Сек -- количество секунд
+type Сек uint
+
+// АренаИмя -- имя арены
+type АренаИмя string
+
+// АренаСостояние -- состояние арены (не существует, апгрейд, ожидание, работа)
+type АренаСостояние string
+
+// АренаРаботаИмя -- имя текущей работы арены (серебро-1, серебро-3, зависит от выбранного режима)
+type АренаРаботаИмя string
+
+// АренаРежимНомер -- номер режима арены (1/2/...)
+type АренаРежимНомер int

+ 9 - 0
app/lev0/alias/msec.go

@@ -0,0 +1,9 @@
+package alias
+
+// МилСек -- время в миллисекундах
+type МилСек uint
+
+// Сек -- возвращает полное число секунд
+func (сам МилСек) Сек() Сек {
+	return Сек(сам / 1_000)
+}

+ 45 - 0
app/lev0/cons/cons.go

@@ -0,0 +1,45 @@
+package cons
+
+import "wartank/app/lev0/alias"
+
+/*
+	Содержит константы для работы
+*/
+
+const ( // Задержки для работы
+	Delay100   = 100 // Задержка в миллисекундах для битвы, сражения, войны
+	Delay500   = 500 // Задержка в миллисекундах для сражения (100 мсек -- слишком часто)
+	СамИмя     = "WarTank"
+	ТопливоМин = 299 // Минимальное количество топлива
+)
+
+const ( // Режимы работы
+	РежимНеСуществует = alias.АренаСостояние("режим_не_существует")
+	РежимАпгрейд      = alias.АренаСостояние("режим_апгрейд")
+	РежимОжидание     = alias.АренаСостояние("режим_ожидание")
+	РежимРабота       = alias.АренаСостояние("режим_работа")
+)
+
+// const (
+// 	TypeMsgResource = 1 // Тип сообщения -- ресурсы
+// 	TypeMsgArsenal  = 2 // Тип сообщения ресурсы
+// )
+
+// const (
+// 	WinDefault alias.ОкноИмя = "winDefault"
+
+// 	WinConfig                 alias.ОкноИмя = "winConfig"                 // Режим конфигурирования
+// 	WinConfigServer           alias.ОкноИмя = "winConfigServer"           // Режим конфигуррования сервера
+// 	WinConfigServerHostInput  alias.ОкноИмя = "winConfigServerHostInput"  // Режим ввода хоста сервера
+// 	WinConfigServerLoginInput alias.ОкноИмя = "winConfigServerLoginInput" // Режим ввода логина на сервер
+// 	WinConfigServerPassInput  alias.ОкноИмя = "winConfigServerPassInput"  // Режим ввода пароля входа на сервер
+
+// 	WinServerConnect alias.ОкноИмя = "winServerConnect" // Режим подключения к серверу
+// 	WinServerLogin   alias.ОкноИмя = "winServerLogin"   // Режим логина на сервер
+
+// 	WinBotsMenu     alias.ОкноИмя = "winBotsMenu"     // Режим показа меню бото-фермы
+// 	WinBotsAddLogin alias.ОкноИмя = "winBotsAddLogin" // Добавление логина бота на бото-ферму
+// 	WinBotsAddPass  alias.ОкноИмя = "winBotsAddPass"  // Добавление пароля бота на бото-ферму
+// 	WinBotsList     alias.ОкноИмя = "winBotsLits"     // Список ботов на бото-ферме
+// 	WinBotShow      alias.ОкноИмя = "winBotShow"      // Показать состояние бота
+// )

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИАрена -- интерфейс арены
 type ИАрена interface {

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

@@ -2,7 +2,7 @@ package types
 
 import (
 	"context"
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 // ИАренаКонтекст -- контекст игровой арены (ангар, база, битва и т.п.)

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИАренаСостояние -- состояние арены
 type ИАренаСостояние interface {

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИПарсерЧас --парсер часов
 type ИПарсерЧас interface {

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИПарсерМин -- парсер минут
 type ИПарсерМин interface {

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИПарсерСек -- парсер секунд
 type ИПарсерСек interface {

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

@@ -1,6 +1,6 @@
 package types
 
-import "wartank/pkg/alias"
+import "wartank/app/lev0/alias"
 
 // ИПарсерПростой -- базовый интерфейс парсеру времени
 type ИПарсерПростой interface {

+ 1 - 1
app/lev1/product/parser_time/parse_hour/parse_hour.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"strconv"
 	"sync"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 )
 
 /*

+ 1 - 1
app/lev1/product/parser_time/parse_min/parse_min.go

@@ -5,8 +5,8 @@ import (
 	"strconv"
 	"sync"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 )
 
 /*

+ 1 - 1
app/lev1/product/parser_time/parse_sec/parse_sec.go

@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"strconv"
 	"sync"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 )
 
 /*

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

@@ -5,11 +5,11 @@ import (
 	"strings"
 	"sync"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/product/parser_time/parse_hour"
 	"wartank/app/lev1/product/parser_time/parse_min"
 	"wartank/app/lev1/product/parser_time/parse_sec"
-	"wartank/pkg/alias"
 )
 
 /*

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

@@ -5,12 +5,12 @@ import (
 	"fmt"
 	"log"
 	"sync"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena/arena_context"
 	"wartank/app/lev2/arena/arena_net"
 	"wartank/app/lev2/arena/arena_string"
 	"wartank/app/lev2/arena/down_time"
-	"wartank/pkg/alias"
 	. "wartank/pkg/helpers"
 )
 

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

@@ -4,10 +4,10 @@ package arena_context
 import (
 	"context"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/app/lev2/arena/arena_context/arena_state"
-	"wartank/pkg/alias"
 	"wartank/app/lev1/web_log"
+	"wartank/app/lev2/arena/arena_context/arena_state"
 	. "wartank/pkg/helpers"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"

+ 1 - 1
app/lev2/arena/arena_context/arena_state/arena_state.go

@@ -3,8 +3,8 @@ package arena_state
 
 import (
 	"sync"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 )
 
 // СценаСостояние -- состояние сцены

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

@@ -8,9 +8,9 @@ import (
 	// "log"
 	"sync"
 	"time"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/product/parser_time"
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/safe_bool"
 	"wartank/pkg/kernel/safe_int"
 )

+ 1 - 1
app/lev2/arena_angar/arena_angar.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
@@ -19,7 +20,6 @@ import (
 	"wartank/app/lev2/arena_upgrade"
 	"wartank/app/lev3/bot/bot_net/bot_net_stat"
 	"wartank/app/lev3/bot/bot_stat/stat_resurs"
-	"wartank/pkg/alias"
 )
 
 /*

+ 1 - 1
app/lev2/arena_angar/fuel_attack/fuel_attack.go

@@ -8,9 +8,9 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/cons"
 )
 
 // ТопливоБой -- объект боя на топливе

+ 1 - 1
app/lev2/arena_arsenal/arena_arsenal.go

@@ -11,8 +11,8 @@ import (
 
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
 	"wartank/app/lev1/web_log"
+	"wartank/app/lev2/arena"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 )

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

@@ -7,11 +7,11 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_bank/bank_mode"
-	"wartank/pkg/alias"
 )
 
 /*

+ 2 - 2
app/lev2/arena_base/arena_base.go

@@ -9,6 +9,8 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_arsenal"
@@ -18,8 +20,6 @@ import (
 	"wartank/app/lev2/arena_market"
 	"wartank/app/lev2/arena_mine"
 	"wartank/app/lev2/arena_polygon"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
 )
 
 /*

+ 1 - 1
app/lev2/arena_battle/battle_wait/battle_wait.go

@@ -5,9 +5,9 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 // СражениеОжидание -- ожидатель начала битвы

+ 1 - 1
app/lev2/arena_battle/battle_worker/battle_worker/shot/damage/damage.go

@@ -3,7 +3,7 @@ package damage
 import (
 	"sync"
 
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 /*

+ 1 - 1
app/lev2/arena_battle/battle_worker/battle_worker/shottime/shottime.go

@@ -5,7 +5,7 @@ import (
 
 	"github.com/sirupsen/logrus"
 
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 /*

+ 1 - 1
app/lev2/arena_convoy/arena_convoy.go

@@ -7,10 +7,10 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 /*

+ 1 - 1
app/lev2/arena_death/battle_wait/battle_wait.go

@@ -5,9 +5,9 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev2/arena_death/death_worker/death_on/shot/damage/damage.go

@@ -3,7 +3,7 @@ package damage
 import (
 	"sync"
 
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 /*

+ 3 - 4
app/lev2/arena_death/death_worker/death_on/shottime/shottime.go

@@ -1,11 +1,10 @@
 package shottime
 
 import (
+	"log"
 	"sync"
 
-	"github.com/sirupsen/logrus"
-
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 /*
@@ -69,7 +68,7 @@ func (сам *ShotTime) Set(val alias.МилСек) {
 	сам.block.Lock()
 	defer сам.block.Unlock()
 	if val > 10_0000 {
-		logrus.WithField("val", val).Error("ShotTime.Set(): отрицательное значение")
+		log.Printf("ShotTime.Set(): отрицательное значение, val=%v", val)
 		return
 	}
 	сам.val = val

+ 1 - 1
app/lev2/arena_division/div_war/div_war.go

@@ -7,13 +7,13 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_division/div_war/div_war_net"
 	"wartank/app/lev2/arena_division/div_war/div_war_on"
 	"wartank/app/lev2/arena_division/div_war/div_war_on/div_war_sound"
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev2/arena_division/div_war/div_war_on/shot/damage/damage.go

@@ -3,7 +3,7 @@ package damage
 import (
 	"sync"
 
-	"wartank/pkg/alias"
+	"wartank/app/lev0/alias"
 )
 
 /*

+ 1 - 1
app/lev2/arena_division/div_war/div_war_on/shot/shot.go

@@ -11,8 +11,8 @@ import (
 	"wartank/app/lev2/arena_division/div_war/div_war_on/shot/damage"
 	"wartank/app/lev2/arena_division/div_war/div_war_on/shot_time"
 	// "wartank/internal/components/sound"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/safe_bool"
 )
 

+ 3 - 3
app/lev2/arena_division/div_war/div_war_on/shot_time/shot_time.go

@@ -1,10 +1,10 @@
 package shot_time
 
 import (
+	"log"
 	"sync"
-	"wartank/pkg/alias"
 
-	"github.com/sirupsen/logrus"
+	"wartank/app/lev0/alias"
 )
 
 /*
@@ -68,7 +68,7 @@ func (сам *ShotTime) Set(val alias.МилСек) {
 	сам.block.Lock()
 	defer сам.block.Unlock()
 	if val > 500_000 {
-		logrus.WithField("val", val).Error("ShotTime.Set(): слишком большое значение")
+		log.Printf("ShotTime.Set(): слишком большое значение, val=%v\n", val)
 		return
 	}
 	сам.val = val

+ 1 - 1
app/lev2/arena_division/divwar/divwar.go

@@ -7,13 +7,13 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_division/div_war/div_war_net"
 	"wartank/app/lev2/arena_division/div_war/div_war_on"
 	"wartank/app/lev2/arena_division/div_war/div_war_on/div_war_sound"
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev2/arena_market/arena_market.go

@@ -7,10 +7,10 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 // АренаРынок -- объект рынка

+ 1 - 1
app/lev2/arena_masters/arena_masters.go

@@ -5,9 +5,9 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 )

+ 1 - 1
app/lev2/arena_mine/arena_mine.go

@@ -8,10 +8,10 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 // АренаШахта -- объект шахты на базе

+ 2 - 2
app/lev2/arena_polygon/arena_polygon.go

@@ -6,11 +6,11 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_int"

+ 0 - 663
app/lev3/bot/angar/base/arsenal/arsenal.go

@@ -1,663 +0,0 @@
-// package arsenal -- объект оружейной на базе
-package arsenal
-
-import (
-	"context"
-	"fmt"
-	"log"
-	"strconv"
-	"strings"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev1/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)
-	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
-}

+ 0 - 321
app/lev3/bot/angar/base/bank/bank.go

@@ -1,321 +0,0 @@
-package bank
-
-import (
-	"fmt"
-	"log"
-	"strconv"
-	"strings"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-	"wartank/app/lev2/arena_bank/bank_mode"
-	"wartank/pkg/alias"
-)
-
-/*
-	Предоставляет объект банка на базе
-*/
-
-// Банк -- объект банка на базе
-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.НовАрена(конт, аренаКонфиг)
-	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
-}

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

@@ -1,38 +0,0 @@
-package bank_mode
-
-import (
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/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
-}

+ 2 - 2
app/lev3/bot/angar/base/base.go

@@ -9,6 +9,8 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_arsenal"
@@ -18,8 +20,6 @@ import (
 	"wartank/app/lev2/arena_market"
 	"wartank/app/lev2/arena_mine"
 	"wartank/app/lev2/arena_polygon"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
 )
 
 /*

+ 0 - 355
app/lev3/bot/angar/base/fuel/fuel.go

@@ -1,355 +0,0 @@
-// package fuel -- склад топлива
-package fuel
-
-import (
-	"context"
-	"log"
-	"strconv"
-	"strings"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-)
-
-// СкладТоплива -- склад топлива
-type СкладТоплива struct {
-	ИАрена
-	бот          ИБот
-	база         ИБаза
-	топливо      ИСтатПарам
-	уровень      ИСтатПарам
-	продуктВремя string          // Сколько осталось времени прямо сейчас
-	кнт          context.Context // контекст шахты
-	фнОтмена     func()          // Функция отмены шахты
-}
-
-// НовТопливо -- возвращает новой склад топлива
-func НовСкладТоплива(конт ИБотКонтекст, база ИБаза) (*СкладТоплива, error) {
-	кнт, фнОтмена := context.WithCancel(база.Контекст())
-	сам := &СкладТоплива{
-		бот:      база.Бот(),
-		база:     база,
-		топливо:  stat_param.НовСтатПарам("топливо"),
-		кнт:      кнт,
-		фнОтмена: фнОтмена,
-		уровень:  stat_param.НовСтатПарам("уровень"), // FIXME: вынести на уровень арены
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         база.Бот(),
-		АренаИмя_:    "Склад_топлива",
-		СтрКонтроль_: `<span class="green2">Склад топлива - `,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/fuelStore",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	_ = ИАренаТопливо(сам)
-	return сам, nil
-}
-
-func (сам *СкладТоплива) Пуск() {
-	go сам.пуск()
-}
-
-// пуск -- запускает обработку шахты
-func (сам *СкладТоплива) пуск() {
-	time.Sleep(time.Second * 3)
-	фнРабота := func() {
-		defer time.Sleep(time.Minute * 30)
-		for !сам.уровеньОбновить() {
-		}
-		сам.ускорениеПровер()
-		сам.количествоПолучить()
-	}
-	for {
-		select {
-		case <-сам.кнт.Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-		default:
-			log.Printf("СкладТоплива.пуск()\n")
-			фнРабота()
-		}
-	}
-}
-
-// Проверяет количество продукта в шахте
-func (сам *СкладТоплива) количествоПолучить() {
-	var (
-		strOut      string
-		еслиНайдено bool
-	)
-	lstMine := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	/*
-		<img class="ico vm" src="/images/icons/fuel.png?2" alt="Топливо" title="Топливо"> 720
-	*/
-	for _, strOut = range lstMine {
-		if strings.Contains(strOut, `src=" alt="Топливо" title="Топливо"`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	_число := strings.TrimPrefix(strOut, `<img class="ico vm" src="/images/icons/fuel.png?2" alt="Топливо" title="Топливо"> `)
-	iNum, err := strconv.Atoi(_число)
-	if err != nil {
-		log.Printf("СкладТоплива.количествоПолучить(): кол-во топлива (%v) не число, err=\n\t%v\n", _число, err)
-		return
-	}
-	сам.топливо.Уст(iNum)
-}
-
-// Проверяет ускорение строительства
-func (сам *СкладТоплива) ускорениеПровер() {
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	// <span class="green2">Склад топлива -
-	var (
-		еслиНайти = false
-		стр       string
-	)
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		return
-	}
-}
-
-// Обновляет текущий уровень шахты (может быть не построена)
-func (сам *СкладТоплива) уровеньОбновить() bool {
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	// <span class="green2">Склад топлива -
-	var (
-		еслиНайти = false
-		стр       = ""
-	)
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		return false
-	}
-	// <span class="green2">Склад топлива - 0</span><br/>
-	_стр := strings.TrimPrefix(стр, `<span class="green2">Склад топлива - `)
-	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
-	иУровень, ош := strconv.Atoi(_стр)
-	if ош != nil {
-		log.Printf("СкладТоплива.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
-		return false
-	}
-	сам.уровень.Уст(иУровень)
-	switch иУровень {
-	case 0: // склад топлива надо построить
-		for !сам.построить() {
-		}
-	default: // Может можно проапгрейдить
-		счёт := 5
-		for !сам.проапгрейдить() {
-			счёт--
-			if счёт == 0 {
-				break
-			}
-		}
-	}
-
-	return true
-}
-
-// Пытается проапгрейдить топливный склад
-func (сам *СкладТоплива) проапгрейдить() bool {
-	time.Sleep(time.Millisecond * 1000)
-	var (
-		еслиНайти = false
-		списСтр   []string
-		стр       = ""
-	)
-	фнКупить := func() bool {
-		defer time.Sleep(time.Millisecond * 1000)
-		списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage")
-		for _, стр = range списСтр {
-			// <a class="simple-but border mb5" href="FuelStorage?5-1.ILinkListener-upgradeLink-link">
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			return true
-		}
-		// Пробуем улучшить шахту
-		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-		_стр = strings.TrimSuffix(_стр, "\">")
-		// https://wartank.ru/building-upgrade/FuelStorage?4-1.ILinkListener-upgradeLink-link
-		// <a class="simple-but border mb5" href="FuelStorage?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 // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++СкладТоплива.проапгрейдить().фнКупить(): покупка склада топлива прошла\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 !еслиНайти {
-			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>") {
-				log.Printf("СкладТоплива.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++СкладТоплива.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнКомплекс := func() {
-		count := 5
-		for count > 0 {
-			if фнКупить() {
-				if фнПодтверждение() {
-					break
-				}
-			}
-			count--
-		}
-	}
-	фнКомплекс()
-	return true
-}
-
-// Строит шахту при нулевом уровне
-func (сам *СкладТоплива) построить() bool {
-	time.Sleep(time.Millisecond * 1000)
-	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/FuelStorage"><span><span>Построить</span></span></a></td>
-	var (
-		еслиНайти = false
-		списСтр   []string
-		стр       = ""
-	)
-	фнКупить := func() bool {
-		defer time.Sleep(time.Millisecond * 1000)
-		списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage")
-		for _, стр = range списСтр {
-			// <a class="simple-but border mb5" href="FuelStorage?71-1.ILinkListener-upgradeLink-link">
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			return true
-		}
-		// Пробуем построить шахту
-		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-		_стр = strings.TrimSuffix(_стр, "\">")
-		// https://wartank.ru/building-upgrade/FuelStorage?49-1.ILinkListener-upgradeLink-link
-		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
-		// https://wartank.ru/building-upgrade/FuelStorage?72-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 // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++СкладТоплива.построить().фнКупить(): покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнПодтверждение := func() bool {
-		for _, стр = range списСтр {
-			// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?5-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
-			if strings.Contains(стр, `ILinkListener-confirmLink`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			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?4-1.ILinkListener-confirmLink
-		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
-		ссылка := "https://wartank.ru" + _стр
-		списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
-		// Проверить, что постройка состоялась
-		for _, стр := range списСтр {
-			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
-				log.Printf("СкладТоплива.построить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++СкладТоплива.построить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнКомплекс := func() {
-		for {
-			if фнКупить() {
-				if фнПодтверждение() {
-					break
-				}
-			}
-		}
-	}
-	фнКомплекс()
-	return true
-}
-
-// Уровень -- возвращает уровень топливного склада
-func (сам *СкладТоплива) Уровень() ИСтатПарам {
-	return сам.уровень
-}
-
-// Топливо -- возвращает топливо
-func (сам *СкладТоплива) Топливо() ИСтатПарам {
-	return сам.топливо
-}
-
-// ПродуктКолСейчас -- возвращает кол-во продукта прямо сейчас
-func (сам *СкладТоплива) ПродуктКолСейчас() int {
-	return сам.топливо.Получ()
-}
-
-// ПродуктИмяСейчас -- возвращает имя продукта прямо сейчас
-func (сам *СкладТоплива) ПродуктИмяСейчас() string {
-	return "топливо"
-}
-
-// ПродуктВремяСейчас -- возвращает сколько осталось времени прямо сейчас
-func (сам *СкладТоплива) ПродуктВремяСейчас() string {
-	return сам.продуктВремя
-}

+ 0 - 414
app/lev3/bot/angar/base/market/market.go

@@ -1,414 +0,0 @@
-// package market -- объект рынка
-package market
-
-import (
-	"log"
-	"strconv"
-	"strings"
-	"time"
-
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
-)
-
-// Рынок -- объект рынка
-type Рынок struct {
-	ИАрена
-	бот     ИБот
-	уровень ИСтатПарам
-}
-
-// НовРынок -- возвращает новый рынок
-func НовРынок(конт ИБотКонтекст, база ИБаза) *Рынок {
-	сам := &Рынок{
-		бот:     база.Бот(),
-		уровень: stat_param.НовСтатПарам("уровень"), // FIXME: вынести на уровень арены
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         база.Бот(),
-		АренаИмя_:    "Рынок",
-		СтрКонтроль_: `<title>Рынок</title>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/market",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	return сам
-}
-
-// Пуск -- запускает всю работу рынка в отдельном потоке
-func (сам *Рынок) Пуск() error {
-	go сам.пуск()
-	return nil
-}
-
-// выполняет опрос рынка базы, должен работать как горутина
-func (сам *Рынок) пуск() {
-	time.Sleep(time.Second * 7)
-	фнРабота := func() {
-		defer time.Sleep(time.Minute * 30)
-		for !сам.уровеньОбновить() {
-		}
-		сам.ускорениеПровер()
-		сам.проверОжидание()
-		for сам.купитьЗолото() {
-		}
-	}
-	for {
-		select {
-		case <-сам.бот.Контекст().Done():
-			return
-		default:
-			фнРабота()
-		}
-	}
-}
-
-// Проверяет ускорение строительства
-func (сам *Рынок) ускорениеПровер() {
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	// <span class="green2">Склад топлива -
-	var (
-		еслиНайти = false
-		стр       string
-	)
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		return
-	}
-}
-
-// Обновляет текущий уровень рынка (может быть не построен)
-func (сам *Рынок) уровеньОбновить() bool {
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	// <span class="green2">Рынок -
-	var (
-		еслиНайти = false
-		стр       = ""
-	)
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Рынок -`) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		return false
-	}
-	// <span class="green2">Рынок - 0</span><br/>
-	_стр := strings.TrimPrefix(стр, `<span class="green2">Рынок - `)
-	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
-	иУровень, ош := strconv.Atoi(_стр)
-	if ош != nil {
-		log.Printf("Рынок.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
-		return false
-	}
-	сам.уровень.Уст(иУровень)
-	switch иУровень {
-	case 0: // рынок надо построить
-		for !сам.построить() {
-		}
-	default: // Может можно проапгрейдить
-		счёт := 5
-		for !сам.проапгрейдить() {
-			счёт--
-			if счёт >= 0 {
-				break
-			}
-		}
-	}
-
-	return true
-}
-
-// Строит шахту при нулевом уровне
-func (сам *Рынок) построить() bool {
-	time.Sleep(time.Millisecond * 1000)
-	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Market"><span><span>Построить</span></span></a></td>
-	var (
-		еслиНайти = false
-		списСтр   []string
-		стр       = ""
-	)
-	фнКупить := func() bool {
-		defer time.Sleep(time.Millisecond * 1000)
-		списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Market")
-		for _, стр = range списСтр {
-			// <a class="simple-but border mb5" href="Market?19-1.ILinkListener-upgradeLink-link">
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			return true
-		}
-		// Пробуем построить шахту
-		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-		_стр = strings.TrimSuffix(_стр, "\">")
-		// https://wartank.ru/building-upgrade/Market?18-1.ILinkListener-upgradeLink-link
-		// <a class="simple-but border mb5" href="Market?19-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 // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++Рынок.построить().фнКупить(): покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнПодтверждение := func() bool {
-		for _, стр = range списСтр {
-			// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?21-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
-			if strings.Contains(стр, `ILinkListener-confirmLink`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			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?20-1.ILinkListener-confirmLink
-		ссылка := "https://wartank.ru" + _стр
-		списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
-		// Проверить, что постройка состоялась
-		for _, стр := range списСтр {
-			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
-				log.Printf("Рынок.построить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++Рынок.построить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнКомплекс := func() {
-		for {
-			if фнКупить() {
-				if фнПодтверждение() {
-					break
-				}
-			}
-		}
-	}
-	фнКомплекс()
-	return true
-}
-
-// Пытается проапгрейдить топливный склад
-func (сам *Рынок) проапгрейдить() bool {
-	time.Sleep(time.Millisecond * 1000)
-	var (
-		еслиНайти = false
-		списСтр   []string
-		стр       = ""
-	)
-	фнКупить := func() bool {
-		defer time.Sleep(time.Millisecond * 1000)
-		списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Market")
-		for _, стр = range списСтр {
-			// <a class="simple-but border mb5" href="Market?5-1.ILinkListener-upgradeLink-link">
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			return true
-		}
-		// Пробуем улучшить шахту
-		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-		_стр = strings.TrimSuffix(_стр, "\">")
-		// https://wartank.ru/building-upgrade/Market?4-1.ILinkListener-upgradeLink-link
-		// <a class="simple-but border mb5" href="Market?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 // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++Рынок.проапгрейдить().фнКупить(): покупка рынка прошла\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 !еслиНайти {
-			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>") {
-				log.Printf("Рынок.проапгрейдить().фнПодтверждение(): подтверждение покупка рынка не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false // Покупка не оплачена
-			}
-		}
-		log.Printf("+++++Рынок.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива прошла\n")
-		return true
-	}
-
-	фнКомплекс := func() {
-		count := 5
-		for count > 0 {
-			if фнКупить() {
-				if фнПодтверждение() {
-					break
-				}
-			}
-			count--
-		}
-	}
-	фнКомплекс()
-	return true
-}
-
-// Проверяет  время ожидания рынка
-func (сам *Рынок) проверОжидание() {
-	var (
-		strOut      string
-		еслиНайдено bool
-	)
-	// countDown := сам.CountDown().Get()
-	фнЕслиСеребро := func() bool { // Найти счётчик цены серебра
-		сам.Обновить()
-		еслиНайдено := false
-		lstMarket := сам.СписПолучить()
-		for _, strOut = range lstMarket {
-			if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if еслиНайдено {
-			lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
-			strSilver := lstSilver[1]
-			switch strSilver {
-			case "10", "50", "100", "500":
-				return true
-			default:
-				серебро := сам.бот.Ангар().СереброВсего()
-				if серебро.Получ() > 1_000_000 {
-					return true
-				}
-				return false
-			}
-		}
-		return false
-	}
-
-	fnGetCountDown := func() { // Искать счётчик времени
-		lstMarket := сам.СписПолучить()
-		// Найти счётчик времени
-		for _, strOut = range lstMarket {
-			if strings.Contains(strOut, `Минимальная цена через `) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return // Минимальная цена
-		}
-		lstTime := strings.Split(strOut, `Минимальная цена через `)
-		strTime := lstTime[1]
-		if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-			// log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err)
-			return // Возможно минимальная цена
-		}
-	}
-	if фнЕслиСеребро() {
-		return
-	}
-	fnGetCountDown()
-}
-
-// Проверяет рынок на режим покупки
-func (сам *Рынок) купитьЗолото() bool {
-	var (
-		ind         int
-		еслиНайдено bool
-		strOut      string
-		lstMarket   = сам.СписПолучить()
-		strSilver   string
-	)
-	for ind, strOut = range lstMarket {
-		if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено { // Не найдена продажа золота за серебро
-		return false
-	}
-	lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
-	strSilver = lstSilver[1]
-	серебро := сам.бот.Ангар().СереброВсего().Получ()
-	еслиКупить := false
-	switch strSilver {
-	case "10", "50", "100", "500": // Допустимые суммы трат
-		еслиКупить = true
-	case "1000": // Если стоит тысяча серебра
-		if серебро > 500_000 { // Если серебра больше полумиллиона -- покупаем
-			еслиКупить = true
-		}
-	case "5000", "10000": // Если большая сумма -- можно купить и больше
-		if серебро > 1_000_000 {
-			еслиКупить = true
-		}
-	}
-	if !еслиКупить {
-		return false
-	}
-	ind -= 15
-	strOut = lstMarket[ind]
-	lstLink := strings.Split(strOut, `<a class="simple-but border mb5" href="`)
-	if len(lstLink) < 2 {
-		return false
-	}
-	strLink := lstLink[1]
-	lstLink = strings.Split(strLink, `"><span><span>Получить `)
-	strLink = "https://wartank.ru/" + lstLink[0]
-	lstMarket, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err)
-		return true
-	}
-	for _, strOut = range lstMarket {
-		if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
-			// log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err)
-			return false
-		}
-	}
-	if err = сам.СтрОбновить(lstMarket); err != nil {
-		// log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err)
-		return true
-	}
-	return true
-}

+ 1 - 1
app/lev3/bot/angar/base/mine/mine.go

@@ -8,10 +8,10 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 // Шахта -- объект шахты на базе

+ 2 - 2
app/lev3/bot/angar/base/polygon/polygon.go

@@ -6,11 +6,11 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
+	"wartank/app/lev0/cons"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
 	"wartank/pkg/kernel/kernel_log"
 	. "wartank/pkg/kernel/kernel_types"
 	"wartank/pkg/kernel/safe_int"

+ 1 - 1
app/lev3/bot/angar/division/div_war/div_war.go

@@ -7,13 +7,13 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_division/div_war/div_war_net"
 	"wartank/app/lev2/arena_division/div_war/div_war_on"
 	"wartank/app/lev2/arena_division/div_war/div_war_on/div_war_sound"
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev3/bot/angar/division/div_war/div_war_on/shot/shot.go

@@ -13,8 +13,8 @@ import (
 	"wartank/app/lev2/arena_division/div_war/div_war_on/shot_time"
 
 	// "wartank/internal/components/sound"
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
-	"wartank/pkg/alias"
 	"wartank/pkg/kernel/safe_bool"
 )
 

+ 1 - 1
app/lev3/bot/angar/division/divwar/divwar.go

@@ -7,13 +7,13 @@ import (
 	"sync"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
 	"wartank/app/lev2/arena_division/div_war/div_war_net"
 	"wartank/app/lev2/arena_division/div_war/div_war_on"
 	"wartank/app/lev2/arena_division/div_war/div_war_on/div_war_sound"
-	"wartank/pkg/alias"
 	. "wartank/pkg/kernel/kernel_types"
 )
 

+ 1 - 1
app/lev3/bot/angar/stat_convoy_fixme/stat_convoy_fixme.go

@@ -7,10 +7,10 @@ import (
 	"strings"
 	"time"
 
+	"wartank/app/lev0/alias"
 	. "wartank/app/lev0/types"
 	"wartank/app/lev1/stat_param"
 	"wartank/app/lev2/arena"
-	"wartank/pkg/alias"
 )
 
 /*