X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/72dd37f1abb2b550aaaac48eac677403d5664797..e2de9d02db38ff188fea569a5b98071a6bd403ea:/hotline/ui.go diff --git a/hotline/ui.go b/hotline/ui.go index d0fd6c0..709137e 100644 --- a/hotline/ui.go +++ b/hotline/ui.go @@ -1,12 +1,11 @@ package hotline import ( + "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" @@ -108,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() @@ -198,29 +197,42 @@ func (ui *UI) joinServer(addr, login, password string) error { } 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 @@ -231,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). @@ -325,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") } @@ -370,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() { @@ -438,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)