package masters import ( "fmt" "log" "strings" "time" "wartank/pkg/alias" "wartank/pkg/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/masters/batmasnet" ) /* Битва мастеров. Работает примерно раз в сутки. Требуется три победы, потом нужно загрести золотишко. Между битвами надо удерживать рейтинг, чтобы не кидало к монстрам. */ // БитваМастеров -- объект битвы мастеров type БитваМастеров struct { *section.Секция бот types.ИБот сеть *batmasnet.BatMasNet } // НовБитваМастеров -- возвращает новый *BatMas func НовБитваМастеров(бот types.ИБот) (*БитваМастеров, error) { if бот == nil { return nil, fmt.Errorf("НовБитваМастеров(): IBot == nil") } сам := &БитваМастеров{ бот: бот, } return сам, nil } // Run -- запускает в работу битву мастеров func (сам *БитваМастеров) Run() error { var err error { // ISection (ожидание) сам.Секция, err = section.НовСекция(сам.бот, "Битва мастеров", `/> Битва мастеров <`) if err != nil { return fmt.Errorf("BatMas.Run(): in create *Section, err=\n\t%w", err) } } { // Net (ожидание) сам.сеть, err = batmasnet.NewBatMasNet(сам.бот) if err != nil { return fmt.Errorf("BatMas.Run(): при создании BatMasNet, err=\n\t%w", err) } } _ = сам.goBatMas() go func() { for { time.Sleep(time.Second * 10) select { case <-сам.бот.Кнт().Done(): return case <-сам.ВремяОстат().КаналСиг(): if !сам.goBatMas() { // Проверка на начало сражения continue } } } }() return nil } // Вычисляет нужно ли идти в битву мастеров // // если нужно, то время проверять уже не надо func (сам *БитваМастеров) goBatMas() bool { сам.findTimeCount() if !сам.upBattle() { return false } countTime := сам.ВремяОстат().String() if countTime > "00:25:00" { if err := сам.ОбратВремяУст(alias.Время(countTime)); err != nil { log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err) } return false } // Время меньше 25 сек, надо уточнять (тут возможна ошибка с экраном ожидания) if err := сам.сеть.Обновить(); err != nil { // log._rintf("ERRO Battle.goBattle().fnCountDown(): при обновлении lstBattle, err=\n\t%v\n", err) // Возможно времени уже не осталось return true } // Время ожидания вышло, надо начать атаку 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 { if err := сам.сеть.Обновить(); err != nil { // log._rintf("ERRO BatMas.upBattle(): при обновлении lstBattle, err=\n\t%v\n", err) return false } // 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 }