X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/e005c191842ccab0e9600a2221616f434ad0afc7..c789e2f35ea97fe2b390cf06dc1c914b913b7535:/hotline/ui.go?ds=sidebyside diff --git a/hotline/ui.go b/hotline/ui.go index 741c9a6..709137e 100644 --- a/hotline/ui.go +++ b/hotline/ui.go @@ -1,13 +1,11 @@ package hotline import ( - "errors" + "bufio" "fmt" - "github.com/davecgh/go-spew/spew" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" - "gopkg.in/yaml.v2" - "io" + "gopkg.in/yaml.v3" "io/ioutil" "os" "strconv" @@ -20,7 +18,6 @@ type UI struct { App *tview.Application Pages *tview.Pages userList *tview.TextView - agreeModal *tview.Modal trackerList *tview.List HLClient *Client } @@ -76,7 +73,6 @@ func NewUI(c *Client) *UI { chatInput: chatInput, userList: userList, trackerList: tview.NewList(), - agreeModal: tview.NewModal(), HLClient: c, } } @@ -111,7 +107,7 @@ func (ui *UI) showBookmarks() *tview.List { func (ui *UI) getTrackerList() *tview.List { listing, err := GetListing(ui.HLClient.pref.Tracker) if err != nil { - spew.Dump(err) + // TODO } list := tview.NewList() @@ -197,33 +193,46 @@ func (ui *UI) joinServer(addr, login, password string) error { addr += ":5500" } if err := ui.HLClient.JoinServer(addr, login, password); err != nil { - return errors.New(fmt.Sprintf("Error joining server: %v\n", err)) + return fmt.Errorf("Error joining server: %v\n", err) } go func() { - for { - err := ui.HLClient.ReadLoop() + // Create a new scanner for parsing incoming bytes into transaction tokens + scanner := bufio.NewScanner(ui.HLClient.Connection) + scanner.Split(transactionScanner) + + // Scan for new transactions and handle them as they come in. + for scanner.Scan() { + // Make a new []byte slice and copy the scanner bytes to it. This is critical to avoid a data race as the + // scanner re-uses the buffer for subsequent scans. + buf := make([]byte, len(scanner.Bytes())) + copy(buf, scanner.Bytes()) + + var t Transaction + _, err := t.Write(buf) if err != nil { - ui.HLClient.Logger.Errorw("read error", "err", err) - - if err == io.EOF { - loginErrModal := tview.NewModal(). - AddButtons([]string{"Ok"}). - SetText("The server connection has closed."). - SetDoneFunc(func(buttonIndex int, buttonLabel string) { - ui.Pages.SwitchToPage("home") - }) - loginErrModal.Box.SetTitle("Server Connection Error") - - ui.Pages.AddPage("loginErr", loginErrModal, false, true) - ui.App.Draw() - return - } - ui.Pages.SwitchToPage("home") - - return + break + } + if err := ui.HLClient.HandleTransaction(&t); err != nil { + ui.HLClient.Logger.Errorw("Error handling transaction", "err", err) } } + + if scanner.Err() == nil { + loginErrModal := tview.NewModal(). + AddButtons([]string{"Ok"}). + SetText("The server connection has closed."). + SetDoneFunc(func(buttonIndex int, buttonLabel string) { + ui.Pages.SwitchToPage("home") + }) + loginErrModal.Box.SetTitle("Server Connection Error") + + ui.Pages.AddPage("loginErr", loginErrModal, false, true) + ui.App.Draw() + return + } + ui.Pages.SwitchToPage("home") + }() return nil @@ -234,7 +243,7 @@ func (ui *UI) renderJoinServerForm(name, server, login, password, backPage strin joinServerForm. // AddInputField("Name", server, 0, func(textToCheck string, lastChar rune) bool { // return false - //}, nil). + // }, nil). AddInputField("Server", server, 0, nil, nil). AddInputField("Login", login, 0, nil, nil). AddPasswordField("Password", password, 0, '*', nil). @@ -328,6 +337,7 @@ func (ui *UI) renderServerUI() *tview.Flex { if buttonIndex == 1 { _ = ui.HLClient.Disconnect() ui.Pages.RemovePage(pageServerUI) + ui.Pages.SwitchToPage("home") } else { ui.Pages.HidePage("modal") } @@ -373,7 +383,7 @@ func (ui *UI) renderServerUI() *tview.Flex { newsPostForm := tview.NewForm(). SetButtonsAlign(tview.AlignRight). - //AddButton("Cancel", nil). // TODO: implement cancel button behavior + // AddButton("Cancel", nil). // TODO: implement cancel button behavior AddButton("Send", nil) newsPostForm.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { @@ -441,7 +451,7 @@ func (ui *UI) renderServerUI() *tview.Flex { SetDirection(tview.FlexRow). AddItem(nil, 0, 1, false). AddItem(newsFlex, 15, 1, true). - //AddItem(newsPostForm, 3, 0, false). + // AddItem(newsPostForm, 3, 0, false). AddItem(nil, 0, 1, false), 40, 1, false). AddItem(nil, 0, 1, false)