| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- package netstat
- import (
- "fmt"
- // "log"
- "strconv"
- "strings"
- "wartank/pkg/types"
- )
- /*
- Исходник предоставляет тип для парсинга статистики уровня танка и сервера.
- */
- // NetStat -- статистика уровня танка и сервера
- type NetStat struct {
- server types.ИСервер
- bot types.ИБот
- }
- // NewNetStat -- возвращает новый *NetStat
- func NewNetStat(bot types.ИБот) (*NetStat, error) {
- if bot == nil {
- return nil, fmt.Errorf("NewNetStat(): IBot == nil")
- }
- сам := &NetStat{
- server: bot.Сервер(),
- bot: bot,
- }
- return сам, nil
- }
- func (сам *NetStat) Update() (err error) {
- // _mt.Println("\n===NetStat.Update()===")
- сам.findLevelTank()
- if err = сам.findLevelProgress(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find level progress, err=\n\t%w", err)
- }
- if err = сам.findAtack(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find atack, err=\n\t%w", err)
- }
- if err = сам.findArmor(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
- }
- if err = сам.findFyne(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
- }
- if err = сам.findHard(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find body, err=\n\t%w", err)
- }
- if err = сам.findPower(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find power, err=\n\t%w", err)
- }
- if err = сам.findOnline(); err != nil {
- return fmt.Errorf("NetStat.Update(): in find online, err=\n\t%w", err)
- }
- return nil
- }
- // Ищет в теле текста ангара мощность танка
- func (сам *NetStat) findPower() (err error) {
- // _mt.Println("\tNetStat.findPower()")
- lstAngar := сам.bot.Ангар().СписПолучить()
- if len(lstAngar) == 0 {
- // log._rintf("WARN NetStat.findPower(): lstAngar is empty\n")
- return
- }
- var strOut string
- for _, strPower := range lstAngar {
- if strings.Contains(strPower, `/images/icons/power.png?2`) {
- strOut = strPower
- break
- }
- }
- // Выделить мощность
- lstPower := strings.Split(strOut, `<img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: `)
- strPower := lstPower[1]
- lstPower = strings.Split(strPower, `</span>`)
- strPower = lstPower[0]
- iPower, err := strconv.Atoi(strPower)
- if err != nil {
- return fmt.Errorf("NetStat.findPower(): power(%v) not number, err=\n\t%w", strPower, err)
- }
- сам.bot.Танк().ТанкСтат().Мощь().Уст(iPower)
- return nil
- }
- // Ищет в теле текста ангара прочность танка
- func (сам *NetStat) findHard() (err error) {
- var (
- strOut string
- lstAngar = сам.bot.Ангар().СписПолучить()
- еслиНайдено bool
- )
- if len(lstAngar) == 0 {
- // log._rintf("WARN NetStat.findHard(): lstAngar пустой\n")
- return
- }
- for _, strOut = range lstAngar {
- if strings.Contains(strOut, `/images/icons/durability.png?1`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено {
- return
- }
- // Выделить прочность
- lstHard := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/durability.png?1" alt="Прочность" title="Прочность"/> Прочность <span class="green2">`)
- strHard := lstHard[1]
- lstHard = strings.Split(strHard, `</span><br/>`)
- strHard = lstHard[0]
- iHard, err := strconv.Atoi(strHard)
- if err != nil {
- return fmt.Errorf("NetStat.findHard(): hard(%v) not number, err=\n\t%w", strHard, err)
- }
- сам.bot.Танк().ТанкСтат().Прочность().Уст(iHard)
- return nil
- }
- // Ищет в теле текста ангара точность танка
- func (сам *NetStat) findFyne() (err error) {
- // _mt.Println("\tNetStat.findFyne()")
- var (
- strOut string
- lstAngar = сам.bot.Ангар().СписПолучить()
- еслиНайдено bool
- )
- if len(lstAngar) == 0 {
- // log._rintf("WARN NetStat.findFyne(): lstAngar пустой\n")
- return
- }
- for _, strOut = range lstAngar {
- if strings.Contains(strOut, `/images/icons/accuracy.png?1`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено {
- return nil
- }
- // Выделить броню
- lstFyne := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">`)
- strFyne := lstFyne[1]
- lstFyne = strings.Split(strFyne, `</span><br/>`)
- strFyne = lstFyne[0]
- iFyne, err := strconv.Atoi(strFyne)
- if err != nil {
- return fmt.Errorf("NetStat.findFyne(): fyne(%v) not number, err=\n\t%w", strFyne, err)
- }
- сам.bot.Танк().ТанкСтат().Точность().Уст(iFyne)
- return nil
- }
- // Ищет в теле текста ангара броню танка
- func (сам *NetStat) findArmor() (err error) {
- // _mt.Println("\tNetStat.findArmor()")
- var (
- strOut string
- lstAngar = сам.bot.Ангар().СписПолучить()
- еслиНайдено bool
- )
- if len(lstAngar) == 0 {
- return nil
- }
- for _, strOut = range lstAngar {
- if strings.Contains(strOut, `/images/icons/armor.png?1`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено {
- return
- }
- // Выделить броню
- lstArmor := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/armor.png?1" alt="Броня" title="Броня"/> Броня <span class="green2">`)
- strArmor := lstArmor[1]
- lstArmor = strings.Split(strArmor, `</span><br/>`)
- strArmor = lstArmor[0]
- iArmor, err := strconv.Atoi(strArmor)
- if err != nil {
- return fmt.Errorf("NetStat.findArmor(): armor(%v) not number, err=\n\t%w", strArmor, err)
- }
- сам.bot.Танк().ТанкСтат().Броня().Уст(iArmor)
- return nil
- }
- // Ищет в теле текста ангара уровень танка
- func (сам *NetStat) findLevelTank() {
- // _mt.Println("\tNetStat.findLevelTank()")
- lstAngar := сам.bot.Ангар().СписПолучить()
- if len(lstAngar) == 0 {
- // log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar")
- return
- }
- var strOut string
- for _, strLevel := range lstAngar {
- if strings.Contains(strLevel, "/images/icons/level.png?2") {
- strOut = strLevel
- break
- }
- }
- // Выделить уровень
- lstLevel := strings.Split(strOut, `<td><div class="value-block lh1"><span><span><img height="14" width="14" src="/images/icons/level.png?2"/> `)
- strLevel := lstLevel[1]
- lstLevel = strings.Split(strLevel, `</span></span></div></td>`)
- strLevel = lstLevel[0]
- iLevel, err := strconv.Atoi(strLevel)
- if err != nil {
- // log._rintf("ERRO NetStat.findLevelTank(): level(%v) не число, err=\n\t%v\n", strLevel, err)
- return
- }
- сам.bot.Ангар().Уровень().Уст(iLevel)
- }
- // Ищет в теле текста ангара прогресс уровня танка танка
- func (сам *NetStat) findLevelProgress() error {
- // _mt.Println("\tNetStat.findLevelProgress()")
- lstAngar := сам.bot.Ангар().СписПолучить()
- if len(lstAngar) == 0 {
- // log._rintf("WARN NetStat.findLevelProgress(): lstAngar пустой\n")
- return nil
- }
- var strOut string
- for _, strProg := range lstAngar {
- if strings.Contains(strProg, `class="progr"`) {
- strOut = strProg
- break
- }
- }
- // Выделить прогресс
- lstProg := strings.Split(strOut, `<td class="progr"><div class="scale-block"><div class="scale" style="width:`)
- strProg := lstProg[1]
- lstProg = strings.Split(strProg, `%;"> </div></div></td>`)
- strProg = lstProg[0]
- iProg, err := strconv.Atoi(strProg)
- if err != nil {
- return fmt.Errorf("NetStat.findLevelProgress(): progress(%v) not number, err=\n\t%w", strProg, err)
- }
- сам.bot.Ангар().Прогресс().Уст(iProg)
- return nil
- }
- // Ищет в теле текста ангара силу атаки танка
- func (сам *NetStat) findAtack() (err error) {
- var (
- strOut string
- lstAngar = сам.bot.Ангар().СписПолучить()
- еслиНайдено bool
- )
- for _, strOut = range lstAngar {
- if strings.Contains(strOut, `/images/icons/attack.png?1`) {
- еслиНайдено = true
- break
- }
- }
- if !еслиНайдено {
- return nil
- }
- // Выделить атаку
- lstAtack := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
- strAtack := lstAtack[1]
- lstAtack = strings.Split(strAtack, `</span><br/>`)
- strAtack = lstAtack[0]
- iAtack, err := strconv.Atoi(strAtack)
- if err != nil {
- return fmt.Errorf("NetStat.findAtack(): atack(%v) not number, err=\n\t%w", strAtack, err)
- }
- сам.bot.Танк().ТанкСтат().Атака().Уст(iAtack)
- return nil
- }
- // Ищет в теле текста ангара силу атаки танка
- func (сам *NetStat) findOnline() (err error) {
- // _mt.Println("\tNetStat.findOnline()")
- lstAngar := сам.bot.Ангар().СписПолучить()
- var strOut string
- for _, strAtack := range lstAngar {
- if strings.Contains(strAtack, `>Онлайн</a>: `) {
- strOut = strAtack
- break
- }
- }
- // Выделить число игроков онлайн
- lstAngar = strings.Split(strOut, `<span class="yellow1">`)
- if len(lstAngar) <= 1 {
- сам.server.Отменить()
- return
- }
- strOnline := lstAngar[1]
- lstAngar = strings.Split(strOnline, `</span>`)
- strOnline = lstAngar[0]
- iOnline, err := strconv.Atoi(strOnline)
- if err != nil {
- return fmt.Errorf("NetStat.findOnline(): online(%v) not number, err=\n\t%w", iOnline, err)
- }
- сам.bot.Ангар().ИгрокиОнлайн().Уст(iOnline)
- return nil
- }
|