netstat.go 9.7 KB

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