Files
self-bot/Bot/Commands/suggest.go
T
2025-04-08 18:48:34 -04:00

138 lines
3.7 KiB
Go

package commands
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"
helpers "ion606_bot/Bot/Helpers"
"github.com/bwmarrin/discordgo"
)
var SuggestCommand = &discordgo.ApplicationCommand{
Name: "suggest",
Description: "Submit a suggestion to the server",
}
var timeToWait = time.Minute * time.Duration(5)
func HandleSuggest(s *discordgo.Session, i *discordgo.InteractionCreate) {
userID := i.Member.User.ID
// Check cooldown from DB
lastSubmission, err := helpers.GetLastSubmission(userID)
if err != nil {
helpers.HandleError(s, i, fmt.Errorf("failed to check cooldown: %w", err))
return
}
if time.Since(lastSubmission) < (timeToWait) {
remaining := time.Until(lastSubmission.Add(timeToWait)).Round(time.Minute)
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: fmt.Sprintf("⏳ You can submit another suggestion in %d minutes!", int(remaining.Minutes())),
Flags: discordgo.MessageFlagsEphemeral,
},
})
return
}
err = helpers.RemoveUserSubmittions(userID);
if err != nil {
log.Default().Println(fmt.Sprintf("%s", err.Error()))
}
// Store new submission time
if err := helpers.SetLastSubmission(userID); err != nil {
helpers.HandleError(s, i, fmt.Errorf("failed to update cooldown: %w", err))
return
}
// Create modal with suggestion input
err = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseModal,
Data: &discordgo.InteractionResponseData{
CustomID: "suggestion_modal",
Title: "Submit Suggestion",
Components: []discordgo.MessageComponent{
discordgo.ActionsRow{
Components: []discordgo.MessageComponent{
discordgo.TextInput{
CustomID: "suggestion_content",
Label: "Your suggestion",
Style: discordgo.TextInputParagraph,
Placeholder: "Type your suggestion here...",
Required: true,
MaxLength: 1000,
},
},
},
},
},
})
if err != nil {
helpers.HandleError(s, i, fmt.Errorf("failed to create modal: %w", err))
}
}
func HandleSuggestModal(s *discordgo.Session, i *discordgo.InteractionCreate) {
// Extract suggestion from modal
data := i.ModalSubmitData()
content := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput).Value
// Get webhook URL from environment
webhookURL := os.Getenv("WEBHOOK_URL")
if webhookURL == "" {
helpers.HandleError(s, i, fmt.Errorf("WEBHOOK_URL environment variable not set"))
return
}
// Create payload
payload := map[string]string{
"content": fmt.Sprintf("**New Suggestion from <@%s> (%s)**\n```\n%s\n```",
i.Member.User.ID,
i.Member.User.Username,
content),
}
jsonData, err := json.Marshal(payload)
if err != nil {
helpers.HandleError(s, i, fmt.Errorf("failed to marshal payload: %w", err))
return
}
// Send to webhook
resp, err := http.Post(webhookURL, "application/json", strings.NewReader(string(jsonData)))
if err != nil {
helpers.HandleError(s, i, fmt.Errorf("webhook request failed: %w", err))
return
}
defer resp.Body.Close()
// Verify successful response
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
body, _ := io.ReadAll(resp.Body)
helpers.HandleError(s, i, fmt.Errorf("webhook returned %d: %s", resp.StatusCode, string(body)))
return
}
// Send confirmation to user
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: "✅ Your suggestion has been submitted!",
Flags: discordgo.MessageFlagsEphemeral,
},
})
}