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("-------------------------------------------------") }