feat(playback): Improve formatting of long playback
This commit is contained in:
parent
357c20027f
commit
cd170de677
|
@ -59,31 +59,67 @@ func listChats(chats *chatpb.Chats) {
|
||||||
|
|
||||||
// print out one line for each chat entry
|
// print out one line for each chat entry
|
||||||
func listEntries(chat *chatpb.Chat) {
|
func listEntries(chat *chatpb.Chat) {
|
||||||
fmt.Printf("\n--- Entries for Topic: %s ---\n", chat.GetChatName())
|
fmt.Printf("--- Entries for Topic: %s ---\n", chat.GetChatName())
|
||||||
for i, entry := range chat.GetEntries() {
|
width := getTerminalWidth()
|
||||||
|
|
||||||
|
// Determine the maximum length of the author and time string
|
||||||
|
maxAuthorAndTimeLen := 0
|
||||||
|
for _, entry := range chat.GetEntries() {
|
||||||
author := entry.GetFrom().String()
|
author := entry.GetFrom().String()
|
||||||
var formattedTime string
|
var formattedTime string
|
||||||
if ctime := entry.GetCtime(); ctime != nil {
|
if ctime := entry.GetCtime(); ctime != nil {
|
||||||
t := ctime.AsTime()
|
t := ctime.AsTime()
|
||||||
formattedTime = t.Format("15:04:05") // Just the time for entry summary
|
formattedTime = t.Format("2006-01-02 15:04:05")
|
||||||
|
} else {
|
||||||
|
formattedTime = "No Time"
|
||||||
|
}
|
||||||
|
authorAndTime := fmt.Sprintf("[%s] (%s)", author, formattedTime)
|
||||||
|
if len(authorAndTime) > maxAuthorAndTimeLen {
|
||||||
|
maxAuthorAndTimeLen = len(authorAndTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, entry := range chat.GetEntries() {
|
||||||
|
author := entry.GetFrom().String()
|
||||||
|
var formattedTime string
|
||||||
|
if ctime := entry.GetCtime(); ctime != nil {
|
||||||
|
t := ctime.AsTime()
|
||||||
|
formattedTime = t.Format("2006-01-02 15:04:05")
|
||||||
} else {
|
} else {
|
||||||
formattedTime = "No Time"
|
formattedTime = "No Time"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a short preview of the content
|
// Create a short preview of the content
|
||||||
contentPreview := strings.TrimSpace(entry.GetContent())
|
contentPreview := strings.TrimSpace(entry.GetContent())
|
||||||
if len(contentPreview) > 60 {
|
|
||||||
contentPreview = contentPreview[:57] + "..."
|
|
||||||
}
|
|
||||||
// Replace newlines with spaces for a clean one-line view
|
// Replace newlines with spaces for a clean one-line view
|
||||||
contentPreview = strings.ReplaceAll(contentPreview, "\n", " ")
|
contentPreview = strings.ReplaceAll(contentPreview, "\n", " ")
|
||||||
|
|
||||||
fmt.Printf(" %2d. [%s] (%s): %s\n",
|
authorAndTime := fmt.Sprintf("[%s] (%s)", author, formattedTime)
|
||||||
i+1,
|
|
||||||
author,
|
availableWidth := width - maxAuthorAndTimeLen - 1 // -1 for a space
|
||||||
formattedTime,
|
if len(contentPreview) > availableWidth {
|
||||||
contentPreview,
|
contentPreview = contentPreview[:availableWidth-3] + "..."
|
||||||
)
|
}
|
||||||
|
|
||||||
|
if author == "USER" {
|
||||||
|
// Calculate padding to fill the space between content and the right-aligned author/time
|
||||||
|
padding := width - len(contentPreview) - maxAuthorAndTimeLen
|
||||||
|
if padding < 0 {
|
||||||
|
padding = 0
|
||||||
|
}
|
||||||
|
// Calculate padding to align the author/time string itself
|
||||||
|
authorAndTimePadding := maxAuthorAndTimeLen - len(authorAndTime)
|
||||||
|
if authorAndTimePadding < 0 {
|
||||||
|
authorAndTimePadding = 0
|
||||||
|
}
|
||||||
|
fmt.Printf("%s%s%s%s\n", contentPreview, strings.Repeat(" ", padding), strings.Repeat(" ", authorAndTimePadding), authorAndTime)
|
||||||
|
} else {
|
||||||
|
padding := maxAuthorAndTimeLen - len(authorAndTime)
|
||||||
|
if padding < 0 {
|
||||||
|
padding = 0
|
||||||
|
}
|
||||||
|
fmt.Printf("%s%s %s\n", authorAndTime, strings.Repeat(" ", padding), contentPreview)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fmt.Println("-------------------------------------------------")
|
fmt.Println("-------------------------------------------------")
|
||||||
}
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/term"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getTerminalWidth() int {
|
||||||
|
width, _, err := term.GetSize(int(os.Stdout.Fd()))
|
||||||
|
if err != nil {
|
||||||
|
// Return a default width if there's an error
|
||||||
|
return 80
|
||||||
|
}
|
||||||
|
return width
|
||||||
|
}
|
Loading…
Reference in New Issue