net_stat.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package net_stat
  2. import (
  3. "strconv"
  4. "strings"
  5. "wartank/pkg/components/kernel/logger"
  6. "wartank/pkg/types"
  7. )
  8. /*
  9. Исходник предоставляет тип для парсинга статистики уровня танка и сервера.
  10. */
  11. // NetStat -- статистика уровня танка и сервера
  12. type NetStat struct {
  13. server types.ИСервер
  14. бот types.ИБот
  15. лог types.ИЛоггер
  16. }
  17. // NewNetStat -- возвращает новый *NetStat
  18. func NewNetStat(bot types.ИБот) *NetStat {
  19. лог := logger.НовЛоггер("NetStat")
  20. лог.Инфо("NewNetStat()\n")
  21. лог.Паника(bot == nil, "NewNetStat(): ИБот == nil")
  22. сам := &NetStat{
  23. server: bot.Сервер(),
  24. бот: bot,
  25. лог: лог,
  26. }
  27. return сам
  28. }
  29. func (сам *NetStat) Update() {
  30. // _mt.Println("\n===NetStat.Update()===")
  31. сам.findLevelTank()
  32. сам.findLevelProgress()
  33. сам.атакаНайти()
  34. сам.броняНайти()
  35. сам.точностьНайти()
  36. сам.прочностьНайти()
  37. сам.мощностьНайти()
  38. сам.игроковОнлайнНайти()
  39. }
  40. // Ищет в теле текста ангара мощность танка
  41. func (сам *NetStat) мощностьНайти() {
  42. lstAngar := сам.бот.Ангар().СписПолучить()
  43. if len(lstAngar) == 0 {
  44. // log._rintf("WARN NetStat.findPower(): lstAngar is empty\n")
  45. return
  46. }
  47. var strOut string
  48. for _, strPower := range lstAngar {
  49. if strings.Contains(strPower, `/images/icons/power.png?2`) {
  50. strOut = strPower
  51. break
  52. }
  53. }
  54. // Выделить мощность
  55. lstPower := strings.Split(strOut, `<img src="/images/icons/power.png?2" height="14" width="14"> <span class="green2">Танковая мощь: `)
  56. strPower := lstPower[1]
  57. lstPower = strings.Split(strPower, `</span>`)
  58. strPower = lstPower[0]
  59. iPower, ош := strconv.Atoi(strPower)
  60. сам.лог.Паника(ош != nil, "NetStat.мощностьНайти(): мощность(%v) не число, ош=\n\t%v\n", strPower, ош)
  61. сам.бот.Стата().Мощь().Уст(iPower)
  62. }
  63. // Ищет в теле текста ангара прочность танка
  64. func (сам *NetStat) прочностьНайти() {
  65. var (
  66. strOut string
  67. lstAngar = сам.бот.Ангар().СписПолучить()
  68. еслиНайдено bool
  69. )
  70. if len(lstAngar) == 0 {
  71. // log._rintf("WARN NetStat.findHard(): lstAngar пустой\n")
  72. return
  73. }
  74. for _, strOut = range lstAngar {
  75. if strings.Contains(strOut, `/images/icons/durability.png?1`) {
  76. еслиНайдено = true
  77. break
  78. }
  79. }
  80. if !еслиНайдено {
  81. return
  82. }
  83. // Выделить прочность
  84. lstHard := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/durability.png?1" alt="Прочность" title="Прочность"/> Прочность <span class="green2">`)
  85. strHard := lstHard[1]
  86. lstHard = strings.Split(strHard, `</span><br/>`)
  87. strHard = lstHard[0]
  88. iHard, ош := strconv.Atoi(strHard)
  89. сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): прочность(%v) не число, ош=\n\t%v\n", strHard, ош)
  90. сам.бот.Стата().Прочность().Уст(iHard)
  91. }
  92. // Ищет в теле текста ангара точность танка
  93. func (сам *NetStat) точностьНайти() {
  94. var (
  95. strOut string
  96. lstAngar = сам.бот.Ангар().СписПолучить()
  97. еслиНайдено bool
  98. )
  99. if len(lstAngar) == 0 {
  100. // log._rintf("WARN NetStat.findFyne(): lstAngar пустой\n")
  101. return
  102. }
  103. for _, strOut = range lstAngar {
  104. if strings.Contains(strOut, `/images/icons/accuracy.png?1`) {
  105. еслиНайдено = true
  106. break
  107. }
  108. }
  109. if !еслиНайдено {
  110. return
  111. }
  112. // Выделить броню
  113. lstFyne := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">`)
  114. strFyne := lstFyne[1]
  115. lstFyne = strings.Split(strFyne, `</span><br/>`)
  116. strFyne = lstFyne[0]
  117. iFyne, ош := strconv.Atoi(strFyne)
  118. сам.лог.Паника(ош != nil, "NetStat.точностьНайти(): точность(%v) не число, ош=\n\t%v\n", strFyne, ош)
  119. сам.бот.Стата().Точность().Уст(iFyne)
  120. }
  121. // Ищет в теле текста ангара броню танка
  122. func (сам *NetStat) броняНайти() {
  123. var (
  124. strOut string
  125. lstAngar = сам.бот.Ангар().СписПолучить()
  126. еслиНайдено bool
  127. )
  128. if len(lstAngar) == 0 {
  129. return
  130. }
  131. for _, strOut = range lstAngar {
  132. if strings.Contains(strOut, `/images/icons/armor.png?1`) {
  133. еслиНайдено = true
  134. break
  135. }
  136. }
  137. if !еслиНайдено {
  138. return
  139. }
  140. // Выделить броню
  141. lstArmor := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/armor.png?1" alt="Броня" title="Броня"/> Броня <span class="green2">`)
  142. strArmor := lstArmor[1]
  143. lstArmor = strings.Split(strArmor, `</span><br/>`)
  144. strArmor = lstArmor[0]
  145. iArmor, ош := strconv.Atoi(strArmor)
  146. сам.лог.Паника(ош != nil, "NetStat.броняНайти(): броня(%v) не число, ош=\n\t%v\n", strArmor, ош)
  147. сам.бот.Стата().Броня().Уст(iArmor)
  148. }
  149. // Ищет в теле текста ангара уровень танка
  150. func (сам *NetStat) findLevelTank() {
  151. lstAngar := сам.бот.Ангар().СписПолучить()
  152. if len(lstAngar) == 0 {
  153. // log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar")
  154. return
  155. }
  156. var strOut string
  157. for _, strLevel := range lstAngar {
  158. if strings.Contains(strLevel, "/images/icons/level.png?2") {
  159. strOut = strLevel
  160. break
  161. }
  162. }
  163. // Выделить уровень
  164. lstLevel := strings.Split(strOut, `<td><div class="value-block lh1"><span><span><img height="14" width="14" src="/images/icons/level.png?2"/> `)
  165. strLevel := lstLevel[1]
  166. lstLevel = strings.Split(strLevel, `</span></span></div></td>`)
  167. strLevel = lstLevel[0]
  168. iLevel, ош := strconv.Atoi(strLevel)
  169. сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): уровень(%v) не число, ош=\n\t%v\n", strLevel, ош)
  170. сам.бот.Ангар().Уровень().Уст(iLevel)
  171. }
  172. // Ищет в теле текста ангара прогресс уровня танка танка
  173. func (сам *NetStat) findLevelProgress() {
  174. lstAngar := сам.бот.Ангар().СписПолучить()
  175. сам.лог.Паника(len(lstAngar) == 0, "lstAngar пустой")
  176. var strOut string
  177. for _, strProg := range lstAngar {
  178. if strings.Contains(strProg, `class="progr"`) {
  179. strOut = strProg
  180. break
  181. }
  182. }
  183. // Выделить прогресс
  184. lstProg := strings.Split(strOut, `<td class="progr"><div class="scale-block"><div class="scale" style="width:`)
  185. strProg := lstProg[1]
  186. lstProg = strings.Split(strProg, `%;">&nbsp;</div></div></td>`)
  187. strProg = lstProg[0]
  188. iProg, ош := strconv.Atoi(strProg)
  189. сам.лог.Паника(ош != nil, "NetStat.прогрессНайти(): прогресс(%v) не число, ош=\n\t%v\n", strProg, ош)
  190. сам.бот.Ангар().Прогресс().Уст(iProg)
  191. }
  192. // Ищет в теле текста ангара силу атаки танка
  193. func (сам *NetStat) атакаНайти() {
  194. var (
  195. strOut string
  196. lstAngar = сам.бот.Ангар().СписПолучить()
  197. еслиНайдено bool
  198. )
  199. for _, strOut = range lstAngar {
  200. if strings.Contains(strOut, `/images/icons/attack.png?1`) {
  201. еслиНайдено = true
  202. break
  203. }
  204. }
  205. if !еслиНайдено {
  206. return
  207. }
  208. // Выделить атаку
  209. списАтака := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
  210. стрАтака := списАтака[1]
  211. списАтака = strings.Split(стрАтака, `</span><br/>`)
  212. стрАтака = списАтака[0]
  213. целАтака, ош := strconv.Atoi(стрАтака)
  214. сам.лог.Паника(ош != nil, "NetStat.атакаНайти(): атака(%v) не число, ош=\n\t%v\n", стрАтака, ош)
  215. сам.бот.Стата().Атака().Уст(целАтака)
  216. }
  217. // Ищет в теле текста ангара силу атаки танка
  218. func (сам *NetStat) игроковОнлайнНайти() {
  219. lstAngar := сам.бот.Ангар().СписПолучить()
  220. var strOut string
  221. for _, стрАтака := range lstAngar {
  222. if strings.Contains(стрАтака, `>Онлайн</a>: `) {
  223. strOut = стрАтака
  224. break
  225. }
  226. }
  227. // Выделить число игроков онлайн
  228. lstAngar = strings.Split(strOut, `<span class="yellow1">`)
  229. if len(lstAngar) <= 1 {
  230. сам.server.Отменить()
  231. return
  232. }
  233. strOnline := lstAngar[1]
  234. lstAngar = strings.Split(strOnline, `</span>`)
  235. strOnline = lstAngar[0]
  236. iOnline, ош := strconv.Atoi(strOnline)
  237. сам.лог.Паника(ош != nil, "NetStat.findOnline(): игроков онлайн(%v) не число, ош=\n\t%v\n", strOnline, ош)
  238. сам.бот.Ангар().ИгрокиОнлайн().Уст(iOnline)
  239. }