forge-gw
TypeScript icon, indicating that this package has built-in type declarations

0.0.2 • Public • Published

Forge Giveaways

Manage and Handle Discord giveaways with ease.

Requirements

This extension requires ForgeScript 1.4.0 to work.

Example Setup

const { ButtonStyle, GiveawayManager } = require('forge-gw')
const { ForgeClient } = require('forgescript')
const { join } = require('path')

require('dotenv').config()

const giveaways = new GiveawayManager({
    path: join(__dirname, 'giveaways/data.json'),
    defineEmbedStrings(giveaway, host) {
        return {
            // this ephemeral reply will be sent when they join the giveaway (embeds may also be used here)
            joinGiveawayMessage: {
                messageContent: ':white_check_mark: | You have joined the giveaway!'
            },

            // this ephemeral reply will be sent when they leave the giveaway (embeds may also be used here)
            leaveGiveawayMessage: {
                messageContent: ':exclamation: | You have left the giveaway!'
            },

            // this embed will be sent on giveaway start
            start: {
                messageContent: ':tada: **GIVEAWAY STARTED!** :tada:',

                // embed properties
                title: `Giveaway (ID: ${giveaway.id})`,

                description: `Prize: **${giveaway.prize}**.\nWinners: **${giveaway.winnersCount}**\n` +
                    `Entries: **${giveaway.entriesCount}**\nHost: **${host.username}**\nEnds at: <t:${giveaway.endTimestamp}:R>`,

                footer: `Ends at:`,
                timestamp: giveaway.endTimestamp
            },

            // defining all messages that are related
            // to giveaway finish
            finish(mentionsString, winnersCount) {
                return {
                    // this message will be sent separately in the giveaway channel when the giveaway ends
                    // used to mention the giveaway winners
                    endMessage: {
                        messageContent: `Congratulations ${mentionsString} on winning **${giveaway.prize}**!`
                    },

                    // the new separated message that the giveaway message in giveaway channel
                    // will be changed to after the giveaway is finished
                    newGiveawayMessage: {
                        messageContent: ':tada: **GIVEAWAY FINISHED!** :tada:',

                        title: `Giveaway (ID: ${giveaway.id})`,


                        // using "giveaway.winnersCount" to pluralize the "winners" word because
                        // it's constant and most likely to match the actual number of winners

                        // using "winnersCount" in "Winners" string in case if the actual number of winners
                        // will not match the giveaway's number of winners
                        description: `Prize: **${giveaway.prize}**\nEntries: **${giveaway.entriesCount}**\n` +
                            `${winnersCount == 1 ? 'Winner' : `Winners **(${winnersCount})**`}: ${mentionsString} `,

                        footer: `Ended at:`,
                        timestamp: giveaway.endedTimestamp
                    },

                    // the new message that the giveaway message in giveaway channel will be changed to
                    // after the giveaway is finished with no winners
                    noWinnersNewGiveawayMessage: {
                        messageContent: ':tada: **GIVEAWAY FINISHED!** :tada:',

                        title: `Giveaway (ID: ${giveaway.id})`,
                        description: `There was no winners in "**${giveaway.prize}**" giveaway!`,

                        footer: `Ended at:`,
                        timestamp: giveaway.endedTimestamp,
                    },

                    // the new separated message that the giveaway message in giveaway channel
                    // will be changed to after the giveaway is finished with no winners (embeds may also be used here)
                    noWinnersEndMessage: {
                        messageContent: `Unfortunetly, there are no winners in the **${giveaway.prize}** giveaway.`
                    }
                }
            },

            // defining all messages that are related
            // to rerolling the giveaway winners
            reroll(mentionsString, winnersCount) {
                return {
                    // this ephemeral reply will be sent when they're not a host
                    // of the giveaway and trying to reroll the winners (embeds may also be used here)
                    onlyHostCanReroll: {
                        messageContent: ':x: | Only host of this giveaway can reroll the winners.'
                    },

                    // the new message that the giveaway message in giveaway channel will be changed to
                    // after the reroll
                    newGiveawayMessage: {
                        messageContent: ':tada: **GIVEAWAY REROLLED!** :tada:',

                        title: `Giveaway (ID: ${giveaway.id})`,

                        description: `Prize: **${giveaway.prize}**\nEntries: **${giveaway.entriesCount}**\n` +
                            `${winnersCount == 1 ? 'Winner' : `Winners **(${winnersCount})**`}: ${mentionsString}`,

                        footer: `Ended at:`,
                        timestamp: giveaway.endedTimestamp,
                    },

                    // this message will be sent separately in the giveaway channel after the reroll
                    // used to mention the new giveaway winners (embeds may also be used here)
                    rerollMessage: {
                        messageContent: `${winnersCount == 1 ? 'New winner is' : 'New winners are'} ` +
                            `${mentionsString}, congratulations!`
                    },

                    // this ephemeral reply will be sent after the successful reroll (embeds may also be used here)
                    successMessage: {
                        messageContent: ':white_check_mark: | Successfully rerolled the winners!'
                    }
                }
            }
        }
    },
    // defining the buttons to be attached on giveaway related messages
    buttons: {
        // the "join giveaway" button to attach on the initial giveaway message
        joinGiveawayButton: {
            text: 'Join the giveaway',
            emoji: '🎉', // either an emoji or custom emoji ID is acceptable
            style: ButtonStyle.Primary
        },

        // the "reroll" button to attach on the separated giveaway end message
        rerollButton: {
            text: 'Reroll Winners',
            emoji: '🔁', // either an emoji or custom emoji ID is acceptable
            style: ButtonStyle.Primary
        },

        // the "go to nessage" link button to attach on the separated giveaway end message
        // that will bring to the initial giveaway message
        goToMessageButton: {
            text: 'Go to Message',
            emoji: '↗️' // either an emoji or custom emoji ID is acceptable
        }
    }
})

const bot = new ForgeClient({
    events: [
        'interactionCreate',
        'messageCreate',
        'ready'
    ],
    extensions: [
        giveaways
    ],
    intents: [
        'Guilds',
        'GuildMessages',
        'GuildMessageReactions',
        'GuildMembers',
        'MessageContent'
    ],
    prefixes: [
        '!'
    ],
    token: process.env.token,
})

bot.commands.add({
    type: 'ready',
    code: '$log[BOT READY]'
},{
    name: 'gw-start',
    type: 'interactionCreate',
    matchesInteractionType: (t) => t.isChatInputCommand(),
    code: `
        $!startGiveaway[966131185120059424;1092490880436408410;590267498192961540;2m;Free Nitro;1]
        $interactionReply[Giveaway started!]
    `,
    data: {
        name: 'gw-start',
        description: 'Starts a new giveaway.'
    }
})

bot.login()

Package Sidebar

Install

npm i forge-gw

Weekly Downloads

6

Version

0.0.2

License

MIT

Unpacked Size

29.8 kB

Total Files

42

Last publish

Collaborators

  • cyberghxstuwu
  • asperion