serv_bots.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // package serv_bots -- словарь ботов сервера
  2. package serv_bots
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "strings"
  8. "sync"
  9. "wartank/pkg/types"
  10. "wartank/server/serv_bots/warbot"
  11. "wartank/server/serv_bots/warbot/warbot_config"
  12. )
  13. // ServBots -- словарь ботов на сервере
  14. type ServBots struct {
  15. server types.IServer
  16. store types.IStore
  17. dict map[string]types.IBot
  18. block sync.RWMutex
  19. }
  20. // NewServBots -- возвращает новый словарь серверных ботов
  21. func NewServBots(server types.IServer) (*ServBots, error) {
  22. if server == nil {
  23. return nil, fmt.Errorf("NewServBots(): IServer == nil")
  24. }
  25. sf := &ServBots{
  26. server: server,
  27. store: server.Store(),
  28. dict: make(map[string]types.IBot),
  29. }
  30. if err := sf.Load(); err != nil {
  31. return nil, fmt.Errorf("NewServBots(): in load bots, err=\n\t%w", err)
  32. }
  33. return sf, nil
  34. }
  35. // Get -- возвращает боевого бота по имени
  36. func (sf *ServBots) Get(name string) types.IBot {
  37. sf.block.RLock()
  38. defer sf.block.RUnlock()
  39. bot, isOk := sf.dict[name]
  40. if !isOk {
  41. return nil
  42. }
  43. return bot
  44. }
  45. // Загружает ботов из хранилища
  46. func (sf *ServBots) Load() error {
  47. sf.block.Lock()
  48. defer sf.block.Unlock()
  49. log.Println("ServBots.load()")
  50. strList, err := sf.store.Get("/bots/list")
  51. if err != nil {
  52. if !strings.Contains(err.Error(), "not found") {
  53. return fmt.Errorf("ServBots.Load(): in get list bot, err=\n\t%w", err)
  54. }
  55. }
  56. lstBot := make([]string, 0)
  57. if strList != "" { // Такое может быть при первом запуске
  58. err = json.Unmarshal([]byte(strList), &lstBot)
  59. if err != nil {
  60. return fmt.Errorf("ServBots.load(): in unmarshal list bot, err=\n\t%w", err)
  61. }
  62. }
  63. for _, name := range lstBot {
  64. bot, err := warbot.NewWarBot(sf.server, name)
  65. if err != nil {
  66. return fmt.Errorf("ServBots.load(): in create bot %q, err=\n\t%w", name, err)
  67. }
  68. bot.Make()
  69. if bot.IsAutoGame() {
  70. go bot.Run()
  71. }
  72. sf.dict[name] = bot
  73. }
  74. return nil
  75. }
  76. // BotStart -- запускает бота в работу по его имени
  77. func (sf *ServBots) BotStart(name string) error {
  78. bot := sf.dict[name]
  79. if bot == nil {
  80. return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", name)
  81. }
  82. bot.Make()
  83. err := bot.Run()
  84. if err != nil {
  85. return fmt.Errorf("ServBots.BotStart(): in run bot(%v), err=\n\t%w", name, err)
  86. }
  87. return nil
  88. }
  89. // ListBot -- возвращает список существующих ботов
  90. func (sf *ServBots) ListBot() []types.IBot {
  91. lst := make([]types.IBot, 0)
  92. for _, bot := range sf.dict {
  93. lst = append(lst, bot)
  94. }
  95. return lst
  96. }
  97. // AddBot -- добавляет бота на ферму
  98. func (sf *ServBots) AddBot(login, pass string) error {
  99. { // Существует ли такой бот
  100. _, isOk := sf.dict[login]
  101. if isOk {
  102. return nil
  103. }
  104. }
  105. { // Сохранить бота в базу
  106. strList, err := sf.store.Get("/bots/list")
  107. if err != nil {
  108. if !strings.Contains(err.Error(), "not found") {
  109. return fmt.Errorf("ServBots.AddBot(): in get list bot, err=\n\t%w", err)
  110. }
  111. }
  112. lstBot := make([]string, 0)
  113. if strList != "" { // Такое может быть при первом запуске
  114. err = json.Unmarshal([]byte(strList), &lstBot)
  115. if err != nil {
  116. return fmt.Errorf("ServBots.AddBot(): in unmarshal list bot, err=\n\t%w", err)
  117. }
  118. }
  119. lstBot = append(lstBot, login)
  120. binData, _ := json.Marshal(lstBot)
  121. err = sf.store.Put("/bots/list", string(binData))
  122. if err != nil {
  123. return fmt.Errorf("ServBots.AddBot(): in save to store list bot, err=\n\t%w", err)
  124. }
  125. config := &warbot_config.WarBotConfig{
  126. IsAutoRun_: false,
  127. Password_: pass,
  128. }
  129. err = sf.store.Put("/bots/"+login, config.Marshall())
  130. if err != nil {
  131. return fmt.Errorf("ServBots.AddBot(): in save to store bot(%q), err=\n\t%w", login, err)
  132. }
  133. }
  134. { // Нет такого бота, надо его создать
  135. bot, err := warbot.NewWarBot(sf.server, login)
  136. if err != nil {
  137. return fmt.Errorf("ServBots.AddBot(): in create bot %q, err=\n\t%w", login, err)
  138. }
  139. sf.dict[login] = bot
  140. }
  141. return nil
  142. }