From 3a7e14031440e5f5eb4cdd7f9ef8c7670f1f5cd3 Mon Sep 17 00:00:00 2001
From: rxdn <29165304+rxdn@users.noreply.github.com>
Date: Sun, 15 Sep 2024 15:43:39 +0100
Subject: [PATCH] Render attachments and embeds
---
app/http/endpoints/api/ticket/getticket.go | 98 +++---
.../src/components/DiscordMessages.svelte | 292 +++++++++++++++++-
frontend/src/js/icons.js | 20 +-
frontend/src/views/TicketView.svelte | 45 ++-
4 files changed, 368 insertions(+), 87 deletions(-)
diff --git a/app/http/endpoints/api/ticket/getticket.go b/app/http/endpoints/api/ticket/getticket.go
index b34ce37..78a9724 100644
--- a/app/http/endpoints/api/ticket/getticket.go
+++ b/app/http/endpoints/api/ticket/getticket.go
@@ -2,18 +2,18 @@ package api
import (
"context"
- "errors"
- "fmt"
"github.com/TicketsBot/GoPanel/botcontext"
- "github.com/TicketsBot/GoPanel/database"
- "github.com/TicketsBot/GoPanel/rpc/cache"
+ dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
+ "github.com/TicketsBot/database"
"github.com/gin-gonic/gin"
- cache2 "github.com/rxdn/gdl/cache"
+ "github.com/rxdn/gdl/objects/channel"
+ "github.com/rxdn/gdl/objects/channel/embed"
+ "github.com/rxdn/gdl/objects/user"
"github.com/rxdn/gdl/rest"
"regexp"
"strconv"
- "strings"
+ "time"
)
var MentionRegex, _ = regexp.Compile("<@(\\d+)>")
@@ -41,7 +41,7 @@ func GetTicket(ctx *gin.Context) {
}
// Get the ticket struct
- ticket, err := database.Client.Tickets.Get(ctx, ticketId, guildId)
+ ticket, err := dbclient.Client.Tickets.Get(ctx, ticketId, guildId)
if err != nil {
ctx.JSON(500, gin.H{
"success": true,
@@ -77,50 +77,56 @@ func GetTicket(ctx *gin.Context) {
return
}
- messagesFormatted := make([]map[string]interface{}, 0)
- if ticket.ChannelId != nil {
- // Get messages
- messages, err := rest.GetChannelMessages(context.Background(), botContext.Token, botContext.RateLimiter, *ticket.ChannelId, rest.GetChannelMessagesData{Limit: 100})
- if err != nil {
- ctx.JSON(500, utils.ErrorJson(err))
- return
- }
+ if ticket.ChannelId == nil {
+ ctx.JSON(404, gin.H{
+ "success": false,
+ "error": "Channel ID is nil",
+ })
+ return
+ }
- // Format messages, exclude unneeded data
- for _, message := range utils.Reverse(messages) {
- content := message.Content
-
- // Format mentions properly
- match := MentionRegex.FindAllStringSubmatch(content, -1)
- for _, mention := range match {
- if len(mention) >= 2 {
- mentionedId, err := strconv.ParseUint(mention[1], 10, 64)
- if err != nil {
- continue
- }
-
- user, err := cache.Instance.GetUser(context.Background(), mentionedId)
- if err == nil {
- content = strings.ReplaceAll(content, fmt.Sprintf("<@%d>", mentionedId), fmt.Sprintf("@%s", user.Username))
- } else if errors.Is(err, cache2.ErrNotFound) {
- content = strings.ReplaceAll(content, fmt.Sprintf("<@%d>", mentionedId), "@Unknown User")
- } else {
- ctx.JSON(500, utils.ErrorJson(err))
- return
- }
- }
- }
-
- messagesFormatted = append(messagesFormatted, map[string]interface{}{
- "author": message.Author,
- "content": content,
- })
- }
+ messages, err := fetchMessages(botContext, ticket)
+ if err != nil {
+ ctx.JSON(500, gin.H{
+ "success": false,
+ "error": err.Error(),
+ })
+ return
}
ctx.JSON(200, gin.H{
"success": true,
"ticket": ticket,
- "messages": messagesFormatted,
+ "messages": messages,
})
}
+
+type StrippedMessage struct {
+ Author user.User `json:"author"`
+ Content string `json:"content"`
+ Timestamp time.Time `json:"timestamp"`
+ Attachments []channel.Attachment `json:"attachments"`
+ Embeds []embed.Embed `json:"embeds"`
+}
+
+func fetchMessages(botContext *botcontext.BotContext, ticket database.Ticket) ([]StrippedMessage, error) {
+ // Get messages
+ messages, err := rest.GetChannelMessages(context.Background(), botContext.Token, botContext.RateLimiter, *ticket.ChannelId, rest.GetChannelMessagesData{Limit: 100})
+ if err != nil {
+ return nil, err
+ }
+
+ // Format messages, exclude unneeded data
+ stripped := make([]StrippedMessage, len(messages))
+ for i, message := range utils.Reverse(messages) {
+ stripped[i] = StrippedMessage{
+ Author: message.Author,
+ Content: message.Content,
+ Timestamp: message.Timestamp,
+ Attachments: message.Attachments,
+ Embeds: message.Embeds,
+ }
+ }
+
+ return stripped, nil
+}
diff --git a/frontend/src/components/DiscordMessages.svelte b/frontend/src/components/DiscordMessages.svelte
index 39a829c..462ae65 100644
--- a/frontend/src/components/DiscordMessages.svelte
+++ b/frontend/src/components/DiscordMessages.svelte
@@ -24,14 +24,86 @@
{/if}
-
+
-
+
{#each messages as message}
-
{message.author.username}: {message.content}
+

handleAvatarLoadError(e, message.author.id)} alt="Avatar"/>
+
+
+ {message.author.global_name || message.author.username}
+
+ {new Date() - new Date(message.timestamp) < 86400000 ? getRelativeTime(new Date(message.timestamp)) : new Date(message.timestamp).toLocaleString()}
+
+
+
+ {#if message.content?.length > 0}
+
{message.content}
+ {/if}
+
+ {#if message.embeds?.length > 0}
+
+ {#each message.embeds as embed}
+
+
+
+ {#if embed.title}
+
{embed.title}
+ {/if}
+ {#if embed.description}
+
{embed.description}
+ {/if}
+
+ {#if embed.fields && embed.fields.length > 0}
+
+ {#each embed.fields as field}
+
+ {field.name}
+ {field.value}
+
+ {/each}
+
+ {/if}
+
+ {#if embed.image && embed.image.proxy_url}
+

+ {/if}
+
+
+ {/each}
+
+ {/if}
+
+ {#if message.attachments?.length > 0}
+
+ {#each message.attachments.filter(a => isImage(a.filename)) as attachment}
+ {@const proxyUrl = attachment.proxy_url.replaceAll("\u0026", "&")}
+

+ {/each}
+
+ {#each message.attachments.filter(a => !isImage(a.filename)) as attachment}
+ {@const directUrl = attachment.url.replaceAll("\u0026", "&")}
+ {@const proxyUrl = attachment.proxy_url.replaceAll("\u0026", "&")}
+
+
+
+ {attachment.filename}
+ {formatFileSize(attachment.size)}
+
+
+
+
+
+ {/each}
+
+ {/if}
+
+
{/each}
@@ -47,14 +119,16 @@
{/if}
-
+