package ui import ( "encoding/json" "fmt" "strings" "time" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/viewport" "github.com/charmbracelet/lipgloss" "github.com/muesli/reflow/wordwrap" ) const timePrefixFormat = "15:04:05" func renderLines(width int, lines ...string) []string { var wrappedLines []string now := time.Now().Format(timePrefixFormat) leftMargin := lipgloss.Width(fmt.Sprintf( "%s %s ", timeStyle.Render(now), lineSeparatorStyle.Render("|"), )) for _, line := range lines { wrapped := wordwrap.String(line, width-leftMargin) wrappedLines = append(wrappedLines, strings.Split(wrapped, "\n")...) } var rendered []string for _, wrappedLine := range wrappedLines { now := time.Now().Format(timePrefixFormat) rendered = append(rendered, fmt.Sprintf( "%s %s %s", timeStyle.Render(now), lineSeparatorStyle.Render("|"), lineStyle.Render(wrappedLine), ), ) } return rendered } func newViewport(width, height int) viewport.Model { viewp := viewport.New(width, height) viewp.KeyMap = viewport.KeyMap{ PageDown: key.NewBinding(key.WithKeys("pgdown")), PageUp: key.NewBinding(key.WithKeys("pgup")), HalfPageUp: key.NewBinding(key.WithKeys("ctrl+k")), HalfPageDown: key.NewBinding(key.WithKeys("ctrl+j")), } return viewp } func renderCmdHelp(m model) []string { var ( renderedCmdHelp []string cmdHelp []string ) if m.width >= 90 { cmdHelp = []string{ "CTRL+N/P", "TOGGLE PROFILE", "CTRL+J/K", "SCROLL UP/DOWN", "CTRL+L", "CLEAR", "CTRL+C", "EXIT", } } else { // NOTE(d1): respect small screens cmdHelp = []string{ "CTRL+N/P", "CTRL+J/K", "CTRL+L", "CTRL+C", } } for idx, cmd := range cmdHelp { if idx%2 == 0 { renderedCmdHelp = append(renderedCmdHelp, cmdKeyStyle.Render(cmd)) } else { renderedCmdHelp = append(renderedCmdHelp, cmdDescriptionStyle.Render(cmd)) } } return renderedCmdHelp } // https://git.openprivacy.ca/sarah/cwtchbot/src/branch/main/bot.go type MessageWrapper struct { Overlay int `json:"o"` Data string `json:"d"` } func packMessage(overlay int, message string) []byte { mw := new(MessageWrapper) mw.Overlay = overlay mw.Data = message data, _ := json.Marshal(mw) return data } func unpackMessage(message string) MessageWrapper { mw := new(MessageWrapper) json.Unmarshal([]byte(message), mw) return *mw }