package angar import ( "fmt" "sync" "time" "strconv" "strings" "wartank/pkg/section" "wartank/pkg/types" "wartank/server/serv_bots/warbot/angar/angarnet" "wartank/server/serv_bots/warbot/angar/base" "wartank/server/serv_bots/warbot/angar/battle" "wartank/server/serv_bots/warbot/angar/convoy" "wartank/server/serv_bots/warbot/angar/fuel" "wartank/server/serv_bots/warbot/angar/fuel_attack" "wartank/server/serv_bots/warbot/angar/masters" "wartank/server/serv_bots/warbot/angar/missions" "wartank/server/serv_bots/warbot/angar/netstat" "wartank/server/serv_bots/warbot/tank/tankstat/static_param" "github.com/sirupsen/logrus" ) /* Объект ангара приложения */ // Ангар -- ангар для танка type Ангар struct { *section.Секция сеть types.ИСценаСеть топливоБой *fuel_attack.ТопливоБой бот types.ИБот конвой *convoy.Конвой сражение *battle.Сражение битва *masters.БитваМастеров база *base.База миссии *missions.Миссии золото types.ИСтатПарам уровень types.ИСтатПарам progress types.ИСтатПарам топливо *fuel.Топливо игроковОнлайн types.ИСтатПарам сереброВсего types.ИСтатПарам silverOnline types.ИСтатПарам сетьТанкСтат *netstat.NetStat блок sync.Mutex } // НовАнгар -- возвращает новый *Angar func НовАнгар(bot types.ИБот) (*Ангар, error) { section, err := section.НовСекция(bot, "Ангар", `Ангар`) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create ISection, err=\n\t%w", err) } золото, ош := static_param.НовСтатПарам("gold") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики золота, ош=\n\t%w", ош) } уровень, ош := static_param.НовСтатПарам("level") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики уровня бота, ош=\n\t%w", ош) } прогресс, ош := static_param.НовСтатПарам("progress") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики прогресса уровня, ош=\n\t%w", ош) } игроковОнлайн, ош := static_param.НовСтатПарам("online") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики игроков онлайн, ош=\n\t%w", ош) } сереброВсего, ош := static_param.НовСтатПарам("silver_all") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики серебра всего, ош=\n\t%w", ош) } сереброСессия, ош := static_param.НовСтатПарам("silver_online") if ош != nil { return nil, fmt.Errorf("НовАнгар(): при создании статистики серебра заработанного за сессию, ош=\n\t%w", ош) } сам := &Ангар{ Секция: section, бот: bot, золото: золото, уровень: уровень, progress: прогресс, игроковОнлайн: игроковОнлайн, сереброВсего: сереброВсего, silverOnline: сереброСессия, } { // Сеть сам.сеть, err = angarnet.NewAngarNet(сам) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create , err=\n\t%w", err) } } { // Сеть атаки сам.топливоБой, err = fuel_attack.НовТопливоБой(сам) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create , err=\n\t%w", err) } } { // Статистика сам.сетьТанкСтат, err = netstat.NewNetStat(сам.бот) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create NetResource, err=\n\t%w", err) } } { // Convoy сам.конвой, err = convoy.НовКонвой(сам.бот) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create IConvoy, err=\n\t%w", err) } } { // Сражение сам.сражение, err = battle.НовСражение(сам.бот) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create IBattle, err=\n\t%w", err) } } { // Битва мастеров сам.битва, err = masters.НовБитваМастеров(сам.бот) if err != nil { return nil, fmt.Errorf("НовАнгар(): in create *BatMas, err=\n\t%w", err) } // go сам.batMas.Run() } { // База сам.база, err = base.НовБаза(сам) if err != nil { return nil, fmt.Errorf("НовАнгар(): in make IBase, err=\n\t%w", err) } } { // Миссии сам.миссии, err = missions.НовМиссии(сам.бот) if err != nil { return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err) } } { // Топливо сам.топливо, err = fuel.НовТопливо(сам) if err != nil { return nil, fmt.Errorf("НовАнгар(): in make *Missions, err=\n\t%w", err) } } _ = types.ИАнгар(сам) return сам, nil } // Обновить -- обновить ангар принудиельно func (сам *Ангар) Обновить() { сам.РесурсыОбновить() сам.сетьТанкСтат.Update() сам.конвой.Обновить() сам.топливо.Обновить() } // запускает обработку ангара func (сам *Ангар) Пуск() error { { // Запуск компонентов if err := сам.топливоБой.Пуск(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске сетевой секции опыт за топливо, err=\n\t%w", err) } if err := сам.конвой.Пуск(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске конвоя, err=\n\t%w", err) } if err := сам.сражение.Пуск(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске сражения, err=\n\t%w", err) } if err := сам.битва.Run(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске схватки, err=\n\t%w", err) } if err := сам.база.Пуск(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске базы, err=\n\t%w", err) } if err := сам.миссии.Пуск(); err != nil { return fmt.Errorf("Ангар.Пуск(): при пуске наград, err=\n\t%w", err) } go сам.топливо.Run() } фнЦикл := func() bool { сам.Обновить() // сам.конвойПроверить() if err := сам.Секция.ОбратВремяУст("01:00"); err != nil { сам.Отмена() logrus.WithError(err).Errorln("Ангар.Run(): in update ICountTime") return false } return true } go func() { сам.Секция.ОбратВремяУст("01") for { select { case <-сам.бот.Кнт().Done(): // Отмена контекста return case <-сам.ВремяОстат().КаналСиг(): // Метка времени if !фнЦикл() { return } default: // Запускается раз в минуту if !фнЦикл() { return } time.Sleep(time.Minute * 1) } } }() return nil } // Обновляет ресурсы ангара func (сам *Ангар) РесурсыОбновить() { if ош := сам.сеть.Обновить(); ош != nil { // log._rintf("ERRO Ангар.updateResurs(): при обработке ангара в сети, err=\n\t%v\n", err) return } сам.золотоНайти() сам.сереброНайти() } // IMissions -- возвращает ссылку на объект миссий func (сам *Ангар) Миссии() types.ИМиссии { return сам.миссии } // Сражение -- возвращает объект сражения func (сам *Ангар) Сражение() types.ИСражениеСцена { return сам.сражение } // Конвой -- возвращает объект конвоя func (сам *Ангар) Конвой() types.Конвой { return сам.конвой } // Золото -- возвращает объект золота func (сам *Ангар) Золото() types.ИСтатПарам { return сам.золото } // Топливо -- возвращает объект топлива func (сам *Ангар) Топливо() types.ИСтатПарам { return сам.топливо.Fuel() } // Уровень -- возвращает объект уровня игрока func (сам *Ангар) Уровень() types.ИСтатПарам { return сам.уровень } // Прогресс -- возвращает прогрес уровня игрока func (сам *Ангар) Прогресс() types.ИСтатПарам { return сам.progress } // ИгрокиОнлайн -- возвращает количество игроков онлайн func (сам *Ангар) ИгрокиОнлайн() types.ИСтатПарам { return сам.игроковОнлайн } // СереброВсего -- возвращает объект всего серебра в ангаре func (сам *Ангар) СереброВсего() types.ИСтатПарам { return сам.сереброВсего } // СереброЗаработаноСессия -- возвращает объект серебра за сессию в ангаре func (сам *Ангар) СереброЗаработаноСессия() types.ИСтатПарам { return сам.silverOnline } // СереброОбновить -- на основе фактического серебра -- обновляет вырабатанное серебро func (сам *Ангар) СереброОбновить(silverFact int) { if сам.сереброВсего.Получ() == 0 { // Если запуск сам.сереброВсего.Уст(silverFact) return } if сам.сереброВсего.Получ() > silverFact { // Если потрачего серебро сам.сереброВсего.Уст(silverFact) return } if сам.сереброВсего.Получ() < silverFact { // Если заработано so := сам.silverOnline.Получ() sd := silverFact - сам.сереброВсего.Получ() сам.silverOnline.Уст(so + sd) } сам.сереброВсего.Уст(silverFact) } // База -- возвращает базу func (сам *Ангар) База() types.ИБаза { сам.блок.Lock() defer сам.блок.Unlock() return сам.база } /* Проверяет на исполнение конвоя func (сам *Ангар) конвойПроверить() { var ( strOut string еслиНайдено bool lstAngar = сам.СписПолучить() ) for _, strOut = range lstAngar { if strings.Contains(strOut, `>Конвой`) { еслиНайдено = true break } } if !еслиНайдено { return } if !strings.Contains(strOut, `Конвой`) { return } сам.конвой.UpdateLst() } */ // Ищет в теле текста ангара серебро func (сам *Ангар) сереброНайти() { // _mt.Println("\tAngarNet.findSilver()") lstAngar := сам.СписПолучить() var strOut string for _, strSilver := range lstAngar { if strings.Contains(strSilver, `Серебро `) strSilver := lstSilver[1] iSilver, err := strconv.Atoi(strSilver) if err != nil { // log._rintf("ERRO AngarNet.findSilver(): silver(%v) not number, err=\n\t%v\n", strSilver, err) return } сам.сереброВсего.Уст(iSilver) } // Ищет в теле текста ангара золото func (сам *Ангар) золотоНайти() { var ( lstAngar = сам.бот.Ангар().СписПолучить() strOut string еслиНайдено bool ) for _, strGold := range lstAngar { if strings.Contains(strGold, `Золото `) strGold := lstGold[1] iGold, err := strconv.Atoi(strGold) if err != nil { // log._rintf("ERRO AngarNet.findGold(): gold(%v) not number, err=\n\t%v\n", strGold, err) return } сам.бот.Ангар().Золото().Уст(iGold) }