// package arena_arsenal -- объект оружейной на базе package arena_arsenal import ( . "gitp78su.ipnodns.ru/svi/kern" . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes" . "wartank/app/lev0/types" "wartank/app/lev1" "wartank/app/lev1/web_log" "wartank/app/lev2/arena" "wartank/app/lev2/arena/arena_arsenal/bf_ammo_make" "wartank/app/lev2/arena/arena_arsenal/bf_ammo_stat" "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_build" "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_take" "wartank/app/lev2/arena/arena_arsenal/bf_arsenal_upgrade" "wartank/app/lev2/arena/arena_build" ) const ( стрКумулятивы = "кумулятивы" стрБронебойки = "бронебойки" стрФугасы = "фугасы" стрРемки = "ремки" ) // Арсенал -- объект оружейной на базе type АренаАрсенал struct { ИАренаСтроение вЛог ИВебЛог лог ILogBuf база ИАренаБаза фугас ИСтатПарам бронебойка ИСтатПарам кумулятив ИСтатПарам ремка ИСтатПарам конт ILocalCtx } // НовАрсенал -- возвращает новый *Arsenal func НовАрсенал(конт ILocalCtx) *АренаАрсенал { лог := NewLogBuf() лог.Info("НовАрсенал()\n") сам := &АренаАрсенал{ конт: конт, база: конт.Get("база").Val().(ИАренаБаза), фугас: lev1.НовСтатПарам(стрФугасы), бронебойка: lev1.НовСтатПарам(стрБронебойки), кумулятив: lev1.НовСтатПарам(стрКумулятивы), ремка: lev1.НовСтатПарам(стрРемки), лог: лог, } аренаКонфиг := arena.АренаКонфиг{ Конт_: конт, АренаИмя_: "Арсенал", СтрКонтроль_: `Ремкомплект
`, СтрУрл_: "https://wartank.ru/production/Armory", } сам.ИАренаСтроение = arena_build.НовАренаСтроение(конт, аренаКонфиг) сам.вЛог = web_log.НовВебЛог(true) // go сам.пуск() сам.вЛог.Добавить("НовАрсенал(): Арсенал создан") конт.Set("арсенал", сам, "Арсенал бота") _ = ИАренаАрсенал(сам) return сам } func (сам *АренаАрсенал) Пуск() { сам.ИАренаСтроение.Пуск() bf_arsenal_build.АрсеналПостроить(сам.конт) bf_arsenal_upgrade.АрсеналАпгрейд(сам.конт) bf_ammo_stat.СнарядыСтат(сам.конт) bf_ammo_make.СнарядыСделать(сам.конт) bf_arsenal_take.АрсеналЗабрать(сам.конт) } //============================= /* // Проверяет необходимость постройки func (сам *АренаАрсенал) проверитьПостроить() bool { сам.вЛог.Добавить("Арсенал.проверитьПостроить()\n") _ = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory") return true } // Обновляет текущий уровень арсенала (может быть не построена) func (сам *АренаАрсенал) уровеньОбновить() bool { сам.вЛог.Добавить("Арсенал.уровеньОбновить()\n") списСтр := сам.Сеть().ВебВоркер().Получ("http://wartank.ru/buildings") // Оружейная - 0
var ( еслиНайти = false стр = "" ) for _, стр = range списСтр { if strings.Contains(стр, `Оружейная -`) { еслиНайти = true break } } if !еслиНайти { сам.вЛог.Добавить("Арсенал.уровеньОбновить(): не надо\n") return false } _стр := strings.TrimPrefix(стр, `Оружейная - `) _стр = strings.TrimSuffix(_стр, `
`) иУровень, ош := strconv.Atoi(_стр) if ош != nil { сам.лог.Err("уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош) сам.вЛог.Добавить("ОШИБКА Арсенал.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош) return false } сам.Уровень().Уст(иУровень) сам.лог.Info("уровеньОбновить(): уровень=%d\n", иУровень) сам.вЛог.Добавить("Арсенал.уровеньОбновить(): уровень=%d\n", иУровень) return true } // Строит арсенал при нулевом уровне func (сам *АренаАрсенал) построить() (bool, error) { сам.вЛог.Добавить("Арсенал.построить()\n") списСтр := сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory") // Арсенал - 0
var ( еслиНайти = false стр = "" ) for _, стр = range списСтр { if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { сам.вЛог.Добавить("Арсенал.построить(): не надо\n") return true, nil } // // Пробуем построить арсенал _стр := strings.TrimPrefix(стр, ``) ссылка := "https://wartank.ru/building-upgrade/" + _стр // https://wartank.ru/building-upgrade/Armory?35-1.ILinkListener-upgradeLink-link списСтр = сам.Сеть().ВебВоркер().Получ(ссылка) еслиНайти = false // "" for _, стр = range списСтр { if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { сам.вЛог.Добавить("Арсенал.построить(): не надо\n") return true, nil } сам.лог.Info("построить(): ок\n") сам.вЛог.Добавить("Арсенал.построить(): ок\n") return true, nil } // Пытается проапгрейдить арсенал func (сам *АренаАрсенал) проапгрейдить() bool { сам.вЛог.Добавить("Арсенал.проапгрейдить()\n") var ( еслиНайти = false списСтр []string стр = "" ) фнКупить := func() bool { defer time.Sleep(time.Millisecond * 1000) списСтр = сам.Сеть().ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory") for _, стр = range списСтр { // if strings.Contains(стр, `ILinkListener-upgradeLink-link`) { еслиНайти = true break } } if !еслиНайти { сам.вЛог.Добавить("Арсенал.проапгрейдить(): не надо\n") return true } // Пробуем улучшить шахту _стр := strings.TrimPrefix(стр, "") // https://wartank.ru/building-upgrade/Armory?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 // Покупка не оплачена } } сам.вЛог.Добавить("Арсенал.проапгрейдить().фнКупить(): ок\n") return true } фнПодтверждение := func() bool { for _, стр = range списСтр { // да, подтверждаю if strings.Contains(стр, `ILinkListener-confirmLink`) { еслиНайти = true break } } if !еслиНайти { сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): не надо\n") return true } // Пробуем построить шахту _стр := strings.TrimPrefix(стр, `да, подтверждаю`) // https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink ссылка := "https://wartank.ru" + _стр списСтр = сам.Сеть().ВебВоркер().Получ(ссылка) // Проверить, что постройка состоялась for _, стр := range списСтр { if strings.Contains(стр, "Вы сделали слишком большую паузу") { сам.вЛог.Добавить("ОШИБКА Арсенал.проапгрейдить().фнПодтверждение(): подтверждение покупка склада топлива не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр) return false // Покупка не оплачена } } сам.вЛог.Добавить("Арсенал.проапгрейдить().фнПодтверждение(): ок\n") return true } фнКомплекс := func() { count := 5 for count > 0 { if фнКупить() { if фнПодтверждение() { break } } count-- } } фнКомплекс() return true } // Проверяет на забрать оружейную func (сам *АренаАрсенал) забрать() bool { var ( strOut string ind int еслиНайдено bool lstBase = сам.СписПолучить() ) for ind, strOut = range lstBase { if strings.Contains(strOut, `Моя амуниция`) { еслиНайдено = true ind += 17 strOut = lstBase[ind] break } } if !еслиНайдено { return false } if !strings.Contains(strOut, `">Забрать`) { return false } lstLink := strings.Split(strOut, `Забрать`) // https://wartank.ru/buildings?80-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink strLink = "https://wartank.ru/" + lstLink[0] var ( лстАрсенал []string ) time.Sleep(time.Millisecond * 100) res := сам.Сеть().Get(strLink) if res.IsErr() { log.Printf("Арсенал.забрать(): при выполнении Get-запроса? err=\n\t%v\n", res.Error()) return false } лстАрсенал = res.Unwrap() if len(лстАрсенал) == 0 { log.Printf("Арсенал.забрать(): len lstBase(%v)==0", len(lstBase)) return false } for _, strOut = range лстАрсенал { if strings.Contains(strOut, `Производство`) { return false } } сам.СтрОбновить(лстАрсенал) return true } */ //==================================== // Фугасы -- возвращает объект числа фугасов func (сам *АренаАрсенал) Фугасы() ИСтатПарам { return сам.фугас } // Бронебойки -- возвращает объект бронебойных снарядов func (сам *АренаАрсенал) Бронебойки() ИСтатПарам { return сам.бронебойка } // Кумулятивы -- возвращает объект бронебойных снарядов func (сам *АренаАрсенал) Кумулятивы() ИСтатПарам { return сам.кумулятив } // Ремки -- возвращает объект ремкомплектов func (сам *АренаАрсенал) Ремки() ИСтатПарам { return сам.ремка }