win_bot_add.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // package win_bot_add -- добавляет новый бот
  2. package win_bot_add
  3. import (
  4. _ "embed"
  5. "fmt"
  6. "log"
  7. "net/url"
  8. "runtime"
  9. "github.com/zserge/lorca"
  10. "wartank/pkg/types"
  11. )
  12. //go:embed win_bot_add.html
  13. var strWinHtml string
  14. // WinBotAdd -- окно добавления бота
  15. type WinBotAdd struct {
  16. desktop types.IDesktop
  17. store types.IStore
  18. win lorca.UI
  19. ws types.IWebSocket
  20. fnAdd func(name, pass string)
  21. }
  22. // NewWinBotAdd -- возвращает новое окно добавления бота
  23. func NewWinBotAdd(desktop types.IDesktop, fnAdd func(name, pass string)) (*WinBotAdd, error) {
  24. { // Предусловия
  25. if desktop == nil {
  26. return nil, fmt.Errorf("NewWinBotAdd(): IDesktop == nil")
  27. }
  28. if fnAdd == nil {
  29. return nil, fmt.Errorf("NewWinBotAdd(): fnAdd == nil")
  30. }
  31. }
  32. sf := &WinBotAdd{
  33. desktop: desktop,
  34. store: desktop.Store(),
  35. ws: desktop.Ws(),
  36. fnAdd: fnAdd,
  37. }
  38. args := []string{}
  39. if runtime.GOOS == "linux" {
  40. args = append(args, "--class=Lorca")
  41. }
  42. var err error
  43. sf.win, err = lorca.New("data:text/html,"+url.PathEscape(strWinHtml), "", 640, 480, args...)
  44. if err != nil {
  45. return nil, fmt.Errorf("NewWinBotAdd(): in create win, err=\n\t%w", err)
  46. }
  47. go sf.close()
  48. return sf, nil
  49. }
  50. // Работает в отдельном потоке, главный цикл окна
  51. func (sf *WinBotAdd) Run() {
  52. log.Println("NewWinBotAdd.Run()")
  53. sf.win.Bind("close_win", sf.onClose)
  54. sf.win.Bind("add", sf.onBotAdd)
  55. <-sf.win.Done() // Ожидание закрытия окна
  56. }
  57. // Добавляет пользователя по требованию
  58. func (sf *WinBotAdd) onBotAdd() {
  59. log.Printf("NewWinBotAdd.onBotAdd()\n")
  60. name := sf.win.Eval(`document.getElementById("/bot/name").value`).String()
  61. pass := sf.win.Eval(`document.getElementById("/bot/pass").value`).String()
  62. go sf.fnAdd(name, pass)
  63. sf.onClose()
  64. }
  65. // Закрывает приложение
  66. func (sf *WinBotAdd) onClose() {
  67. log.Println("NewWinBotAdd.onClose()")
  68. sf.win.Close()
  69. }
  70. // close -- ожидает отмены глобального контекста
  71. func (sf *WinBotAdd) close() {
  72. <-sf.desktop.CtxApp().Done()
  73. log.Println("NewWinBotAdd.close()")
  74. sf.win.Close()
  75. }