package masters import ( "log" "strings" "time" "wartank/pkg/alias" "wartank/pkg/arena" "wartank/pkg/components/arena_net" "wartank/pkg/components/kernel/logger" "wartank/pkg/types" ) /* Битва мастеров. Работает примерно раз в сутки. Требуется три победы, потом нужно загрести золотишко. Между битвами надо удерживать рейтинг, чтобы не кидало к монстрам. */ // БитваМастеров -- объект битвы мастеров type БитваМастеров struct { types.ИАрена бот types.ИБот сеть types.ИАренаСеть лог types.ИЛоггер } // НовБитваМастеров -- возвращает новый *BatMas func НовБитваМастеров(бот types.ИБот) *БитваМастеров { лог := logger.НовЛоггер("БитваМастеров") лог.Инфо("НовБитваМастеров()\n") лог.Паника(бот == nil, "НовБитваМастеров(): ИБот == nil\n") сам := &БитваМастеров{ бот: бот, лог: лог, } аренаКонфиг := arena.АренаКонфиг{ Бот_: бот, АренаИмя_: "Битва мастеров", СтрКонтроль_: `/> Битва мастеров <`, ФнПуск_: сам.пуск, СтрУрл_: "https://wartank.ru/pvp", } сам.ИАрена = arena.НовАрена(аренаКонфиг) сам.сеть = arena_net.НовАренаСеть(сам, "https://wartank.ru/pvp") return сам } // запускает в работу битву мастеров func (сам *БитваМастеров) пуск() { _ = сам.goBatMas() go func() { for { time.Sleep(time.Second * 10) select { case <-сам.бот.Контекст().Done(): return case <-сам.ВремяОстат().КаналСиг(): if !сам.goBatMas() { // Проверка на начало сражения continue } } } }() } // Вычисляет нужно ли идти в битву мастеров // // если нужно, то время проверять уже не надо func (сам *БитваМастеров) goBatMas() bool { сам.findTimeCount() if !сам.upBattle() { return false } countTime := сам.ВремяОстат().String() if countTime > "00:25:00" { if err := сам.ОбратВремяУст(alias.Время(countTime)); err != nil { сам.лог.Ошибка("goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err) } return false } // Время меньше 25 сек, надо уточнять (тут возможна ошибка с экраном ожидания) сам.сеть.Обновить() // Время ожидания вышло, надо начать атаку if err := сам.ОбратВремяУст("00"); err != nil { log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(0)\n\terr=%v\n", err) } return false } // Ищет время до начала битвы мастеров func (сам *БитваМастеров) findTimeCount() { var ( strOut string lstBattle = сам.СписПолучить() еслиНайдено bool ) // Обновление через: 12:02:22 for _, strOut = range lstBattle { if strings.Contains(strOut, `Обновление через: `) { еслиНайдено = true break } } if еслиНайдено { // Ждём начала битвы мастеров lstTime := strings.Split(strOut, `Обновление через: `) strTime := lstTime[1] lstTime = strings.Split(strTime, ` (`) strTime = lstTime[0] if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil { log.Printf("WARN BatMas.findTimeCount(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", strTime, err) } } } // При необходимости даёт команду на участие в битве мастеров, // // вызывается только если есть награда func (сам *БитваМастеров) upBattle() bool { сам.сеть.Обновить() // log.Error("BatMas.upBattle(): доделать") // var ( // strOut string // lstBattle = сам.GetLst() // еслиНайдено bool // ) // for _, strOut = range lstBattle { // if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) { // еслиНайдено = true // break // } // } // if еслиНайдено { // lstUp := strings.Split(strOut, `Взвод, подъем! В атаку!`) // linkUp = "https://wartank.ru/" + lstUp[0] // lstBattle, err := сам.net.Get(linkUp) // if err != nil { // log.WithError(err).Error("Battle.upBattle(): при выполнении GET-команды на подъём в атаку") // return false // } // if err = сам.Update(lstBattle); err != nil { // log.WithError(err).Error("Battle.upBattle(): при обновлении lstBattle") // } // } return false }