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" ) var chatData ChatData var selectedUserIdx int = 0 func layoutChat(g *gocui.Gui, maxX, maxY int) error { if v, err := g.SetView("chat", 21, 0, maxX-1, maxY-5); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Chat " v.Wrap = true v.Autoscroll = true updateChatView(v) } return nil } func layoutInput(g *gocui.Gui, maxX, maxY int) error { if v, err := g.SetView("input", 21, maxY-4, maxX-1, maxY-1); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Type your message: " v.Editable = true v.Wrap = true if _, err := g.SetCurrentView("input"); err != nil { return err } } return nil } func updateChatView(v *gocui.View) { v.Clear() clear := cleanimage.NewKittyImageCleaner() // TODO: In future optimize this to only clear certain part of screen fmt.Print(clear.DeleteByColumn(23, 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 } if strings.HasSuffix(string(decoded), "\n") { decoded = []byte(strings.TrimSuffix(string(decoded), "\n")) } t, _ := time.Parse(time.RFC3339, msg.Timestamp) 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 !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("./configs/icon.png", i*3+2, 23, 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") icon_path := fmt.Sprintf("./configs/servers/default/users/%s/icon.png", strings.ToLower(msg.Sender)) render_image.RenderImage(icon_path, i*3+2, 23, w, h, false) } } } // TODO: Rewrite This Code func sendMessage(g *gocui.Gui, v *gocui.View) error { input := v.Buffer() v.Clear() v.SetCursor(0, 0) v.SetOrigin(0, 0) WriteMessage(users[selectedUserIdx], "You", users[selectedUserIdx], input) LoadMessages(users[selectedUserIdx]) updateChatView(g.Views()[1]) return nil }