// package win_bot_view -- просмотр состояния бота package win_bot_view import ( _ "embed" "fmt" "log" "net/url" "runtime" "time" "github.com/zserge/lorca" "wartank/pkg/types" ) //go:embed win_bot_view.html var strWinHtml string // WinBotView -- окно просмотра бота type WinBotView struct { desktop types.IDesktop store types.IStore win lorca.UI ws types.IWebSocket name string } // NewWinBotView -- возвращает новое окно просмотра бота func NewWinBotView(desktop types.IDesktop, name string) (*WinBotView, error) { { // Предусловия if desktop == nil { return nil, fmt.Errorf("NewWinBotView(): IDesktop == nil") } if name == "" { return nil, fmt.Errorf("NewWinBotView(): name шы уьзен") } } sf := &WinBotView{ desktop: desktop, store: desktop.Store(), ws: desktop.Ws(), name: name, } 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("NewWinBotView(): in create win, err=\n\t%w", err) } go sf.close() return sf, nil } // Работает в отдельном потоке, главный цикл окна func (sf *WinBotView) Run() { log.Println("WinBotView.Run()") sf.win.Bind("close_win", sf.onClose) for { select { case <-sf.win.Done(): // Ожидание закрытия окна sf.close() return default: // Дежурный вывод информации go sf.update() time.Sleep(time.Millisecond * 500) } } } // Обновляет информацию в окне func (sf *WinBotView) update() { dictReq := make(map[string]string) dictReq["name"] = sf.name dictResp, err := sf.ws.Call("/bot/status", dictReq) if err != nil { log.Printf("WinBotView.update(): in read bot(%q),err=\n\t%v\n", sf.name, err) return } // log.Printf("WinBotView.update(): dictRes=%#v\n", dictResp) { // Имя name := dictResp["/bot/name"] js := fmt.Sprintf( `function UpdateName(){ var _el=document.getElementById("/bot/name"); _el.innerText=%q } UpdateName()`, name) sf.win.Eval(js) } { // Если онлайн isOnline := dictResp["/bot/online"] js := fmt.Sprintf( `function UpdateIsOnlime(){ var _el=document.getElementById("/bot/online"); _el.innerText=%q } UpdateIsOnlime()`, isOnline) sf.win.Eval(js) } { // Топливо fuel := dictResp["/bot/fuel"] js := fmt.Sprintf( `function UpdateFuel(){ var _el=document.getElementById("/bot/fuel"); _el.innerText=%q } UpdateFuel()`, fuel) sf.win.Eval(js) } { // Золото gold := dictResp["/bot/gold"] js := fmt.Sprintf( `function UpdateGold(){ var _el=document.getElementById("/bot/gold"); _el.innerText=%q } UpdateGold()`, gold) sf.win.Eval(js) } { // Серебро silver := dictResp["/bot/silver"] js := fmt.Sprintf( `function UpdateSilver(){ var _el=document.getElementById("/bot/silver"); _el.innerText=%q } UpdateSilver()`, silver) sf.win.Eval(js) } { // Серебро-время silverTime := dictResp["/bank/silver-time"] js := fmt.Sprintf( `function UpdateSilverTime(){ var _el=document.getElementById("/bank/silver-time"); _el.innerText=%q } UpdateSilverTime()`, silverTime) sf.win.Eval(js) } { // Серебро-режим silverMode := dictResp["/bank/silver-mode"] js := fmt.Sprintf( `function UpdateSilverMode(){ var _el=document.getElementById("/bank/silver-mode"); _el.innerText=%q } UpdateSilverMode()`, silverMode) sf.win.Eval(js) } { // Серебро-всего silverAll := dictResp["/angar/silver-all"] js := fmt.Sprintf( `function UpdateSilverAll(){ var _el=document.getElementById("/angar/silver-all"); _el.innerText=%q } UpdateSilverAll()`, silverAll) sf.win.Eval(js) } { // Шахта-время mineTime := dictResp["/bot/mine-time"] js := fmt.Sprintf( `function UpdateMineTime(){ var _el=document.getElementById("/bot/mine-time"); _el.innerText=%q } UpdateMineTime()`, mineTime) sf.win.Eval(js) } { // Шахта-режим mineMode := dictResp["/bot/mine-mode"] js := fmt.Sprintf( `function UpdateMineMode(){ var _el=document.getElementById("/bot/mine-mode"); _el.innerText=%q } UpdateMineMode()`, mineMode) sf.win.Eval(js) } { // Шахта-руда mineRuda := dictResp["/mine/ruda"] js := fmt.Sprintf( `function UpdateMineRuda(){ var _el=document.getElementById("/mine/ruda"); _el.innerText=%q } UpdateMineRuda()`, mineRuda) sf.win.Eval(js) } } // Закрывает окно func (sf *WinBotView) onClose() { log.Println("WinBotView.onClose()") sf.win.Close() } // close -- ожидает отмены глобального контекста func (sf *WinBotView) close() { <-sf.desktop.CtxApp().Done() log.Println("WinBotView.close()") sf.win.Close() }