X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/f4a69647659df356f7f1d1ab1d8b4eedcc34dfba..c519856703dbb94c58ec070a103c8df72ab98b19:/hotline/client.go?ds=sidebyside diff --git a/hotline/client.go b/hotline/client.go index 1e2972f..c7c1463 100644 --- a/hotline/client.go +++ b/hotline/client.go @@ -35,10 +35,11 @@ type Bookmark struct { } type ClientPrefs struct { - Username string `yaml:"Username"` - IconID int `yaml:"IconID"` - Bookmarks []Bookmark `yaml:"Bookmarks"` - Tracker string `yaml:"Tracker"` + Username string `yaml:"Username"` + IconID int `yaml:"IconID"` + Bookmarks []Bookmark `yaml:"Bookmarks"` + Tracker string `yaml:"Tracker"` + EnableBell bool `yaml:"EnableBell"` } func (cp *ClientPrefs) IconBytes() []byte { @@ -119,7 +120,7 @@ func (db *DebugBuffer) Write(p []byte) (int, error) { return db.TextView.Write(p) } -// Sync is a noop function that exists to satisfy the zapcore.WriteSyncer interface +// Sync is a noop function that dataFile to satisfy the zapcore.WriteSyncer interface func (db *DebugBuffer) Sync() error { return nil } @@ -237,7 +238,41 @@ func handleTranServerMsg(c *Client, t *Transaction) (res []Transaction, err erro return res, err } +func (c *Client) showErrMsg(msg string) { + time := time.Now().Format(time.RFC850) + + title := "| Error |" + + msgBox := tview.NewTextView().SetScrollable(true) + msgBox.SetText(msg).SetBackgroundColor(tcell.ColorDarkRed) + msgBox.SetTitle(title).SetBorder(true) + msgBox.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyEscape: + c.UI.Pages.RemovePage("serverMsgModal" + time) + } + return event + }) + + centeredFlex := tview.NewFlex(). + AddItem(nil, 0, 1, false). + AddItem(tview.NewFlex().SetDirection(tview.FlexRow). + AddItem(nil, 0, 1, false). + AddItem(msgBox, 0, 2, true). + AddItem(nil, 0, 1, false), 0, 2, true). + AddItem(nil, 0, 1, false) + + c.UI.Pages.AddPage("serverMsgModal"+time, centeredFlex, true, true) + c.UI.App.Draw() // TODO: errModal doesn't render without this. wtf? +} + func handleGetFileNameList(c *Client, t *Transaction) (res []Transaction, err error) { + if t.IsError() { + c.showErrMsg(string(t.GetField(fieldError).Data)) + c.Logger.Infof("Error: %s", t.GetField(fieldError).Data) + return res, err + } + fTree := tview.NewTreeView().SetTopLevel(1) root := tview.NewTreeNode("Root") fTree.SetRoot(root).SetCurrentNode(root) @@ -397,54 +432,6 @@ func handleNotifyDeleteUser(c *Client, t *Transaction) (res []Transaction, err e return res, err } -const readBuffSize = 1024000 // 1KB - TODO: what should this be? - -func (c *Client) ReadLoop() error { - tranBuff := make([]byte, 0) - tReadlen := 0 - // Infinite loop where take action on incoming client requests until the connection is closed - for { - buf := make([]byte, readBuffSize) - tranBuff = tranBuff[tReadlen:] - - readLen, err := c.Connection.Read(buf) - if err != nil { - return err - } - tranBuff = append(tranBuff, buf[:readLen]...) - - // We may have read multiple requests worth of bytes from Connection.Read. readTransactions splits them - // into a slice of transactions - var transactions []Transaction - if transactions, tReadlen, err = readTransactions(tranBuff); err != nil { - c.Logger.Errorw("Error handling transaction", "err", err) - } - - // iterate over all of the transactions that were parsed from the byte slice and handle them - for _, t := range transactions { - if err := c.HandleTransaction(&t); err != nil { - c.Logger.Errorw("Error handling transaction", "err", err) - } - } - } -} - -func (c *Client) GetTransactions() error { - tranBuff := make([]byte, 0) - tReadlen := 0 - - buf := make([]byte, readBuffSize) - tranBuff = tranBuff[tReadlen:] - - readLen, err := c.Connection.Read(buf) - if err != nil { - return err - } - tranBuff = append(tranBuff, buf[:readLen]...) - - return nil -} - func handleClientGetUserNameList(c *Client, t *Transaction) (res []Transaction, err error) { var users []User for _, field := range t.Fields { @@ -480,6 +467,10 @@ func (c *Client) renderUserList() { } func handleClientChatMsg(c *Client, t *Transaction) (res []Transaction, err error) { + if c.pref.EnableBell { + fmt.Println("\a") + } + _, _ = fmt.Fprintf(c.UI.chatBox, "%s \n", t.GetField(fieldData).Data) return res, err @@ -633,7 +624,6 @@ func (c *Client) LogIn(login string, password string) error { NewField(fieldUserIconID, c.pref.IconBytes()), NewField(fieldUserLogin, negateString([]byte(login))), NewField(fieldUserPassword, negateString([]byte(password))), - NewField(fieldVersion, []byte{0, 2}), ), ) } @@ -675,10 +665,7 @@ func (c *Client) HandleTransaction(t *Transaction) error { } requestNum := binary.BigEndian.Uint16(t.Type) - c.Logger.Infow( - "Received Transaction", - "RequestType", requestNum, - ) + c.Logger.Debugw("Received Transaction", "RequestType", requestNum) if handler, ok := c.Handlers[requestNum]; ok { outT, _ := handler.Handle(c, t)