net_stat.go 9.5 KB

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