package bank import ( "fmt" "log" "strconv" "strings" "wartank/pkg/components/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/base/bank/bankmode" "wartank/server/serv_bots/warbot/angar/base/bank/banknet" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" ) /* Предоставляет объект банка на базе */ // Bank -- объект банка на базе type Bank struct { *section.Section server types.IServer bot types.IServBot net *banknet.BankNet silverBot types.IStatParam mode1 *bankmode.BankMode mode2 *bankmode.BankMode } // NewBank -- возвращает новый *Bank func NewBank(server types.IServer, bot types.IServBot) (*Bank, error) { { // Предусловия if server == nil { return nil, fmt.Errorf("NewBank(): IServer == nil") } if bot == nil { return nil, fmt.Errorf("NewBank(): IServBot == nil") } } sf := &Bank{ server: server, bot: bot, silverBot: static_param.NewStaticParam("silver_bot"), mode1: bankmode.NewBankMode(), mode2: bankmode.NewBankMode(), } return sf, nil } func (sf *Bank) Run() error { log.Printf("Bank.Run()\n") var err error { // Section // sf.Section, err = section.NewSection(`
Серебро`, sf.chCall) // Серебро
sf.Section, err = section.NewSection(sf.server, `Серебро
`) if err != nil { return fmt.Errorf("Bank.Run(): in create *Section, err=\n\t%w", err) } } { // BankNet sf.net, err = banknet.NewBankNet(sf.server, sf, sf.bot) if err != nil { return fmt.Errorf("Bank.Run(): in create NetBank, err=\n\t%w", err) } } // sf.CountDown().S_t(1) go sf.run() return nil } // UpdateLst -- принудительно обновляет состояние банка func (sf *Bank) UpdateLst() { if err := sf.net.UpdateLst("Банк"); err != nil { log.Printf("Bank.UpdateLst(): err=\n\t%v\n", err) } } // запускает банк в опрос func (sf *Bank) run() { log.Printf("Bank.run()\n") sf.CountDown().Set(5) for range sf.CountDown().ChanSig() { // time.Sleep(time.Second * 30) count := sf.CountDown().Get() log.Printf("Bank countDown=%d\n", count) if err := sf.net.UpdateLst("банк"); err != nil { // log._rintf("ERRO Bank.Run(): при обновлении lstBank, err=\n\t%v\n", err) continue } if err := sf.getAllMode(); err != nil { // log._rintf("ERRO Bank.Run(): при получении списка режимов банка, err=\n\t%v\n", err) continue } if err := sf.makeProduct(); err != nil { log.Printf("ERRO Bank.Run(): при пуске производства банка, err=\n\t%v\n", err) } } } // Mode2 -- возвращает объект режима2 func (sf *Bank) Mode2() types.IBankMode { return sf.mode2 } // Mode1 -- возвращает объект режима1 func (sf *Bank) Mode1() types.IBankMode { return sf.mode1 } // SilverBot -- возвращает серебро от бота func (sf *Bank) SilverBot() types.IStatParam { return sf.silverBot } // Запускает в производство серебро func (sf *Bank) makeProduct() error { var ( lstBank = sf.GetLst() ind int strOut string strLink string isFind bool ) time1 := sf.Mode1().Time() time2 := sf.Mode2().Time() if time1 > time2 { time1 = time2 } for ind, strOut = range lstBank { if strings.Contains(strOut, time1) { ind += 7 strLink = lstBank[ind] isFind = true break } } if isFind && strings.Contains(strLink, `>Начать производство`) { lstLink := strings.Split(strLink, `Начать производство`) strLink = "http://wartank.ru/production/" + lstLink[0] lstBank, err := sf.net.Get(strLink) if err != nil { return fmt.Errorf("BankNet.makeProduct(): при выполнении GET-запроса начать производство, err=%w", err) } for _, strOut := range lstBank { if strings.Contains(strOut, `База`) { // Это база, а не банк return nil } } if err = sf.Update(lstBank); err != nil { return fmt.Errorf("BankNet.makeProduct(): при обновлении lstBank, err=%w", err) } if err := sf.CountDown().Parse(time1); err != nil { log.Printf("WARN Bank.makeProduct(): при установке времени производства банка(%v)\n\terr=%v\n", time1, err) } } return nil } // Получает все режимы банка func (sf *Bank) getAllMode() error { var ( lstBank = sf.GetLst() ind int strMode string strMode1 string strMode2 string ) { // Получить первый режим for ind, strMode = range lstBank { if strings.Contains(strMode, `Кол-во: `) { strMode1 = strMode break } } lstMode := strings.Split(strMode1, `Кол-во: `) strMode1 = lstMode[1] lstMode = strings.Split(strMode1, `
`) strMode1 = lstMode[0] iNum1, err := strconv.Atoi(strMode1) if err != nil { return fmt.Errorf("BankNet.getAllMode(): numSilver1(%v) not number, err=\n\t%w", strMode1, err) } sf.Mode1().Silver().Set(iNum1) // Установить время производства strTime1 := lstBank[ind+2] sf.Mode1().TimeSet(strTime1) if iNum1 <= 2 { // Если банк слишком слабый return nil } } { // Получить второй режим for _ind := ind + 2; _ind < len(lstBank); _ind++ { strMode := lstBank[_ind] if strings.Contains(strMode, `Кол-во: `) { strMode2 = strMode ind = _ind break } } lstMode := strings.Split(strMode2, `Кол-во: `) strMode2 = lstMode[1] lstMode = strings.Split(strMode2, `
`) strMode2 = lstMode[0] iNum2, err := strconv.Atoi(strMode2) if err != nil { return fmt.Errorf("BankNet.getAllMode(): numSilver2(%v) not number, err=\n\t%w", strMode2, err) } sf.Mode2().Silver().Set(iNum2) // Установить время производства strTime2 := lstBank[ind+2] sf.Mode2().TimeSet(strTime2) } return nil }