dict_bot.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // package dict_bot -- словарь ботов в игре
  2. package dict_bot
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "strings"
  8. "wartank/desktop/dict_bot/bot"
  9. "wartank/desktop/dict_bot/win_bot_add"
  10. "wartank/desktop/dict_bot/win_bot_view"
  11. "wartank/desktop/dict_bot/win_bots"
  12. "wartank/pkg/types"
  13. )
  14. // DictBot -- словарь ботов в игре
  15. type DictBot struct {
  16. desktop types.IDesktop
  17. store types.IStore
  18. ws types.IWebSocket
  19. dict map[string]types.IBot
  20. winBots *win_bots.WinBots
  21. }
  22. // NewDictBot -- возвращает новый словарь ботов
  23. func NewDictBot(desktop types.IDesktop) (*DictBot, error) {
  24. if desktop == nil {
  25. return nil, fmt.Errorf("NewDictBot(): IDesktop == nil")
  26. }
  27. sf := &DictBot{
  28. desktop: desktop,
  29. store: desktop.Store(),
  30. ws: desktop.Ws(),
  31. dict: make(map[string]types.IBot),
  32. }
  33. sf.load()
  34. return sf, nil
  35. }
  36. // Загружает список ботов, к этому моменту логин рута точно прошёл
  37. func (sf *DictBot) load() {
  38. log.Println("DictBot.load()")
  39. dictResp, err := sf.ws.Read("/bot/list/load")
  40. if err != nil {
  41. if strings.Contains(err.Error(), "not found") {
  42. return
  43. }
  44. log.Printf("DictBot.load(): in get bot, err=\n\t%v\n", err)
  45. return
  46. }
  47. strErr := dictResp["err"]
  48. if strErr != "" {
  49. if strings.Contains(strErr, "not found") { // Это был первый запуск
  50. lstBot := make([]string, 0)
  51. binList, _ := json.Marshal(&lstBot)
  52. dictReq := make(map[string]string)
  53. dictReq["binData"] = string(binList)
  54. err := sf.ws.Write("/bot/list/save", dictReq)
  55. if err != nil {
  56. log.Printf("DictBot.load(): in write new list bot, err=\n\t%v\n", strErr)
  57. }
  58. } else {
  59. log.Printf("DictBot.load(): in response, err=\n\t%v\n", strErr)
  60. }
  61. }
  62. log.Printf("DictBot.load(): dictResp=%#v\n", dictResp)
  63. strList := dictResp["/bot/list"]
  64. lstBot := make([]string, 0)
  65. err = json.Unmarshal([]byte(strList), &lstBot)
  66. if err != nil {
  67. log.Printf("DictBot.load(): in unmarshal list bot, err=\n\t%v\n", err)
  68. return
  69. }
  70. for _, bot := range lstBot {
  71. sf.dict[bot] = ""
  72. }
  73. }
  74. // Show -- показывает окно списка ботов
  75. func (sf *DictBot) Show() {
  76. log.Println("DictBot.Show()")
  77. dictBot := make(map[string]string)
  78. for key := range sf.dict {
  79. dictBot[key] = ""
  80. }
  81. var err error
  82. sf.winBots, err = win_bots.NewWinBots(sf.desktop, sf.addShow, sf.view, dictBot)
  83. if err != nil {
  84. log.Printf("DictBot.Show(): in create WinBots, err=\n\t%v\n", err)
  85. return
  86. }
  87. go sf.winBots.Run()
  88. }
  89. // Показывает окно добавления бота
  90. func (sf *DictBot) addShow() {
  91. log.Println("DictBot.addShow()")
  92. winBotAdd, err := win_bot_add.NewWinBotAdd(sf.desktop, sf.addNew)
  93. if err != nil {
  94. log.Printf("DictBot.addShow(): in create WinBotAdd, err=\n\t%v\n", err)
  95. return
  96. }
  97. go winBotAdd.Run()
  98. }
  99. // Команда обратного вызова для добавления нового бота
  100. func (sf *DictBot) addNew(name, pass string) {
  101. log.Printf("DictBot.addNew(): name=%q\tpass=%q\n", name, pass)
  102. _, isOk := sf.dict[name]
  103. if isOk {
  104. log.Printf("DictBot.addNew(): бот с именем(%q) уже существует\n", name)
  105. return
  106. }
  107. bot, err := bot.NewBot(name, pass)
  108. if err != nil {
  109. log.Printf("DictBot.addNew(): in add new bot(%q), err=\n\t%v\n", name, err)
  110. return
  111. }
  112. sf.dict[name] = bot
  113. { // Работа с хранилищем
  114. // Сохранить бота в хранилище
  115. err = sf.store.Put("/bot/"+name, pass)
  116. if err != nil {
  117. log.Printf("DictBot.addNew(): in save new bot(%q), err=\n\t%v\n", name, err)
  118. return
  119. }
  120. // Обновить список ботов
  121. lstBot := make([]string, 0)
  122. for key := range sf.dict {
  123. lstBot = append(lstBot, key)
  124. }
  125. // Сохранить обновлённый список ботов
  126. binNewList, err := json.Marshal(&lstBot)
  127. if err != nil {
  128. log.Printf("DictBot.addNew(): in marshal new list bots, err=\n\t%v\n", err)
  129. return
  130. }
  131. err = sf.store.Put("/bot/list", string(binNewList))
  132. if err != nil {
  133. log.Printf("DictBot.addNew(): in save new bot(%q), err=\n\t%v\n", name, err)
  134. return
  135. }
  136. }
  137. if sf.winBots == nil {
  138. return
  139. }
  140. dictBot := make(map[string]string)
  141. for key := range sf.dict {
  142. dictBot[key] = ""
  143. }
  144. sf.winBots.UpdateList(dictBot)
  145. }
  146. // Команда просмотра существующего бота
  147. func (sf *DictBot) view(nameBot string) {
  148. log.Printf("DictBot.view(): nameBot=%q\n", nameBot)
  149. winBotView, err := win_bot_view.NewWinBotView(sf.desktop, nameBot)
  150. if err != nil {
  151. log.Printf("DictBot.view(): in create win view on bot(%q), err=\n\t%v\n", nameBot, err)
  152. return
  153. }
  154. go winBotView.Run()
  155. }