// package win_bot_add -- добавляет новый бот package win_bot_add import ( _ "embed" "fmt" "log" "net/url" "runtime" "github.com/zserge/lorca" "wartank/pkg/types" ) //go:embed win_bot_add.html var strWinHtml string // WinBotAdd -- окно добавления бота type WinBotAdd struct { desktop types.IDesktop store types.IStore win lorca.UI ws types.IWebSocket fnAdd func(name, pass string) } // NewWinBotAdd -- возвращает новое окно добавления бота func NewWinBotAdd(desktop types.IDesktop, fnAdd func(name, pass string)) (*WinBotAdd, error) { { // Предусловия if desktop == nil { return nil, fmt.Errorf("NewWinBotAdd(): IDesktop == nil") } if fnAdd == nil { return nil, fmt.Errorf("NewWinBotAdd(): fnAdd == nil") } } sf := &WinBotAdd{ desktop: desktop, store: desktop.Store(), ws: desktop.Ws(), fnAdd: fnAdd, } args := []string{} if runtime.GOOS == "linux" { args = append(args, "--class=Lorca") } var err error sf.win, err = lorca.New("data:text/html,"+url.PathEscape(strWinHtml), "", 640, 480, args...) if err != nil { return nil, fmt.Errorf("NewWinBotAdd(): in create win, err=\n\t%w", err) } go sf.close() return sf, nil } // Работает в отдельном потоке, главный цикл окна func (sf *WinBotAdd) Run() { log.Println("NewWinBotAdd.Run()") sf.win.Bind("close_win", sf.onClose) sf.win.Bind("add", sf.onBotAdd) <-sf.win.Done() // Ожидание закрытия окна } // Добавляет пользователя по требованию func (sf *WinBotAdd) onBotAdd() { log.Printf("NewWinBotAdd.onBotAdd()\n") name := sf.win.Eval(`document.getElementById("/bot/name").value`).String() pass := sf.win.Eval(`document.getElementById("/bot/pass").value`).String() go sf.fnAdd(name, pass) sf.onClose() } // Закрывает приложение func (sf *WinBotAdd) onClose() { log.Println("NewWinBotAdd.onClose()") sf.win.Close() } // close -- ожидает отмены глобального контекста func (sf *WinBotAdd) close() { <-sf.desktop.CtxApp().Done() log.Println("NewWinBotAdd.close()") sf.win.Close() }