package polygon import ( "fmt" "strconv" "strings" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/polygon/polygonnet" ) /* Объект полигона на базе */ // Polygon -- объект полигона на базе type Polygon struct { *section.Section bot types.ИБот tankStat types.ИТанкСтат net *polygonnet.PolygonNet } // NewPolygon -- возвращает новый *Polygon func NewPolygon(base types.ИБаза) (*Polygon, error) { section, err := section.NewSection(base.Бот(), "Полигон", `Полигон`) if err != nil { return nil, fmt.Errorf("NewPolygon(): in create *Section, err=\n\t%w", err) } sf := &Polygon{ Section: section, bot: base.Бот(), tankStat: base.Бот().Танк().ТанкСтат(), } sf.net, err = polygonnet.NewPolygonNet(sf) if err != nil { return nil, fmt.Errorf("NewPolygon(): in create NetPolygon, err=\n\t%w", err) } return sf, nil } // Run -- запускает работу полигона в отдельном потоке func (sf *Polygon) Run() error { go sf.run() return nil } // выполняет опрос полигона базы. func (sf *Polygon) run() { sf.SetCountDown(2) for { select { case <-sf.bot.Кнт().Done(): sf.ВремяОпрос().Стоп() return case <-sf.ВремяОпрос().КаналСиг(): mode := sf.РежимТекущ().Получ() if mode == "upgrade" { continue } sf.addForce() sf.checkForce() sf.updateTime() } } } // Обновляет оставшееся время полигона // // Этот объект сам описывает своё время func (sf *Polygon) updateTime() { var ( strLastTime string isFind bool isSet bool lstPolygon = sf.СписПолучить() ) defer func() { if !isSet { sf.SetCountDown(5) } }() for _, lastTime := range lstPolygon { if strings.Contains(lastTime, `>Осталось: `) { strLastTime = lastTime isFind = true break } } if !isFind { // Время полигона вышло return } lstTime := strings.Split(strLastTime, `>Осталось: `) strLastTime = lstTime[1] lstTime = strings.Split(strLastTime, ``) strLastTime = lstTime[0] if err := sf.ParseCountDown(strLastTime); err != nil { // log._rintf("ERRO Polygon.updateTime(): при установке времени ожидания полигона(%v)\n\terr=%v\n", strLastTime, err) return } isSet = true } // Проверяет что именно активировано func (sf *Polygon) checkForce() { var ( isFind bool lstPolygon = sf.СписПолучить() ind = 0 strOut string ) for ind, strOut = range lstPolygon { if strings.Contains(strOut, `Активно`) { ind -= 9 isFind = true break } } if !isFind { return } strOut = lstPolygon[ind] форсажИмя := "" switch { // Вычисляем контрольную строку case strings.Contains(strOut, `>улучшение точности<`): форсажИмя = "fyne" case strings.Contains(strOut, `>увеличение прочности<`): форсажИмя = "hard" case strings.Contains(strOut, `>усиление брони<`): форсажИмя = "armor" case strings.Contains(strOut, `>усиление атаки<`): форсажИмя = "attack" } // Вычислим на сколько strOut = lstPolygon[ind+1] lstOut := strings.Split(strOut, `+`) 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 } sf.tankStat.ФорсажОбнов(форсажИмя, iForce) } // Выбирает самый слабый параметр и усиливает его func (sf *Polygon) addForce() { if err := sf.net.UpdateLst(); err != nil { // log._rintf("Polygon.checkPolygon(): при принудительном обновлении lstPlygon, mode=%s\terr=\n\t%v\n", sf.ModeCurrent().Get(), err) sf.SetCountDown(5) return } lstPoligon := sf.СписПолучить() if len(lstPoligon) == 0 { return } stat := sf.tankStat iAttack := stat.Атака().Получ() iArmor := stat.Броня().Получ() iFyne := stat.Точность().Получ() iHard := stat.Прочность().Получ() strParam := "attack" iParam := iHard { /* Вычислить самый слабый параметр. Политика вычислений: 1) hard -- прочность, самый низкоприоритетный параметр 2) armor -- броня, чуть лучше power 3) fyne -- точность, чуть лучше armor 4) attack -- атака, самый важный */ if iArmor <= iParam { iParam = iArmor strParam = "armor" } if iFyne <= iParam { iParam = iFyne strParam = "fyne" } if iAttack < iParam { strParam = "attack" } } // Найти нужную строку активации var ( ind int strOut string isFind bool ) switch strParam { case "attack": // Усиливаем атаку for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>усиление атаки<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := sf.net.Get(strLink); err != nil { // log._rintf("ERRO NetPolygon.addForce(): in make request force attack, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована атака strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) 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 } sf.tankStat.ФорсажОбнов("attack", iForce) sf.РежимТекущ().Уст("атака") } case "armor": // Усиливаем броню isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>усиление брони<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := sf.net.Get(strLink); err != nil { // log._rintf("NetPolygon.addForce(): in make request force armor, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована броня strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) 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 } sf.tankStat.ФорсажОбнов("armor", iForce) sf.РежимТекущ().Уст("броня") } case "fyne": // Усиливаем точность isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>улучшение точности<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] if strOut == "" { return } lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := sf.net.Get(strLink); err != nil { // log._rintf("ERRO NetPolygon.addForce(): in make request force fyne, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована точность strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) 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 } sf.tankStat.ФорсажОбнов("fyne", iForce) sf.РежимТекущ().Уст("точность") } case "hard": // Усиливаем мощность isFind = false for ind, strOut = range lstPoligon { if strings.Contains(strOut, `>увеличение прочности<`) { isFind = true break } } if !isFind { return } ind += 8 strOut = lstPoligon[ind] lstLink := strings.Split(strOut, `Получить бесплатно`) strLink := "https://wartank.ru/" + lstLink[0] if _, err := sf.net.Get(strLink); err != nil { // log._rintf("NetPolygon.addForce(): in make request force hard, err=\n\t%v\n", err) return } { // Узнать на сколько форсирована прочность strForce := lstPoligon[ind-7] lstForce := strings.Split(strForce, `+`) 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 } sf.tankStat.ФорсажОбнов("hard", iForce) sf.РежимТекущ().Уст("прочность") } default: // Неизвестно что sf.РежимТекущ().Уст("неизвестно") // log._rintf("ERRO NetPolygon.addForce(): неизвестно что это, strParam=%q", strParam) return } }