]> git.r.bdr.sh - rbdr/mobius/blobdiff - client.go
Fix crash on shxd servers
[rbdr/mobius] / client.go
index 3fc9b564b15f0cc01c6de8a0869993526a103dc6..940e6fe2c2f1bbb09085d077d26385142da8835c 100644 (file)
--- a/client.go
+++ b/client.go
@@ -220,7 +220,11 @@ func (ui *UI) renderSettingsForm() *tview.Flex {
        }, nil)
        settingsForm.AddInputField("Tracker", ui.HLClient.pref.Tracker, 0, nil, nil)
        settingsForm.AddButton("Save", func() {
-               ui.HLClient.pref.Username = settingsForm.GetFormItem(0).(*tview.InputField).GetText()
+               usernameInput := settingsForm.GetFormItem(0).(*tview.InputField).GetText()
+               if len(usernameInput) == 0 {
+                       usernameInput = "unnamed"
+               }
+               ui.HLClient.pref.Username = usernameInput
                iconStr = settingsForm.GetFormItem(1).(*tview.InputField).GetText()
                ui.HLClient.pref.IconID, _ = strconv.Atoi(iconStr)
                ui.HLClient.pref.Tracker = settingsForm.GetFormItem(2).(*tview.InputField).GetText()
@@ -410,9 +414,10 @@ func (ui *UI) renderServerUI() *tview.Flex {
                                case tcell.KeyTab:
                                        ui.App.SetFocus(newsPostTextArea)
                                case tcell.KeyEnter:
+                                       newsText := strings.ReplaceAll(newsPostTextArea.GetText(true), "\n", "\r")
                                        err := ui.HLClient.Send(
                                                *NewTransaction(tranOldPostNews, nil,
-                                                       NewField(fieldData, []byte(newsPostTextArea.GetText(true))),
+                                                       NewField(fieldData, []byte(newsText)),
                                                ),
                                        )
                                        if err != nil {
@@ -442,7 +447,7 @@ func (ui *UI) renderServerUI() *tview.Flex {
                                        fmt.Fprintf(newsPostTextArea, "\n")
                                default:
                                        switch event.Rune() {
-                                       case 127:
+                                       case 127: // backspace
                                                curTxt := newsPostTextArea.GetText(true)
                                                if len(curTxt) > 0 {
                                                        curTxt = curTxt[:len(curTxt)-1]
@@ -749,15 +754,16 @@ func (c *Client) GetTransactions() error {
 func handleClientGetUserNameList(c *Client, t *Transaction) (res []Transaction, err error) {
        var users []User
        for _, field := range t.Fields {
-               u, _ := ReadUser(field.Data)
-               //flagBitmap := big.NewInt(int64(binary.BigEndian.Uint16(u.Flags)))
-               //if flagBitmap.Bit(userFlagAdmin) == 1 {
-               //      fmt.Fprintf(UserList, "[red::b]%s[-:-:-]\n", u.Name)
-               //} else {
-               //      fmt.Fprintf(UserList, "%s\n", u.Name)
-               //}
-
-               users = append(users, *u)
+               // The Hotline protocol docs say that ClientGetUserNameList should only return fieldUsernameWithInfo (300)
+               // fields, but shxd sneaks in fieldChatSubject (115) so it's important to filter explicitly for the expected
+               // field type.  Probably a good idea to do everywhere.
+               if bytes.Equal(field.ID, []byte{0x01, 0x2c}) {
+                       u, err := ReadUser(field.Data)
+                       if err != nil {
+                               return res, err
+                       }
+                       users = append(users, *u)
+               }
        }
        c.UserList = users