// package fuel -- склад топлива
package fuel
import (
"context"
"fmt"
"log"
"strconv"
"strings"
"time"
"wartank/pkg/section"
"wartank/pkg/types"
"wartank/server/serv_bots/warbot/angar/base/fuel/fuel_net"
"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)
// СкладТоплива -- склад топлива
type СкладТоплива struct {
*section.Секция
сеть *fuel_net.ТопливоСеть
бот types.ИБот
база types.ИБаза
топливо types.ИСтатПарам
уровень types.ИСтатПарам
продуктВремя string // Сколько осталось времени прямо сейчас
кнт context.Context // контекст шахты
фнОтмена func() // Функция отмены шахты
}
// НовТопливо -- возвращает новой склад топлива
func НовСкладТоплива(база types.ИБаза) (*СкладТоплива, error) {
секция, ош := section.НовСекция(база.Бот(), "Склад_топлива", `Склад топлива - `)
if ош != nil {
return nil, fmt.Errorf("НовСкладТоплива(): in create *Section, err=\n\t%w", ош)
}
топливо, ош := static_param.НовСтатПарам("топливо")
if ош != nil {
return nil, fmt.Errorf("НовСкладТоплива(): при создании статистики склаада топлива, ош=\n\t%w", ош)
}
уровень, ош := static_param.НовСтатПарам("уровень")
if ош != nil {
return nil, fmt.Errorf("НовСкладТоплива(): при создании статистики уровня, ош=\n\t%w", ош)
}
кнт, фнОтмена := context.WithCancel(база.Кнт())
сам := &СкладТоплива{
Секция: секция,
бот: база.Бот(),
база: база,
топливо: топливо,
кнт: кнт,
фнОтмена: фнОтмена,
уровень: уровень,
}
сам.сеть, ош = fuel_net.НовТопливоСеть(сам)
if ош != nil {
return nil, fmt.Errorf("NewMine(): in create *ТопливоСеть, err=\n\t%w", ош)
}
_ = types.ИБазаТопливо(сам)
return сам, nil
}
func (сам *СкладТоплива) Пуск() error {
go сам.пуск()
return nil
}
// пуск -- запускает обработку шахты
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, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
if err != nil {
log.Printf("СкладТоплива.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
return
}
/*
720
*/
for _, strOut = range lstMine {
if strings.Contains(strOut, `src=" alt="Топливо" title="Топливо"`) {
еслиНайдено = true
break
}
}
if !еслиНайдено {
return
}
_число := strings.TrimPrefix(strOut, `
`)
iNum, err := strconv.Atoi(_число)
if err != nil {
log.Printf("СкладТоплива.количествоПолучить(): кол-во топлива (%v) не число, err=\n\t%v\n", _число, err)
return
}
сам.топливо.Уст(iNum)
}
// Проверяет ускорение строительства
func (сам *СкладТоплива) ускорениеПровер() {
списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
if ош != nil {
log.Printf("СкладТоплива.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
return
}
// Склад топлива -
var (
еслиНайти = false
стр = ""
)
for _, стр = range списСтр {
if strings.Contains(стр, `Склад топлива - `) {
еслиНайти = true
break
}
}
if !еслиНайти {
return
}
}
// Обновляет текущий уровень шахты (может быть не построена)
func (сам *СкладТоплива) уровеньОбновить() bool {
списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
if ош != nil {
log.Printf("СкладТоплива.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
return false
}
// Склад топлива -
var (
еслиНайти = false
стр = ""
)
for _, стр = range списСтр {
if strings.Contains(стр, `Склад топлива - `) {
еслиНайти = true
break
}
}
if !еслиНайти {
return false
}
// Склад топлива - 0
_стр := strings.TrimPrefix(стр, `Склад топлива - `)
_стр = strings.TrimSuffix(_стр, `
`)
иУровень, ош := 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
стр = ""
ош error
)
фнКупить := func() bool {
defer time.Sleep(time.Millisecond * 1000)
списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/FuelStorage")
if ош != nil {
log.Printf("СкладТоплива.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
return false
}
for _, стр = range списСтр {
//
if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
еслиНайти = true
break
}
}
if !еслиНайти {
return true
}
// Пробуем улучшить шахту
_стр := strings.TrimPrefix(стр, "")
// https://wartank.ru/building-upgrade/FuelStorage?4-1.ILinkListener-upgradeLink-link
//
ссылка := "https://wartank.ru/building-upgrade/" + _стр
списСтр, ош = сам.сеть.Клиент().Get(ссылка)
if ош != nil {
log.Printf("СкладТоплива.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
return false
}
// Проверить, что постройка состоялась
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 списСтр {
// да, подтверждаю
if strings.Contains(стр, `ILinkListener-confirmLink`) {
еслиНайти = true
break
}
}
if !еслиНайти {
return true
}
// Пробуем построить шахту
_стр := strings.TrimPrefix(стр, `да, подтверждаю`)
// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
ссылка := "https://wartank.ru" + _стр
списСтр, ош = сам.сеть.Клиент().Get(ссылка)
if ош != nil {
log.Printf("СкладТоплива.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
return false
}
// Проверить, что постройка состоялась
for _, стр := range списСтр {
if strings.Contains(стр, "