battle_register.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // package battle_register -- регестрирует танк в битве
  2. package battle_register
  3. import (
  4. "fmt"
  5. "log"
  6. "strings"
  7. "wartank/pkg/components/section"
  8. "wartank/pkg/components/sectionnet"
  9. "wartank/pkg/types"
  10. )
  11. // BattleRegister -- регистрирует танк к началу атаки
  12. type BattleRegister struct {
  13. *section.Section
  14. server types.IServer
  15. bot types.IServBot
  16. net *sectionnet.SectionNet
  17. }
  18. // NewBattleRegister -- возвращает новый ожидатель битвы
  19. func NewBattleRegister(server types.IServer, bot types.IServBot) (*BattleRegister, error) {
  20. { // Предусловия
  21. if server == nil {
  22. return nil, fmt.Errorf("NewBattleRegister(): IServer == nil")
  23. }
  24. if bot == nil {
  25. return nil, fmt.Errorf("NewBattleRegister():IServBot == nil")
  26. }
  27. }
  28. sf := &BattleRegister{
  29. server: server,
  30. bot: bot,
  31. }
  32. var err error
  33. { // ISection (ожидание)
  34. sf.Section, err = section.NewSection(server, `<title>Сражения</title>`)
  35. if err != nil {
  36. return nil, fmt.Errorf("NewBattleRegister(): in create *Section, err=\n\t%w", err)
  37. }
  38. }
  39. return sf, nil
  40. }
  41. // Run -- запускает регистратор в работу
  42. func (sf *BattleRegister) Run() {
  43. sf.net = sectionnet.NewSectionNet(sf.server, sf.bot, sf, "http://wartank.ru/pve")
  44. }
  45. // Register -- регистрирует танк на сражение
  46. func (sf *BattleRegister) Register() {
  47. if err := sf.net.UpdateLst("Ближайшее сражение"); err != nil { // Здесь может уже обратный отсчёт перед сражением
  48. return
  49. }
  50. var (
  51. strOut string
  52. lstBattle = sf.GetLst()
  53. isFind bool
  54. )
  55. for _, strOut = range lstBattle {
  56. if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) {
  57. isFind = true
  58. break
  59. }
  60. if strings.Contains(strOut, `<div class="white medium cntr bold mb5">Вы в рядах участников</div>`) {
  61. // log._rintf("INFO BattleRegister.Register(): уже зарегистрирован\n")
  62. return
  63. }
  64. }
  65. if !isFind { // Возможно, ожидание или битва уже идёт
  66. return
  67. }
  68. // Найдено приглашение на участие
  69. lstUp := strings.Split(strOut, `<a class="simple-but border" href="`)
  70. linkUp := lstUp[1]
  71. lstUp = strings.Split(linkUp, `"><span><span>Взвод, подъем! В атаку!</span></span></a>`)
  72. linkUp = "http://wartank.ru/" + lstUp[0]
  73. lstBattle, err := sf.net.Get(linkUp)
  74. if err != nil {
  75. // log._rintf("ERRO BattleRegister.Register(): при выполнении GET-команды на подъём в атаку, err=\n\t%v\n", err)
  76. return
  77. }
  78. if err = sf.Update(lstBattle); err != nil {
  79. log.Printf("BattleRegister.Register(): при обновлении lstBattle, err=\n\t%v\n", err)
  80. }
  81. // log._rintf("INFO BattleRegister.Register(): регистрация прошла успешно\n")
  82. }