| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // package arena -- типовая арена работы части игры (банк, арсенал и т.п.)
- package arena
- import (
- "fmt"
- "log"
- "sync"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- "wartank/app/lev0/alias"
- . "wartank/app/lev0/types"
- "wartank/app/lev1"
- "wartank/app/lev2/arena/arena_context"
- "wartank/app/lev2/arena/arena_net"
- "wartank/app/lev2/arena/arena_string"
- "wartank/app/lev2/arena/down_time"
- )
- // АренаКонфиг -- конфигурация арены
- type АренаКонфиг struct {
- Бот_ ИБот
- АренаИмя_ alias.ААренаИмя
- СтрКонтроль_ string // Контрольная строка для арены
- СтрУрл_ string // Адрес арены
- ФнПуск_ func()
- }
- // Контролирует правильность параметров
- func (конф *АренаКонфиг) контроль() {
- Hassert(конф.СтрКонтроль_ != "", "АренаКонфиг.СтрКонтроль_ == \"\"")
- Hassert(конф.ФнПуск_ != nil, "АренаКонфиг.ФнПуск_ == nil")
- Hassert(конф.Бот_ != nil, "АренаКонфиг.Бот_ == nil")
- Hassert(конф.АренаИмя_ != "", "АренаКонфиг.СценаИмя_ == \"\"")
- Hassert(конф.СтрУрл_ != "", "АренаКонфиг.СтрУрл_ == \"\"")
- }
- // Арена -- арена игры
- type Арена struct {
- ИАренаКонтекст
- времяОстат ИВремяОстат // Обратный отсчёт до окончания работы режима
- списСтр *arena_string.АренаСтроки // Список строк из сети для анализа секции
- конф АренаКонфиг
- уровень ИСтатПарам
- сеть ИАренаСеть
- блок sync.RWMutex
- }
- // НовАрена -- возвращает новую арену игры
- func НовАрена(конт ILocalCtx, конф АренаКонфиг) ИАрена {
- log.Printf("НовАрена(): стрКонтроль=%q\n", конф.СтрКонтроль_)
- конф.контроль()
- аренаКонтекст := arena_context.НовАренаКонтекст(конт, конф.Бот_, конф.АренаИмя_)
- сам := &Арена{
- ИАренаКонтекст: аренаКонтекст,
- уровень: lev1.НовСтатПарам("уровень"),
- времяОстат: down_time.НовВремОбрат(аренаКонтекст, 5),
- списСтр: arena_string.НовАренаСтроки(конт, конф.СтрКонтроль_),
- конф: конф,
- }
- сам.сеть = arena_net.НовАренаСеть_(конт, сам, конф.СтрУрл_) //"https://wartank.ru/angar")
- return сам
- }
- // Пуск -- запускает арену
- func (сам *Арена) Пуск() {
- сам.Обновить()
- сам.конф.ФнПуск_()
- }
- // Обновить -- обновляет арену
- func (сам *Арена) Обновить() {
- сам.сеть.Обновить()
- списСтр := сам.СписПолучить()
- if len(списСтр) == 0 {
- списСтр = сам.Бот().Сеть().ВебВоркер().Получ(сам.конф.СтрУрл_)
- }
- ош := сам.СтрОбновить(списСтр)
- if ош != nil {
- log.Printf("Арена.Обновить(): ош=\n\t%v\n", ош)
- сам.Отменить()
- }
- }
- // СтрОбновить -- обновляет список строк секции по требованию
- func (сам *Арена) СтрОбновить(lstString []string) error {
- if err := сам.списСтр.Set(lstString); err != nil {
- return fmt.Errorf("Арена.СтрОбновить(): при установке lstString, err=\n\t%w", err)
- }
- return nil
- }
- // Уровень -- возвращает уровень арены
- func (сам *Арена) Уровень() ИСтатПарам {
- return сам.уровень
- }
- // СписПолучить -- возвращает список строк секции
- func (сам *Арена) СписПолучить() []string {
- return сам.списСтр.Получ()
- }
- // ОбратВремяУст -- устанавливает новое значение обратного счётчика времени
- func (сам *Арена) ОбратВремяУст(времяСек alias.АВремя) error {
- ош := сам.времяОстат.Уст(времяСек)
- if ош != nil {
- return fmt.Errorf("Арена.ОбратВремяУст(): ош=\n\t%w", ош)
- }
- return nil
- }
- // ВремяОстат -- объект оставшегося времени
- func (сам *Арена) ВремяОстат() ИВремяОстат {
- сам.блок.RLock()
- defer сам.блок.RUnlock()
- return сам.времяОстат
- }
- // Сеть -- возвращает объект сети
- func (сам *Арена) Сеть() ИАренаСеть {
- return сам.сеть
- }
|