package batmas import ( "fmt" "log" "strings" "time" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/batmas/batmasnet" ) /* Битва мастеров. Работает примерно раз в сутки. Требуется три победы, потом нужно загрести золотишко. Между битвами надо удерживать рейтинг, чтобы не кидало к монстрам. */ // BatMas -- объект битвы мастеров type BatMas struct { *section.Section bot types.ИБот net *batmasnet.BatMasNet } // NetBatMas -- возвращает новый *BatMas func NewBatMas(bot types.ИБот) (*BatMas, error) { if bot == nil { return nil, fmt.Errorf("NewBatMas(): IBot == nil") } sf := &BatMas{ bot: bot, } return sf, nil } // Run -- запускает в работу битву мастеров func (sf *BatMas) Run() error { var err error { // ISection (ожидание) sf.Section, err = section.NewSection(sf.bot, "Битва мастеров", `/> Битва мастеров <`) if err != nil { return fmt.Errorf("BatMas.Run(): in create *Section, err=\n\t%w", err) } } { // Net (ожидание) sf.net, err = batmasnet.NewBatMasNet(sf.bot) if err != nil { return fmt.Errorf("BatMas.Run(): при создании BatMasNet, err=\n\t%w", err) } } _ = sf.goBatMas() go func() { for { time.Sleep(time.Second * 10) select { case <-sf.bot.Кнт().Done(): sf.ВремяОпрос().Стоп() return case <-sf.ВремяОпрос().КаналСиг(): if !sf.goBatMas() { // Проверка на начало сражения continue } } } }() return nil } // Вычисляет нужно ли идти в битву мастеров // // если нужно, то время проверять уже не надо func (sf *BatMas) goBatMas() bool { sf.findTimeCount() if !sf.upBattle() { return false } countTime := sf.ВремяОпрос().Получ() countTime -= 5 if countTime > 25 { if err := sf.SetCountDown(countTime); err != nil { log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err) } return false } // Время меньше 25 сек, надо уточнять (тут возможна ошибка с экраном ожидания) if err := sf.net.UpdateLst(); err != nil { // log._rintf("ERRO Battle.goBattle().fnCountDown(): при обновлении lstBattle, err=\n\t%v\n", err) // Возможно времени уже не осталось return true } // Время ожидания вышло, надо начать атаку if err := sf.SetCountDown(0); err != nil { log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(0)\n\terr=%v\n", err) } return false } // Ищет время до начала битвы мастеров func (sf *BatMas) findTimeCount() { var ( strOut string lstBattle = sf.СписПолучить() isFind bool ) // Обновление через: 12:02:22 for _, strOut = range lstBattle { if strings.Contains(strOut, `Обновление через: `) { isFind = true break } } if isFind { // Ждём начала битвы мастеров lstTime := strings.Split(strOut, `Обновление через: `) strTime := lstTime[1] lstTime = strings.Split(strTime, ` (`) strTime = lstTime[0] if err := sf.ParseCountDown(strTime); err != nil { log.Printf("WARN BatMas.findTimeCount(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", strTime, err) } } } // При необходимости даёт команду на участие в битве мастеров, // // вызывается только если есть награда func (sf *BatMas) upBattle() bool { if err := sf.net.UpdateLst(); err != nil { // log._rintf("ERRO BatMas.upBattle(): при обновлении lstBattle, err=\n\t%v\n", err) return false } // log.Error("BatMas.upBattle(): доделать") // var ( // strOut string // lstBattle = sf.GetLst() // isFind bool // ) // for _, strOut = range lstBattle { // if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) { // isFind = true // break // } // } // if isFind { // lstUp := strings.Split(strOut, `Взвод, подъем! В атаку!`) // linkUp = "http://wartank.ru/" + lstUp[0] // lstBattle, err := sf.net.Get(linkUp) // if err != nil { // log.WithError(err).Error("Battle.upBattle(): при выполнении GET-команды на подъём в атаку") // return false // } // if err = sf.Update(lstBattle); err != nil { // log.WithError(err).Error("Battle.upBattle(): при обновлении lstBattle") // } // } return false }