Bläddra i källkod

d02 Отказ от консольного варианта

SVI 3 år sedan
förälder
incheckning
11f691e0d7

+ 0 - 103
desktop/client_serv/client_serv.go

@@ -1,103 +0,0 @@
-// package client_serv -- клиент подключения к бото-серверу
-package client_serv
-
-import (
-	"fmt"
-	"log"
-	"net/rpc"
-
-	"wartank/server/serv_rpc"
-)
-
-// ClientServ -- клиент подключения к бото-серверу
-type ClientServ struct {
-	client *rpc.Client
-	url    string
-	login  string // Логин на бото-ферму
-	pass   string // Логин на бото-ферму
-}
-
-// NewClientServ -- возвращает новый клиент к бото-серверу
-func NewClientServ() *ClientServ {
-	sf := &ClientServ{}
-	return sf
-}
-
-// Connect -- подключает клиента к бото-серверу
-func (sf *ClientServ) Connect(url_ string) error {
-	sf.url = url_
-	var err error
-	sf.client, err = rpc.DialHTTP("tcp", url_)
-	if err != nil {
-		return fmt.Errorf("ClientSrv.Connect(): in connect to bot-server, err=\n\t%w", err)
-	}
-	req := &serv_rpc.EchoReq{}
-	resp := &serv_rpc.EchoResp{}
-	err = sf.client.Call("ServRpc.Echo", req, &resp)
-	if err != nil {
-		return fmt.Errorf("ClientServ.Connect(): in make Echo-request to bot-server, err=\n\t%w", err)
-	}
-	if resp.Result != "WarTank!" {
-		return fmt.Errorf("ClientServ.Connect(): bad response on Echo request(%v!='WarTank!')", resp.Result)
-	}
-	return nil
-}
-
-// Login -- логинится на сервер
-func (sf *ClientServ) Login(login, pass string) error {
-	log.Println("ClientServ.Login()")
-	req := &serv_rpc.LoginReq{
-		Login: login,
-		Pass:  pass,
-	}
-	resp := &serv_rpc.LoginResp{}
-	err := sf.client.Call("ServRpc.Login", req, resp)
-	if err != nil {
-		return fmt.Errorf("ClientServ.Login(): err=\n\t%w", err)
-	}
-	if resp.Result != "ok" {
-		return fmt.Errorf("ClientServ.Login(): resp=%q", resp.Result)
-	}
-	sf.login = login
-	sf.pass = pass
-	return nil
-}
-
-// AddBot -- добавляет бота на сервер
-func (sf *ClientServ) AddBot(login, pass string) error {
-	log.Println("ClientServ.AddBot()")
-	req := &serv_rpc.AddBotReq{
-		Login:    sf.login,
-		Pass:     sf.pass,
-		BotLogin: login,
-		BotPass:  pass,
-	}
-	resp := &serv_rpc.AddBotResp{}
-	err := sf.client.Call("ServRpc.AddBot", req, resp)
-	if err != nil {
-		return fmt.Errorf("ClientServ.AddBot(): err=\n\t%w", err)
-	}
-	if resp.Result != "ok" {
-		return fmt.Errorf("ClientServ.AddBot(): resp=%q", resp.Result)
-	}
-	return nil
-}
-
-// BotStart -- стартует бота на сервере
-func (sf *ClientServ) BotStart(login string) error {
-	log.Println("ClientServ.BotStart()")
-	req := &serv_rpc.BotStartReq{
-		Login:    sf.login,
-		Pass:     sf.pass,
-		BotLogin: login,
-	}
-	resp := &serv_rpc.BotStartResp{}
-	err := sf.client.Call("ServRpc.BotStart", req, resp)
-	if err != nil {
-		return fmt.Errorf("ClientServ.BotStart(): err=\n\t%w", err)
-	}
-	if resp.Result != "ok" {
-		return fmt.Errorf("ClientServ.BotStart(): resp=%q", resp.Result)
-	}
-	return nil
-}

+ 0 - 47
desktop/config/config.go

@@ -1,47 +0,0 @@
-// package config -- конфигурация для клиента
-package config
-
-import (
-	"encoding/json"
-	"log"
-	"os"
-	"wartank/pkg/bot"
-)
-
-// Config -- конфигурация для клиента
-type Config struct {
-	Host_    string     `json:"host"`      // Хост
-	Login_   string     `json:"login"`     // Логин
-	Pass_    string     `json:"password"`  // Пароль
-	ListBot_ []*bot.Bot `json:"list_bots"` // Список ботов
-}
-
-// NewConfig -- возвращает новый конфиг
-func NewConfig() *Config {
-	sf := &Config{
-		ListBot_: []*bot.Bot{},
-	}
-	sf.load()
-	return sf
-}
-
-// Save -- сохраняет конфиг по требованию
-func (sf *Config) Save() {
-	binData, _ := json.MarshalIndent(sf, "", "\t")
-	err := os.WriteFile("./config.json", binData, 0600)
-	if err != nil {
-		log.Printf("Config.Save(): err=%v", err)
-	}
-}
-
-// Загружает конфиг при старте
-func (sf *Config) load() {
-	binData, err := os.ReadFile("./config.json")
-	if err != nil {
-		return
-	}
-	err = json.Unmarshal(binData, sf)
-	if err != nil {
-		return
-	}
-}

+ 0 - 292
desktop/desktop.go

@@ -1,292 +0,0 @@
-// package desktop -- консольный клиент для вар-танка
-package desktop
-
-import (
-	"fmt"
-	"log"
-	"os"
-	"time"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/client_serv"
-	"wartank/desktop/config"
-	"wartank/desktop/win_bots_add_login"
-	"wartank/desktop/win_bots_add_pass"
-	"wartank/desktop/win_bots_list"
-	"wartank/desktop/win_bots_menu"
-	"wartank/desktop/win_config"
-	"wartank/desktop/win_config_server"
-	"wartank/desktop/win_config_server_host_input"
-	"wartank/desktop/win_config_server_login_input"
-	"wartank/desktop/win_config_server_pass_input"
-	"wartank/desktop/win_default"
-	"wartank/desktop/win_server_connect"
-	"wartank/desktop/win_server_login"
-	"wartank/pkg/alias"
-	"wartank/pkg/bot"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// Desktop -- консольный клиент для вар-танка
-type Desktop struct {
-	conf       *config.Config
-	winName    alias.AWinName                    // Режим показа на экране
-	p          *tea.Program                      // Объект приложения
-	client     *client_serv.ClientServ           // Клиент подключния к бото-серверу
-	isConnect  bool                              // Признак подключения к бот-серверу
-	isLogin    bool                              // Признак логина на сервер
-	dictWin    map[alias.AWinName]types.ITermWin // Список окон показа
-	botCurrent *bot.Bot
-}
-
-// var desk *Desktop
-
-func NewDesktop() (*Desktop, error) {
-	sf := &Desktop{
-		client:     client_serv.NewClientServ(),
-		dictWin:    make(map[alias.AWinName]types.ITermWin),
-		conf:       config.NewConfig(),
-		botCurrent: &bot.Bot{},
-	}
-	sf.p = tea.NewProgram(sf, tea.WithAltScreen(), tea.WithANSICompressor())
-	{ // Создание окон
-		{ // WinDefault
-			winDefault, err := win_default.NewWinDefault(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinDefault, err=\n\t%w", err)
-			}
-			sf.dictWin[winDefault.Name()] = winDefault
-		}
-		{ // WinConfig
-			winConfig, err := win_config.NewWinConfig(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinConfig, err=\n\t%w", err)
-			}
-			sf.dictWin[winConfig.Name()] = winConfig
-		}
-		{ // WinConfigServer
-			winConfigServer, err := win_config_server.NewWinConfigServer(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinConfigServer, err=\n\t%w", err)
-			}
-			sf.dictWin[winConfigServer.Name()] = winConfigServer
-		}
-		{ // WinConfigServerHostInput
-			winConfigServerHostInput, err := win_config_server_host_input.NewWinConfigServerHostInput(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerHostInput, err=\n\t%w", err)
-			}
-			sf.dictWin[winConfigServerHostInput.Name()] = winConfigServerHostInput
-		}
-		{ // WinConfigServerLoginInput
-			winConfigServerLoginInput, err := win_config_server_login_input.NewWinConfigServerLoginInput(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerLoginInput, err=\n\t%w", err)
-			}
-			sf.dictWin[winConfigServerLoginInput.Name()] = winConfigServerLoginInput
-		}
-		{ // WinConfigServerPassInput
-			winConfigServerPassInput, err := win_config_server_pass_input.NewWinConfigServerPasswordInput(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinConfigServerPasswordInput, err=\n\t%w", err)
-			}
-			sf.dictWin[winConfigServerPassInput.Name()] = winConfigServerPassInput
-		}
-		{ // WinServerConnect
-			winServerConnect, err := win_server_connect.NewWinServerConnect(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinServerConnect, err=\n\t%w", err)
-			}
-			sf.dictWin[winServerConnect.Name()] = winServerConnect
-		}
-		{ // WinServerLogin
-			winServerLogin, err := win_server_login.NewWinServerLogin(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinServerLogin, err=\n\t%w", err)
-			}
-			sf.dictWin[winServerLogin.Name()] = winServerLogin
-		}
-		{ // WinBotsMenu
-			winBotsMenu, err := win_bots_menu.NewWinBotsMenu(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinBotsMenu, err=\n\t%w", err)
-			}
-			sf.dictWin[winBotsMenu.Name()] = winBotsMenu
-		}
-		{ // WinBotsAddLogin
-			winBotsAddLogin, err := win_bots_add_login.NewWinBotsAddLogin(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinBotsAddLogin, err=\n\t%w", err)
-			}
-			sf.dictWin[winBotsAddLogin.Name()] = winBotsAddLogin
-		}
-		{ // WinBotsAddPass
-			winBotsAddPass, err := win_bots_add_pass.NewWinBotsAddPass(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinBotsAddPass, err=\n\t%w", err)
-			}
-			sf.dictWin[winBotsAddPass.Name()] = winBotsAddPass
-		}
-		{ // WinBotsLst
-			winBotsLst, err := win_bots_list.NewWinBotsList(sf)
-			if err != nil {
-				return nil, fmt.Errorf("NewDesktop(): in create WinBotsLst, err=\n\t%w", err)
-			}
-			sf.dictWin[winBotsLst.Name()] = winBotsLst
-		}
-	}
-	sf.winName = cons.WinDefault
-	go sf.tick()
-	return sf, nil
-}
-
-// SetWin -- устанавливает главное окно
-func (sf *Desktop) SetWin(winName alias.AWinName) {
-	sf.winName = winName
-}
-
-func (sf *Desktop) tick() {
-	for {
-		time.Sleep(time.Second * 1)
-		msg := tea.MouseEvent{}
-		// m.Update(msg)
-		sf.p.Send(msg)
-	}
-}
-
-// Run -- запускает в работу консольный клиент
-func (sf *Desktop) Run() error {
-	if _, err := sf.p.Run(); err != nil {
-		return fmt.Errorf("Deskto.Run(): err=\n\t%w", err)
-	}
-	return nil
-}
-
-// Init -- инициализация перед запуском главного цикла
-func (sf *Desktop) Init() tea.Cmd {
-	// Просто вернуть `nil`, т.е. никаких команд
-	return textinput.Blink
-}
-
-// Update -- обновление консоли по требованию
-func (sf *Desktop) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-	var cmd tea.Cmd
-	switch msg := msg.(type) {
-	// Может клавиша нажата
-	case tea.KeyMsg:
-		switch msg.String() { // Да, нажато, а что именно?
-		case "ctrl+q": // Надо выйти из программы
-			return sf, tea.Quit
-		}
-	}
-	mod_, _ := sf.dictWin[sf.winName].Update(msg)
-	if mod_ != nil {
-		return sf, nil
-	}
-	return sf, cmd
-}
-
-func (sf *Desktop) View() string {
-	_ = tea.ClearScreen()
-	_s := fmt.Sprintf("Desktop.View(): winName=%q\n", sf.winName)
-	os.WriteFile("./out.log", []byte(_s), 0600)
-	s := time.Now().Local().Format("[ WarTank ] = 2006-01-02 15:04:05.000")
-	s += fmt.Sprintf("\tХост=%q\tЛогин=%q\tПароль=%q\tПодключено=%v\tЛогин=%v\n\n",
-		sf.conf.Host_,
-		sf.conf.Login_,
-		sf.conf.Pass_,
-		sf.isConnect,
-		sf.isLogin)
-	s += _s + sf.dictWin[sf.winName].View() + "\n\n\n\n"
-	return s
-}
-
-// IsLogin -- возвращает признак логина на сервер ботов
-func (sf *Desktop) IsLogin() bool {
-	return sf.isLogin
-}
-
-// IsConnect -- возвращает признак подключения на сервер ботов
-func (sf *Desktop) IsConnect() bool {
-	return sf.isConnect
-}
-
-// SetHost -- устанавливает имя хоста бото-фермы
-func (sf *Desktop) SetHost(hostName string) {
-	sf.conf.Host_ = hostName
-	sf.conf.Save()
-}
-
-// SetLogin -- устанавливает логин бото-фермы
-func (sf *Desktop) SetLogin(login string) {
-	sf.conf.Login_ = login
-	sf.conf.Save()
-}
-
-// SetPass -- устанавливает пароль бото-фермы
-func (sf *Desktop) SetPass(password string) {
-	sf.conf.Pass_ = password
-	sf.conf.Save()
-}
-
-// Connect -- подключает клиент к бото-ферме
-func (sf *Desktop) Connect() error {
-	err := sf.client.Connect(sf.conf.Host_)
-	sf.isConnect = false
-	if err != nil {
-		return fmt.Errorf("Desktop.Connect(): err=\n\t%v", err)
-	}
-	sf.isConnect = true
-	return nil
-}
-
-// MakeLogin -- выполняет вход на бото-ферму
-func (sf *Desktop) MakeLogin() error {
-	err := sf.client.Login(sf.conf.Login_, sf.conf.Pass_)
-	sf.isLogin = false
-	if err != nil {
-		return fmt.Errorf("Desktop.MakeLogin(): in login to server, err=\n\t%v", err)
-	}
-	sf.isLogin = true
-	return nil
-}
-
-// SetBotLogin -- устанавливает логин текущего бота
-func (sf *Desktop) SetBotLogin(login string) {
-	sf.botCurrent.Login_ = login
-}
-
-// SetBotPass -- устанавливает пароль текущего бота
-func (sf *Desktop) SetBotPass(password string) {
-
-	sf.botCurrent.Pass_ = password
-	for _, bot_ := range sf.conf.ListBot_ {
-		if bot_.Login_ == sf.botCurrent.Login_ {
-			return
-		}
-	}
-	err := sf.client.AddBot(sf.botCurrent.Login_, password)
-	if err != nil {
-		log.Printf("Desktop.SetBotPass(): in make request, err=\n\t%v\n", err)
-		return
-	}
-	botNew := &bot.Bot{
-		Login_: sf.botCurrent.Login_,
-		Pass_:  password,
-	}
-	sf.conf.ListBot_ = append(sf.conf.ListBot_, botNew)
-	sf.conf.Save()
-}
-
-// LstBot -- список ботов из десктоп-клиента
-func (sf *Desktop) LstBot() []*bot.Bot {
-	return sf.conf.ListBot_
-}
-
-// CurrentBotStart -- стартует текущего бота
-func (sf *Desktop) CurrentBotStart() {
-	sf.client.BotStart(sf.botCurrent.Login_)
-}

+ 0 - 49
desktop/win_base/win_base.go

@@ -1,49 +0,0 @@
-// package win_base -- базовое окно терминального клиента
-package win_base
-
-import (
-	"fmt"
-
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/pkg/alias"
-	"wartank/pkg/types"
-)
-
-// WinBase -- базовое окно терминального клиента
-type WinBase struct {
-	desk  types.IDesktop
-	model tea.Model      // Модель для обработки
-	name  alias.AWinName // Имя экрана
-}
-
-// NewWinBase -- возвращает новое базовое окно терминального клиента
-func NewWinBase(desk types.IDesktop, name alias.AWinName) (*WinBase, error) {
-	if desk == nil {
-		return nil, fmt.Errorf("NewWinBase(): IDesktop==nil")
-	}
-	if name == "" {
-		return nil, fmt.Errorf("NewWinBase(): name is empty")
-	}
-	sf := &WinBase{
-		desk: desk,
-		name: name,
-	}
-	_ = types.IWinBase(sf)
-	return sf, nil
-}
-
-// Desk -- возвращает терминальный клиент
-func (sf *WinBase) Desk() types.IDesktop {
-	return sf.desk
-}
-
-// Name -- возвращает собственное имя
-func (sf *WinBase) Name() alias.AWinName {
-	return sf.name
-}
-
-func (sf *WinBase) Init() tea.Cmd {
-	// Просто вернуть `nil`, т.е. никаких команд
-	return nil
-}

+ 0 - 67
desktop/win_bot_show/win_bot_show.go

@@ -1,67 +0,0 @@
-// package win_bot_show -- показывает состояние бота
-package win_bot_show
-
-import (
-	"fmt"
-
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinBotShow -- показывает состояние бота на бото-сервере вар-танк
-type WinBotShow struct {
-	*win_base.WinBase
-	model tea.Model
-}
-
-// NewWinBotShow -- возвращает новое окно для показа состояния бота на бото-сервере вар-танк
-func NewWinBotShow(desk types.IDesktop) (*WinBotShow, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServer)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinBotShow(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinBotShow{
-		WinBase: winBase,
-	}
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinBotShow) Init() tea.Cmd {
-	return nil
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinBotShow) 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.WinConfig
-		case "1": // Запустить сервер
-			sf.Desk().CurrentBotStart()
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-		return sf.model, nil
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinBotShow) View() string {
-	_ = tea.ClearScreen()
-	s := "Настройки сервера вар-танк\n\n"
-	s += "[1]-Настройки хоста сервера\n"
-	s += "[2]-Логин для входа\n"
-	s += "[3]-Пароль для входа\n"
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 73
desktop/win_bots_add_login/win_bots_add.go

@@ -1,73 +0,0 @@
-// package win_bots_add_login -- окно добавления логина бота на бото-ферму
-package win_bots_add_login
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinBotsAddLogin -- конфигурация для добавления логина бота на бото-ферму вар-танк
-type WinBotsAddLogin struct {
-	*win_base.WinBase
-	textInput textinput.Model
-}
-
-// NewWinBotsAddLogin -- возвращает новое окно для ввода логина бота при добавлению на бото-ферму вар-танк
-func NewWinBotsAddLogin(desk types.IDesktop) (*WinBotsAddLogin, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinBotsAddLogin)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinBotsAdd(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinBotsAddLogin{
-		WinBase:   winBase,
-		textInput: textinput.New(),
-	}
-	sf.textInput.Placeholder = "wartank"
-	sf.textInput.Focus()
-	sf.textInput.Width = 30
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinBotsAddLogin) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinBotsAddLogin) 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 "enter": // Нажатие "enter" вводит фактическое значение
-			sf.Desk().SetBotLogin(sf.textInput.Value())
-			winName = cons.WinBotsAddPass
-		default:
-			sf.textInput, _ = sf.textInput.Update(msg)
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinBotsAddLogin) View() string {
-	_ = tea.ClearScreen()
-	s := "=Добавление логина бота на бото-ферму вар-танк=\n\n"
-	s += fmt.Sprintf(">%v\n", sf.textInput.View())
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 73
desktop/win_bots_add_pass/win_bots_add.go

@@ -1,73 +0,0 @@
-// package win_bots_add_pass -- окно добавления пароля бота на бото-ферму
-package win_bots_add_pass
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinBotsAddPass -- конфигурация для добавления пароля бота на бото-ферму вар-танк
-type WinBotsAddPass struct {
-	*win_base.WinBase
-	textInput textinput.Model
-}
-
-// NewWinBotsAddPass -- возвращает новое окно для ввода пароля бота при добавлению на бото-ферму вар-танк
-func NewWinBotsAddPass(desk types.IDesktop) (*WinBotsAddPass, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinBotsAddPass)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinBotsAddPass(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinBotsAddPass{
-		WinBase:   winBase,
-		textInput: textinput.New(),
-	}
-	sf.textInput.Placeholder = "wartank"
-	sf.textInput.Focus()
-	sf.textInput.Width = 30
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinBotsAddPass) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinBotsAddPass) 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 "enter": // Нажатие "enter" вводит фактическое значение
-			sf.Desk().SetBotPass(sf.textInput.Value())
-			winName = cons.WinBotsMenu
-		default:
-			sf.textInput, _ = sf.textInput.Update(msg)
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinBotsAddPass) View() string {
-	_ = tea.ClearScreen()
-	s := "=Добавление пароля бота на бото-ферму вар-танк=\n\n"
-	s += fmt.Sprintf(">%v\n", sf.textInput.View())
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 119
desktop/win_bots_list/win_bot_list.go

@@ -1,119 +0,0 @@
-// 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 {
-	_ = tea.ClearScreen()
-	s := "=Выбор бота на бото-ферме вар-танк=\n\n"
-	sf.updateBots()
-	if sf.botSelect >= len(sf.lstBot) {
-		sf.botSelect = len(sf.lstBot) - 1
-	}
-	if sf.botSelect < 0 {
-		sf.botSelect = 0
-	}
-	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_)
-	}
-	if len(sf.lstBot) > 0 {
-		s += fmt.Sprintf("WinBotsList.View(): select=%v\n", sf.lstBot[sf.botSelect].Login_)
-		s += "\n\n[ctrl+q]-выход [esc]-назад [enter]-просмотр бота\n"
-	}
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 64
desktop/win_bots_menu/win_bots_menu.go

@@ -1,64 +0,0 @@
-// package win_bots_menu -- меню бото-фермы
-package win_bots_menu
-
-import (
-	"fmt"
-
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinBotsMenu -- окно меню бото-фермы
-type WinBotsMenu struct {
-	*win_base.WinBase
-	model tea.Model // Модель для обработки
-}
-
-// NewWinBotsMenu -- возвращает новое окно меню бото-фермы
-func NewWinBotsMenu(desk types.IDesktop) (*WinBotsMenu, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinBotsMenu)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinBotsMenu(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinBotsMenu{
-		WinBase: winBase,
-	}
-	return sf, nil
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinBotsMenu) 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.WinDefault
-		case "1": // Выбор один
-			winName = cons.WinBotsAddLogin
-		case "3": // Список ботов
-			winName = cons.WinBotsList
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-		return sf.model, nil
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinBotsMenu) View() string {
-	_ = tea.ClearScreen()
-	s := "=Меню бото-фермы вар-танк=\n\n"
-	s += "[1]-Добавить бота\n"
-	s += "[2]-Удалить бота\n"
-	s += "[3]-Список ботов\n"
-	s += "\n\n[ctrl+q]-выход [esc]-отмена\n"
-	return s
-}

+ 0 - 80
desktop/win_config/win_config.go

@@ -1,80 +0,0 @@
-// package win_config -- окно конфигурирования
-package win_config
-
-import (
-	"fmt"
-
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinConfig -- окно конфигурирования
-type WinConfig struct {
-	*win_base.WinBase
-	model tea.Model // Модель для обработки
-}
-
-// NewWinConfig -- возвращает новое окно конфигурирования
-func NewWinConfig(desk types.IDesktop) (*WinConfig, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfig)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinConfig(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinConfig{
-		WinBase: winBase,
-	}
-	return sf, nil
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinConfig) 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.WinDefault
-		case "1": // Выбор один
-			winName = cons.WinConfigServer
-		case "2": // Вход на сервер
-			if !sf.Desk().IsConnect() {
-				winName = cons.WinServerConnect
-			}
-		case "3": // Логин на сервер
-			if !sf.Desk().IsLogin() {
-				winName = cons.WinServerLogin
-			}
-		case "4": // Показать меню бото-фермы
-			winName = cons.WinBotsMenu
-		}
-
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-		return sf.model, nil
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinConfig) View() string {
-	_ = tea.ClearScreen()
-	s := "Настройки клиента\n\n"
-	s += "[1]-Настройки сервера\n"
-	if !sf.Desk().IsConnect() {
-		s += "[2]-Вход на сервер\n"
-	}
-	if !sf.Desk().IsLogin() {
-		s += "[3]-Логин на сервер\n"
-	}
-	if sf.Desk().IsLogin() {
-		s += "[4]-Меню бото-фермы\n"
-	}
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 79
desktop/win_config_server/win_config_server.go

@@ -1,79 +0,0 @@
-// package win_config_server -- конфигурация для подключения к бото-серверу вар-танк
-package win_config_server
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinConfigServer -- конфигурация для подключения к бото-серверу вар-танк
-type WinConfigServer struct {
-	*win_base.WinBase
-	model     tea.Model
-	textInput textinput.Model
-}
-
-// NewWinConfigServer -- возвращает новое окно для подключения к бото-серверу вар-танк
-func NewWinConfigServer(desk types.IDesktop) (*WinConfigServer, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServer)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinConfigServer(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinConfigServer{
-		WinBase: winBase,
-	}
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinConfigServer) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinConfigServer) 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.WinConfig
-		case "1": // Выбор хоста сервера
-			winName = cons.WinConfigServerHostInput
-			sf.textInput.Reset()
-			sf.textInput.Placeholder = "localhost:18050"
-		case "2": // Выбор логина для входа
-			winName = cons.WinConfigServerLoginInput
-			sf.textInput.Reset()
-			sf.textInput.Placeholder = "login"
-		case "3": // Выбор пароля для входа
-			winName = cons.WinConfigServerPassInput
-			sf.textInput.Reset()
-			sf.textInput.Placeholder = "pass"
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-		return sf.model, nil
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinConfigServer) View() string {
-	_ = tea.ClearScreen()
-	s := "Настройки сервера вар-танк\n\n"
-	s += "[1]-Настройки хоста сервера\n"
-	s += "[2]-Логин для входа\n"
-	s += "[3]-Пароль для входа\n"
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 75
desktop/win_config_server_host_input/win_config_server_host_input.go

@@ -1,75 +0,0 @@
-// package win_config_server_host_input -- окно ввода хоста бото-фермы
-package win_config_server_host_input
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinConfigServerHostInput -- конфигурация для ввода имени хоста к бото-серверу вар-танк
-type WinConfigServerHostInput struct {
-	*win_base.WinBase
-	textInput textinput.Model
-}
-
-// NewWinConfigServerHostInput -- возвращает новое окно для ввода имени хоста к бото-серверу вар-танк
-func NewWinConfigServerHostInput(desk types.IDesktop) (*WinConfigServerHostInput, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServerHostInput)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinConfigServerHostInput(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinConfigServerHostInput{
-		WinBase:   winBase,
-		textInput: textinput.New(),
-	}
-	sf.textInput.Placeholder = "localhost"
-	sf.textInput.Focus()
-	sf.textInput.Width = 30
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinConfigServerHostInput) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinConfigServerHostInput) 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.WinConfigServer
-		case "enter": // Нажатие "enter" вводит фактическое значение
-			sf.Desk().SetHost(sf.textInput.Value())
-			winName = cons.WinConfigServer
-		default:
-			sf.textInput, _ = sf.textInput.Update(msg)
-			// fmt.Printf("\nmsg=%#v\n", msg.String())
-			// winName = sf.Name()
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinConfigServerHostInput) View() string {
-	_ = tea.ClearScreen()
-	s := "=Ввод хоста для сервера вар-танк=\n\n"
-	s += fmt.Sprintf(">%v\n", sf.textInput.View())
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 73
desktop/win_config_server_login_input/win_config_server_login_input.go

@@ -1,73 +0,0 @@
-// package win_config_server_login_input -- окно ввода логина бото-фермы
-package win_config_server_login_input
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinConfigServerLoginInput -- конфигурация для ввода логина хоста к бото-серверу вар-танк
-type WinConfigServerLoginInput struct {
-	*win_base.WinBase
-	textInput textinput.Model
-}
-
-// NewWinConfigServerLoginInput -- возвращает новое окно для ввода логина хоста к бото-серверу вар-танк
-func NewWinConfigServerLoginInput(desk types.IDesktop) (*WinConfigServerLoginInput, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServerLoginInput)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinConfigServerLoginInput(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinConfigServerLoginInput{
-		WinBase:   winBase,
-		textInput: textinput.New(),
-	}
-	sf.textInput.Placeholder = "admin"
-	sf.textInput.Focus()
-	sf.textInput.Width = 30
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinConfigServerLoginInput) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinConfigServerLoginInput) 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.WinConfigServer
-		case "enter": // Нажатие "enter" или "пробел" переключает выбранный элемент списка
-			sf.Desk().SetLogin(sf.textInput.Value())
-			winName = cons.WinConfigServer
-		default:
-			sf.textInput, _ = sf.textInput.Update(msg)
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinConfigServerLoginInput) View() string {
-	_ = tea.ClearScreen()
-	s := "=Ввод логина для сервера вар-танк=\tWinConfigServerLoginInput\n\n"
-	s += fmt.Sprintf(">%v\n", sf.textInput.View())
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 73
desktop/win_config_server_pass_input/win_config_server_pass_input.go

@@ -1,73 +0,0 @@
-// package win_config_server_pass_input -- окно ввода пароля бото-фермы
-package win_config_server_pass_input
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinConfigServerPasswordInput -- конфигурация для ввода пароля к бото-серверу вар-танк
-type WinConfigServerPasswordInput struct {
-	*win_base.WinBase
-	textInput textinput.Model
-}
-
-// NewWinConfigServerPasswordInput -- возвращает новое окно для ввода пароля к бото-серверу вар-танк
-func NewWinConfigServerPasswordInput(desk types.IDesktop) (*WinConfigServerPasswordInput, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinConfigServerPassInput)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinConfigServerPasswordInput(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinConfigServerPasswordInput{
-		WinBase:   winBase,
-		textInput: textinput.New(),
-	}
-	sf.textInput.Placeholder = "admin"
-	sf.textInput.Focus()
-	sf.textInput.Width = 30
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinConfigServerPasswordInput) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinConfigServerPasswordInput) 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.WinConfigServer
-		case "enter": // Нажатие "enter" или "пробел" переключает выбранный элемент списка
-			sf.Desk().SetPass(sf.textInput.Value())
-			winName = cons.WinConfigServer
-		default:
-			sf.textInput, _ = sf.textInput.Update(msg)
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinConfigServerPasswordInput) View() string {
-	_ = tea.ClearScreen()
-	s := "=Ввод пароля для бот-сервера вар-танк=\tWinConfigServerPasswordInput\n\n"
-	s += fmt.Sprintf(">%v\n", sf.textInput.View())
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}

+ 0 - 104
desktop/win_default/win_default.go

@@ -1,104 +0,0 @@
-// package win_default -- окно по умолчанию
-package win_default
-
-import (
-	"fmt"
-
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinDefault -- окно по умолчанию
-type WinDefault struct {
-	*win_base.WinBase
-	cursor   int              // позиция курсора в списке
-	choices  []string         // выбранный пункт в списке
-	selected map[int]struct{} // что выбрано из списка
-	model    tea.Model        // Модель для обработки
-}
-
-// NewWinDefault -- возвращает новое окно по умолчанию
-func NewWinDefault(desk types.IDesktop) (*WinDefault, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinDefault)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinDefault(): in create IWinBase, err=\n\t%w", err)
-	}
-	sf := &WinDefault{
-		WinBase: winBase,
-		// Список дел
-		choices:  []string{"Купить картошку", "Оплатить мобилку", "Заплатить за кредит"},
-		selected: make(map[int]struct{}),
-	}
-	return sf, nil
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinDefault) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-	isMsg := false
-	switch msg := msg.(type) {
-	// Может клавиша нажата
-	case tea.KeyMsg:
-		switch msg.String() { // Да, нажато, а что именно?
-		case "up", "k": // Если "up" или "k" перемещение курсора вверх
-			if sf.cursor > 0 {
-				sf.cursor--
-				isMsg = true
-			}
-		case "down", "j": // Если "down" или "j" перемещение курсора вниз
-			if sf.cursor < len(sf.choices)-1 {
-				sf.cursor++
-				isMsg = true
-			}
-		case "enter", " ": // Нажатие "enter" или "пробел" переключает выбранный элемент списка
-			_, ok := sf.selected[sf.cursor]
-			if ok {
-				delete(sf.selected, sf.cursor)
-			} else {
-				sf.selected[sf.cursor] = struct{}{}
-			}
-			isMsg = true
-		case "w": // Настройки графического клиента
-			sf.Desk().SetWin(cons.WinConfig)
-		}
-	}
-	if isMsg {
-		sf.Desk().SetWin(sf.Name())
-		return sf.model, nil
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinDefault) View() string {
-	_ = tea.ClearScreen()
-	// Заголовок
-	s := "Что нам нужно сделать?\n\n"
-
-	// Перебор по списку выбора
-	for i, choice := range sf.choices {
-
-		// Курсор указывает на этот выбор?
-		cursor := " " // нет курсора
-		if sf.cursor == i {
-			cursor = ">" // есть курсор
-		}
-
-		// Этот элемент выбран?
-		checked := " " // не выбран
-		if _, ok := sf.selected[i]; ok {
-			checked = "+" // выбран!
-		}
-
-		// отрендерить заново
-		s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice)
-	}
-
-	// Подвал
-	s += "\n\n[ctrl+q]-выход [w]-настройки\n"
-
-	// Вернуть строку экрана для отрисовки
-	return s
-}

+ 0 - 72
desktop/win_server_connect/win_server_connect.go

@@ -1,72 +0,0 @@
-// package win_server_connect -- подключение к бото-ферме
-package win_server_connect
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinServerConnect -- конфигурация для подключения к бото-серверу вар-танк
-type WinServerConnect struct {
-	*win_base.WinBase
-}
-
-// NewWinServerConnect -- возвращает новое окно для подключения к бото-серверу вар-танк
-func NewWinServerConnect(desk types.IDesktop) (*WinServerConnect, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinServerConnect)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinServerConnect(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinServerConnect{
-		WinBase: winBase,
-	}
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinServerConnect) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinServerConnect) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-	winName := alias.AWinName("")
-	switch msg := msg.(type) {
-	// Может клавиша нажата
-	case tea.KeyMsg:
-		switch msg.String() { // Да, нажато, а что именно?
-		case "esc": // Нажатие "esc" прекращает подключение к серверу
-			winName = cons.WinConfig
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinServerConnect) View() string {
-	_ = tea.ClearScreen()
-	s := "=Подключение к бот-серверу вар-танк=\n\n"
-	if !sf.Desk().IsConnect() {
-		// err := desk.client.Connect(desk.host)
-		err := sf.Desk().Connect()
-		if err != nil {
-			s += fmt.Sprintf("WinServerConnect.View(): in connect to server, err=\n\t%v", err)
-			s += "\n\n[ctrl+q]-выход [esc]-отмена\n"
-			return s
-		}
-	}
-	s += "Desktop.winConnectServer(): ok\n"
-	s += "\n\n[ctrl+q]-выход [esc]-отмена\n"
-	return s
-}

+ 0 - 71
desktop/win_server_login/win_server_login.go

@@ -1,71 +0,0 @@
-// package win_server_login -- вход на бото-ферму
-package win_server_login
-
-import (
-	"fmt"
-
-	"github.com/charmbracelet/bubbles/textinput"
-	tea "github.com/charmbracelet/bubbletea"
-
-	"wartank/desktop/win_base"
-	"wartank/pkg/alias"
-	"wartank/pkg/cons"
-	"wartank/pkg/types"
-)
-
-// WinServerLgin -- вход на бото-сервер вар-танк
-type WinServerLgin struct {
-	*win_base.WinBase
-}
-
-// NewWinServerLogin -- возвращает новое окно для входа на бото-сервер вар-танк
-func NewWinServerLogin(desk types.IDesktop) (*WinServerLgin, error) {
-	winBase, err := win_base.NewWinBase(desk, cons.WinServerLogin)
-	if err != nil {
-		return nil, fmt.Errorf("NewWinServerLogin(): in create WinBase, err=\n\t%w", err)
-	}
-	sf := &WinServerLgin{
-		WinBase: winBase,
-	}
-	_ = tea.Model(sf)
-	return sf, nil
-}
-
-// Init -- настраивает окно для бабл-теа
-func (sf *WinServerLgin) Init() tea.Cmd {
-	return textinput.Blink
-}
-
-// Update -- обрабатывает команду цикла
-func (sf *WinServerLgin) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-	winName := alias.AWinName("")
-	switch msg := msg.(type) {
-	// Может клавиша нажата
-	case tea.KeyMsg:
-		switch msg.String() { // Да, нажато, а что именно?
-		case "esc": // Нажатие "esc" прекращает логин на сервер
-			winName = cons.WinConfig
-		}
-	}
-	if winName != "" {
-		sf.Desk().SetWin(winName)
-	}
-	return nil, nil
-}
-
-// View -- перерисовывание окна по требованию
-func (sf *WinServerLgin) View() string {
-	_ = tea.ClearScreen()
-	s := "=Логин на бот-сервер вар-танк=\n\n"
-	// err := desk.client.Login(desk.login, desk.pass)
-	err := sf.Desk().MakeLogin()
-	if err != nil {
-		s += fmt.Sprintf("WinServerLgin.View(): err=\n\t%v", err)
-		s += "\n\n[ctrl+q]-выход [esc]-отмена\n"
-		return s
-	}
-	s += "WinServerLgin.View(): login ok\n"
-	// desk.isLogin = true
-	s += "\n\n[ctrl+q]-выход [esc]-отмена\n"
-	return s
-}