net_stat.go 9.2 KB

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