2024-09-15 15:43:39 +01:00

133 lines
3.0 KiB
Go

package api
import (
"context"
"github.com/TicketsBot/GoPanel/botcontext"
dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/database"
"github.com/gin-gonic/gin"
"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"
"time"
)
var MentionRegex, _ = regexp.Compile("<@(\\d+)>")
func GetTicket(ctx *gin.Context) {
guildId := ctx.Keys["guildid"].(uint64)
userId := ctx.Keys["userid"].(uint64)
botContext, err := botcontext.ContextForGuild(guildId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
return
}
ticketId, err := strconv.Atoi(ctx.Param("ticketId"))
if err != nil {
ctx.JSON(400, gin.H{
"success": true,
"error": "Invalid ticket ID",
})
return
}
// Get the ticket struct
ticket, err := dbclient.Client.Tickets.Get(ctx, ticketId, guildId)
if err != nil {
ctx.JSON(500, gin.H{
"success": true,
"error": err.Error(),
})
return
}
if ticket.GuildId != guildId {
ctx.JSON(403, gin.H{
"success": false,
"error": "Guild ID doesn't match",
})
return
}
if !ticket.Open {
ctx.JSON(404, gin.H{
"success": false,
"error": "Ticket does not exist",
})
return
}
hasPermission, requestErr := utils.HasPermissionToViewTicket(context.Background(), guildId, userId, ticket)
if requestErr != nil {
ctx.JSON(requestErr.StatusCode, utils.ErrorJson(requestErr))
return
}
if !hasPermission {
ctx.JSON(403, utils.ErrorStr("You do not have permission to view this ticket"))
return
}
if ticket.ChannelId == nil {
ctx.JSON(404, gin.H{
"success": false,
"error": "Channel ID is nil",
})
return
}
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": 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
}