// package arena_base -- база в игре package arena_base import ( "fmt" "log" "sync" "time" . "gitp78su.ipnodns.ru/svi/kern" . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes" . "wartank/app/lev0/types" "wartank/app/lev2/arena" ) /* Объект базы в игре. */ const ( // времОжидПлат = "01:00" // Время ожидания платного ускорения // времОжидБесплат = "30:00" // Время ожидания бесплатного ускорения ) // База -- объект базы type АренаБаза struct { ИАрена конт ILocalCtx блок sync.Mutex счётОбнов ISafeInt // Счётчик времени до обновления } // НовБаза -- возвращает новую базу бота func НовБаза(конт ILocalCtx) *АренаБаза { сам := &АренаБаза{ конт: конт, счётОбнов: NewSafeInt(), } аренаКонфиг := arena.АренаКонфиг{ Конт_: конт, АренаИмя_: "База", СтрКонтроль_: `База`, ФнПуск_: сам.пуск, СтрУрл_: "https://wartank.ru/buildings", } сам.ИАрена = arena.НовАрена(конт, аренаКонфиг) конт.Set("база", сам, "База бота") go сам.счётОбновВремя() _ = ИАренаБаза(сам) return сам } // Обновить -- обновляет базу (с кэшированием результата) func (сам *АренаБаза) Обновить() { списСтр := сам.СписПолучить() if len(списСтр) == 0 { сам.ИАрена.Обновить() сам.счётОбнов.Reset() return } if сам.счётОбнов.Get() < 5000 { return } сам.ИАрена.Обновить() } // ОбновитьПринуд -- обновляет базу принудительно (без учёта кэша) func (сам *АренаБаза) ОбновитьПринуд() { сам.ИАрена.Обновить() сам.счётОбнов.Reset() } // Запускает базу в обработку func (сам *АренаБаза) Пуск() { if err := сам.runComponent(); err != nil { panic(fmt.Errorf("Base.Run(): run, err=\n\t%w", err)) } go сам.пуск() } // Собственная работа func (сам *АренаБаза) пуск() { фнЦикл := func() { defer time.Sleep(time.Minute * 2) сам.Обновить() } for { select { case <-сам.Контекст().Done(): return // case <-сам.ВремяОпрос().КаналСиг(): // фнЦикл() default: log.Printf("База.пуск()\n") фнЦикл() } } } // Считает время до устаревания базы func (сам *АренаБаза) счётОбновВремя() { for { time.Sleep(time.Millisecond * 1000) счёт := сам.счётОбнов.Get() сам.счётОбнов.Set(счёт + 1000) } } // Запускает компоненты func (сам *АренаБаза) runComponent() error { log.Printf("Base.runComponent()\n") сам.блок.Lock() defer сам.блок.Unlock() return nil }