// package win_bots_list -- окно списка ботов на бото-ферме package win_bots_list import ( "fmt" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "wartank/desktop/win_base" "wartank/pkg/alias" "wartank/pkg/bot" "wartank/pkg/cons" "wartank/pkg/types" ) // WinBotsList -- показывает список ботов на бото-ферме вар-танк type WinBotsList struct { *win_base.WinBase botSelect int // Выбранный бот lstBot []*bot.Bot // Список ботов } // NewWinBotsList -- возвращает новое окно для ввода списка ботов а бото-ферме вар-танк func NewWinBotsList(desk types.IDesktop) (*WinBotsList, error) { winBase, err := win_base.NewWinBase(desk, cons.WinBotsList) if err != nil { return nil, fmt.Errorf("NewWinBotsList(): in create WinBase, err=\n\t%w", err) } sf := &WinBotsList{ WinBase: winBase, lstBot: make([]*bot.Bot, 0), } sf.updateBots() _ = tea.Model(sf) return sf, nil } // Обновляет список ботов func (sf *WinBotsList) updateBots() { sf.lstBot = sf.Desk().LstBot() if sf.botSelect >= len(sf.lstBot) { sf.botSelect = len(sf.lstBot) - 1 } } // Init -- настраивает окно для бабл-теа func (sf *WinBotsList) Init() tea.Cmd { return textinput.Blink } // Update -- обрабатывает команду цикла func (sf *WinBotsList) Update(msg tea.Msg) (tea.Model, tea.Cmd) { winName := alias.AWinName("") switch msg := msg.(type) { // Может клавиша нажата case tea.KeyMsg: switch msg.String() { // Да, нажато, а что именно? case "esc": // Вернуться на шаг назад winName = cons.WinBotsMenu case "down", "s": // Нажато вниз sf.updateBots() for key := range sf.lstBot { if key == sf.botSelect { sf.botSelect++ if sf.botSelect >= len(sf.lstBot) { sf.botSelect = len(sf.lstBot) - 1 } sf.Desk().SetBotLogin(sf.lstBot[key].Login_) break } } case "up", "w": // Нажато вверх sf.updateBots() for key := range sf.lstBot { if key == sf.botSelect { sf.botSelect-- if sf.botSelect < 0 { sf.botSelect = 0 } sf.Desk().SetBotLogin(sf.lstBot[key].Login_) break } } case "enter": // Посмотреть бота winName = cons.WinBotShow } } if winName != "" { sf.Desk().SetWin(winName) } return nil, nil } // View -- перерисовывание окна по требованию func (sf *WinBotsList) View() string { s := "=Выбор бота на бото-ферме вар-танк=\n\n" sf.updateBots() for key, bot := range sf.lstBot { if key != sf.botSelect { s += fmt.Sprintf("%v)\t%v\n", key, bot.Login_) continue } s += fmt.Sprintf("%v)=>\t%v\n", key, bot.Login_) } s += fmt.Sprintf("WinBotsList.View(): select=%v\n", sf.lstBot[sf.botSelect].Login_) s += "\n\n[ctrl+q]-выход [esc]-назад [enter]-просмотр бота\n" return s }