arena_convoy.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package arena_convoy
  2. import (
  3. "strconv"
  4. "strings"
  5. "time"
  6. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  7. . "wartank/app/lev0/alias"
  8. . "wartank/app/lev0/types"
  9. "wartank/app/lev1"
  10. "wartank/app/lev2/arena"
  11. )
  12. /*
  13. Объект конвоя в ангаре
  14. */
  15. // АренаКонвой -- объект конвоя в ангаре
  16. type АренаКонвой struct {
  17. ИАрена
  18. бот ИБот
  19. слава ИСтатПарам // Количество славы
  20. }
  21. // НовКонвой -- возвращает новый *Convoy
  22. func НовКонвой(конт ILocalCtx) *АренаКонвой {
  23. сам := &АренаКонвой{
  24. бот: конт.Get("бот").Val().(ИБот),
  25. слава: lev1.НовСтатПарам("слава"),
  26. }
  27. аренаКонфиг := arena.АренаКонфиг{
  28. Бот_: сам.бот,
  29. АренаИмя_: "Конвой",
  30. СтрКонтроль_: `<title>Конвой</title>`,
  31. ФнПуск_: сам.пуск,
  32. СтрУрл_: "https://wartank.ru/convoy",
  33. }
  34. сам.ИАрена = arena.НовАрена(конт, аренаКонфиг)
  35. конт.Set("конвой", сам, "Арена конвоя бота")
  36. _ = ИАренаКонвой(сам)
  37. return сам
  38. }
  39. // Слава -- возвращает славу конвоя
  40. func (сам *АренаКонвой) Слава() ИСтатПарам {
  41. return сам.слава
  42. }
  43. // UpdateLst -- принудительно обновляет состояние конвоя
  44. func (сам *АренаКонвой) UpdateLst() {
  45. сам.Обновить()
  46. }
  47. // обрабатывает конвой
  48. func (сам *АренаКонвой) пуск() {
  49. фнЦикл := func() {
  50. сам.проверитьМиссия6фрагов()
  51. сам.проверитьМиссияРазведкаКонвой()
  52. сам.проверитьМиссияМастерРазведки()
  53. сам.призыВзять()
  54. }
  55. for {
  56. select {
  57. case <-сам.бот.КонтБот().Ctx().Done():
  58. return
  59. default:
  60. фнЦикл()
  61. time.Sleep(time.Second * 3)
  62. фнЦикл() // Для второго шага
  63. time.Sleep(time.Minute * 20)
  64. }
  65. }
  66. }
  67. func (сам *АренаКонвой) призыВзять() {
  68. if false {
  69. сам.обновитьВремя()
  70. }
  71. for {
  72. сам.проверитьМиссияРазведкаКонвой()
  73. сам.проверитьМиссияМастерРазведки()
  74. сам.проверитьМиссия6фрагов()
  75. сам.Обновить()
  76. }
  77. }
  78. // Обновляет славу по требованию
  79. func (сам *АренаКонвой) Обновить() {
  80. // Найти строку с упоминанием оставшегося времени конвоя
  81. lstConvoy := сам.СписПолучить()
  82. var (
  83. strGlory string
  84. еслиНайдено bool
  85. )
  86. for _, lastTime := range lstConvoy {
  87. if strings.Contains(lastTime, `alt="Слава" title="Слава"> `) {
  88. strGlory = lastTime
  89. еслиНайдено = true
  90. break
  91. }
  92. }
  93. if !еслиНайдено { // Не найдена строка со славой -- это атака
  94. return
  95. }
  96. // Ищем количество славы
  97. lstGlory := strings.Split(strGlory, `alt="Слава" title="Слава"> `)
  98. strGlory = lstGlory[1]
  99. iGlory, err := strconv.Atoi(strGlory)
  100. if err != nil {
  101. // log._rintf("ERRO ConvoyNet.updateGlory(): слава(%v) не число, err=\n\t%v\n", strGlory, err)
  102. return
  103. }
  104. сам.слава.Уст(iGlory)
  105. }
  106. // Обновляет оставшееся время конвоя
  107. func (сам *АренаКонвой) обновитьВремя() {
  108. // Время подходит надо обновляться
  109. сам.Обновить()
  110. сам.ОбратВремяУст("20")
  111. // Найти строку с упоминанием оставшегося времени конвоя
  112. lstConvoy := сам.СписПолучить()
  113. var (
  114. strLastTime string
  115. еслиНайдено bool
  116. isMask bool
  117. )
  118. for _, lastTime := range lstConvoy {
  119. if strings.Contains(lastTime, `До следующего конвоя: `) {
  120. strLastTime = lastTime
  121. еслиНайдено = true
  122. break
  123. }
  124. if strings.Contains(lastTime, `Полная маскировка через `) {
  125. strLastTime = lastTime
  126. isMask = true
  127. break
  128. }
  129. // <div class="bot"><a class="simple-but border red" w:id="startFight" href="convoy?7-1.ILinkListener-root-startFight"><span><span>В БОЙ!</span></span></a></div>
  130. if strings.Contains(lastTime, `ILinkListener-root-startFight`) {
  131. return
  132. }
  133. if strings.Contains(lastTime, `ILinkListener-root-findEnemy`) {
  134. return
  135. }
  136. // <div class="bot"><a class="simple-but border" w:id="startMasking" href="convoy?12-1.ILinkListener-root-startMasking"><span><span>В БОЙ!</span></span></a></div>
  137. if strings.Contains(lastTime, `ILinkListener-root-startMasking`) {
  138. return
  139. }
  140. }
  141. switch {
  142. case еслиНайдено: // Большая пауза между конвоями
  143. // Ждём окончания ожидания конвоя
  144. lstTime := strings.Split(strLastTime, `До следующего конвоя: `)
  145. strLastTime = lstTime[1]
  146. сам.ОбратВремяУст(АВремя(strLastTime))
  147. case isMask: // Если маскировка между конвоями
  148. // Ждём окончания ожидания конвоя
  149. lstTime := strings.Split(strLastTime, `Полная маскировка через `)
  150. strLastTime = lstTime[1]
  151. сам.ОбратВремяУст(АВремя(strLastTime))
  152. }
  153. }
  154. // Забирает награду в конвое "Активируй боевую силу"
  155. func (сам *АренаКонвой) проверитьМиссияРазведкаКонвой() {
  156. var (
  157. strOut string
  158. еслиНайдено bool
  159. )
  160. сам.Сеть().Обновить()
  161. lstConvoy := сам.СписПолучить()
  162. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  163. for _, strOut = range lstConvoy {
  164. if strings.Contains(strOut, `.ILinkListener-missions-cc-0-c-awardLink`) {
  165. еслиНайдено = true
  166. break
  167. }
  168. }
  169. if !еслиНайдено {
  170. return
  171. }
  172. // <a class="simple-but border" href="convoy?21-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  173. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  174. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  175. // https://wartank.ru/convoy?23-1.ILinkListener-missions-cc-0-c-awardLink
  176. ссылка := "https://wartank.ru/" + _ссылка
  177. lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
  178. сам.СтрОбновить(lstConvoy)
  179. }
  180. // Забирает награду в конвое "Мастер дозора"
  181. func (сам *АренаКонвой) проверитьМиссияМастерРазведки() {
  182. var (
  183. strOut string
  184. еслиНайдено bool
  185. lstConvoy = сам.СписПолучить()
  186. ind int
  187. )
  188. if len(lstConvoy) == 0 {
  189. сам.Обновить()
  190. lstConvoy = сам.СписПолучить()
  191. }
  192. for ind, strOut = range lstConvoy {
  193. if strings.Contains(strOut, `Проведи разведку в конвое<br/>`) {
  194. еслиНайдено = true
  195. ind += 23
  196. strOut = lstConvoy[ind]
  197. break
  198. }
  199. }
  200. if !еслиНайдено {
  201. return
  202. }
  203. // <a class="simple-but border" href="convoy?61-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
  204. if !strings.Contains(strOut, `ILinkListener-missions-cc-0-c-awardLink`) {
  205. return
  206. }
  207. lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
  208. strLink := lstLink[1]
  209. lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
  210. // https://wartank.ru/convoy?61-1.ILinkListener-missions-cc-0-c-awardLink
  211. strLink = "https://wartank.ru/" + lstLink[0]
  212. lstConvoy, err := сам.Сеть().Get(strLink)
  213. if err != nil {
  214. // log._rintf("ERRO Конвой.checkMaster(): при выполнении команды GET, err=\n\t%v\n", err)
  215. return
  216. }
  217. сам.СтрОбновить(lstConvoy)
  218. }
  219. // Забирает награду в конвое "Уничтожь 6 врагов в конвое"
  220. func (сам *АренаКонвой) проверитьМиссия6фрагов() {
  221. var (
  222. strOut string
  223. еслиНайдено bool
  224. )
  225. сам.Обновить()
  226. lstConvoy := сам.СписПолучить()
  227. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  228. for _, strOut = range lstConvoy {
  229. if strings.Contains(strOut, `.ILinkListener-missions-cc-1-c-awardLink`) {
  230. еслиНайдено = true
  231. break
  232. }
  233. }
  234. if !еслиНайдено {
  235. return
  236. }
  237. // <a class="simple-but border" href="convoy?8-1.ILinkListener-missions-cc-1-c-awardLink"><span><span>Получить награду</span></span></a>
  238. _ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
  239. _ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
  240. // https://wartank.ru/convoy?15-1.ILinkListener-missions-cc-1-c-awardLink
  241. ссылка := "https://wartank.ru/" + _ссылка
  242. lstConvoy = сам.Сеть().ВебВоркер().Получ(ссылка)
  243. сам.СтрОбновить(lstConvoy)
  244. }