113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
package main
|
|
|
|
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)
|
|
for _, wrappedLine := range strings.Split(wrapped, "\n") {
|
|
wrappedLines = append(wrappedLines, wrappedLine)
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|