|
|
@@ -0,0 +1,302 @@
|
|
|
+// 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 сам.продуктВремя
|
|
|
+}
|