Jelajahi Sumber

d01 Продолжение переделок

SVI 2 tahun lalu
induk
melakukan
f07405cade

+ 1 - 1
Makefile

@@ -22,7 +22,7 @@ dev.run:
 	go fmt ./...
 	go build -o ./bin/dev_serv ./cmd/server/main.go
 	./dev_serv.sh
-desktop.run:
+desk.run:
 	clear
 	go fmt ./...
 	go build -o ./bin/dev_desktop ./cmd/desktop/main.go

+ 4 - 3
README.md

@@ -31,7 +31,8 @@ sudo apt-get install libasound2-dev
 ## Цели сборки
 
 ```bash
-make # Сборка бота
-make run # Сборка и запуск бота
-make mod # Обновление зависимостей
+make          # Сборка бота
+make run      # Сборка и запуск бота
+make mod      # Обновление зависимостей
+mekr desk.run # Запуск терминального клиента для отладки
 ```

+ 3 - 0
cmd/server/main.go

@@ -1,4 +1,7 @@
 // package main -- пускач длся сервера на файбере
+//
+//	Команда запуска обновлятора noip.com
+//	noip-duc -g p78su.ddns.net,p78git.ddns.net --daemonize -u prospero78su -p Lera_07091978
 package main
 
 import (

+ 7 - 32
desktop/desktop.go

@@ -10,6 +10,7 @@ import (
 
 	"wartank/desktop/client_serv"
 	"wartank/desktop/win_config"
+	"wartank/desktop/win_config_server"
 	"wartank/desktop/win_default"
 	"wartank/pkg/alias"
 	"wartank/pkg/cons"
@@ -50,6 +51,12 @@ func NewDesktop() (*Desktop, error) {
 			return nil, fmt.Errorf("NewDesktop(): in create WinConfig, err=\n\t%w", err)
 		}
 		sf.dictWin[winConfig.Name()] = winConfig
+
+		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
 	}
 	sf.winName = cons.WinDefault
 	go sf.tick()
@@ -118,27 +125,6 @@ func (sf *Desktop) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 		return mod_, cmd_
 	}
 	/*
-		 case ModeConfigServer:
-		// 	switch msg := msg.(type) {
-		// 	// Может клавиша нажата
-		// 	case tea.KeyMsg:
-		// 		switch msg.String() { // Да, нажато, а что именно?
-		// 		case "esc": // Вернуться на шаг назад
-		// 			desk.winName = ModeConfig
-		// 		case "1": // Выбор хоста сервера
-		// 			desk.winName = ModeInputHostServer
-		// 			desk.textInput.Reset()
-		// 			desk.textInput.Placeholder = "localhost:18050"
-		// 		case "2": // Выбор логина для входа
-		// 			desk.winName = ModeInputLoginServer
-		// 			desk.textInput.Reset()
-		// 			desk.textInput.Placeholder = "login"
-		// 		case "3": // Выбор пароля для входа
-		// 			desk.winName = ModeInputPassServer
-		// 			desk.textInput.Reset()
-		// 			desk.textInput.Placeholder = "pass"
-		// 		}
-		// 	}
 		 case ModeInputHostServer:
 		// 	switch msg := msg.(type) {
 		// 	// Может клавиша нажата
@@ -228,8 +214,6 @@ func (sf Desktop) View() string {
 	s += fmt.Sprintf("\tХост=%q\tЛогин=%q\tПароль=%q\tПодключено=%v\tЛогин=%v\tЕстьАдмин=%v\n\n", desk.host, desk.login, desk.pass, desk.isConnect, desk.isLogin, desk.isMakeAdmin)
 	s += desk.dictWin[desk.winName].View()
 	switch desk.winName {
-	// case ModeConfigServer: // Конфигурация сервера
-	// 	s += desk.winConfigServer()
 	// case ModeInputHostServer: // Ввод хоста для сервера
 	// 	s += desk.winHostServer()
 	// case ModeInputLoginServer: // Ввод логина для входа на сервер
@@ -326,15 +310,6 @@ func (sf *Desktop) winHostServer() string {
 	return s
 }
 
-func (sf *Desktop) winConfigServer() string {
-	s := "Настройки сервера вар-танк\n\n"
-	s += "[1]-Настройки хоста сервера\n"
-	s += "[2]-Логин для входа\n"
-	s += "[3]-Пароль для входа\n"
-	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
-	return s
-}
-
 */
 
 // IsLogin -- возвращает признак логина на сервер ботов

+ 49 - 0
desktop/win_base/win_base.go

@@ -0,0 +1,49 @@
+// 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
+}

+ 10 - 20
desktop/win_config/win_config.go

@@ -6,6 +6,7 @@ import (
 
 	tea "github.com/charmbracelet/bubbletea"
 
+	"wartank/desktop/win_base"
 	"wartank/pkg/alias"
 	"wartank/pkg/cons"
 	"wartank/pkg/types"
@@ -13,33 +14,22 @@ import (
 
 // WinConfig -- окно конфигурирования
 type WinConfig struct {
-	desk  types.IDesktop
-	model tea.Model      // Модель для обработки
-	name  alias.AWinName // Имя экрана
+	*win_base.WinBase
+	model tea.Model // Модель для обработки
 }
 
 // NewWinConfig -- возвращает новое окно конфигурирования
 func NewWinConfig(desk types.IDesktop) (*WinConfig, error) {
-	if desk == nil {
-		return nil, fmt.Errorf("NewWinConfig(): IDesktop==nil")
+	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{
-		desk: desk,
-		name: cons.WinConfig,
+		WinBase: winBase,
 	}
 	return sf, nil
 }
 
-// Name -- возвращает собственное имя
-func (sf *WinConfig) Name() alias.AWinName {
-	return sf.name
-}
-
-func (sf *WinConfig) Init() tea.Cmd {
-	// Просто вернуть `nil`, т.е. никаких команд
-	return nil
-}
-
 // Update -- обрабатывает команду цикла
 func (sf *WinConfig) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 	winName := alias.AWinName("")
@@ -52,11 +42,11 @@ func (sf *WinConfig) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 		case "1": // Выбор один
 			winName = cons.WinConfigServer
 		case "2": // Вход на сервер
-			if !sf.desk.IsConnect() {
+			if !sf.Desk().IsConnect() {
 				winName = cons.WinConnectServer
 			}
 		case "3": // Логин на сервер
-			if !sf.desk.IsLogin() {
+			if !sf.Desk().IsLogin() {
 				winName = cons.WinLoginServer
 			}
 		case "4": // Создать админа
@@ -67,7 +57,7 @@ func (sf *WinConfig) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 
 	}
 	if winName != "" {
-		sf.desk.SetWin(winName)
+		sf.Desk().SetWin(winName)
 		return sf.model, nil
 	}
 	return nil, nil

+ 78 - 0
desktop/win_config_server/win_config_server.go

@@ -0,0 +1,78 @@
+// 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.WinInputHostServer
+			sf.textInput.Reset()
+			sf.textInput.Placeholder = "localhost:18050"
+		case "2": // Выбор логина для входа
+			winName = cons.WinInputLoginServer
+			sf.textInput.Reset()
+			sf.textInput.Placeholder = "login"
+		case "3": // Выбор пароля для входа
+			winName = cons.WinInputPassServer
+			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 {
+	s := "Настройки сервера вар-танк\n\n"
+	s += "[1]-Настройки хоста сервера\n"
+	s += "[2]-Логин для входа\n"
+	s += "[3]-Пароль для входа\n"
+	s += "\n\n[ctrl+q]-выход [esc]-назад\n"
+	return s
+}

+ 8 - 19
desktop/win_default/win_default.go

@@ -6,29 +6,28 @@ import (
 
 	tea "github.com/charmbracelet/bubbletea"
 
-	"wartank/pkg/alias"
+	"wartank/desktop/win_base"
 	"wartank/pkg/cons"
 	"wartank/pkg/types"
 )
 
 // WinDefault -- окно по умолчанию
 type WinDefault struct {
-	desk     types.IDesktop
+	*win_base.WinBase
 	cursor   int              // позиция курсора в списке
 	choices  []string         // выбранный пункт в списке
 	selected map[int]struct{} // что выбрано из списка
 	model    tea.Model        // Модель для обработки
-	name     alias.AWinName   // Имя экрана
 }
 
 // NewWinDefault -- возвращает новое окно по умолчанию
 func NewWinDefault(desk types.IDesktop) (*WinDefault, error) {
-	if desk == nil {
-		return nil, fmt.Errorf("NewWinDefault(): IDesktop==nil")
+	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{
-		desk: desk,
-		name: cons.WinDefault,
+		WinBase: winBase,
 		// Список дел
 		choices:  []string{"Купить картошку", "Оплатить мобилку", "Заплатить за кредит"},
 		selected: make(map[int]struct{}),
@@ -36,16 +35,6 @@ func NewWinDefault(desk types.IDesktop) (*WinDefault, error) {
 	return sf, nil
 }
 
-// Name -- возвращает собственное имя
-func (sf *WinDefault) Name() alias.AWinName {
-	return sf.name
-}
-
-func (sf *WinDefault) Init() tea.Cmd {
-	// Просто вернуть `nil`, т.е. никаких команд
-	return nil
-}
-
 // Update -- обрабатывает команду цикла
 func (sf *WinDefault) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 	isMsg := false
@@ -72,11 +61,11 @@ func (sf *WinDefault) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			}
 			isMsg = true
 		case "w": // Настройки графического клиента
-			sf.desk.SetWin(cons.WinConfig)
+			sf.Desk().SetWin(cons.WinConfig)
 		}
 	}
 	if isMsg {
-		sf.desk.SetWin(sf.name)
+		sf.Desk().SetWin(sf.Name())
 		return sf.model, nil
 	}
 	return nil, nil

+ 10 - 10
pkg/cons/cons.go

@@ -21,14 +21,14 @@ const (
 
 const (
 	WinDefault          alias.AWinName = "winDefault"
-	WinConfig           alias.AWinName = "winConfig" // Режим конфигурирования
-	WinConfigServer                                  // Режим конфигуррования сервера
-	WinInputHostServer                               // Режим ввода хоста сервера
-	WinInputLoginServer                              // Режим ввода логина на сервер
-	WinInputPassServer                               // Режим ввода пароля входа на сервер
-	WinConnectServer                                 // Режим подключения к серверу
-	WinLoginServer                                   // Режим логина на сервер
-	WinServerMakeAdmin                               // Создать админа для бот-сервера
-	WinServerMakeUser                                // Создать пользователя для бот-сервера
-	WinShowMenuBot                                   // Показать меню ботов
+	WinConfig           alias.AWinName = "winConfig"       // Режим конфигурирования
+	WinConfigServer     alias.AWinName = "winConfigServer" // Режим конфигуррования сервера
+	WinInputHostServer                                     // Режим ввода хоста сервера
+	WinInputLoginServer                                    // Режим ввода логина на сервер
+	WinInputPassServer                                     // Режим ввода пароля входа на сервер
+	WinConnectServer                                       // Режим подключения к серверу
+	WinLoginServer                                         // Режим логина на сервер
+	WinServerMakeAdmin                                     // Создать админа для бот-сервера
+	WinServerMakeUser                                      // Создать пользователя для бот-сервера
+	WinShowMenuBot                                         // Показать меню ботов
 )

+ 17 - 0
pkg/types/iwin_base.go

@@ -0,0 +1,17 @@
+package types
+
+import (
+	tea "github.com/charmbracelet/bubbletea"
+
+	"wartank/pkg/alias"
+)
+
+// IWinBase -- базовое окно для терминального клиента
+type IWinBase interface {
+	// Desk -- возвращает терминальный клиент
+	Desk() IDesktop
+	// Name -- возвращает собственное имя
+	Name() alias.AWinName
+	// Init -- инициализирует окно для бабл-теа
+	Init() tea.Cmd
+}