| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- // 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.НовСекция(база.Бот(), "Склад_топлива", `<span class="green2">Склад топлива - `)
- 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
- }
- /*
- <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 (сам *СкладТоплива) ускорениеПровер() {
- списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
- if ош != nil {
- log.Printf("СкладТоплива.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
- return
- }
- // <span class="green2">Склад топлива -
- var (
- еслиНайти = false
- стр = ""
- )
- for _, стр = range списСтр {
- if strings.Contains(стр, `<span class="green2">Склад топлива - `) {
- еслиНайти = 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
- }
- // <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
- }
- сам.уровень.Уст(иУровень)
- if иУровень == 0 { // склад топлива надо построить
- for !сам.построить() {
- }
- }
- 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
- стр = ""
- ош 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 списСтр {
- // <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/" + _стр
- списСтр, ош = сам.сеть.Клиент().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 списСтр {
- // <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" + _стр
- списСтр, ош = сам.сеть.Клиент().Get(ссылка)
- if ош != nil {
- log.Printf("СкладТоплива.построить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
- return false
- }
- // Проверить, что постройка состоялась
- 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 (сам *СкладТоплива) Уровень() types.ИСтатПарам {
- return сам.уровень
- }
- // Тоаливо -- возвращает топливо
- func (сам *СкладТоплива) Топливо() types.ИСтатПарам {
- return сам.топливо
- }
- // ПродуктКолСейчас -- возвращает кол-во продукта прямо сейчас
- func (сам *СкладТоплива) ПродуктКолСейчас() int {
- return сам.топливо.Получ()
- }
- // ПродуктИмяСейчас -- возвращает имя продукта прямо сейчас
- func (сам *СкладТоплива) ПродуктИмяСейчас() string {
- return "топливо"
- }
- // ПродуктВремяСейчас -- возвращает сколько осталось времени прямо сейчас
- func (сам *СкладТоплива) ПродуктВремяСейчас() string {
- return сам.продуктВремя
- }
|