// package arena_fuel_storage -- склад топлива package arena_fuel_storage 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.АренаКонфиг{ Бот_: база.Бот(), АренаИмя_: "Склад_топлива", СтрКонтроль_: `Склад топлива - `, ФнПуск_: сам.пуск, СтрУрл_: "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") /* Топливо 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 (сам *АренаСкладТоплива) ускорениеПровер() { списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings") // Склад топлива - var ( еслиНайти = false стр string ) for _, стр = range списСтр { if strings.Contains(стр, `Склад топлива - `) { еслиНайти = true break } } if !еслиНайти { return } } // Обновляет текущий уровень шахты (может быть не построена) func (сам *АренаСкладТоплива) уровеньОбновить() bool { списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings") // Склад топлива - 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 стр = "" ) фнКупить := func() bool { defer time.Sleep(time.Millisecond * 1000) списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage") 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/" + _стр списСтр = сам.Сеть().ВебВоркер().Получ(ссылка) // Проверить, что постройка состоялась 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" + _стр списСтр = сам.Сеть().ВебВоркер().Получ(ссылка) // Проверить, что постройка состоялась for _, стр := range списСтр { if strings.Contains(стр, "Вы сделали слишком большую паузу") { 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) // Построить var ( еслиНайти = false списСтр []string стр = "" ) фнКупить := func() bool { defer time.Sleep(time.Millisecond * 1000) списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage") for _, стр = range списСтр { // if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, "") // https://wartank.ru/building-upgrade/FuelStorage?49-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 списСтр { // да, подтверждаю if strings.Contains(стр, `ILinkListener-confirmLink`) { еслиНайти = true break } } if !еслиНайти { return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, `да, подтверждаю`) // https://wartank.ru/wicket/page?4-1.ILinkListener-confirmLink // ссылка := "https://wartank.ru" + _стр списСтр = сам.Сеть().ВебВоркер().Получ(ссылка) // Проверить, что постройка состоялась for _, стр := range списСтр { if strings.Contains(стр, "Вы сделали слишком большую паузу") { 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 сам.продуктВремя }