package main import ( "context" "fmt" "log" "sort" "github.com/edgedb/edgedb-go" "github.com/flosch/pongo2" "github.com/gofiber/fiber/v2" ) func ChatPageHandler(c *fiber.Ctx) error { return c.Render("chat", fiber.Map{}, "layouts/main") } func LoadModelSelectionHandler(c *fiber.Ctx) error { CheckedModels := []string{"gpt-3.5-turbo"} // Default model out, err := modelsPopoverTmpl.Execute(pongo2.Context{ "CompanyInfos": CompanyInfos, "CheckedModels": CheckedModels, }) if err != nil { c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Error rendering template", }) } return c.SendString(out) } func DeleteMessageHandler(c *fiber.Ctx) error { messageId := c.FormValue("id") fmt.Println("Deleting message: " + messageId) messageUUID, err := edgedb.ParseUUID(messageId) if err != nil { fmt.Println("Error in uuid.FromString: in DeleteMessageHandler") fmt.Println(err) } // Delete all messages err = edgeClient.Execute(edgeCtx, ` WITH messageArea := (SELECT Message FILTER .id = $0).area DELETE Area FILTER .position >= messageArea.position AND .conversation = messageArea.conversation; `, messageUUID) if err != nil { fmt.Println("Error in edgeClient.Execute: in DeleteMessageHandler") fmt.Println(err) } return c.SendString(generateChatHTML()) } func LoadChatHandler(c *fiber.Ctx) error { return c.SendString(generateChatHTML()) } type NextMessage struct { Icon string Content string Hidden bool Id string Name string } func generateChatHTML() string { // Get the messages from the database Messages := getAllMessages() htmlString := "
" var NextMessages []NextMessage // Use the custom NextMessage struct for i, message := range Messages { if message.Role == "user" { htmlContent := markdownToHTML(message.Content) userOut, err := userTmpl.Execute(pongo2.Context{"Content": htmlContent, "ID": message.ID.String()}) if err != nil { panic(err) } htmlString += userOut // Reset NextMessages when a user message is encountered NextMessages = []NextMessage{} } else { fmt.Println(i) modelID, exist := message.ModelID.Get() if !exist { modelID = "gpt-3.5-turbo" } selected, exist := message.Selected.Get() if !exist { selected = false } // For bot messages, add them to NextMessages with only the needed fields nextMsg := NextMessage{ Icon: model2Icon(modelID), // Assuming Icon is a field you want to include from Message Content: markdownToHTML(message.Content), Hidden: !selected, // Assuming Hidden is a field you want to include from Message Id: message.ID.String(), Name: model2Name(modelID), } NextMessages = append(NextMessages, nextMsg) // Check if the next message is not a bot or if it's the last message if i+1 == len(Messages) || Messages[i+1].Role != "bot" { sort.Slice(NextMessages, func(i, j int) bool { if !NextMessages[i].Hidden && NextMessages[j].Hidden { return true } if NextMessages[i].Hidden && !NextMessages[j].Hidden { return false } return true }) botOut, err := botTmpl.Execute(pongo2.Context{"Messages": NextMessages, "ConversationAreaId": i}) if err != nil { panic(err) } htmlString += botOut htmlString += "
" } } } htmlString += "
" // Render the HTML template with the messages return htmlString } func GetMessageContentHandler(c *fiber.Ctx) error { messageId := c.FormValue("id") messageUUID, err := edgedb.ParseUUID(messageId) if err != nil { fmt.Println("Error in uuid.FromString: in DeleteMessageHandler") fmt.Println(err) } var selectedMessage Message err = edgeClient.QuerySingle(context.Background(), ` SELECT Message { model_id, content } FILTER .id = $0; `, &selectedMessage, messageUUID) if err != nil { log.Fatal(err) } modelID, _ := selectedMessage.ModelID.Get() out := "
" out += "

" out += model2Name(modelID) out += "

" out += "
" out += "
" out += " " out += markdownToHTML(selectedMessage.Content) out += " " out += "
" return c.SendString(out) }