desktop.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. // package desktop -- консольный клиент для вар-танка
  2. package desktop
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "time"
  8. "github.com/charmbracelet/bubbles/textinput"
  9. tea "github.com/charmbracelet/bubbletea"
  10. "wartank/desktop/client_serv"
  11. "wartank/desktop/config"
  12. "wartank/desktop/win_bots_add_login"
  13. "wartank/desktop/win_bots_add_pass"
  14. "wartank/desktop/win_bots_list"
  15. "wartank/desktop/win_bots_menu"
  16. "wartank/desktop/win_config"
  17. "wartank/desktop/win_config_server"
  18. "wartank/desktop/win_config_server_host_input"
  19. "wartank/desktop/win_config_server_login_input"
  20. "wartank/desktop/win_config_server_pass_input"
  21. "wartank/desktop/win_default"
  22. "wartank/desktop/win_server_connect"
  23. "wartank/desktop/win_server_login"
  24. "wartank/pkg/alias"
  25. "wartank/pkg/bot"
  26. "wartank/pkg/cons"
  27. "wartank/pkg/types"
  28. )
  29. // Desktop -- консольный клиент для вар-танка
  30. type Desktop struct {
  31. conf *config.Config
  32. winName alias.AWinName // Режим показа на экране
  33. p *tea.Program // Объект приложения
  34. client *client_serv.ClientServ // Клиент подключния к бото-серверу
  35. isConnect bool // Признак подключения к бот-серверу
  36. isLogin bool // Признак логина на сервер
  37. dictWin map[alias.AWinName]types.ITermWin // Список окон показа
  38. botCurrent *bot.Bot
  39. }
  40. // var desk *Desktop
  41. func NewDesktop() (*Desktop, error) {
  42. sf := &Desktop{
  43. client: client_serv.NewClientServ(),
  44. dictWin: make(map[alias.AWinName]types.ITermWin),
  45. conf: config.NewConfig(),
  46. botCurrent: &bot.Bot{},
  47. }
  48. sf.p = tea.NewProgram(sf, tea.WithAltScreen(), tea.WithANSICompressor())
  49. { // Создание окон
  50. { // WinDefault
  51. winDefault, err := win_default.NewWinDefault(sf)
  52. if err != nil {
  53. return nil, fmt.Errorf("NewDesktop(): in create WinDefault, err=\n\t%w", err)
  54. }
  55. sf.dictWin[winDefault.Name()] = winDefault
  56. }
  57. { // WinConfig
  58. winConfig, err := win_config.NewWinConfig(sf)
  59. if err != nil {
  60. return nil, fmt.Errorf("NewDesktop(): in create WinConfig, err=\n\t%w", err)
  61. }
  62. sf.dictWin[winConfig.Name()] = winConfig
  63. }
  64. { // WinConfigServer
  65. winConfigServer, err := win_config_server.NewWinConfigServer(sf)
  66. if err != nil {
  67. return nil, fmt.Errorf("NewDesktop(): in create WinConfigServer, err=\n\t%w", err)
  68. }
  69. sf.dictWin[winConfigServer.Name()] = winConfigServer
  70. }
  71. { // WinConfigServerHostInput
  72. winConfigServerHostInput, err := win_config_server_host_input.NewWinConfigServerHostInput(sf)
  73. if err != nil {
  74. return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerHostInput, err=\n\t%w", err)
  75. }
  76. sf.dictWin[winConfigServerHostInput.Name()] = winConfigServerHostInput
  77. }
  78. { // WinConfigServerLoginInput
  79. winConfigServerLoginInput, err := win_config_server_login_input.NewWinConfigServerLoginInput(sf)
  80. if err != nil {
  81. return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerLoginInput, err=\n\t%w", err)
  82. }
  83. sf.dictWin[winConfigServerLoginInput.Name()] = winConfigServerLoginInput
  84. }
  85. { // WinConfigServerPassInput
  86. winConfigServerPassInput, err := win_config_server_pass_input.NewWinConfigServerPasswordInput(sf)
  87. if err != nil {
  88. return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerPasswordInput, err=\n\t%w", err)
  89. }
  90. sf.dictWin[winConfigServerPassInput.Name()] = winConfigServerPassInput
  91. }
  92. { // WinServerConnect
  93. winServerConnect, err := win_server_connect.NewWinServerConnect(sf)
  94. if err != nil {
  95. return nil, fmt.Errorf("NewDesktop(): in create WinServerConnect, err=\n\t%w", err)
  96. }
  97. sf.dictWin[winServerConnect.Name()] = winServerConnect
  98. }
  99. { // WinServerLogin
  100. winServerLogin, err := win_server_login.NewWinServerLogin(sf)
  101. if err != nil {
  102. return nil, fmt.Errorf("NewDesktop(): in create WinServerLogin, err=\n\t%w", err)
  103. }
  104. sf.dictWin[winServerLogin.Name()] = winServerLogin
  105. }
  106. { // WinBotsMenu
  107. winBotsMenu, err := win_bots_menu.NewWinBotsMenu(sf)
  108. if err != nil {
  109. return nil, fmt.Errorf("NewDesktop(): in create WinBotsMenu, err=\n\t%w", err)
  110. }
  111. sf.dictWin[winBotsMenu.Name()] = winBotsMenu
  112. }
  113. { // WinBotsAddLogin
  114. winBotsAddLogin, err := win_bots_add_login.NewWinBotsAddLogin(sf)
  115. if err != nil {
  116. return nil, fmt.Errorf("NewDesktop(): in create WinBotsAddLogin, err=\n\t%w", err)
  117. }
  118. sf.dictWin[winBotsAddLogin.Name()] = winBotsAddLogin
  119. }
  120. { // WinBotsAddPass
  121. winBotsAddPass, err := win_bots_add_pass.NewWinBotsAddPass(sf)
  122. if err != nil {
  123. return nil, fmt.Errorf("NewDesktop(): in create WinBotsAddPass, err=\n\t%w", err)
  124. }
  125. sf.dictWin[winBotsAddPass.Name()] = winBotsAddPass
  126. }
  127. { // WinBotsLst
  128. winBotsLst, err := win_bots_list.NewWinBotsList(sf)
  129. if err != nil {
  130. return nil, fmt.Errorf("NewDesktop(): in create WinBotsLst, err=\n\t%w", err)
  131. }
  132. sf.dictWin[winBotsLst.Name()] = winBotsLst
  133. }
  134. }
  135. sf.winName = cons.WinDefault
  136. go sf.tick()
  137. return sf, nil
  138. }
  139. // SetWin -- устанавливает главное окно
  140. func (sf *Desktop) SetWin(winName alias.AWinName) {
  141. sf.winName = winName
  142. }
  143. func (sf *Desktop) tick() {
  144. for {
  145. time.Sleep(time.Second * 1)
  146. msg := tea.MouseEvent{}
  147. // m.Update(msg)
  148. sf.p.Send(msg)
  149. }
  150. }
  151. // Run -- запускает в работу консольный клиент
  152. func (sf *Desktop) Run() error {
  153. if _, err := sf.p.Run(); err != nil {
  154. return fmt.Errorf("Deskto.Run(): err=\n\t%w", err)
  155. }
  156. return nil
  157. }
  158. // Init -- инициализация перед запуском главного цикла
  159. func (sf *Desktop) Init() tea.Cmd {
  160. // Просто вернуть `nil`, т.е. никаких команд
  161. return textinput.Blink
  162. }
  163. // Update -- обновление консоли по требованию
  164. func (sf *Desktop) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  165. var cmd tea.Cmd
  166. switch msg := msg.(type) {
  167. // Может клавиша нажата
  168. case tea.KeyMsg:
  169. switch msg.String() { // Да, нажато, а что именно?
  170. case "ctrl+q": // Надо выйти из программы
  171. return sf, tea.Quit
  172. }
  173. }
  174. mod_, _ := sf.dictWin[sf.winName].Update(msg)
  175. if mod_ != nil {
  176. return sf, nil
  177. }
  178. return sf, cmd
  179. }
  180. func (sf *Desktop) View() string {
  181. _ = tea.ClearScreen()
  182. _s := fmt.Sprintf("Desktop.View(): winName=%q\n", sf.winName)
  183. os.WriteFile("./out.log", []byte(_s), 0600)
  184. s := time.Now().Local().Format("[ WarTank ] = 2006-01-02 15:04:05.000")
  185. s += fmt.Sprintf("\tХост=%q\tЛогин=%q\tПароль=%q\tПодключено=%v\tЛогин=%v\n\n",
  186. sf.conf.Host_,
  187. sf.conf.Login_,
  188. sf.conf.Pass_,
  189. sf.isConnect,
  190. sf.isLogin)
  191. s += _s + sf.dictWin[sf.winName].View() + "\n\n\n\n"
  192. return s
  193. }
  194. // IsLogin -- возвращает признак логина на сервер ботов
  195. func (sf *Desktop) IsLogin() bool {
  196. return sf.isLogin
  197. }
  198. // IsConnect -- возвращает признак подключения на сервер ботов
  199. func (sf *Desktop) IsConnect() bool {
  200. return sf.isConnect
  201. }
  202. // SetHost -- устанавливает имя хоста бото-фермы
  203. func (sf *Desktop) SetHost(hostName string) {
  204. sf.conf.Host_ = hostName
  205. sf.conf.Save()
  206. }
  207. // SetLogin -- устанавливает логин бото-фермы
  208. func (sf *Desktop) SetLogin(login string) {
  209. sf.conf.Login_ = login
  210. sf.conf.Save()
  211. }
  212. // SetPass -- устанавливает пароль бото-фермы
  213. func (sf *Desktop) SetPass(password string) {
  214. sf.conf.Pass_ = password
  215. sf.conf.Save()
  216. }
  217. // Connect -- подключает клиент к бото-ферме
  218. func (sf *Desktop) Connect() error {
  219. err := sf.client.Connect(sf.conf.Host_)
  220. sf.isConnect = false
  221. if err != nil {
  222. return fmt.Errorf("Desktop.Connect(): err=\n\t%v", err)
  223. }
  224. sf.isConnect = true
  225. return nil
  226. }
  227. // MakeLogin -- выполняет вход на бото-ферму
  228. func (sf *Desktop) MakeLogin() error {
  229. err := sf.client.Login(sf.conf.Login_, sf.conf.Pass_)
  230. sf.isLogin = false
  231. if err != nil {
  232. return fmt.Errorf("Desktop.MakeLogin(): in login to server, err=\n\t%v", err)
  233. }
  234. sf.isLogin = true
  235. return nil
  236. }
  237. // SetBotLogin -- устанавливает логин текущего бота
  238. func (sf *Desktop) SetBotLogin(login string) {
  239. sf.botCurrent.Login_ = login
  240. }
  241. // SetBotPass -- устанавливает пароль текущего бота
  242. func (sf *Desktop) SetBotPass(password string) {
  243. sf.botCurrent.Pass_ = password
  244. for _, bot_ := range sf.conf.ListBot_ {
  245. if bot_.Login_ == sf.botCurrent.Login_ {
  246. return
  247. }
  248. }
  249. err := sf.client.AddBot(sf.botCurrent.Login_, password)
  250. if err != nil {
  251. log.Printf("Desktop.SetBotPass(): in make request, err=\n\t%v\n", err)
  252. return
  253. }
  254. botNew := &bot.Bot{
  255. Login_: sf.botCurrent.Login_,
  256. Pass_: password,
  257. }
  258. sf.conf.ListBot_ = append(sf.conf.ListBot_, botNew)
  259. sf.conf.Save()
  260. }
  261. // LstBot -- список ботов из десктоп-клиента
  262. func (sf *Desktop) LstBot() []*bot.Bot {
  263. return sf.conf.ListBot_
  264. }
  265. // CurrentBotStart -- стартует текущего бота
  266. func (sf *Desktop) CurrentBotStart() {
  267. sf.client.BotStart(sf.botCurrent.Login_)
  268. }