| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- // package bot -- бот для игры в wartank
- package bot
- import (
- "fmt"
- "strings"
- "time"
- . "gitp78su.ipnodns.ru/svi/kern"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- . "wartank/app/lev0/alias"
- . "wartank/app/lev0/types"
- "wartank/app/lev2"
- "wartank/app/lev3/bot/bot_config"
- "wartank/app/lev3/bot/bot_net"
- "wartank/app/lev3/bot/bot_stat/tank_stat"
- )
- // ВарБот -- бот для игры в вартанк
- type Бот struct {
- прилож ИПриложение
- хран IKernelStoreKv
- стата ИТанкСтат
- errFinal error // Финальная ошибка работы, если была
- сеть ИБотСеть
- ангар ИАренаАнгар
- база ИАренаБаза
- шахта ИАренаШахта
- арсенал ИАренаАрсенал
- полигон ИАренаПолигон
- банк ИАренаБанк
- бак ИАренаБак
- бойТопливо ИАренаСтроение
- аренаМедаль ИАрена
- миссииПростые ИАренаМиссииПростые
- рынок ИАренаРынок
- конвой ИАренаКонвой
- сражение ИАренаСтроение
- битваМастер ИАренаСтроение
- еслиРаботает ISafeBool
- еслиАвтозапуск ISafeBoolReact
- лог ILogBuf
- конт ILocalCtx
- конфиг *bot_config.БотКонфиг
- }
- // ЗагрузитьВарБот -- загружает бота из базы
- func ЗагрузитьВарБот(номер АБотНомер) *Бот {
- лог := NewLogBuf()
- лог.Info("ЗагрузитьВарБот()\n")
- Hassert(номер != 0, "ЗагрузитьВарБот(): номер пустой")
- стрНомер := fmt.Sprint(номер)
- лог.Info("ЗагрузитьВарБот(): номер=%q\n", стрНомер)
- конт := GetKernelCtx()
- хран := конт.Get("kernStoreKV").Val().(IKernelStoreKv)
- binData, err := хран.Get("/bots/" + стрНомер)
- if err != nil {
- if !strings.Contains(err.Error(), "not found") {
- Hassert(false, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
- }
- Hassert(err == nil, "ЗагрузитьВарБот(): in load bot '%v' from store, err=\n\t%v\n", номер, err)
- }
- конфиг := &bot_config.БотКонфиг{}
- конфиг.Unmarshal(binData)
- сам := создатьЯдроВарБот(конфиг)
- go сам.рестарт()
- _ = ИБот(сам)
- return сам
- }
- // Каждые два часа перезапускает себя
- func (сам *Бот) рестарт() {
- time.Sleep(time.Hour * 2)
- сам.конт.Cancel()
- сам.лог.Info("рестарт(): бот %q перезагружен\n", сам.конфиг.Логин_)
- }
- // НовВарБот -- возвращает новый WarBot
- func НовВарБот(конт IKernelCtx, номер АБотНомер, логин, пароль string, еслиАвто bool) *Бот {
- лог := NewLogBuf()
- лог.Info("НовВарБот()\n")
- Hassert(логин != "", "НовВарБот(): логин пустой")
- Hassert(пароль != "", "НовВарБот(): пароль пустой")
- лог.Info("НовВарБот(): name=%q\n", логин)
- config := &bot_config.БотКонфиг{
- ЕслиАвтозапуск_: еслиАвто,
- Логин_: логин,
- Пароль_: пароль,
- Номер_: номер,
- }
- сам := создатьЯдроВарБот(config)
- сам.сохрКонфиг()
- _ = ИБот(сам)
- return сам
- }
- // Создаёт ядро бота
- func создатьЯдроВарБот(конфиг *bot_config.БотКонфиг) *Бот {
- Hassert(конфиг != nil, "создатьЯдроВарБот(): ВарБотКонфиг==nil")
- лог := NewLogBuf()
- лог.Info("создатьЯдроВарБот()\n")
- конт := GetKernelCtx()
- приложение := конт.Get("мод_сервер").Val().(ИПриложение)
- контБот := NewLocalCtx(конт.Ctx())
- сам := &Бот{
- конт: контБот,
- прилож: приложение,
- хран: конт.Get("kernStoreKV").Val().(IKernelStoreKv),
- стата: tank_stat.НовТанкСтат(контБот),
- еслиРаботает: NewSafeBool(),
- конфиг: конфиг,
- лог: лог,
- }
- сам.еслиАвтозапуск = NewSafeBoolReact()
- сам.еслиАвтозапуск.Add(сам.Имя(), сам.автозапускИзм)
- сам.конт.Set("бот", сам, "создание ядра")
- сам.конт.Set("приложение", приложение, "Приложение WarBot")
- сам.конт.Set("бот_имя", сам.конфиг.Логин_, "Имя бота")
- сам.сеть = bot_net.НовБотСеть(сам.конт)
- сам.ангар = lev2.НовАнгар(сам.конт)
- сам.битваМастер = lev2.НовАренаБитваМастеров(сам.конт)
- сам.сражение = lev2.НовСражение(сам.конт)
- сам.рынок = lev2.НовАренаРынок(сам.конт)
- сам.аренаМедаль = lev2.НовАренаМедали(сам.конт)
- сам.конвой = lev2.НовКонвой(сам.конт)
- сам.банк = lev2.НовБанк(сам.конт)
- сам.миссииПростые = lev2.НовМиссииПростые(сам.конт)
- сам.полигон = lev2.НовПолигон(сам.конт)
- сам.база = lev2.НовБаза(сам.конт)
- сам.шахта = lev2.НовШахта(сам.конт)
- сам.арсенал = lev2.НовАрсенал(сам.конт)
- сам.бак = lev2.НовАренаБак(сам.конт)
- сам.бойТопливо = lev2.НовБойТопливо(сам.конт)
- if сам.конфиг.ЕслиАвтозапуск_ {
- сам.еслиАвтозапуск.Set()
- сам.Пуск()
- }
- return сам
- }
- // ЕслиРабота -- возвращает признак, что бот подключен
- func (сам *Бот) ЕслиРабота() bool {
- return сам.еслиРаботает.Get()
- }
- // Номер -- возвращает номер бота
- func (сам *Бот) Номер() АБотНомер {
- return сам.конфиг.Номер()
- }
- // Имя -- возвращает имя бота
- func (сам *Бот) Имя() string {
- return сам.конфиг.Логин()
- }
- // Пароль -- возвращает пароль бота
- func (сам *Бот) Пароль() string {
- return сам.конфиг.Пароль_
- }
- // Пуск -- запускает бот в работу
- func (сам *Бот) Пуск() {
- if сам.еслиРаботает.Get() {
- return
- }
- go сам.пуск()
- }
- // Работает в отдельном потоке ,пока сервер не даст команду остановки
- func (сам *Бот) пуск() {
- сам.еслиРаботает.Set()
- for {
- select {
- case <-сам.конт.Ctx().Done():
- return
- default:
- сам.ангар.Пуск()
- сам.база.Пуск()
- сам.шахта.Пуск()
- сам.арсенал.Пуск()
- сам.полигон.Пуск()
- сам.банк.Пуск()
- сам.бак.Пуск()
- сам.бойТопливо.Пуск()
- сам.аренаМедаль.Пуск()
- сам.рынок.Пуск()
- сам.конвой.Пуск()
- сам.миссииПростые.Пуск()
- // сам.сражение.Пуск()
- //сам.битваМастер.Пуск()
- fmt.Printf("бот цикл\n=============\n\n")
- time.Sleep(time.Second * 5)
- }
- }
- }
- // Error -- возвращает финальную ошибку работы, если была
- func (сам *Бот) Error() error {
- return сам.errFinal
- }
- // Стата -- возвращает статистику танка
- func (сам *Бот) Стата() ИТанкСтат {
- return сам.стата
- }
- // Сеть -- возвращает ссылку на свой сетевой клиент
- func (сам *Бот) Сеть() ИБотСеть {
- return сам.сеть
- }
- // Автозапуск -- возвращает признак автоматического запуска бота
- func (сам *Бот) Автозапуск() ISafeBoolReact {
- return сам.еслиАвтозапуск
- }
- // Обратный вызов автоматического запуска бота
- func (сам *Бот) автозапускИзм(знач bool) {
- сам.лог.Debug("Бот.автозапускИзм()")
- // сам.еслиАвтозапуск.Уст()
- сам.конфиг.ЕслиАвтозапуск_ = знач
- сам.сохрКонфиг()
- }
- // Сохраняет конфиг бота
- func (сам *Бот) сохрКонфиг() {
- strConf := сам.конфиг.Marshall()
- стрНомер := fmt.Sprint(сам.Номер())
- err := сам.хран.Set("/bots/"+стрНомер, strConf)
- Hassert(err == nil, "ВарБот.сохрКонфиг(): err=\n\t%v\n", err)
- }
- // КонтБот -- возвращает контекст бота
- func (сам *Бот) КонтБот() ILocalCtx {
- return сам.конт
- }
|