From 45528010f62b663091902df25d07baee09ba7fc2 Mon Sep 17 00:00:00 2001 From: Paranoia8972 Date: Sun, 1 Dec 2024 21:11:27 +0100 Subject: [PATCH] Add advent commands with button handling --- internal/pkg/commands/advent.go | 130 +++++++++ internal/pkg/commands/commands.go | 8 + internal/pkg/utils/advent.go | 62 +++++ internal/pkg/utils/adventCalender.go | 379 +++++++++++++++++++++++++++ main.go | 8 + 5 files changed, 587 insertions(+) create mode 100644 internal/pkg/commands/advent.go create mode 100644 internal/pkg/utils/advent.go create mode 100644 internal/pkg/utils/adventCalender.go diff --git a/internal/pkg/commands/advent.go b/internal/pkg/commands/advent.go new file mode 100644 index 0000000..8c03a84 --- /dev/null +++ b/internal/pkg/commands/advent.go @@ -0,0 +1,130 @@ +package commands + +import ( + "log" + "strconv" + "time" + + "github.com/Paranoia8972/PixelBot/internal/pkg/utils" + "github.com/bwmarrin/discordgo" +) + +// var debugDay int + +// func init() { +// SetDebugDay(24) +// } + +func AdventCommand(s *discordgo.Session, i *discordgo.InteractionCreate) { + currentDay := time.Now().Day() + //* debugDay start + // if debugDay >= 1 && debugDay <= 24 { + // currentDay = debugDay + // } + //* debugDay end + var buttons []discordgo.MessageComponent + for j := 1; j <= 24; j++ { + style := discordgo.SecondaryButton + disabled := true + label := strconv.Itoa(j) + if j <= currentDay { + style = discordgo.SuccessButton + disabled = false + } + if j == currentDay { + label = "🎄 " + label + } + buttons = append(buttons, discordgo.Button{ + Label: label, + CustomID: "advent_" + strconv.Itoa(j), + Style: style, + Disabled: disabled, + }) + } + + var rows []discordgo.MessageComponent + for k := 0; k < 24; k += 5 { + rows = append(rows, discordgo.ActionsRow{ + Components: buttons[k:min(k+5, 24)], + }) + } + + embed := &discordgo.MessageEmbed{ + Title: "Advent Calendar", + Description: "# Advent, Advent, a little light is burning! 🎄🎁", + Color: 0x248045, + } + + err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Components: rows, + Flags: 64, + }, + }) + if err != nil { + log.Printf("Failed to respond to interaction: %v", err) + } +} + +func HandleAdventButton(s *discordgo.Session, i *discordgo.InteractionCreate) { + userID := i.Member.User.ID + username := i.Member.User.Username + buttonID := i.MessageComponentData().CustomID + day, err := strconv.Atoi(buttonID[len("advent_"):]) + if err != nil { + log.Printf("Invalid button ID: %v", err) + return + } + err = utils.StoreAdventClick(userID, username, buttonID) + if err != nil { + log.Printf("Failed to store advent click: %v", err) + } + + adventFunctions := map[int]func(s *discordgo.Session, i *discordgo.InteractionCreate){ + 1: utils.Advent1, + 2: utils.Advent2, + 3: utils.Advent3, + 4: utils.Advent4, + 5: utils.Advent5, + 6: utils.Advent6, + 7: utils.Advent7, + 8: utils.Advent8, + 9: utils.Advent9, + 10: utils.Advent10, + 11: utils.Advent11, + 12: utils.Advent12, + 13: utils.Advent13, + 14: utils.Advent14, + 15: utils.Advent15, + 16: utils.Advent16, + 17: utils.Advent17, + 18: utils.Advent18, + 19: utils.Advent19, + 20: utils.Advent20, + 21: utils.Advent21, + 22: utils.Advent22, + 23: utils.Advent23, + 24: utils.Advent24, + } + + if adventFunc, ok := adventFunctions[day]; ok { + adventFunc(s, i) + } +} + +// func SetDebugDay(day int) { +// if day >= 1 && day <= 24 { +// debugDay = day +// } else { +// debugDay = 0 +// } +// } + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/internal/pkg/commands/commands.go b/internal/pkg/commands/commands.go index 3e7d2e3..d44cda9 100644 --- a/internal/pkg/commands/commands.go +++ b/internal/pkg/commands/commands.go @@ -465,6 +465,14 @@ func RegisterCommands(s *discordgo.Session, cfg *config.Config) { }, }, }, + { + Name: "version", + Description: "Get the bot's version", + }, + { + Name: "advent", + Description: "Advent calendar", + }, } commands := make([]*discordgo.ApplicationCommand, len(Commands)) diff --git a/internal/pkg/utils/advent.go b/internal/pkg/utils/advent.go new file mode 100644 index 0000000..19d78b8 --- /dev/null +++ b/internal/pkg/utils/advent.go @@ -0,0 +1,62 @@ +package utils + +import ( + "context" + "sort" + "strconv" + "time" + + "github.com/Paranoia8972/PixelBot/internal/db" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type AdventClick struct { + UserID string `bson:"user_id"` + Username string `bson:"username"` + Buttons []string `bson:"buttons"` + Timestamp time.Time `bson:"timestamp"` +} + +func StoreAdventClick(userID, username, buttonID string) error { + collection := db.GetCollection(cfg.DBName, "advent_clicks") + filter := bson.M{"user_id": userID} + + // Retrieve the current document + var adventClick AdventClick + err := collection.FindOne(context.Background(), filter).Decode(&adventClick) + if err != nil && err != mongo.ErrNoDocuments { + return err + } + + // Add the new buttonID if it doesn't already exist + buttonExists := false + for _, b := range adventClick.Buttons { + if b == buttonID { + buttonExists = true + break + } + } + if !buttonExists { + adventClick.Buttons = append(adventClick.Buttons, buttonID) + } + + // Sort the buttons + sort.Slice(adventClick.Buttons, func(i, j int) bool { + dayI, _ := strconv.Atoi(adventClick.Buttons[i][len("advent_"):]) + dayJ, _ := strconv.Atoi(adventClick.Buttons[j][len("advent_"):]) + return dayI < dayJ + }) + + update := bson.M{ + "$set": bson.M{ + "username": username, + "buttons": adventClick.Buttons, + "timestamp": time.Now(), + }, + } + opts := options.Update().SetUpsert(true) + _, err = collection.UpdateOne(context.Background(), filter, update, opts) + return err +} diff --git a/internal/pkg/utils/adventCalender.go b/internal/pkg/utils/adventCalender.go new file mode 100644 index 0000000..1c068ad --- /dev/null +++ b/internal/pkg/utils/adventCalender.go @@ -0,0 +1,379 @@ +package utils + +import ( + "log" + + "github.com/bwmarrin/discordgo" +) + +func Advent1(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🕯️ First Advent: 1. December", + Description: "Use the code `advent1_500` to redeem 500 coins once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent2(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎄 Advent Calendar: 2. December", + Description: "You've received a Levelup! 🎉", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent3(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 3. December", + Description: "Use the code `snowman3_2024` to redeem for the Pet `Snowman` once OnThePixel.net opens!\n Each code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent4(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "❄️ Advent Calendar: 4. December", + Description: "Use the code `advent4_200` to redeem 200 coins once OnThePixel.net opens!\n Each code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent5(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎁 Advent Calendar: 5. December", + Description: "You've received a Levelup! 🎉", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent6(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎄 Advent Calendar: 6. December", + Description: "Use the code `nick6_2024` to redeem a for a santa hat once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent7(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 7. December", + Description: "Use the code `advent7_200` to redeem 200 coins once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent8(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🕯️🕯️ Second Advent: 8. December", + Description: "You've received a Levelup! 🎉", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent9(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "❄️ Advent Calendar: 9. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent10(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎁 Advent Calendar: 10. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent11(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎄 Advent Calendar: 11. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent12(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 12. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent13(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "❄️ Advent Calendar: 13. December", + Description: "You were unlucky and got a piece of coal! 🪨", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent14(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎁 Advent Calendar: 14. December", + Description: "Use the code `snow14_2024` to redeem for a ❄️ snow particle trail once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent15(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🕯️🕯️🕯️ Third Advent: 15. December", + Description: "Use the code `advent15_500` to redeem 500 coins once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent16(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎄 Advent Calendar: 16. December", + Description: "You've received a Levelup! 🎉", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent17(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 17. December", + Description: "Use the code `advent17_200` to redeem 200 coins once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent18(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "❄️ Advent Calendar: 18. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +// TODO +func Advent19(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎁 Advent Calendar: 19. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent20(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 20. December", + Description: "Just a few more days until Christmas!\nYou've received the role `Holiday Hero` on discord 🎅", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) + err := s.GuildMemberRoleAdd(i.GuildID, i.Member.User.ID, "1312868677800034376") + if err != nil { + log.Println(err) + return + } +} + +// TODO +func Advent21(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "☃️ Advent Calendar: 21. December", + Description: "Use the code `Advent500` to redeem 500 coins once OnThePixel.net opens!", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent22(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🕯️🕯️🕯️🕯️ Fourth Advent: 22. December", + Description: "Use the code `advent22_500` to redeem 500 coins once OnThePixel.net opens!\nEach code can only be redeemed once.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent23(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "❄️ Advent Calendar: 23. December", + Description: "Just one more day until Christmas!\nYou've received the role `Christmas Elf` on discord 🎄", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} + +func Advent24(s *discordgo.Session, i *discordgo.InteractionCreate) { + embed := &discordgo.MessageEmbed{ + Title: "🎅🎁🎄 Christmas Day: 24. December", + Description: "Use the code `xmas-hero` to redeem for a custom role on the Minecraft Server once OnThePixel.net opens!\nYou'll receive special perks and a custom color for your name.", + Color: 0x248045, + } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{embed}, + Flags: 64, + }, + }) +} diff --git a/main.go b/main.go index c6e80f8..4985503 100644 --- a/main.go +++ b/main.go @@ -83,6 +83,10 @@ func main() { commands.RandomNumberCommand(s, i) case "chooser": commands.ChooserCommand(s, i) + case "version": + commands.VersionCommand(s, i) + case "advent": + commands.AdventCommand(s, i) } } }) @@ -97,6 +101,10 @@ func main() { commands.TicketCloseHandler(s, i) case "stop_radio": commands.StopRadio(s, i) + default: + if strings.HasPrefix(i.MessageComponentData().CustomID, "advent_") { + commands.HandleAdventButton(s, i) + } } case discordgo.InteractionModalSubmit: switch {