diff options
| author | Kyren223 <Kyren223@proton.me> | 2024-12-19 19:57:31 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2024-12-19 19:57:31 +0200 |
| commit | bae7f78b9c4c3198a4e47ec2b2931e30ebf19e97 (patch) | |
| tree | 9f8c7efe2c7bbb768c16270c8901ffa2af09cb27 /internal/client | |
| parent | 6d91f3f9af3efc6e77ec89979fee18366c7b8847 (diff) | |
Added support for basic display of messages
Diffstat (limited to 'internal/client')
| -rw-r--r-- | internal/client/ui/core/chat/chat.go | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index c41c313..f483539 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -6,12 +6,16 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/google/btree" "github.com/kyren223/eko/internal/client/gateway" + "github.com/kyren223/eko/internal/client/ui" "github.com/kyren223/eko/internal/client/ui/colors" "github.com/kyren223/eko/internal/client/ui/core/state" "github.com/kyren223/eko/internal/client/ui/viminput" + "github.com/kyren223/eko/internal/data" "github.com/kyren223/eko/internal/packet" + "github.com/kyren223/eko/pkg/assert" "github.com/kyren223/eko/pkg/snowflake" ) @@ -125,7 +129,62 @@ func (m Model) View() string { builder.WriteString(style.Render(rightCorner)) // NORMAL master 1 LSP utf-8 go 51% 67:21 - return builder.String() + messagebox := builder.String() + messagesHeight := ui.Height - lipgloss.Height(messagebox) + 1 + remains := messagesHeight + + builder.Reset() + var btree *btree.BTreeG[data.Message] + if m.frequencyIndex != nil { + network := state.State.Networks[m.networkIndex] + frequencyId := network.Frequencies[*m.frequencyIndex].ID + btree = state.State.Messages[frequencyId] + } else { + // TODO: implement support for receiver id + } + + if btree != nil { + const timeGap = 7 * 60 * 1000 // 7 minutes in millis + initialTime := int64(0) + previousSender := snowflake.ID(0) + + btree.Ascend(func(message data.Message) bool { + outsideTimeRange := message.ID.Time()-timeGap > initialTime + header := outsideTimeRange || previousSender != message.SenderID + + if header { + initialTime = message.ID.Time() + previousSender = message.SenderID + } + + remains -= m.renderMessage(message, &builder, header) + return true + }) + } + + messages := builder.String() + actualMessagesHeight := lipgloss.Height(messages) + if actualMessagesHeight < messagesHeight { + diff := messagesHeight - actualMessagesHeight + messages = strings.Repeat("\n", diff) + messages + } else if actualMessagesHeight > messagesHeight { + diff := actualMessagesHeight - messagesHeight + newlines := 0 + index := -1 + for i, c := range messages { + if newlines == diff { + index = i + break + } + if c == '\n' { + newlines++ + } + } + assert.Assert(index != -1, "must always have enough newlines if it's greater") + messages = messages[index:] + } + + return messages + messagebox } func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { @@ -216,3 +275,18 @@ func (m *Model) Set(receiverIndex, frequencyIndex *int) { m.receiverIndex = receiverIndex m.frequencyIndex = frequencyIndex } + +func (m *Model) renderMessage(message data.Message, builder *strings.Builder, header bool) int { + lines := 0 + if header { + builder.WriteString(message.SenderID.String()) + builder.WriteByte('\n') + lines += 1 + } + + builder.WriteString(message.Content) + builder.WriteByte('\n') + lines += 1 + + return lines +} |
