| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // 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.АренаКонфиг{
- Конт_: конт,
- АренаИмя_: "База",
- СтрКонтроль_: `<title>База</title>`,
- ФнПуск_: сам.пуск,
- СтрУрл_: "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
- }
|