arena_convoy.go 11 KB

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