package netstat
import (
"fmt"
// "log"
"strconv"
"strings"
"wartank/pkg/types"
)
/*
Исходник предоставляет тип для парсинга статистики уровня танка и сервера.
*/
// NetStat -- статистика уровня танка и сервера
type NetStat struct {
server types.IServer
bot types.IServBot
}
// NewNetStat -- возвращает новый *NetStat
func NewNetStat(server types.IServer, bot types.IServBot) (*NetStat, error) {
if server == nil {
return nil, fmt.Errorf("NewNetStat(): IServer == nil")
}
if bot == nil {
return nil, fmt.Errorf("NewNetStat(): IServBot == nil")
}
sf := &NetStat{
server: server,
bot: bot,
}
return sf, nil
}
func (sf *NetStat) Update() (err error) {
// _mt.Println("\n===NetStat.Update()===")
sf.findLevelTank()
if err = sf.findLevelProgress(); err != nil {
return fmt.Errorf("NetStat.Update(): in find level progress, err=\n\t%w", err)
}
if err = sf.findAtack(); err != nil {
return fmt.Errorf("NetStat.Update(): in find atack, err=\n\t%w", err)
}
if err = sf.findArmor(); err != nil {
return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
}
if err = sf.findFyne(); err != nil {
return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
}
if err = sf.findHard(); err != nil {
return fmt.Errorf("NetStat.Update(): in find body, err=\n\t%w", err)
}
if err = sf.findPower(); err != nil {
return fmt.Errorf("NetStat.Update(): in find power, err=\n\t%w", err)
}
if err = sf.findOnline(); err != nil {
return fmt.Errorf("NetStat.Update(): in find online, err=\n\t%w", err)
}
return nil
}
// Ищет в теле текста ангара мощность танка
func (sf *NetStat) findPower() (err error) {
// _mt.Println("\tNetStat.findPower()")
lstAngar := sf.bot.Angar().GetLst()
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, `
Танковая мощь: `)
strPower := lstPower[1]
lstPower = strings.Split(strPower, ``)
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)
}
sf.bot.Tank().TankStat().Power().Set(iPower)
return nil
}
// Ищет в теле текста ангара прочность танка
func (sf *NetStat) findHard() (err error) {
var (
strOut string
lstAngar = sf.bot.Angar().GetLst()
isFind 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`) {
isFind = true
break
}
}
if !isFind {
return
}
// Выделить прочность
lstHard := strings.Split(strOut, `
Прочность `)
strHard := lstHard[1]
lstHard = strings.Split(strHard, `
`)
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)
}
sf.bot.Tank().TankStat().Hard().Set(iHard)
return nil
}
// Ищет в теле текста ангара точность танка
func (sf *NetStat) findFyne() (err error) {
// _mt.Println("\tNetStat.findFyne()")
var (
strOut string
lstAngar = sf.bot.Angar().GetLst()
isFind 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`) {
isFind = true
break
}
}
if !isFind {
return nil
}
// Выделить броню
lstFyne := strings.Split(strOut, `
Точность `)
strFyne := lstFyne[1]
lstFyne = strings.Split(strFyne, `
`)
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)
}
sf.bot.Tank().TankStat().Fyne().Set(iFyne)
return nil
}
// Ищет в теле текста ангара броню танка
func (sf *NetStat) findArmor() (err error) {
// _mt.Println("\tNetStat.findArmor()")
var (
strOut string
lstAngar = sf.bot.Angar().GetLst()
isFind bool
)
if len(lstAngar) == 0 {
return nil
}
for _, strOut = range lstAngar {
if strings.Contains(strOut, `/images/icons/armor.png?1`) {
isFind = true
break
}
}
if !isFind {
return
}
// Выделить броню
lstArmor := strings.Split(strOut, `
Броня `)
strArmor := lstArmor[1]
lstArmor = strings.Split(strArmor, `
`)
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)
}
sf.bot.Tank().TankStat().Armor().Set(iArmor)
return nil
}
// Ищет в теле текста ангара уровень танка
func (sf *NetStat) findLevelTank() {
// _mt.Println("\tNetStat.findLevelTank()")
lstAngar := sf.bot.Angar().GetLst()
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, `