diff --git a/cmd/tui/model.go b/cmd/tui/model.go index 60cc1e3..c7c8a40 100644 --- a/cmd/tui/model.go +++ b/cmd/tui/model.go @@ -210,6 +210,14 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { }) }) + m.client.On(ts3client.EventMessage, func(e *ts3client.MessageEvent) { + m.program.Send(chatMsg{ + senderID: e.SenderID, + senderName: e.SenderName, + message: e.Message, + }) + }) + // Handle incoming audio - play through speakers m.client.On(ts3client.EventAudio, func(e *ts3client.AudioEvent) { if m.audioPlayer != nil { @@ -325,6 +333,18 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } return m, nil + case chatMsg: + m.chatMessages = append(m.chatMessages, ChatMessage{ + Time: time.Now(), + Sender: msg.senderName, + Content: msg.message, + }) + // Keep last 100 messages + if len(m.chatMessages) > 100 { + m.chatMessages = m.chatMessages[1:] + } + return m, nil + case micLevelMsg: // Update microphone level for display m.micLevel = int(msg) @@ -510,12 +530,23 @@ func (m *Model) handleInputKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) { m.inputText = "" case "backspace": if len(m.inputText) > 0 { - m.inputText = m.inputText[:len(m.inputText)-1] + // Handle UTF-8 backspace properly + runes := []rune(m.inputText) + if len(runes) > 0 { + m.inputText = string(runes[:len(runes)-1]) + } } default: // Add character to input - if len(msg.String()) == 1 { - m.inputText += msg.String() + // Allow Runes (including multi-byte like ñ) and Space + // Filter out special keys that might send description strings (like "alt+") by ensuring only 1 rune + if msg.Type == tea.KeyRunes { + runes := []rune(msg.String()) + if len(runes) == 1 { + m.inputText += string(runes) + } + } else if msg.Type == tea.KeySpace { + m.inputText += " " } } return m, nil