net_stat.go 9.4 KB

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