netstat.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package netstat
  2. import (
  3. "fmt"
  4. // "log"
  5. "strconv"
  6. "strings"
  7. "wartank/pkg/types"
  8. )
  9. /*
  10. Исходник предоставляет тип для парсинга статистики уровня танка и сервера.
  11. */
  12. // NetStat -- статистика уровня танка и сервера
  13. type NetStat struct {
  14. server types.IServer
  15. bot types.IServBot
  16. }
  17. // NewNetStat -- возвращает новый *NetStat
  18. func NewNetStat(server types.IServer, bot types.IServBot) (*NetStat, error) {
  19. if server == nil {
  20. return nil, fmt.Errorf("NewNetStat(): IServer == nil")
  21. }
  22. if bot == nil {
  23. return nil, fmt.Errorf("NewNetStat(): IServBot == nil")
  24. }
  25. sf := &NetStat{
  26. server: server,
  27. bot: bot,
  28. }
  29. return sf, nil
  30. }
  31. func (sf *NetStat) Update() (err error) {
  32. // _mt.Println("\n===NetStat.Update()===")
  33. sf.findLevelTank()
  34. if err = sf.findLevelProgress(); err != nil {
  35. return fmt.Errorf("NetStat.Update(): in find level progress, err=\n\t%w", err)
  36. }
  37. if err = sf.findAtack(); err != nil {
  38. return fmt.Errorf("NetStat.Update(): in find atack, err=\n\t%w", err)
  39. }
  40. if err = sf.findArmor(); err != nil {
  41. return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
  42. }
  43. if err = sf.findFyne(); err != nil {
  44. return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
  45. }
  46. if err = sf.findHard(); err != nil {
  47. return fmt.Errorf("NetStat.Update(): in find body, err=\n\t%w", err)
  48. }
  49. if err = sf.findPower(); err != nil {
  50. return fmt.Errorf("NetStat.Update(): in find power, err=\n\t%w", err)
  51. }
  52. if err = sf.findOnline(); err != nil {
  53. return fmt.Errorf("NetStat.Update(): in find online, err=\n\t%w", err)
  54. }
  55. return nil
  56. }
  57. // Ищет в теле текста ангара мощность танка
  58. func (sf *NetStat) findPower() (err error) {
  59. // _mt.Println("\tNetStat.findPower()")
  60. lstAngar := sf.bot.Angar().GetLst()
  61. if len(lstAngar) == 0 {
  62. // log._rintf("WARN NetStat.findPower(): lstAngar is empty\n")
  63. return
  64. }
  65. var strOut string
  66. for _, strPower := range lstAngar {
  67. if strings.Contains(strPower, `/images/icons/power.png?2`) {
  68. strOut = strPower
  69. break
  70. }
  71. }
  72. // Выделить мощность
  73. lstPower := strings.Split(strOut, `<img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: `)
  74. strPower := lstPower[1]
  75. lstPower = strings.Split(strPower, `</span>`)
  76. strPower = lstPower[0]
  77. iPower, err := strconv.Atoi(strPower)
  78. if err != nil {
  79. return fmt.Errorf("NetStat.findPower(): power(%v) not number, err=\n\t%w", strPower, err)
  80. }
  81. sf.bot.Tank().TankStat().Power().Set(iPower)
  82. return nil
  83. }
  84. // Ищет в теле текста ангара прочность танка
  85. func (sf *NetStat) findHard() (err error) {
  86. var (
  87. strOut string
  88. lstAngar = sf.bot.Angar().GetLst()
  89. isFind bool
  90. )
  91. if len(lstAngar) == 0 {
  92. // log._rintf("WARN NetStat.findHard(): lstAngar пустой\n")
  93. return
  94. }
  95. for _, strOut = range lstAngar {
  96. if strings.Contains(strOut, `/images/icons/durability.png?1`) {
  97. isFind = true
  98. break
  99. }
  100. }
  101. if !isFind {
  102. return
  103. }
  104. // Выделить прочность
  105. lstHard := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/durability.png?1" alt="Прочность" title="Прочность"/> Прочность <span class="green2">`)
  106. strHard := lstHard[1]
  107. lstHard = strings.Split(strHard, `</span><br/>`)
  108. strHard = lstHard[0]
  109. iHard, err := strconv.Atoi(strHard)
  110. if err != nil {
  111. return fmt.Errorf("NetStat.findHard(): hard(%v) not number, err=\n\t%w", strHard, err)
  112. }
  113. sf.bot.Tank().TankStat().Hard().Set(iHard)
  114. return nil
  115. }
  116. // Ищет в теле текста ангара точность танка
  117. func (sf *NetStat) findFyne() (err error) {
  118. // _mt.Println("\tNetStat.findFyne()")
  119. var (
  120. strOut string
  121. lstAngar = sf.bot.Angar().GetLst()
  122. isFind bool
  123. )
  124. if len(lstAngar) == 0 {
  125. // log._rintf("WARN NetStat.findFyne(): lstAngar пустой\n")
  126. return
  127. }
  128. for _, strOut = range lstAngar {
  129. if strings.Contains(strOut, `/images/icons/accuracy.png?1`) {
  130. isFind = true
  131. break
  132. }
  133. }
  134. if !isFind {
  135. return nil
  136. }
  137. // Выделить броню
  138. lstFyne := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">`)
  139. strFyne := lstFyne[1]
  140. lstFyne = strings.Split(strFyne, `</span><br/>`)
  141. strFyne = lstFyne[0]
  142. iFyne, err := strconv.Atoi(strFyne)
  143. if err != nil {
  144. return fmt.Errorf("NetStat.findFyne(): fyne(%v) not number, err=\n\t%w", strFyne, err)
  145. }
  146. sf.bot.Tank().TankStat().Fyne().Set(iFyne)
  147. return nil
  148. }
  149. // Ищет в теле текста ангара броню танка
  150. func (sf *NetStat) findArmor() (err error) {
  151. // _mt.Println("\tNetStat.findArmor()")
  152. var (
  153. strOut string
  154. lstAngar = sf.bot.Angar().GetLst()
  155. isFind bool
  156. )
  157. if len(lstAngar) == 0 {
  158. return nil
  159. }
  160. for _, strOut = range lstAngar {
  161. if strings.Contains(strOut, `/images/icons/armor.png?1`) {
  162. isFind = true
  163. break
  164. }
  165. }
  166. if !isFind {
  167. return
  168. }
  169. // Выделить броню
  170. lstArmor := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/armor.png?1" alt="Броня" title="Броня"/> Броня <span class="green2">`)
  171. strArmor := lstArmor[1]
  172. lstArmor = strings.Split(strArmor, `</span><br/>`)
  173. strArmor = lstArmor[0]
  174. iArmor, err := strconv.Atoi(strArmor)
  175. if err != nil {
  176. return fmt.Errorf("NetStat.findArmor(): armor(%v) not number, err=\n\t%w", strArmor, err)
  177. }
  178. sf.bot.Tank().TankStat().Armor().Set(iArmor)
  179. return nil
  180. }
  181. // Ищет в теле текста ангара уровень танка
  182. func (sf *NetStat) findLevelTank() {
  183. // _mt.Println("\tNetStat.findLevelTank()")
  184. lstAngar := sf.bot.Angar().GetLst()
  185. if len(lstAngar) == 0 {
  186. // log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar")
  187. return
  188. }
  189. var strOut string
  190. for _, strLevel := range lstAngar {
  191. if strings.Contains(strLevel, "/images/icons/level.png?2") {
  192. strOut = strLevel
  193. break
  194. }
  195. }
  196. // Выделить уровень
  197. lstLevel := strings.Split(strOut, `<td><div class="value-block lh1"><span><span><img height="14" width="14" src="/images/icons/level.png?2"/> `)
  198. strLevel := lstLevel[1]
  199. lstLevel = strings.Split(strLevel, `</span></span></div></td>`)
  200. strLevel = lstLevel[0]
  201. iLevel, err := strconv.Atoi(strLevel)
  202. if err != nil {
  203. // log._rintf("ERRO NetStat.findLevelTank(): level(%v) не число, err=\n\t%v\n", strLevel, err)
  204. return
  205. }
  206. sf.bot.Angar().Level().Set(iLevel)
  207. }
  208. // Ищет в теле текста ангара прогресс уровня танка танка
  209. func (sf *NetStat) findLevelProgress() error {
  210. // _mt.Println("\tNetStat.findLevelProgress()")
  211. lstAngar := sf.bot.Angar().GetLst()
  212. if len(lstAngar) == 0 {
  213. // log._rintf("WARN NetStat.findLevelProgress(): lstAngar пустой\n")
  214. return nil
  215. }
  216. var strOut string
  217. for _, strProg := range lstAngar {
  218. if strings.Contains(strProg, `class="progr"`) {
  219. strOut = strProg
  220. break
  221. }
  222. }
  223. // Выделить прогресс
  224. lstProg := strings.Split(strOut, `<td class="progr"><div class="scale-block"><div class="scale" style="width:`)
  225. strProg := lstProg[1]
  226. lstProg = strings.Split(strProg, `%;">&nbsp;</div></div></td>`)
  227. strProg = lstProg[0]
  228. iProg, err := strconv.Atoi(strProg)
  229. if err != nil {
  230. return fmt.Errorf("NetStat.findLevelProgress(): progress(%v) not number, err=\n\t%w", strProg, err)
  231. }
  232. sf.bot.Angar().Progress().Set(iProg)
  233. return nil
  234. }
  235. // Ищет в теле текста ангара силу атаки танка
  236. func (sf *NetStat) findAtack() (err error) {
  237. var (
  238. strOut string
  239. lstAngar = sf.bot.Angar().GetLst()
  240. isFind bool
  241. )
  242. for _, strOut = range lstAngar {
  243. if strings.Contains(strOut, `/images/icons/attack.png?1`) {
  244. isFind = true
  245. break
  246. }
  247. }
  248. if !isFind {
  249. return nil
  250. }
  251. // Выделить атаку
  252. lstAtack := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
  253. strAtack := lstAtack[1]
  254. lstAtack = strings.Split(strAtack, `</span><br/>`)
  255. strAtack = lstAtack[0]
  256. iAtack, err := strconv.Atoi(strAtack)
  257. if err != nil {
  258. return fmt.Errorf("NetStat.findAtack(): atack(%v) not number, err=\n\t%w", strAtack, err)
  259. }
  260. sf.bot.Tank().TankStat().Attack().Set(iAtack)
  261. return nil
  262. }
  263. // Ищет в теле текста ангара силу атаки танка
  264. func (sf *NetStat) findOnline() (err error) {
  265. // _mt.Println("\tNetStat.findOnline()")
  266. lstAngar := sf.bot.Angar().GetLst()
  267. var strOut string
  268. for _, strAtack := range lstAngar {
  269. if strings.Contains(strAtack, `>Онлайн</a>: `) {
  270. strOut = strAtack
  271. break
  272. }
  273. }
  274. // Выделить число игроков онлайн
  275. lstAngar = strings.Split(strOut, `<span class="yellow1">`)
  276. if len(lstAngar) <= 1 {
  277. sf.server.CancelApp()
  278. return
  279. }
  280. strOnline := lstAngar[1]
  281. lstAngar = strings.Split(strOnline, `</span>`)
  282. strOnline = lstAngar[0]
  283. iOnline, err := strconv.Atoi(strOnline)
  284. if err != nil {
  285. return fmt.Errorf("NetStat.findOnline(): online(%v) not number, err=\n\t%w", iOnline, err)
  286. }
  287. sf.bot.Angar().Online().Set(iOnline)
  288. return nil
  289. }