// 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
}