package tui import ( "encoding/base64" "fmt" "log" "strings" "time" "whspbrd/pkg/cell_size" "whspbrd/pkg/clean_image" "whspbrd/pkg/render_image" "github.com/jroimartin/gocui" ) const ( chatViewColumn = 23 userIconPath = "./configs/icon.png" contactIconPathFmt = "./configs/servers/default/users/%s/icon.png" messageRowOffset = 2 messageRowIncrement = 3 ) func updateChatView(v *gocui.View) { v.Clear() clear := cleanimage.NewKittyImageCleaner() fmt.Print(clear.DeleteByColumn(chatViewColumn, false)) for i, msg := range chatData.Messages { decoded, err := base64.StdEncoding.DecodeString(msg.Content) if err != nil { log.Printf("Error decoding message: %v", err) continue } decoded = []byte(strings.TrimSuffix(string(decoded), "\n")) t, err := time.Parse(time.RFC3339, msg.Timestamp) if err != nil { log.Printf("Error parsing timestamp: %v", err) t = time.Now() // fallback to current time } formattedTime := t.Format("2006-01-02 15:04") w, h, err := cell_size.GetTerminalCellSizePixels() if err != nil { log.Println("Error getting terminal cell size:", err) continue } if h > w { h = h * 2 w = 0 } else { w = w*3 - (w / 10) h = 0 } if len(users) == 0 || selectedUserIdx >= len(users) { continue } if !strings.EqualFold(msg.Sender, users[selectedUserIdx]) { fmt.Fprintf(v, "%s", "\t\t\t\t\t"+Colors.Text(Colors.Base02)+"You ("+formattedTime+"):"+Colors.Reset+"\n\t\t\t\t\t"+string(decoded)+"\n\n") render_image.RenderImage(userIconPath, i*messageRowIncrement+messageRowOffset, chatViewColumn, w, h, false) } else { fmt.Fprintf(v, "%s", "\t\t\t\t\t"+Colors.Text(Colors.Base05)+msg.Sender+" ("+formattedTime+"):"+Colors.Reset+"\n\t\t\t\t\t"+string(decoded)+"\n\n") iconPath := fmt.Sprintf(contactIconPathFmt, strings.ToLower(msg.Sender)) render_image.RenderImage(iconPath, i*messageRowIncrement+messageRowOffset, chatViewColumn, w, h, false) } } } func sendMessage(g *gocui.Gui, v *gocui.View) error { if len(users) == 0 || selectedUserIdx >= len(users) { return nil } input := v.Buffer() v.Clear() v.SetCursor(0, 0) v.SetOrigin(0, 0) if err := WriteMessage(users[selectedUserIdx], "You", users[selectedUserIdx], input); err != nil { log.Printf("Error writing message: %v", err) return err } LoadMessages(users[selectedUserIdx]) chatView, err := g.View("chat") if err != nil { log.Printf("Error getting chat view: %v", err) return err } updateChatView(chatView) return nil }