Procházet zdrojové kódy

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

SVI před 1 rokem
rodič
revize
d928886cde

+ 0 - 841
app/lev3/bot/angar/base/mine/mine.go

@@ -1,841 +0,0 @@
-// package mine -- объект шахты на базе
-package mine
-
-import (
-	"context"
-	"fmt"
-	"strconv"
-	"strings"
-	"time"
-
-	"wartank/app/lev0/alias"
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-)
-
-// Шахта -- объект шахты на базе
-type Шахта struct {
-	ИАрена
-	лог          ИВебЛог
-	бот          ИБот
-	база         ИАренаБаза
-	руда         ИСтатПарам
-	железо       ИСтатПарам
-	сталь        ИСтатПарам
-	свинец       ИСтатПарам
-	уровень      ИСтатПарам
-	продуктИмя   string          // Что сейчас делается
-	продуктКол   ИСтатПарам      // Сколько делается прямо сейчас
-	продуктВремя string          // Сколько осталось времени прямо сейчас
-	кнт          context.Context // контекст шахты
-	фнОтмена     func()          // Функция отмены шахты
-}
-
-// НовШахта -- возвращает новый *Mine
-func НовШахта(конт ИБотКонтекст, база ИАренаБаза) (ИАренаШахта, error) {
-	кнт, фнОтмена := context.WithCancel(база.Контекст())
-	сам := &Шахта{
-		бот:        база.Бот(),
-		база:       база,
-		руда:       stat_param.НовСтатПарам("руда"),
-		железо:     stat_param.НовСтатПарам("железо"),
-		сталь:      stat_param.НовСтатПарам("сталь"),
-		свинец:     stat_param.НовСтатПарам("свинец"),
-		продуктКол: stat_param.НовСтатПарам("кол-во"),
-		уровень:    stat_param.НовСтатПарам("уровень"),
-		кнт:        кнт,
-		фнОтмена:   фнОтмена,
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         сам.бот,
-		АренаИмя_:    "Шахта",
-		СтрКонтроль_: `<span class="green2">Руда</span><br/>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/production/Mine",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	сам.лог = сам.ВебЛог()
-	go сам.пуск()
-	сам.лог.ОтклВывод()
-	сам.лог.Добавить("Шахта.НовШахта(): бот=%q\n", сам.бот.Имя())
-	return сам, nil
-}
-
-// пуск -- запускает обработку шахты
-func (сам *Шахта) пуск() {
-	фнРабота := func() {
-		defer func() {
-			for сам.ВремяОстат().ПолучМилСек() > 0 {
-				time.Sleep(time.Second * 5)
-			}
-		}()
-		сам.лог.Добавить("Шахта.пуск().фнРабота(): бот=%q\n", сам.бот.Имя())
-		{ // Построить
-			счёт := 5
-			for счёт > 0 {
-				еcлиНет := сам.построить()
-				if еcлиНет {
-					break
-				}
-				счёт--
-			}
-		}
-		{ // Забрать из шахты
-			счёт := 5
-			for счёт > 0 { // Забрать из шахты
-				if сам.шахтаЗабрать() {
-					break
-				}
-				счёт--
-			}
-		}
-		сам.уровеньОбновить()
-		сам.ускорениеПровер()
-		{ // Проапгрейдить
-			счёт := 5
-			for счёт > 0 {
-				if сам.проапгрейдить() {
-					break
-				}
-				счёт--
-			}
-		}
-		{ // Получить продукцию
-			счёт := 5
-			for счёт > 0 {
-				счёт--
-				еслиПолуч, ош := сам.количествоПолучить()
-				if ош != nil {
-					continue
-				}
-				if еслиПолуч {
-					break
-				}
-			}
-		}
-		сам.Сделать()
-	}
-	for {
-		select {
-		case <-сам.кнт.Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-			фнРабота()
-		default:
-			фнРабота()
-		}
-	}
-}
-
-// Проверяет количество продукта в шахте
-func (сам *Шахта) количествоПолучить() (bool, error) {
-	сам.лог.Добавить("Шахта.количествоПолучить()\n")
-	var (
-		ind         int
-		strOut      string
-		еслиНайдено bool
-		режим       string
-	)
-	lstMine := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	/*
-		Режим (руда-1):
-		<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
-
-		Время (+8 строк):
-		<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
-	*/
-	for ind, strOut = range lstMine {
-		// Руда текущее
-		if strings.Contains(strOut, `src="/images/icons/ore.png?2" alt="ore"`) {
-			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
-			еслиНайдено = true
-			режим = "руда"
-			break
-		}
-		// Железо текущее
-		if strings.Contains(strOut, `src="/images/icons/iron.png?2" alt="iron"`) {
-			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;2</div></td>
-			еслиНайдено = true
-			режим = "железо"
-			break
-		}
-		// Сталь текущее
-		if strings.Contains(strOut, `src="/images/icons/steel.png?2" alt="steel"`) {
-			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="iron"/>&nbsp;2</div></td>
-			еслиНайдено = true
-			режим = "сталь"
-			break
-		}
-		// Свинец текущее
-		if strings.Contains(strOut, `src="/images/icons/plumbum.png?2" alt="plumbum"`) {
-			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="iron"/>&nbsp;2</div></td>
-			еслиНайдено = true
-			режим = "свинец"
-			break
-		}
-	}
-	if !еслиНайдено {
-		сам.лог.Добавить("Шахта.количествоПолучить(): не надо\n")
-		return true, nil
-	}
-	switch режим {
-	case "руда":
-		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
-		_число = strings.TrimSuffix(_число, `</div></td>`)
-		iNum, err := strconv.Atoi(_число)
-		if err != nil {
-			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
-			return false, fmt.Errorf("")
-		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "руда"
-		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во руды = %v\n", iNum)
-	case "железо":
-		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
-		_число = strings.TrimSuffix(_число, `</div></td>`)
-		iNum, err := strconv.Atoi(_число)
-		if err != nil {
-			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
-			return false, fmt.Errorf("")
-		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "железо"
-		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во железа = %v\n", iNum)
-	case "сталь":
-		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
-		_число = strings.TrimSuffix(_число, `</div></td>`)
-		iNum, err := strconv.Atoi(_число)
-		if err != nil {
-			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
-			return false, fmt.Errorf("")
-		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "сталь"
-		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во стали = %v\n", iNum)
-	case "свинец":
-		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="plumbum"/>&nbsp;`)
-		_число = strings.TrimSuffix(_число, `</div></td>`)
-		iNum, err := strconv.Atoi(_число)
-		if err != nil {
-			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
-			return false, fmt.Errorf("")
-		}
-		сам.продуктКол.Уст(iNum)
-		сам.продуктИмя = "свинец"
-		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во свинца = %v\n", iNum)
-	default:
-		сам.лог.Добавить("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
-		return false, fmt.Errorf("")
-	}
-	// <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
-	strTime := lstMine[ind+3]
-	// <td><div class="value-block lh1"><span><span>00:19:53</span></span></div></td>
-	strTime = strings.TrimPrefix(strTime, `<td><div class="value-block lh1"><span><span>`)
-	strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
-	сам.продуктВремя = strTime
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
-	}
-	сам.лог.Добавить("Шахта.количествоПолучить(): время=%q\n", strTime)
-	return true, nil
-}
-
-// Проверяет на забор из шахты
-func (сам *Шахта) шахтаЗабрать() bool {
-	сам.лог.Добавить("Шахта.шахтаЗабрать()\n")
-	var (
-		strOut      string
-		еслиНайдено bool
-	)
-	списШахта := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
-	for _, strOut = range списШахта {
-		if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		сам.лог.Добавить("Шахта.шахтаЗабрать(): не надо\n")
-		return true
-	}
-	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
-	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
-	ссылка := "https://wartank.ru/" + _ссылка
-	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
-	lstBase1 := сам.Сеть().ВебВоркер().Получ(ссылка)
-	if err := сам.СтрОбновить(lstBase1); err != nil {
-		сам.лог.Добавить("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
-		return false
-	}
-	сам.лог.Добавить("Шахта.шахтаЗабрать(): ОК\n")
-	return true
-}
-
-// Проверяет ускорение строительства FIXME: не работает
-func (сам *Шахта) ускорениеПровер() {
-	сам.лог.Добавить("")
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	// <span class="green2">Шахта - 0</span><br/>
-	var (
-		еслиНайти bool
-		стр       string
-	)
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `<span class="green2">Шахта - `) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		сам.лог.Добавить("Шахта.ускорениеПровер(): не надо\n")
-		return
-	}
-	сам.лог.Добавить("Шахта.ускорениеПровер(): надо\n")
-}
-
-// Уровень -- возвращает уровень шахты
-func (сам *Шахта) Уровень() ИСтатПарам {
-	return сам.уровень
-}
-
-// Обновляет текущий уровень шахты (может быть не построена)
-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", стр, ош)
-		return false
-	}
-	сам.уровень.Уст(иУровень)
-	сам.лог.Добавить("Шахта.уровеньОбновить(): уровень=%v\n", иУровень)
-	return true
-}
-
-// Строит шахту при нулевом уровне
-func (сам *Шахта) построить() bool {
-	сам.лог.Добавить("Шахта.построить()\n")
-	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
-	var (
-		еслиНайти = false
-		стр       = ""
-	)
-	списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings")
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `href="building-upgrade/Mine"><span><span>Построить</span></span>`) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		сам.лог.Добавить("Шахта.построить(): не надо\n")
-		return true
-	}
-	// Пробуем построить шахту
-	_стр := strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
-	_стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
-	ссылка := "https://wartank.ru/" + _стр
-	списСтр = сам.Сеть().ВебВоркер().Получ(ссылка)
-	еслиНайти = false
-	// "<a class=\"simple-but border mb5\" href=\"Mine?14-1.ILinkListener-upgradeLink-link\">"
-	for _, стр = range списСтр {
-		if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-			еслиНайти = true
-			break
-		}
-	}
-	if !еслиНайти {
-		сам.лог.Добавить("Шахта.построить(): не найдена команда постройки\n")
-		return true
-	}
-	_стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-	_стр = strings.TrimSuffix(_стр, "\">")
-	// http://wartank.ru/building-upgrade/Mine?16-1.ILinkListener-upgradeLink-link
-	ссылка = "https://wartank.ru/building-upgrade/" + _стр
-	_ = сам.Сеть().ВебВоркер().Получ(ссылка)
-	return true
-}
-
-// Пытается проапгрейдить топливный склад
-func (сам *Шахта) проапгрейдить() bool {
-	сам.лог.Добавить("Шахта.проапгрейдить()\n")
-	var (
-		еслиНайти = false
-		списСтр   []string
-		стр       = ""
-	)
-	фнКупить := func() (bool, error) {
-		defer time.Sleep(time.Millisecond * 1000)
-		списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Mine")
-		for _, стр = range списСтр {
-			// <a class="simple-but border mb5" href="Mine?5-1.ILinkListener-upgradeLink-link">
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				еслиНайти = true
-				break
-			}
-		}
-		if !еслиНайти {
-			сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): не надо\n")
-			return false, nil
-		}
-		// Пробуем улучшить шахту
-		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
-		_стр = strings.TrimSuffix(_стр, "\">")
-		// https://wartank.ru/building-upgrade/Mine?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") {
-				сам.лог.Добавить("ОШИБКА Шахта.проапгрейдить().фнКупить(): покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
-				return false, fmt.Errorf("покупка шахты не прошла") // Покупка не оплачена
-			}
-		}
-		сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): покупка шахты прошла\n")
-		return true, nil
-	}
-
-	фнПодтверждение := 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() {
-		сам.лог.Добавить("Шахта.проапгрейдить().фнКомплекс()\n")
-		count := 5
-		for count > 0 {
-			еслиОк, ош := фнКупить()
-			switch {
-			case ош == nil && еслиОк: // покупка шахты прошла
-				if фнПодтверждение() {
-					return
-				}
-			case ош == nil && !еслиОк: // покупка шахты не нужна
-				return
-			case ош != nil: // ошибка при работе с сетью
-				count--
-			}
-		}
-	}
-	фнКомплекс()
-	return true
-}
-
-// Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
-func (сам *Шахта) Сделать() {
-	сам.Обновить()
-	if err := сам.выбратьМеталл(); err != nil {
-		сам.лог.Добавить("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
-		return
-	}
-	работа := сам.АренаСостояние().РаботаИмя()
-	switch работа {
-	case "руда":
-		for !сам.рудаСделать() {
-		}
-	case "железо":
-		for !сам.железоСделать() {
-		}
-	case "сталь":
-		for !сам.стальСделать() {
-		}
-	case "свинец":
-		for !сам.свинецСделать() {
-		}
-	default:
-		сам.лог.Добавить("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
-	}
-}
-
-// Свинец -- возвращает объект свинца
-func (сам *Шахта) Свинец() ИСтатПарам {
-	return сам.свинец
-}
-
-// Сталь -- возвращает объект стали
-func (сам *Шахта) Сталь() ИСтатПарам {
-	return сам.сталь
-}
-
-// Железо -- возвращает объект железа
-func (сам *Шахта) Железо() ИСтатПарам {
-	return сам.железо
-}
-
-// Руда -- возвращает объект руды
-func (сам *Шахта) Руда() ИСтатПарам {
-	return сам.руда
-}
-
-// ПродуктКолСейчас -- возвращает количество производимого продукта
-func (сам *Шахта) ПродуктКолСейчас() int {
-	return сам.продуктКол.Получ()
-}
-
-// ПродуктИмяСейчас -- возвращает имя производимого продукта
-func (сам *Шахта) ПродуктИмяСейчас() string {
-	return сам.продуктИмя
-}
-
-// ПродуктВремяСейчас -- сколько осталось времени до производства продукта
-func (сам *Шахта) ПродуктВремяСейчас() string {
-	// сам.количествоПолучить()
-	return сам.продуктВремя
-	// return сам.Секция.ВремяОпрос().Стр()
-}
-
-// Выбирает продукцию по возможности произвести и её количеству
-func (сам *Шахта) выбратьМеталл() error {
-	var (
-		диктПродукция = make(map[string]bool) // Словарь известной продукции
-		lstMine       = сам.СписПолучить()
-	)
-
-	фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
-		диктПродукция["руда"] = true // Руда есть всегда
-		диктПродукция["железо"] = false
-		диктПродукция["сталь"] = false
-		диктПродукция["свинец"] = false
-		for _, strProd := range lstMine { // Проверить руду
-			if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
-				диктПродукция["руда"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить руду
-			if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
-				диктПродукция["железо"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить сталь
-			if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
-				диктПродукция["сталь"] = true
-				break
-			}
-		}
-		for _, strProd := range lstMine { // Проверить свинец
-			if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
-				диктПродукция["свинец"] = true
-				break
-			}
-		}
-	}
-	фнВыбратьПродукт()
-	сам.АренаСостояние().РаботаИмяУст("руда")
-	руда := сам.Руда().Получ()
-	железо := сам.Железо().Получ()
-	if диктПродукция["железо"] {
-		if руда > железо*2 {
-			сам.АренаСостояние().РаботаИмяУст("железо")
-		}
-	}
-
-	сталь := сам.Сталь().Получ()
-	if диктПродукция["сталь"] {
-		if железо > сталь*2 {
-			сам.АренаСостояние().РаботаИмяУст("сталь")
-		}
-	}
-
-	свинец := сам.Свинец().Получ()
-	if диктПродукция["свинец"] {
-		if сталь > свинец*2 {
-			сам.АренаСостояние().РаботаИмяУст("свинец")
-		}
-	}
-
-	return nil
-}
-
-// Создаёт руду
-func (сам *Шахта) рудаСделать() bool {
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get("https://wartank.ru/production/Mine")
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
-		return false
-	}
-	var (
-		инд         int
-		стрВых      string
-		strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for инд, стрВых = range lstMine {
-		if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
-			strNum = lstMine[инд+1]
-			strTime = lstMine[инд+3]
-			strLink = lstMine[инд+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	if !strings.Contains(strLink, `>Начать производство<`) {
-		return true
-	}
-	// "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
-	// "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
-	_link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
-	_link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
-	strLink = "https://wartank.ru/production/" + _link
-	// https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err = сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
-		return false
-	}
-	for _, стрВых = range lstMine {
-		if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
-			return false
-		}
-	}
-	if err = сам.СтрОбновить(lstMine); err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
-		return false
-	}
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		сам.лог.Добавить("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
-	}
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.продуктКол.Уст(iNum)
-	return true
-}
-
-// Создаёт железо
-func (сам *Шахта) железоСделать() bool {
-	var (
-		lstMine     = сам.СписПолучить()
-		ind         int
-		strOut      string
-		strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
-			// <span class="green2">Железо</span><br/>
-			strNum = lstMine[ind+1]
-			// Кол-во: <span class="green2">1</span><br/>
-			strTime = lstMine[ind+3]
-			// <a class="simple-but border" href="Mine?4-1.ILinkListener-productions-1-production-startProduceLink"><span><span>Начать производство</span></span></a>
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	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]
-	// https://wartank.ru/production/Mine?4-1.ILinkListener-productions-1-production-startProduceLink
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	if err = сам.СтрОбновить(lstMine); err != nil {
-		// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
-		return false
-	}
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		сам.лог.Добавить("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
-	}
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.продуктКол.Уст(iNum)
-	return true
-}
-
-// Создаёт сталь
-func (сам *Шахта) стальСделать() bool {
-	var (
-		lstMine     = сам.СписПолучить()
-		ind         int
-		strOut      string
-		strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
-			strNum = lstMine[ind+1]
-			strTime = lstMine[ind+3]
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	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]
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	if err = сам.СтрОбновить(lstMine); err != nil {
-		// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
-		return false
-	}
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		сам.лог.Добавить("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
-	}
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.продуктКол.Уст(iNum)
-	return true
-}
-
-// Создаёт свинец
-func (сам *Шахта) свинецСделать() bool {
-	var (
-		lstMine     = сам.СписПолучить()
-		ind         int
-		strOut      string
-		strTime     string
-		strLink     string
-		strNum      string
-		еслиНайдено bool
-	)
-	for ind, strOut = range lstMine {
-		if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
-			strNum = lstMine[ind+1]
-			strTime = lstMine[ind+3]
-			strLink = lstMine[ind+10]
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return true
-	}
-	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]
-	time.Sleep(time.Millisecond * 55)
-	lstMine, err := сам.Сеть().Get(strLink)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
-		return false
-	}
-	for _, strOut := range lstMine { // Проверка на базу
-		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
-			return false
-		}
-	}
-	if err = сам.СтрОбновить(lstMine); err != nil {
-		// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
-		return false
-	}
-	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
-		сам.лог.Добавить("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
-	}
-	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
-	strNum = lstNum[1]
-	lstNum = strings.Split(strNum, `</span><br/>`)
-	strNum = lstNum[0]
-	iNum, err := strconv.Atoi(strNum)
-	if err != nil {
-		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
-		return false
-	}
-	сам.продуктКол.Уст(iNum)
-	return true
-}

+ 0 - 616
app/lev3/bot/angar/base/polygon/polygon.go

@@ -1,616 +0,0 @@
-package polygon
-
-import (
-	"log"
-	"strconv"
-	"strings"
-	"time"
-
-	"wartank/app/lev0/alias"
-	"wartank/app/lev0/cons"
-	. "wartank/app/lev0/types"
-	"wartank/app/lev1/stat_param"
-	"wartank/app/lev2/arena"
-	"wartank/kernel"
-	. "wartank/kernel/kernel_types"
-)
-
-/*
-	Объект полигона на базе
-*/
-
-const (
-	времОжидПлат    = "05:00" // Время ожидания платного ускорения
-	времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения
-	стрПрочность    = "прочность"
-	стрТочность     = "точность"
-	стрБроня        = "броня"
-	стрАтака        = "атака"
-)
-
-// Полигон -- объект полигона на базе
-type Полигон struct {
-	ИАрена
-	бот           ИБот
-	танкСтат      ИТанкСтат
-	продуктСейчас ИБезопСтрока
-	продуктКол    ИБезопЦелое
-	уровень       *stat_param.СтатПарам
-	лог           ИЯдроЛог
-}
-
-// НовПолигон -- возвращает новый *Polygon
-func НовПолигон(конт ИБотКонтекст, база ИАренаБаза) *Полигон {
-	лог := kernel.НовЛог("Полигон " + база.Бот().Имя())
-	лог.Инфо("НовПолигон(): бот=%s\n", база.Бот().Имя())
-	сам := &Полигон{
-		бот:           база.Бот(),
-		танкСтат:      база.Бот().Стата(),
-		продуктСейчас: kernel.НовБезопСтрока(),
-		продуктКол:    kernel.НовБезопЦелое(),
-		уровень:       stat_param.НовСтатПарам("уровень"), // FIXME: вынести на уровень арены
-		лог:           лог,
-	}
-	аренаКонфиг := arena.АренаКонфиг{
-		Бот_:         база.Бот(),
-		АренаИмя_:    "Полигон",
-		СтрКонтроль_: `<span class="green2">Полигон</span><br/>`,
-		ФнПуск_:      сам.пуск,
-		СтрУрл_:      "https://wartank.ru/polygon",
-	}
-	сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
-	_ = ИАренаПолигон(сам)
-	return сам
-}
-
-// Уровень -- возвращает уровень полигона
-func (сам *Полигон) Уровень() ИСтатПарам {
-	return сам.уровень
-}
-
-// ПродуктКолСейчас -- количество продукта, что именно сейчас производится на полигоне
-func (сам *Полигон) ПродуктКолСейчас() int {
-	return сам.продуктКол.Получ()
-}
-
-// ПродуктИмяСейчас -- что именно сейчас производится на полигоне
-func (сам *Полигон) ПродуктИмяСейчас() string {
-	return сам.продуктСейчас.Получ()
-}
-
-// ПродуктВремяСейчас -- сколько осталось времени до обновы полигона
-func (сам *Полигон) ПродуктВремяСейчас() string {
-	return сам.ВремяОстат().String()
-}
-
-// Пуск -- запускает работу полигона в отдельном потоке
-func (сам *Полигон) Пуск() {
-	go сам.пуск()
-}
-
-const (
-	стрАпгрейд = "апгрейд"
-)
-
-// выполняет опрос полигона базы.
-func (сам *Полигон) пуск() {
-	ош := сам.ОбратВремяУст("02")
-	if ош != nil {
-		log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
-		сам.бот.Сервер().Отменить()
-		return
-	}
-	фнРабота := func() {
-		defer func() {
-			for сам.ВремяОстат().ПолучМилСек() > 0 {
-				select {
-				case <-сам.Контекст().Done():
-					return
-				default:
-					time.Sleep(time.Second * 5)
-				}
-			}
-		}()
-		if сам.построитьПровер() { // Можно ли посторить?
-			if сам.построить() {
-				return
-			}
-		}
-		сам.проверитьУскорение()
-		сам.усилениеДобавить()
-		сам.усилениеПровер()
-		сам.времяОбнов()
-
-		if сам.продуктСейчас.Получ() == стрАпгрейд {
-			ош := сам.ВремяОстат().Уст("00:10:00")
-			if ош != nil {
-				log.Printf("Полигон(): при установке времени обратного отсчета, ош=\n\t%v\n", ош)
-				сам.бот.Сервер().Отменить()
-				return
-			}
-		}
-		счёт := 5
-		for счёт > 0 {
-			if сам.уровеньПолучить() {
-				break
-			}
-			счёт--
-		}
-		log.Printf("Полигон.пуск(): бот=%q, цикл завершён\n", сам.бот.Имя())
-	}
-	for {
-		select {
-		case <-сам.Контекст().Done():
-			return
-		case <-сам.ВремяОстат().КаналСиг():
-			фнРабота()
-		default:
-			фнРабота()
-		}
-	}
-}
-
-// Построить
-func (сам *Полигон) построить() bool {
-	списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
-	ссылка0 := "" // ссылка на постройку
-
-	{ // Поиск ссылки на покупку
-		for _, стр := range списСтр {
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				ссылка0 = стр
-				break
-			}
-		}
-		if ссылка0 == "" {
-			return false
-		}
-		// <a class="simple-but border mb5" href="Polygon?9-1.ILinkListener-upgradeLink-link">
-		ссылка0 = strings.TrimPrefix(ссылка0, `<a class="simple-but border mb5" href="`)
-		ссылка0 = strings.TrimSuffix(ссылка0, `">`)
-		// https://wartank.ru/building-upgrade/Polygon?40-1.ILinkListener-upgradeLink-link
-		ссылка0 = "http://wartank.ru/building-upgrade/" + ссылка0
-		списСтр = сам.Сеть().ВебВоркер().Получ(ссылка0)
-	}
-	ссылка1 := "" // ссылка на улучшение здания
-
-	{ // Выбор покупки
-		// <a class="simple-but border mb5" href="Polygon?49-1.ILinkListener-upgradeLink-link">
-		for _, стр := range списСтр {
-			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
-				ссылка1 = стр
-				break
-			}
-		}
-		if ссылка1 == "" {
-			return false
-		}
-		ссылка1 = strings.TrimPrefix(ссылка1, `<a class="simple-but border mb5" href="`)
-		ссылка1 = strings.TrimSuffix(ссылка1, `">`)
-		// https://wartank.ru/building-upgrade/Polygon?48-1.ILinkListener-upgradeLink-link
-		ссылка1 = "http://wartank.ru/building-upgrade/" + ссылка1
-		списСтр = сам.Сеть().ВебВоркер().Получ(ссылка1)
-	}
-	ссылка2 := "" // подтверждение покупки
-	{             // Подтверждение покупки
-		// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?53-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
-		for _, стр := range списСтр {
-			if strings.Contains(стр, `confirmLink`) {
-				ссылка2 = стр
-				break
-			}
-		}
-		if ссылка2 == "" {
-			return false
-		}
-		ссылка2 = strings.TrimPrefix(ссылка2, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../`)
-		ссылка2 = strings.TrimSuffix(ссылка2, `">`)
-		// https://wartank.ru/wicket/page?52-1.ILinkListener-confirmLink
-		ссылка2 = "http://wartank.ru/wicket/" + ссылка2
-		//ссылка2="https://wartank.ru/wicket/page?25-1.ILinkListener-confirmLink"
-		_ = сам.Сеть().ВебВоркер().Получ(ссылка2)
-	}
-	return true
-}
-
-// Проверяет уровень полигона
-func (сам *Полигон) уровеньПолучить() bool {
-	var (
-		стрВых      = ""
-		еслиНайдено bool
-	)
-	lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	// <span class="green2">Полигон - 5</span><br/>
-	for _, стрВых = range lstBase {
-		if strings.Contains(стрВых, `<span class="green2">Полигон - `) {
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return false
-	}
-	стрУровень := strings.TrimPrefix(стрВых, `<span class="green2">Полигон - `)
-	стрУровень = strings.TrimSuffix(стрУровень, `</span><br/>`)
-	цУров, ош := strconv.Atoi(стрУровень)
-	if ош != nil {
-		return false
-	}
-	сам.уровень.Уст(цУров)
-	return true
-}
-
-// Проверяет на ускорение апгрейда полигона
-func (сам *Полигон) проверитьУскорение() bool {
-	var (
-		strOut      = ""
-		еслиНайдено bool
-	)
-	lstBase := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/buildings")
-	// Проверка на платное ускорение апгрейда + время
-	{ // Платное ускорение
-		if strings.Contains(strOut, `Ускорить за`) {
-			if err := сам.ОбратВремяУст(времОжидПлат); err != nil {
-				log.Printf("WARN Base.checkArsenalForce(): при установке платного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидПлат, err)
-			}
-			сам.АренаСостояние().РаботаИмяУст("")
-			сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-			сам.продуктСейчас.Уст(стрАпгрейд)
-			сам.продуктКол.Уст(0)
-			return true
-		}
-	}
-	{ // Проверка на бесплатное ускорение апгрейда
-		еслиНайдено = false
-		for _, strOut = range lstBase {
-			if strings.Contains(strOut, `Производит снаряды, ремкомплекты<br/>`) {
-				// Убедиться что есть строка платного ускорения
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return false
-		}
-		if !strings.Contains(strOut, `>Ускорение<`) {
-			return false
-		}
-		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктСейчас.Уст(стрАпгрейд)
-		сам.продуктКол.Уст(0)
-		lstLink := strings.Split(strOut, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
-		strLink := lstLink[1]
-		lstLink = strings.Split(strLink, `"><span><span>Ускорение</span></span></a>`)
-		strLink = "https://wartank.ru/" + lstLink[0]
-		lstBase, err := сам.Сеть().Get(strLink)
-		if err != nil {
-			// log._rintf("ERRO NetBank.checkArsenalForce(): при GET-запросе на бесплатном ускорении апгрейда арсенала, err=\n\t%v\n", err)
-			return false
-		}
-		// sound.ArsenalForce()
-		if err := сам.СтрОбновить(lstBase); err != nil {
-			// log._rintf("ERRO NetBank.checkArsenalForce(): при обновлении lstBase, err=\n\t%v\n", err)
-			return false
-		}
-		сам.АренаСостояние().РаботаИмяУст("")
-		сам.АренаСостояние().СостояниеУст(cons.РежимАпгрейд)
-		сам.продуктКол.Уст(0)
-		if err := сам.ОбратВремяУст(времОжидБесплат); err != nil {
-			log.Printf("WARN Base.checkArsenalForce(): при установке бесплатного времени ускорения апгрейда арсенала(%v)\n\terr=%v\n", времОжидБесплат, err)
-		}
-	}
-	// Все проверки прошли -- это просто работа
-	сам.АренаСостояние().РаботаИмяУст("work")
-	return true
-}
-
-// Проверяет необходимость постройки полигона
-func (сам *Полигон) построитьПровер() bool {
-	// https://wartank.ru/building-upgrade/Polygon
-	списПолигон := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
-	стрСсылка := ""
-	еслиНайти := false
-	// <a class="simple-but border mb5" href="Polygon?66-1.ILinkListener-upgradeLink-link">
-	for _, стрСсылка = range списПолигон {
-		if strings.Contains(стрСсылка, `href="Polygon?`) {
-			еслиНайти = true
-			break
-		}
-	}
-	return еслиНайти
-}
-
-// Обновляет оставшееся время полигона
-//
-//	Этот объект сам описывает своё время
-func (сам *Полигон) времяОбнов() {
-	var (
-		strLastTime string
-		еслиНайдено bool
-		isSet       bool
-		lstPolygon  = сам.СписПолучить()
-	)
-	defer func() {
-		if !isSet {
-			ош := сам.ОбратВремяУст("05")
-			if ош != nil {
-				log.Printf("Полигон.времяОбнов(): при установке обратного времени ожидания полигона, ош=\n\t%v\n", ош)
-				сам.бот.Сервер().Отменить()
-				return
-			}
-		}
-	}()
-	for _, lastTime := range lstPolygon {
-		if strings.Contains(lastTime, `>Осталось: `) {
-			strLastTime = lastTime
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено { // Время полигона вышло
-		return
-	}
-	lstTime := strings.Split(strLastTime, `>Осталось: `)
-	strLastTime = lstTime[1]
-	lstTime = strings.Split(strLastTime, `</span>`)
-	strLastTime = lstTime[0]
-	if err := сам.ОбратВремяУст(alias.Время(strLastTime)); err != nil {
-		// log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err)
-		return
-	}
-	isSet = true
-}
-
-// Проверяет что именно активировано
-func (сам *Полигон) усилениеПровер() {
-	var (
-		еслиНайдено bool
-		lstPolygon  = сам.СписПолучить()
-		ind         = 0
-		strOut      string
-	)
-
-	for ind, strOut = range lstPolygon {
-		if strings.Contains(strOut, `<span>Активно</span>`) {
-			ind -= 9
-			еслиНайдено = true
-			break
-		}
-	}
-	if !еслиНайдено {
-		return
-	}
-	strOut = lstPolygon[ind]
-	форсажИмя := ""
-	switch { // Вычисляем контрольную строку
-	case strings.Contains(strOut, `>улучшение точности<`):
-		форсажИмя = стрТочность
-	case strings.Contains(strOut, `>увеличение прочности<`):
-		форсажИмя = стрПрочность
-	case strings.Contains(strOut, `>усиление брони<`):
-		форсажИмя = стрБроня
-	case strings.Contains(strOut, `>усиление атаки<`):
-		форсажИмя = стрАтака
-	}
-	// Вычислим на сколько
-	strOut = lstPolygon[ind+1]
-	lstOut := strings.Split(strOut, `<span class="green2">+`)
-	strOut = lstOut[1]
-	lstOut = strings.Split(strOut, ` на `)
-	strOut = lstOut[0]
-	iForce, err := strconv.Atoi(strOut)
-	if err != nil {
-		// log._rintf("NetPolygon.checkTime(): force(%v) not number, err=\n\t%v\n", strOut, err)
-		return
-	}
-	сам.танкСтат.ФорсажОбнов(форсажИмя, iForce)
-	сам.продуктСейчас.Уст("усиление-" + форсажИмя)
-	сам.продуктКол.Уст(iForce)
-}
-
-// Выбирает самый слабый параметр и усиливает его
-func (сам *Полигон) усилениеДобавить() {
-	сам.Сеть().Обновить()
-	// log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPolygon, mode=%s\terr=\n\t%v\n", сам.ModeCurrent().Get(), err)
-	if err := сам.ОбратВремяУст("05"); err != nil {
-		log.Printf("Polygon.checkPolygon(): при принудительном обновлении обратного времени, время=`05`\terr=\n\t%v\n", err)
-		сам.бот.Сервер().Отменить()
-		return
-	}
-	lstPolygon := сам.СписПолучить()
-	if len(lstPolygon) == 0 {
-		return
-	}
-	stat := сам.танкСтат
-	iAttack := stat.Атака().Получ()
-	iArmor := stat.Броня().Получ()
-	iFyne := stat.Точность().Получ()
-	iHard := stat.Прочность().Получ()
-
-	strParam := стрАтака
-	iParam := iHard
-	{
-		/*
-			Вычислить самый слабый параметр.
-
-			Политика вычислений:
-				1) hard -- прочность, самый низкоприоритетный параметр
-				2) armor -- броня, чуть лучше power
-				3) fyne -- точность, чуть лучше armor
-				4) attack -- атака, самый важный
-		*/
-
-		if iArmor <= iParam {
-			iParam = iArmor
-			strParam = стрБроня
-		}
-		if iFyne <= iParam {
-			iParam = iFyne
-			strParam = стрТочность
-		}
-		if iAttack < iParam {
-			strParam = стрАтака
-		}
-	}
-
-	// Найти нужную строку активации
-	var (
-		ind         int
-		strOut      string
-		еслиНайдено bool
-	)
-	switch strParam {
-	case стрАтака: // Усиливаем атаку
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>усиление атаки<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
-			return
-		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		if _, err := сам.Сеть().Get(strLink); err != nil {
-			// log._rintf("ERRO NetPolygon.addForce(): in make request force attack, err=\n\t%v\n", err)
-			return
-		}
-		{ // Узнать на сколько форсирована атака
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			if err != nil {
-				// log._rintf("ERRO NetPolygon.addForce(): strForceAttack(%v) not int, err=\n\t%v\n", strForce, err)
-				return
-			}
-			сам.танкСтат.ФорсажОбнов("attack", iForce)
-			сам.АренаСостояние().РаботаИмяУст(стрАтака)
-		}
-	case стрБроня: // Усиливаем броню
-		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>усиление брони<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
-			return
-		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		if _, err := сам.Сеть().Get(strLink); err != nil {
-			// log._rintf("NetPolygon.addForce(): in make request force armor, err=\n\t%v\n", err)
-			return
-		}
-		{ // Узнать на сколько форсирована броня
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			if err != nil {
-				// log._rintf("ERRO NetPolygon.addForce(): strForceArmor(%v) not int, err=\n\t%v\n", strForce, err)
-				return
-			}
-			сам.танкСтат.ФорсажОбнов(стрБроня, iForce)
-			сам.АренаСостояние().РаботаИмяУст(стрБроня)
-		}
-	case стрТочность: // Усиливаем точность
-		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>улучшение точности<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		strOut = lstPolygon[ind]
-		if strOut == "" {
-			return
-		}
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		if _, err := сам.Сеть().Get(strLink); err != nil {
-			// log._rintf("ERRO NetPolygon.addForce(): in make request force fyne, err=\n\t%v\n", err)
-			return
-		}
-		{ // Узнать на сколько форсирована точность
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			if err != nil {
-				// log._rintf("ERRO NetPolygon.addForce(): strForceFyne(%v) not int, err=\n\t%v\n", strForce, err)
-				return
-			}
-			сам.танкСтат.ФорсажОбнов(стрТочность, iForce)
-			сам.АренаСостояние().РаботаИмяУст(стрТочность)
-		}
-	case стрПрочность: // Усиливаем мощность
-		еслиНайдено = false
-		for ind, strOut = range lstPolygon {
-			if strings.Contains(strOut, `>увеличение прочности<`) {
-				еслиНайдено = true
-				break
-			}
-		}
-		if !еслиНайдено {
-			return
-		}
-		ind += 8
-		strOut = lstPolygon[ind]
-		lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
-		strOut = lstLink[1]
-		lstLink = strings.Split(strOut, `"><span><span>Получить бесплатно</span></span></a>`)
-		strLink := "https://wartank.ru/" + lstLink[0]
-		if _, err := сам.Сеть().Get(strLink); err != nil {
-			// log._rintf("NetPolygon.addForce(): in make request force hard, err=\n\t%v\n", err)
-			return
-		}
-		{ // Узнать на сколько форсирована прочность
-			strForce := lstPolygon[ind-7]
-			lstForce := strings.Split(strForce, `<span class="green2">+`)
-			strForce = lstForce[1]
-			lstForce = strings.Split(strForce, ` на `)
-			strForce = lstForce[0]
-			iForce, err := strconv.Atoi(strForce)
-			if err != nil {
-				// log._rintf("ERRO NetPolygon.addForce(): strForceHard(%v) not int, err=\n\t%v\n", strForce, err)
-				return
-			}
-			сам.танкСтат.ФорсажОбнов(стрПрочность, iForce)
-			сам.АренаСостояние().РаботаИмяУст(стрПрочность)
-		}
-	default: // Неизвестно что
-		сам.АренаСостояние().РаботаИмяУст("неизвестно")
-		// log._rintf("ERRO NetPolygon.addForce(): неизвестно что это, strParam=%q", strParam)
-		return
-	}
-}