144 lines
3.6 KiB
Go
144 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"go.wit.com/lib/protobuf/chatpb"
|
|
"go.wit.com/log"
|
|
)
|
|
|
|
func doPlayback() error {
|
|
if argv.Uuid != "" {
|
|
showChat(argv.Uuid)
|
|
return nil
|
|
}
|
|
|
|
if argv.Playback.Purge != nil {
|
|
doPurge()
|
|
return nil
|
|
}
|
|
|
|
listChats(me.chats)
|
|
return nil
|
|
}
|
|
|
|
func doPurge() {
|
|
changed := false
|
|
for _, chat := range me.chats.GetChats() {
|
|
if len(chat.GetEntries()) == 0 {
|
|
me.chats.Delete(chat)
|
|
changed = true
|
|
}
|
|
}
|
|
if changed {
|
|
me.chats.ConfigSave()
|
|
}
|
|
}
|
|
|
|
func showChat(uuid string) {
|
|
chat := me.chats.FindByUuid(uuid)
|
|
if chat == nil {
|
|
log.Info("unknown uuid", uuid)
|
|
return
|
|
}
|
|
prettyFormatChat(chat)
|
|
}
|
|
|
|
func listChats(chats *chatpb.Chats) {
|
|
if argv.Playback.Long != nil {
|
|
for _, chat := range chats.GetChats() {
|
|
listEntries(chat)
|
|
}
|
|
return
|
|
}
|
|
|
|
log.Info("Found %d chat topic(s) in the log.", len(chats.GetChats()))
|
|
log.Println("-------------------------------------------------")
|
|
|
|
for _, chat := range chats.GetChats() {
|
|
entryCount := len(chat.GetEntries())
|
|
var formattedTime string
|
|
if ctime := chat.GetCtime(); ctime != nil {
|
|
t := ctime.AsTime()
|
|
formattedTime = t.Format("2006-01-02 15:04:05")
|
|
} else {
|
|
formattedTime = "No Timestamp"
|
|
}
|
|
|
|
log.Printf("Entries: %-4d | Started: %-25s | UUID: %s | %-25s\n",
|
|
entryCount,
|
|
formattedTime,
|
|
chat.GetUuid(),
|
|
chat.GetChatName(),
|
|
)
|
|
}
|
|
log.Println("-------------------------------------------------")
|
|
}
|
|
|
|
// print out one line for each chat entry
|
|
func listEntries(chat *chatpb.Chat) {
|
|
log.Printf("--- Entries for Topic: %s ---\n", chat.GetChatName())
|
|
width := getTerminalWidth()
|
|
|
|
// Determine the maximum length of the author and time string
|
|
maxAuthorAndTimeLen := 0
|
|
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 {
|
|
formattedTime = "No Time"
|
|
}
|
|
authorAndTime := log.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 {
|
|
formattedTime = "No Time"
|
|
}
|
|
|
|
// Create a short preview of the content
|
|
contentPreview := strings.TrimSpace(entry.GetContent())
|
|
// Replace newlines with spaces for a clean one-line view
|
|
contentPreview = strings.ReplaceAll(contentPreview, "\n", " ")
|
|
|
|
authorAndTime := log.Sprintf("[%s] (%s)", author, formattedTime)
|
|
|
|
availableWidth := width - maxAuthorAndTimeLen - 1 // -1 for a space
|
|
if len(contentPreview) > availableWidth {
|
|
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
|
|
}
|
|
log.Printf("%s%s%s%s\n", contentPreview, strings.Repeat(" ", padding), strings.Repeat(" ", authorAndTimePadding), authorAndTime)
|
|
} else {
|
|
padding := maxAuthorAndTimeLen - len(authorAndTime)
|
|
if padding < 0 {
|
|
padding = 0
|
|
}
|
|
log.Printf("%s%s %s\n", authorAndTime, strings.Repeat(" ", padding), contentPreview)
|
|
}
|
|
}
|
|
log.Println("-------------------------------------------------")
|
|
}
|