}, 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()
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 {
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]
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