warbot.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // package warbot -- бот для игры в wartank
  2. package warbot
  3. import (
  4. "fmt"
  5. "wartank/pkg/types"
  6. "wartank/server/serv_bots/warbot/angar"
  7. "wartank/server/serv_bots/warbot/tank"
  8. "wartank/server/serv_bots/warbot/warbot_net"
  9. )
  10. // WarBot -- бот для игры в вартанк
  11. type WarBot struct {
  12. server types.IServer
  13. store types.IStore
  14. tank *tank.Tank
  15. errFinal error // Финальная ошибка работы, если была
  16. angar types.IAngar
  17. botNet types.IBotNet
  18. name string // Имя бота
  19. pass string // Пароль бота
  20. }
  21. // NewWarBot -- возвращает новый WarBot
  22. func NewWarBot(server types.IServer, name string) (*WarBot, error) {
  23. { // Предусловия
  24. if server == nil {
  25. return nil, fmt.Errorf("NewWarBot(): IApp is nil")
  26. }
  27. if name == "" {
  28. return nil, fmt.Errorf("NewWarBot(): name is empty")
  29. }
  30. }
  31. tank, err := tank.NewTank(server)
  32. if err != nil {
  33. return nil, fmt.Errorf("NewWarBot(): in create Tank, err=\n\t%w", err)
  34. }
  35. sf := &WarBot{
  36. server: server,
  37. store: server.Store(),
  38. tank: tank,
  39. name: name,
  40. }
  41. sf.pass, err = sf.store.Get("/bot/" + sf.name)
  42. if err != nil {
  43. return nil, fmt.Errorf("NewWarBot(): in get pass from store, err=\n\t%w", err)
  44. }
  45. { // WarBotNet
  46. sf.botNet, err = warbot_net.NewWarBotNet(server, sf)
  47. if err != nil {
  48. return nil, fmt.Errorf("NewWarBot(): in make IBotNet, err=\n\t%w", err)
  49. }
  50. }
  51. sf.angar, err = angar.NewAngar(sf.server, sf)
  52. if err != nil {
  53. return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", sf.name, err)
  54. }
  55. return sf, nil
  56. }
  57. // Name -- возвращает имя бота
  58. func (sf *WarBot) Name() string {
  59. return sf.name
  60. }
  61. // Pass -- возвращает пароль бота
  62. func (sf *WarBot) Pass() string {
  63. return sf.pass
  64. }
  65. // Run -- запускает бот в работу
  66. func (sf *WarBot) Run() (err error) {
  67. err = sf.botNet.Login()
  68. if err != nil {
  69. return fmt.Errorf("WarBot.Run(): bot(%q) in net login, err=\n\t%w", sf.name, err)
  70. }
  71. if err := sf.angar.Run(); err != nil {
  72. return fmt.Errorf("WarBot.Run(): bot(%q) in run angar, err=\n\t%w", sf.name, err)
  73. }
  74. return nil
  75. }
  76. // Error -- возвращает финальную ошибку работы, если была
  77. func (sf *WarBot) Error() error {
  78. return sf.errFinal
  79. }
  80. // Angar -- возвращает ангар игры
  81. func (sf *WarBot) Angar() types.IAngar {
  82. return sf.angar
  83. }
  84. // Tank -- возвращает объект танка
  85. func (sf *WarBot) Tank() types.ITank {
  86. return sf.tank
  87. }
  88. // BotNet -- возвращает ссылку на свой сетевой клиент
  89. func (sf *WarBot) BotNet() types.IBotNet {
  90. return sf.botNet
  91. }