win_bot_list.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // package win_bots_list -- окно списка ботов на бото-ферме
  2. package win_bots_list
  3. import (
  4. "fmt"
  5. "github.com/charmbracelet/bubbles/textinput"
  6. tea "github.com/charmbracelet/bubbletea"
  7. "wartank/desktop/win_base"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/bot"
  10. "wartank/pkg/cons"
  11. "wartank/pkg/types"
  12. )
  13. // WinBotsList -- показывает список ботов на бото-ферме вар-танк
  14. type WinBotsList struct {
  15. *win_base.WinBase
  16. botSelect int // Выбранный бот
  17. lstBot []*bot.Bot // Список ботов
  18. }
  19. // NewWinBotsList -- возвращает новое окно для ввода списка ботов а бото-ферме вар-танк
  20. func NewWinBotsList(desk types.IDesktop) (*WinBotsList, error) {
  21. winBase, err := win_base.NewWinBase(desk, cons.WinBotsList)
  22. if err != nil {
  23. return nil, fmt.Errorf("NewWinBotsList(): in create WinBase, err=\n\t%w", err)
  24. }
  25. sf := &WinBotsList{
  26. WinBase: winBase,
  27. lstBot: make([]*bot.Bot, 0),
  28. }
  29. sf.updateBots()
  30. _ = tea.Model(sf)
  31. return sf, nil
  32. }
  33. // Обновляет список ботов
  34. func (sf *WinBotsList) updateBots() {
  35. sf.lstBot = sf.Desk().LstBot()
  36. if sf.botSelect >= len(sf.lstBot) {
  37. sf.botSelect = len(sf.lstBot) - 1
  38. }
  39. }
  40. // Init -- настраивает окно для бабл-теа
  41. func (sf *WinBotsList) Init() tea.Cmd {
  42. return textinput.Blink
  43. }
  44. // Update -- обрабатывает команду цикла
  45. func (sf *WinBotsList) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  46. winName := alias.AWinName("")
  47. switch msg := msg.(type) {
  48. // Может клавиша нажата
  49. case tea.KeyMsg:
  50. switch msg.String() { // Да, нажато, а что именно?
  51. case "esc": // Вернуться на шаг назад
  52. winName = cons.WinBotsMenu
  53. case "down", "s": // Нажато вниз
  54. sf.updateBots()
  55. for key := range sf.lstBot {
  56. if key == sf.botSelect {
  57. sf.botSelect++
  58. if sf.botSelect >= len(sf.lstBot) {
  59. sf.botSelect = len(sf.lstBot) - 1
  60. }
  61. sf.Desk().SetBotLogin(sf.lstBot[key].Login_)
  62. break
  63. }
  64. }
  65. case "up", "w": // Нажато вверх
  66. sf.updateBots()
  67. for key := range sf.lstBot {
  68. if key == sf.botSelect {
  69. sf.botSelect--
  70. if sf.botSelect < 0 {
  71. sf.botSelect = 0
  72. }
  73. sf.Desk().SetBotLogin(sf.lstBot[key].Login_)
  74. break
  75. }
  76. }
  77. case "enter": // Посмотреть бота
  78. winName = cons.WinBotShow
  79. }
  80. }
  81. if winName != "" {
  82. sf.Desk().SetWin(winName)
  83. }
  84. return nil, nil
  85. }
  86. // View -- перерисовывание окна по требованию
  87. func (sf *WinBotsList) View() string {
  88. s := "=Выбор бота на бото-ферме вар-танк=\n\n"
  89. sf.updateBots()
  90. for key, bot := range sf.lstBot {
  91. if key != sf.botSelect {
  92. s += fmt.Sprintf("%v)\t%v\n", key, bot.Login_)
  93. continue
  94. }
  95. s += fmt.Sprintf("%v)=>\t%v\n", key, bot.Login_)
  96. }
  97. s += fmt.Sprintf("WinBotsList.View(): select=%v\n", sf.lstBot[sf.botSelect].Login_)
  98. s += "\n\n[ctrl+q]-выход [esc]-назад [enter]-просмотр бота\n"
  99. return s
  100. }