Compare commits
2 commits
v3.0.0-bet
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
14f7ba48e8 | |||
45fe6df464 |
66 changed files with 2609 additions and 5587 deletions
18
.github/dependabot.yml
vendored
18
.github/dependabot.yml
vendored
|
@ -1,18 +0,0 @@
|
||||||
# To get started with Dependabot version updates, you'll need to specify which
|
|
||||||
# package ecosystems to update and where the package manifests are located.
|
|
||||||
# Please see the documentation for all configuration options:
|
|
||||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "npm" # See documentation for possible values
|
|
||||||
directory: "/" # Location of package manifests
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- EmotionChild
|
|
||||||
target-branch: "development"
|
|
||||||
labels:
|
|
||||||
- "npm"
|
|
||||||
- "dependencies"
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,4 +1,3 @@
|
||||||
node_modules
|
node_modules
|
||||||
giveaways.js
|
giveaways.js
|
||||||
config.json
|
config.json
|
||||||
giveaways.json
|
|
2
LICENSE
2
LICENSE
|
@ -186,7 +186,7 @@
|
||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2023 EmotionChild
|
Copyright 2023 Toastie_t0ast
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
50
README.md
50
README.md
|
@ -1,37 +1,45 @@
|
||||||
# Giveaway-Child
|
# Holana
|
||||||
|
|
||||||
|
## Updates
|
||||||
|
|
||||||
|
- Update discord.js version to v13.
|
||||||
|
- Format the code looks more cleaner.
|
||||||
|
- Minor bot fixes and improvements.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- Nodejs v16
|
- Bot needs v16 of nodejs to work
|
||||||
- Invite your bot with bot and applications scope
|
- Invite your bot with `bot` and `applications.commands` scope
|
||||||
|
- Bot only uses slash commands, message content no longer exists.
|
||||||
|
- Bot currently supports v14 of discord.js.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Fast giveaways created using the best databases, like: mongodb, quick.db, .etc
|
- Lightning fast giveaways created using best databases, like: mongodb, quick.db, etc.
|
||||||
- LAST CHANCE TO ENTER warning when a giveaway is about to end.
|
- LAST CHANCE TO ENTER warning when giveaway is about to end.
|
||||||
- Slash commands for faster giveaway creating.
|
- Slash commands for faster and simpler giveaway creating.
|
||||||
Drop giveaway ability, drop giveaways anytime in your server with the drop command.
|
- Drop giveaway ability, drop giveaway anytime in your server with drop command.
|
||||||
- Pause and un-pause giveaway feature.
|
- Pause and un-pause giveaways.
|
||||||
|
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
|
|
||||||
- 🔗 [Invite Link](https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=8&scope=bot)
|
- 🔗 [Invite Link](https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=8&scope=bot)
|
||||||
- ℹ [Support Server Link](https://discord.gg/SVQVzJq)
|
- ℹ [Support Server Link](https://discord.gg/etQdZxSyEH)
|
||||||
- 📑 [Commands](https://docs.elliebot.net/Giveaway-Child/Commands/)
|
- 📑 [Commands](https://docs.elliebot.net/Giveaway-child/Commands)
|
||||||
- 🌐 [Website](https://docs.elliebot.net/coming_soon)
|
- 🌐 [Website](https://docs.elliebot.net/category/holana)
|
||||||
|
|
||||||
## Custom/External Database setup
|
|
||||||
|
|
||||||
- Read the [README](Database%20Examples/README.md) file and you are good to go to use custom db's.
|
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
- `npm i`
|
## Custom/External Database setup
|
||||||
- Pick a database from the Database Examples folder.
|
|
||||||
- Just copy and paste it into the [index file](index.js)
|
- Check the example folder to get the custom database examples
|
||||||
- Fill out the [config file](config.example.json) and save it as config.js.
|
|
||||||
- Then run the bot with `npm run start`
|
## Manual setup on local machine
|
||||||
|
|
||||||
|
- Run command `npm i`
|
||||||
|
- Pick a database from `Database Examples` folder and copy it to `index.js` file.
|
||||||
|
- Fill the configurations.
|
||||||
|
- Run command `npm run start`
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
|
|
68
commands/drop.js
Normal file
68
commands/drop.js
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const messages = require("../utils/messages.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "Create a drop giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "winners",
|
||||||
|
description: "How many winners the giveaway should have",
|
||||||
|
type: Discord.ApplicationCommandOptionType.Integer,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "prize",
|
||||||
|
description: "What the prize of the giveaway should be",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "channel",
|
||||||
|
description: "The channel to start the giveaway in",
|
||||||
|
type: Discord.ApplicationCommandOptionType.Channel,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to start giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const giveawayChannel = interaction.options.getChannel("channel");
|
||||||
|
const giveawayWinnerCount = interaction.options.getInteger("winners");
|
||||||
|
const giveawayPrize = interaction.options.getString("prize");
|
||||||
|
|
||||||
|
if (!giveawayChannel.isTextBased()) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: ":x: Selected channel is not text-based.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the giveaway
|
||||||
|
client.giveawaysManager.start(giveawayChannel, {
|
||||||
|
// The number of winners for this drop
|
||||||
|
winnerCount: giveawayWinnerCount,
|
||||||
|
// The prize of the giveaway
|
||||||
|
prize: giveawayPrize,
|
||||||
|
// Who hosts this giveaway
|
||||||
|
hostedBy: client.config.hostedBy ? interaction.user : null,
|
||||||
|
// specify drop
|
||||||
|
isDrop: true,
|
||||||
|
// Messages
|
||||||
|
messages,
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.reply(`Giveaway started in ${giveawayChannel}!`);
|
||||||
|
},
|
||||||
|
};
|
71
commands/end.js
Normal file
71
commands/end.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "End a giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "giveaway",
|
||||||
|
description: "The giveaway to end (message ID or giveaway prize)",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to end giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = interaction.options.getString("giveaway");
|
||||||
|
|
||||||
|
// try to found the giveaway with prize then with ID
|
||||||
|
const giveaway =
|
||||||
|
// Search with giveaway prize
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.prize === query && g.guildId === interaction.guild.id
|
||||||
|
) ||
|
||||||
|
// Search with giveaway ID
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.messageId === query && g.guildId === interaction.guild.id
|
||||||
|
);
|
||||||
|
|
||||||
|
// If no giveaway was found
|
||||||
|
if (!giveaway) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "Unable to find a giveaway for `" + query + "`.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (giveaway.ended) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "This giveaway is already ended.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit the giveaway
|
||||||
|
client.giveawaysManager
|
||||||
|
.end(giveaway.messageId)
|
||||||
|
// Success message
|
||||||
|
.then(() => {
|
||||||
|
// Success message
|
||||||
|
interaction.reply("Giveaway ended!");
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
interaction.reply({
|
||||||
|
content: e,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
44
commands/help.js
Normal file
44
commands/help.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
const messages = require("../utils/messages");
|
||||||
|
const {
|
||||||
|
EmbedBuilder,
|
||||||
|
ActionRowBuilder,
|
||||||
|
ButtonBuilder,
|
||||||
|
ButtonStyle,
|
||||||
|
} = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: "help",
|
||||||
|
description: "Get all Bot Commands",
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
let helpembed = new EmbedBuilder();
|
||||||
|
helpembed.setAuthor({ name: `Commands of ${client.user.username}` });
|
||||||
|
helpembed.setColor("#2f3136");
|
||||||
|
helpembed.setThumbnail(
|
||||||
|
"https://cdn.discordapp.com/attachments/765441543100170271/837111290265993246/196270_IDaqfU3u.png"
|
||||||
|
);
|
||||||
|
client.commands.map((cmd) => {
|
||||||
|
helpembed.addFields({
|
||||||
|
name: `\`${cmd.name}\``,
|
||||||
|
value: `${cmd.description}`,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
helpembed.setTimestamp();
|
||||||
|
helpembed.setFooter({ text: `© Holana | Have a nice day!` });
|
||||||
|
|
||||||
|
const row = new ActionRowBuilder().addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setEmoji("865572290065072128")
|
||||||
|
.setLabel(`Invite ${client.user.username}`)
|
||||||
|
.setURL(
|
||||||
|
`https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=8&scope=bot%20applications.commands`
|
||||||
|
)
|
||||||
|
.setStyle(ButtonStyle.Link)
|
||||||
|
);
|
||||||
|
|
||||||
|
await interaction.reply({
|
||||||
|
embeds: [helpembed],
|
||||||
|
components: [row],
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
35
commands/invite.js
Normal file
35
commands/invite.js
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
const messages = require("../utils/messages");
|
||||||
|
const {
|
||||||
|
EmbedBuilder,
|
||||||
|
ActionRowBuilder,
|
||||||
|
ButtonBuilder,
|
||||||
|
ButtonStyle,
|
||||||
|
} = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: "invite",
|
||||||
|
description: "Get Invite Link for Holana",
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
let invite = new EmbedBuilder()
|
||||||
|
.setTitle(`${interaction.user.tag}`)
|
||||||
|
.setDescription("You can invite the bot by clicking on the below button.")
|
||||||
|
.setColor("#2f3136")
|
||||||
|
.setFooter({ text: `© Holana | Have a nice day!` });
|
||||||
|
|
||||||
|
const row = new ActionRowBuilder().addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setEmoji("865572290065072128")
|
||||||
|
.setLabel(`Invite ${client.user.username}`)
|
||||||
|
.setURL(
|
||||||
|
`https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=8&scope=bot%20applications.commands`
|
||||||
|
)
|
||||||
|
.setStyle(ButtonStyle.Link)
|
||||||
|
);
|
||||||
|
|
||||||
|
await interaction.reply({
|
||||||
|
embeds: [invite],
|
||||||
|
components: [row],
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
71
commands/pause.js
Normal file
71
commands/pause.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "Pause a giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "giveaway",
|
||||||
|
description: "The giveaway to pause (message ID or giveaway prize)",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to pause giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = interaction.options.getString("giveaway");
|
||||||
|
|
||||||
|
// try to found the giveaway with prize then with ID
|
||||||
|
const giveaway =
|
||||||
|
// Search with giveaway prize
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.prize === query && g.guildId === interaction.guild.id
|
||||||
|
) ||
|
||||||
|
// Search with giveaway ID
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.messageId === query && g.guildId === interaction.guild.id
|
||||||
|
);
|
||||||
|
|
||||||
|
// If no giveaway was found
|
||||||
|
if (!giveaway) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "Unable to find a giveaway for `" + query + "`.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (giveaway.pauseOptions.isPaused) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "This giveaway is already paused.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit the giveaway
|
||||||
|
client.giveawaysManager
|
||||||
|
.pause(giveaway.messageId)
|
||||||
|
// Success message
|
||||||
|
.then(() => {
|
||||||
|
// Success message
|
||||||
|
interaction.reply("Giveaway paused!");
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
interaction.reply({
|
||||||
|
content: e,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
39
commands/ping.js
Normal file
39
commands/ping.js
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
const messages = require("../utils/messages");
|
||||||
|
const { EmbedBuilder } = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: "ping",
|
||||||
|
description: "Tells a bot latency,",
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (!interaction.member.permissions.has("SEND_MESSAGES")) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to start giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let circles = {
|
||||||
|
green: "<:online:903711513183940669>",
|
||||||
|
yellow: "<:idle:903711513490112512> ",
|
||||||
|
red: "<:dnd:903711513066487851>",
|
||||||
|
};
|
||||||
|
|
||||||
|
let botping = new EmbedBuilder()
|
||||||
|
.setTitle(`${client.user.username} Ping`)
|
||||||
|
.setColor("2f3136")
|
||||||
|
.addFields({
|
||||||
|
name: "<:connection2:896715171454677013> Bot Ping:",
|
||||||
|
value: `${
|
||||||
|
client.ws?.ping <= 200
|
||||||
|
? circles.green
|
||||||
|
: client.ws?.ping <= 400
|
||||||
|
? circles.yellow
|
||||||
|
: circles.red
|
||||||
|
} ${client.ws?.ping}ms`,
|
||||||
|
})
|
||||||
|
.setTimestamp();
|
||||||
|
await interaction.reply({ embeds: [botping] });
|
||||||
|
},
|
||||||
|
};
|
70
commands/reroll.js
Normal file
70
commands/reroll.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "Reroll a giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "giveaway",
|
||||||
|
description: "The giveaway to reroll (message ID or prize)",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to reroll giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = interaction.options.getString("giveaway");
|
||||||
|
|
||||||
|
// try to found the giveaway with prize then with ID
|
||||||
|
const giveaway =
|
||||||
|
// Search with giveaway prize
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.prize === query && g.guildId === interaction.guild.id
|
||||||
|
) ||
|
||||||
|
// Search with giveaway ID
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.messageId === query && g.guildId === interaction.guild.id
|
||||||
|
);
|
||||||
|
|
||||||
|
// If no giveaway was found
|
||||||
|
if (!giveaway) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "Unable to find a giveaway for `" + query + "`.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!giveaway.ended) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "The giveaway is not ended yet.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reroll the giveaway
|
||||||
|
client.giveawaysManager
|
||||||
|
.reroll(giveaway.messageId)
|
||||||
|
.then(() => {
|
||||||
|
// Success message
|
||||||
|
interaction.reply("Giveaway rerolled!");
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
interaction.reply({
|
||||||
|
content: e,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
77
commands/start.js
Normal file
77
commands/start.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const ms = require("ms");
|
||||||
|
const messages = require("../utils/messages");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "Start a giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "duration",
|
||||||
|
description:
|
||||||
|
"How long the giveaway should last for. Example values: 1m, 1h, 1d",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "winners",
|
||||||
|
description: "How many winners the giveaway should have",
|
||||||
|
type: Discord.ApplicationCommandOptionType.Integer,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "prize",
|
||||||
|
description: "What the prize of the giveaway should be",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "channel",
|
||||||
|
description: "The channel to start the giveaway in",
|
||||||
|
type: Discord.ApplicationCommandOptionType.Channel,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to start giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const giveawayChannel = interaction.options.getChannel("channel");
|
||||||
|
const giveawayDuration = interaction.options.getString("duration");
|
||||||
|
const giveawayWinnerCount = interaction.options.getInteger("winners");
|
||||||
|
const giveawayPrize = interaction.options.getString("prize");
|
||||||
|
|
||||||
|
if (!giveawayChannel.isTextBased()) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: ":x: Selected channel is not text-based.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the giveaway
|
||||||
|
client.giveawaysManager.start(giveawayChannel, {
|
||||||
|
// The giveaway duration
|
||||||
|
duration: ms(giveawayDuration),
|
||||||
|
// The giveaway prize
|
||||||
|
prize: giveawayPrize,
|
||||||
|
// The giveaway winner count
|
||||||
|
winnerCount: giveawayWinnerCount,
|
||||||
|
// Who hosts this giveaway
|
||||||
|
hostedBy: client.config.hostedBy ? interaction.user : null,
|
||||||
|
// Messages
|
||||||
|
messages,
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.reply(`Giveaway started in ${giveawayChannel}!`);
|
||||||
|
},
|
||||||
|
};
|
87
commands/stats.js
Normal file
87
commands/stats.js
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
const os = require("os");
|
||||||
|
const { EmbedBuilder } = require("discord.js");
|
||||||
|
const feroms = require("fero-ms");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: "stats",
|
||||||
|
description: "Sends bot physical statistics",
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
let uptime = client.uptime;
|
||||||
|
let shortUptime = feroms.ms(uptime);
|
||||||
|
let model = os.cpus()[0].model;
|
||||||
|
let cores = os.cpus().length;
|
||||||
|
let platform = os.platform();
|
||||||
|
let nodejs = process.version;
|
||||||
|
let djs = require("discord.js").version;
|
||||||
|
let botversion = require("../package.json").version;
|
||||||
|
let server = client.guilds.cache.size;
|
||||||
|
let user = client.users.cache.size;
|
||||||
|
let channel = client.channels.cache.size;
|
||||||
|
|
||||||
|
let statsembed = new EmbedBuilder()
|
||||||
|
.addFields(
|
||||||
|
{
|
||||||
|
name: "<:live2:896715171882500106> I have been online for?",
|
||||||
|
value: `\`\`\`${shortUptime}\`\`\``,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:globe:896718155416760340> Guilds",
|
||||||
|
value: `\`${server}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:mention:896718358672707584> Users",
|
||||||
|
value: `\`${user}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:channel:896717996326809641> Channels",
|
||||||
|
value: `\`${channel}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Bot Version",
|
||||||
|
value: `\`v${botversion}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:prime:896718399776886816> Arch",
|
||||||
|
value: `\`${os.arch()}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:info:896718244461826140> Platform",
|
||||||
|
value: `\`${platform}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:desktop:896718080821047346> Cores",
|
||||||
|
value: `\`${cores}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<a:Discord:896723328277024819> Discord.js Version",
|
||||||
|
value: `\`v${djs}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:jss:896718571491704852> Node.js Version",
|
||||||
|
value: `\`${nodejs}\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:ram:896715172029276180> Ram Usage",
|
||||||
|
value: `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(
|
||||||
|
2
|
||||||
|
)}MB/ ${(os.totalmem() / 1024 / 1024).toFixed(2)}MB\``,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "<:desktop:896718080821047346> CPU Model",
|
||||||
|
value: `\`\`\`${model}\`\`\``,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.setTimestamp();
|
||||||
|
await interaction.reply({ embeds: [statsembed] });
|
||||||
|
},
|
||||||
|
};
|
71
commands/unpause.js
Normal file
71
commands/unpause.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: "Unpause a giveaway",
|
||||||
|
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "giveaway",
|
||||||
|
description: "The giveaway to unpause (message ID or giveaway prize)",
|
||||||
|
type: Discord.ApplicationCommandOptionType.String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
run: async (client, interaction) => {
|
||||||
|
// If the member doesn't have enough permissions
|
||||||
|
if (
|
||||||
|
!interaction.member.permissions.has("MANAGE_MESSAGES") &&
|
||||||
|
!interaction.member.roles.cache.some((r) => r.name === "Giveaways")
|
||||||
|
) {
|
||||||
|
return interaction.reply({
|
||||||
|
content:
|
||||||
|
":x: You need to have the manage messages permissions to unpause giveaways.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = interaction.options.getString("giveaway");
|
||||||
|
|
||||||
|
// try to found the giveaway with prize then with ID
|
||||||
|
const giveaway =
|
||||||
|
// Search with giveaway prize
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.prize === query && g.guildId === interaction.guild.id
|
||||||
|
) ||
|
||||||
|
// Search with giveaway ID
|
||||||
|
client.giveawaysManager.giveaways.find(
|
||||||
|
(g) => g.messageId === query && g.guildId === interaction.guild.id
|
||||||
|
);
|
||||||
|
|
||||||
|
// If no giveaway was found
|
||||||
|
if (!giveaway) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "Unable to find a giveaway for `" + query + "`.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!giveaway.pauseOptions.isPaused) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: "This giveaway is not paused.",
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit the giveaway
|
||||||
|
client.giveawaysManager
|
||||||
|
.unpause(giveaway.messageId)
|
||||||
|
// Success message
|
||||||
|
.then(() => {
|
||||||
|
// Success message
|
||||||
|
interaction.reply("Giveaway unpaused!");
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
interaction.reply({
|
||||||
|
content: e,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"token": "",
|
|
||||||
"prefix": "!",
|
|
||||||
"everyoneMention": false,
|
|
||||||
"copyright": "Holana",
|
|
||||||
"hostedBy": false,
|
|
||||||
"MONGODB_URI": "",
|
|
||||||
"privateMessageInformation": true
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
module.exports = (client, interaction) => {
|
|
||||||
// Check if our interaction is a slash command
|
|
||||||
if (interaction.isCommand()) {
|
|
||||||
// Get the command from our slash command collection
|
|
||||||
const command = client.interactions.get(interaction.commandName);
|
|
||||||
|
|
||||||
// If command does not exist return an error message
|
|
||||||
if (!command) return interaction.reply({
|
|
||||||
content: "Something Went Wrong | Perhaps command not registered?",
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
|
|
||||||
command.run(client, interaction);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
module.exports = (client, message) => {
|
|
||||||
// return if author is a bot
|
|
||||||
if (message.author.bot) return;
|
|
||||||
|
|
||||||
// return if message does not match prefix (in command)
|
|
||||||
if (message.content.indexOf(client.config.prefix) !== 0) return;
|
|
||||||
|
|
||||||
// Defining what are arguments and commands
|
|
||||||
const args = message.content.slice(client.config.prefix.length).trim().split(/ +/g);
|
|
||||||
const command = args.shift().toLowerCase();
|
|
||||||
|
|
||||||
// Get the command data from the client.commands Enmap
|
|
||||||
const cmd = client.commands.get(command);
|
|
||||||
|
|
||||||
// If command does not exist return
|
|
||||||
if (!cmd) return;
|
|
||||||
|
|
||||||
// Run the command
|
|
||||||
cmd.run(client, message, args);
|
|
||||||
};
|
|
|
@ -1,53 +0,0 @@
|
||||||
const register = require('../../utils/slashsync');
|
|
||||||
const { ActivityType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = async (client) => {
|
|
||||||
|
|
||||||
await register(client, client.register_arr.map((command) => ({
|
|
||||||
name: command.name,
|
|
||||||
description: command.description,
|
|
||||||
options: command.options,
|
|
||||||
type: '1'
|
|
||||||
})), {
|
|
||||||
debug: true
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(`[ / | Slash Command ] - ✅ Loaded all slash commands!`)
|
|
||||||
console.log(`[STATUS] ${client.user.tag} is now online!`);
|
|
||||||
const activities = [
|
|
||||||
'Your Giveaways',
|
|
||||||
'/help',
|
|
||||||
'www.elliebot.net'
|
|
||||||
]
|
|
||||||
|
|
||||||
setInterval(() => {
|
|
||||||
const status = activities[Math.floor(Math.random() * activities.length)];
|
|
||||||
client.user.setActivity({ name: `${status}`, type: ActivityType.Watching })
|
|
||||||
}, 5000);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Do this one if you want the streaming Status //
|
|
||||||
|
|
||||||
/*
|
|
||||||
const register = require('../../utils/slashsync');
|
|
||||||
const { ActivityType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = async (client) => {
|
|
||||||
|
|
||||||
await register(client, client.register_arr.map((command) => ({
|
|
||||||
name: command.name,
|
|
||||||
description: command.description,
|
|
||||||
options: command.options,
|
|
||||||
type: '1'
|
|
||||||
})), {
|
|
||||||
debug: true
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(`[ / | Slash Command ] - ✅ Loaded all slash commands!`)
|
|
||||||
console.log(`[STATUS] ${client.user.tag} is now online!`);
|
|
||||||
|
|
||||||
client.user.setActivity({ name: `Your Giveaways`, type: ActivityType.Streaming, url: 'https://youtube.com/' })
|
|
||||||
|
|
||||||
};*/
|
|
|
@ -1,14 +0,0 @@
|
||||||
const Discord = require('discord.js');
|
|
||||||
module.exports = {
|
|
||||||
async execute(giveaway, member, reaction) {
|
|
||||||
reaction.users.remove(member.user);
|
|
||||||
member.send({
|
|
||||||
embeds: [
|
|
||||||
new Discord.EmbedBuilder()
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setDescription("<:cross:885049515323846696> **Oops! Looks Like that giveaway has already ended!** <:ended:1033984179672727553>"),
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.catch((e) => {});
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,34 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
async execute(giveaway, winners) {
|
|
||||||
winners.forEach((member) => {
|
|
||||||
member.send({
|
|
||||||
components: [new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Jump to the Giveaway")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(`https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}`)
|
|
||||||
.setEmoji('973495590921043968'),
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Invite Me")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL("https://discord.com/api/oauth2/authorize?client_id=726333575091454002permissions=406881561681&scope=bot%20applications.commands")
|
|
||||||
.setEmoji('984296691794583582'))],
|
|
||||||
embeds: [new EmbedBuilder()
|
|
||||||
.setAuthor({name: "Congratulations!", iconURL: "https://ellie.gcoms.xyz/Ellise.png"})
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setThumbnail('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setDescription(`<:DotYellow:1002212470812852245> Hello there ${member.user}\n <:DotBlue:1002212466480128032> Congrats!! you have won **${giveaway.prize}!**\n <:DotBlue:1002212466480128032> DM ${giveaway.hostedBy} to claim your prize!`)
|
|
||||||
.setImage('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}).catch(e => {})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
async execute(giveaway, reactor, messageReaction) {
|
|
||||||
|
|
||||||
const noice = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Invite Me")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL("https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=406881561681&scope=bot%20applications.commands")
|
|
||||||
.setEmoji('984296691794583582'),
|
|
||||||
);
|
|
||||||
|
|
||||||
let approved = new EmbedBuilder()
|
|
||||||
.setTimestamp()
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setAuthor({name: "Entry Confirmed!", iconURL: "https://ellie.gcoms.xyz/Ellise.png"})
|
|
||||||
.setDescription(
|
|
||||||
`<:DotGreen:1002212464345239643> Your entry to **${giveaway.prize}** on [This Server](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}) has been approved! \n<:DotGreen:1002212464345239643> Earn extra points by **Voting**. \n<:DotPink:1002212468870877304> Hosted By: ${giveaway.hostedBy}`
|
|
||||||
)
|
|
||||||
.setFooter({ text: "©️ Holana", iconURL: ('https://ellie.gcoms.xyz/Ellise.png') })
|
|
||||||
.setTimestamp()
|
|
||||||
|
|
||||||
const lol = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Invite Me")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL("https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=406881561681&scope=bot%20applications.commands")
|
|
||||||
.setEmoji('984296691794583582'),
|
|
||||||
);
|
|
||||||
|
|
||||||
let denied = new EmbedBuilder()
|
|
||||||
.setTimestamp()
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setAuthor({name: "Entry Denied!", iconURL: "https://ellie.gcoms.xyz/Ellise.png"})
|
|
||||||
.setDescription(
|
|
||||||
`<:DotPink:1002212468870877304> Your entry to **${giveaway.prize}** on [This Server](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}) has been denied! \n<:DotPink:1002212468870877304> Please review the requirements to enter the giveaway properly. \n<:DotPink:1002212468870877304> Hosted By: ${giveaway.hostedBy}`
|
|
||||||
)
|
|
||||||
.setFooter({ text: "©️ Holana", iconURL: ('https://ellie.gcoms.xyz/Ellise.png') })
|
|
||||||
|
|
||||||
let client = messageReaction.message.client
|
|
||||||
if (reactor.user.bot) return;
|
|
||||||
if(giveaway.extraData) {
|
|
||||||
if (giveaway.extraData.role !== "null" && !reactor.roles.cache.get(giveaway.extraData.role)){
|
|
||||||
messageReaction.users.remove(reactor.user);
|
|
||||||
return reactor.send({
|
|
||||||
embeds: [denied],
|
|
||||||
components: [lol]
|
|
||||||
}).catch(e => {})
|
|
||||||
}
|
|
||||||
|
|
||||||
return reactor.send({
|
|
||||||
embeds: [approved],
|
|
||||||
components: [noice]
|
|
||||||
}).catch(e => {})
|
|
||||||
} else {
|
|
||||||
return reactor.send({
|
|
||||||
embeds: [approved]
|
|
||||||
}).catch(e => {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
async execute(giveaway, member) {
|
|
||||||
return member.send({
|
|
||||||
|
|
||||||
components: [new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Jump to the Giveaway")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(`https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}`)
|
|
||||||
.setEmoji('973495590921043968'))],
|
|
||||||
|
|
||||||
embeds: [new EmbedBuilder()
|
|
||||||
.setTimestamp()
|
|
||||||
.setAuthor({ name: "Reaction Removed!", iconURL: "https://ellie.gcoms.xyz/Ellise.png" })
|
|
||||||
.setTitle('Did You Just Remove a Reaction From A Giveaway?')
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setDescription(
|
|
||||||
`<:DotPink:1002212468870877304> Your entery to **${giveaway.prize}** on [This Server](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}) have been removed!\n <:DotPink:1002212468870877304> This means you're removed as a valid giveaway participant.\n <:DotGreen:1002212464345239643> Think It was a mistake? **Go react again!**`
|
|
||||||
)
|
|
||||||
.setFooter({ text: "©️ Holana", iconURL: ('https://ellie.gcoms.xyz/Ellise.png') })
|
|
||||||
]
|
|
||||||
}).catch(e => {})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
async execute(giveaway, winners) {
|
|
||||||
winners.forEach((member) => {
|
|
||||||
member.send({
|
|
||||||
|
|
||||||
components: [new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Jump to the Giveaway")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(`https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}`)
|
|
||||||
.setEmoji('973495590921043968'),
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel("Invite Me")
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL("https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=406881561681&scope=bot%20applications.commands")
|
|
||||||
.setEmoji('984296691794583582'))],
|
|
||||||
|
|
||||||
embeds: [new EmbedBuilder()
|
|
||||||
.setAuthor({name: "Congratulations!", iconURL: ('https://ellie.gcoms.xyz/Ellise.png')})
|
|
||||||
.setThumbnail('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setDescription(`<:DotYellow:1002212470812852245> Hello there ${member.user}\n<:DotGreen:1002212464345239643> Host of the giveaway rerolled and you won the Giveaway!\n<:DotGreen:1002212464345239643> Good Job On Winning **${giveaway.prize}!** <:confetti:984296694357319730><:confetti:984296694357319730>\n<:DotGreen:1002212464345239643> DM ${giveaway.hostedBy} to claim your prize!!`)
|
|
||||||
.setImage('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: "©️ Holana",
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}).catch(e => {})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
13
events/interactionCreate.js
Normal file
13
events/interactionCreate.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module.exports = (client, interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return;
|
||||||
|
|
||||||
|
const command = client.commands.get(interaction.commandName);
|
||||||
|
|
||||||
|
if (!command)
|
||||||
|
return void interaction.reply({
|
||||||
|
content: `Command \`${interaction.commandName}\` not found.`,
|
||||||
|
ephemeral: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
command.run(client, interaction);
|
||||||
|
}
|
|
@ -1,8 +0,0 @@
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "connected",
|
|
||||||
execute() {
|
|
||||||
console.log(chalk.greenBright("[MONGO DB]: Connected to MongoDB!"));
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,8 +0,0 @@
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "connecting",
|
|
||||||
execute() {
|
|
||||||
console.log(chalk.cyan("[MONGO DB]: Connecting to MongoDB..."));
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,8 +0,0 @@
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'disconnected',
|
|
||||||
execute(client) {
|
|
||||||
console.log(chalk.red("[MONGO DB]: Disconnected from MongoDB!"));
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,8 +0,0 @@
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "err",
|
|
||||||
execute(err) {
|
|
||||||
console.log(chalk.red("[MONGO DB]: Error: " + err + ""));
|
|
||||||
},
|
|
||||||
};
|
|
21
events/ready.js
Normal file
21
events/ready.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
const { ActivityType } = require("discord.js");
|
||||||
|
|
||||||
|
module.exports = (client) => {
|
||||||
|
console.log(
|
||||||
|
`Ready to serve in ${client.channels.cache.size} channels on ${client.guilds.cache.size} servers, for a total of ${client.users.cache.size} users.`
|
||||||
|
);
|
||||||
|
|
||||||
|
const activities = [
|
||||||
|
`Giveaways in ${client.guilds.cache.size} guilds`,
|
||||||
|
"/help",
|
||||||
|
`over ${client.users.cache.size} users!`,
|
||||||
|
`${
|
||||||
|
client.giveawaysManager.giveaways.filter((g) => !g.ended).length
|
||||||
|
} active giveaways!`,
|
||||||
|
];
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
let activity = activities[Math.floor(Math.random() * activities.length)];
|
||||||
|
client.user.setActivity(activity, { type: ActivityType.Watching });
|
||||||
|
}, 20000);
|
||||||
|
};
|
5
example.config.json
Normal file
5
example.config.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"token": "Discord Bot Token",
|
||||||
|
"everyoneMention": false,
|
||||||
|
"hostedBy": true
|
||||||
|
}
|
5
examples/custom-databases/.eslintrc.json
Normal file
5
examples/custom-databases/.eslintrc.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"no-restricted-globals": "off"
|
||||||
|
}
|
||||||
|
}
|
64
examples/custom-databases/enmap.js
Normal file
64
examples/custom-databases/enmap.js
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load Enmap
|
||||||
|
const Enmap = require("enmap");
|
||||||
|
|
||||||
|
// Create giveaways table
|
||||||
|
const giveawayDB = new Enmap({ name: "giveaways" });
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return giveawayDB.fetchEverything().array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
giveawayDB.set(messageId, giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Replace the unedited giveaway with the edited giveaway
|
||||||
|
giveawayDB.set(messageId, giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Remove the giveaway from the database
|
||||||
|
giveawayDB.delete(messageId);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(client, {
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
133
examples/custom-databases/mongoose.js
Normal file
133
examples/custom-databases/mongoose.js
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connect to the database
|
||||||
|
const mongoose = require("mongoose");
|
||||||
|
mongoose.connect("mongodb://localhost/database");
|
||||||
|
const db = mongoose.connection;
|
||||||
|
|
||||||
|
// Check the connection
|
||||||
|
db.on("error", console.error.bind(console, "Connection error:"));
|
||||||
|
db.once("open", () => {
|
||||||
|
console.log("Connected to MongoDB.");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create the schema for giveaways
|
||||||
|
const giveawaySchema = new mongoose.Schema(
|
||||||
|
{
|
||||||
|
messageId: String,
|
||||||
|
channelId: String,
|
||||||
|
guildId: String,
|
||||||
|
startAt: Number,
|
||||||
|
endAt: Number,
|
||||||
|
ended: Boolean,
|
||||||
|
winnerCount: Number,
|
||||||
|
prize: String,
|
||||||
|
messages: {
|
||||||
|
giveaway: String,
|
||||||
|
giveawayEnded: String,
|
||||||
|
title: String,
|
||||||
|
inviteToParticipate: String,
|
||||||
|
drawing: String,
|
||||||
|
dropMessage: String,
|
||||||
|
winMessage: mongoose.Mixed,
|
||||||
|
embedFooter: mongoose.Mixed,
|
||||||
|
noWinner: String,
|
||||||
|
winners: String,
|
||||||
|
endedAt: String,
|
||||||
|
hostedBy: String,
|
||||||
|
},
|
||||||
|
thumbnail: String,
|
||||||
|
image: String,
|
||||||
|
hostedBy: String,
|
||||||
|
winnerIds: { type: [String], default: undefined },
|
||||||
|
reaction: mongoose.Mixed,
|
||||||
|
botsCanWin: Boolean,
|
||||||
|
embedColor: mongoose.Mixed,
|
||||||
|
embedColorEnd: mongoose.Mixed,
|
||||||
|
exemptPermissions: { type: [], default: undefined },
|
||||||
|
exemptMembers: String,
|
||||||
|
bonusEntries: String,
|
||||||
|
extraData: mongoose.Mixed,
|
||||||
|
lastChance: {
|
||||||
|
enabled: Boolean,
|
||||||
|
content: String,
|
||||||
|
threshold: Number,
|
||||||
|
embedColor: mongoose.Mixed,
|
||||||
|
},
|
||||||
|
pauseOptions: {
|
||||||
|
isPaused: Boolean,
|
||||||
|
content: String,
|
||||||
|
unPauseAfter: Number,
|
||||||
|
embedColor: mongoose.Mixed,
|
||||||
|
durationAfterPause: Number,
|
||||||
|
infiniteDurationText: String,
|
||||||
|
},
|
||||||
|
isDrop: Boolean,
|
||||||
|
allowedMentions: {
|
||||||
|
parse: { type: [String], default: undefined },
|
||||||
|
users: { type: [String], default: undefined },
|
||||||
|
roles: { type: [String], default: undefined },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ id: false }
|
||||||
|
);
|
||||||
|
|
||||||
|
// Create the model
|
||||||
|
const giveawayModel = mongoose.model("giveaways", giveawaySchema);
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database. We fetch all documents by passing an empty condition.
|
||||||
|
return await giveawayModel.find().lean().exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
await giveawayModel.create(giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Find by messageId and update it
|
||||||
|
await giveawayModel.updateOne({ messageId }, giveawayData).exec();
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Find by messageId and delete it
|
||||||
|
await giveawayModel.deleteOne({ messageId }).exec();
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(client, {
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
144
examples/custom-databases/mysql.js
Normal file
144
examples/custom-databases/mysql.js
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load mysql
|
||||||
|
const MySQL = require("mysql");
|
||||||
|
const sql = MySQL.createConnection({
|
||||||
|
host: "localhost",
|
||||||
|
user: "Your MySQL user",
|
||||||
|
password: "Your MySQL password",
|
||||||
|
database: "Your MySQL database name",
|
||||||
|
charset: "utf8mb4", // In order to save emojis correctly
|
||||||
|
});
|
||||||
|
sql.connect((err) => {
|
||||||
|
if (err) {
|
||||||
|
// Stop the process if we can't connect to the MySQL server
|
||||||
|
throw new Error("Impossible to connect to MySQL server. Code: " + err.code);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
"[SQL] Connected to the MySQL server! Connection ID: " + sql.threadId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create giveaways table
|
||||||
|
sql.query(
|
||||||
|
`
|
||||||
|
CREATE TABLE IF NOT EXISTS \`giveaways\`
|
||||||
|
(
|
||||||
|
\`id\` INT(1) NOT NULL AUTO_INCREMENT,
|
||||||
|
\`message_id\` VARCHAR(20) NOT NULL,
|
||||||
|
\`data\` JSON NOT NULL,
|
||||||
|
PRIMARY KEY (\`id\`)
|
||||||
|
);
|
||||||
|
`,
|
||||||
|
(err) => {
|
||||||
|
if (err) console.error(err);
|
||||||
|
console.log("[SQL] Created table `giveaways`");
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
sql.query("SELECT `data` FROM `giveaways`", (err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
const giveaways = res.map((row) =>
|
||||||
|
JSON.parse(row.data, (_, v) =>
|
||||||
|
typeof v === "string" && /BigInt\("(-?\d+)"\)/.test(v) ? eval(v) : v
|
||||||
|
)
|
||||||
|
);
|
||||||
|
resolve(giveaways);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
sql.query(
|
||||||
|
"INSERT INTO `giveaways` (`message_id`, `data`) VALUES (?,?)",
|
||||||
|
[
|
||||||
|
messageId,
|
||||||
|
JSON.stringify(giveawayData, (_, v) =>
|
||||||
|
typeof v === "bigint" ? `BigInt("${v}")` : v
|
||||||
|
),
|
||||||
|
],
|
||||||
|
(err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
sql.query(
|
||||||
|
"UPDATE `giveaways` SET `data` = ? WHERE `message_id` = ?",
|
||||||
|
[
|
||||||
|
JSON.stringify(giveawayData, (_, v) =>
|
||||||
|
typeof v === "bigint" ? `BigInt("${v}")` : v
|
||||||
|
),
|
||||||
|
messageId,
|
||||||
|
],
|
||||||
|
(err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
sql.query(
|
||||||
|
"DELETE FROM `giveaways` WHERE `message_id` = ?",
|
||||||
|
messageId,
|
||||||
|
(err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(client, {
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
81
examples/custom-databases/nano.js
Normal file
81
examples/custom-databases/nano.js
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load nano
|
||||||
|
const nano = require("nano")("http://admin:mypassword@localhost:5984");
|
||||||
|
let giveawayDB;
|
||||||
|
|
||||||
|
// Check the DB
|
||||||
|
(async () => {
|
||||||
|
if (!(await nano.db.list()).includes("giveaways"))
|
||||||
|
await nano.db.create("giveaways");
|
||||||
|
giveawayDB = nano.use("giveaways");
|
||||||
|
// Start the manager only after the DB got checked to prevent an error
|
||||||
|
client.giveawaysManager._init();
|
||||||
|
})();
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return (await giveawayDB.list({ include_docs: true })).rows.map(
|
||||||
|
(r) => r.doc
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
await giveawayDB.insert(giveawayData, messageId);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Get the unedited giveaway from the database
|
||||||
|
const giveaway = await giveawayDB.get(messageId);
|
||||||
|
// Edit the giveaway
|
||||||
|
await giveawayDB.insert({ ...giveaway, ...giveawayData });
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Get the giveaway from the database
|
||||||
|
const giveaway = await giveawayDB.get(messageId);
|
||||||
|
// Remove the giveaway from the database
|
||||||
|
await giveawayDB.destroy(messageId, giveaway._rev);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(
|
||||||
|
client,
|
||||||
|
{
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
false
|
||||||
|
); // ATTENTION: Add "false" in order to not start the manager until the DB got checked, see below
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
76
examples/custom-databases/quick.db.js
Normal file
76
examples/custom-databases/quick.db.js
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load quick.db
|
||||||
|
const db = require("quick.db");
|
||||||
|
if (!Array.isArray(db.get("giveaways"))) db.set("giveaways", []);
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return db.get("giveaways");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
db.push("giveaways", giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = db.get("giveaways");
|
||||||
|
// Remove the unedited giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Push the edited giveaway into the array
|
||||||
|
newGiveawaysArray.push(giveawayData);
|
||||||
|
// Save the updated array
|
||||||
|
db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = db.get("giveaways");
|
||||||
|
// Remove the giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Save the updated array
|
||||||
|
db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(client, {
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
87
examples/custom-databases/quick.replit.js
Normal file
87
examples/custom-databases/quick.replit.js
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load quick.replit
|
||||||
|
const { Database } = require("quick.replit");
|
||||||
|
const db = new Database();
|
||||||
|
|
||||||
|
// Check the DB when it is ready
|
||||||
|
db.once("ready", async () => {
|
||||||
|
if (!Array.isArray(await db.get("giveaways"))) await db.set("giveaways", []);
|
||||||
|
// Start the manager only after the DB got checked to prevent an error
|
||||||
|
client.giveawaysManager._init();
|
||||||
|
});
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return await db.get("giveaways");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
await db.push("giveaways", giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = await db.get("giveaways");
|
||||||
|
// Remove the unedited giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Push the edited giveaway into the array
|
||||||
|
newGiveawaysArray.push(giveawayData);
|
||||||
|
// Save the updated array
|
||||||
|
await db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = await db.get("giveaways");
|
||||||
|
// Remove the giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Save the updated array
|
||||||
|
await db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(
|
||||||
|
client,
|
||||||
|
{
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
false
|
||||||
|
); // ATTENTION: Add "false" in order to not start the manager until the DB got checked, see below
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
71
examples/custom-databases/quickmongo.js
Normal file
71
examples/custom-databases/quickmongo.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load quickmongo
|
||||||
|
const { Database } = require("quickmongo");
|
||||||
|
const giveawayDB = new Database("mongodb://localhost/database", {
|
||||||
|
collectionName: "giveaways",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start the manager only after the DB turned ready to prevent an error
|
||||||
|
giveawayDB.once("ready", () => client.giveawaysManager._init());
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return (await giveawayDB.all()).map((element) => element.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Add the new giveaway to the database
|
||||||
|
await giveawayDB.set(messageId, giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Replace the unedited giveaway with the edited giveaway
|
||||||
|
await giveawayDB.set(messageId, giveawayData);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Remove the giveaway from the database
|
||||||
|
await giveawayDB.delete(messageId);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(
|
||||||
|
client,
|
||||||
|
{
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
false
|
||||||
|
); // ATTENTION: Add "false" in order to not start the manager until the DB got checked, see below
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
83
examples/custom-databases/replit.js
Normal file
83
examples/custom-databases/replit.js
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.IntentsBitField.Flags.Guilds,
|
||||||
|
Discord.IntentsBitField.Flags.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load Replit Database
|
||||||
|
const Database = require("@replit/database");
|
||||||
|
const db = new Database();
|
||||||
|
(async () => {
|
||||||
|
if (!Array.isArray(await db.get("giveaways"))) await db.set("giveaways", []);
|
||||||
|
})();
|
||||||
|
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
const GiveawayManagerWithOwnDatabase = class extends GiveawaysManager {
|
||||||
|
// This function is called when the manager needs to get all giveaways which are stored in the database.
|
||||||
|
async getAllGiveaways() {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
return await db.get("giveaways");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be saved in the database.
|
||||||
|
async saveGiveaway(messageId, giveawayData) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveawaysArray = await db.get("giveaways");
|
||||||
|
// Push the new giveaway into the array
|
||||||
|
giveawaysArray.push(giveawayData);
|
||||||
|
// Save the updated array
|
||||||
|
await db.set("giveaways", giveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be edited in the database.
|
||||||
|
async editGiveaway(messageId, giveawayData) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = await db.get("giveaways");
|
||||||
|
// Remove the unedited giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Push the edited giveaway into the array
|
||||||
|
newGiveawaysArray.push(giveawayData);
|
||||||
|
// Save the updated array
|
||||||
|
await db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when a giveaway needs to be deleted from the database.
|
||||||
|
async deleteGiveaway(messageId) {
|
||||||
|
// Get all giveaways from the database
|
||||||
|
const giveaways = await db.get("giveaways");
|
||||||
|
// Remove the giveaway from the array
|
||||||
|
const newGiveawaysArray = giveaways.filter(
|
||||||
|
(giveaway) => giveaway.messageId !== messageId
|
||||||
|
);
|
||||||
|
// Save the updated array
|
||||||
|
await db.set("giveaways", newGiveawaysArray);
|
||||||
|
// Don't forget to return something!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new instance of your new class
|
||||||
|
const manager = new GiveawayManagerWithOwnDatabase(client, {
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
embedColorEnd: "#000000",
|
||||||
|
reaction: "🎉",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a giveawaysManager property to access the manager everywhere!
|
||||||
|
client.giveawaysManager = manager;
|
||||||
|
|
||||||
|
client.on("ready", () => {
|
||||||
|
console.log("Bot is ready!");
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.DISCORD_BOT_TOKEN);
|
1
examples/simple.js
Normal file
1
examples/simple.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
// Example bot available on https://toastielab.dev/toastie_t0ast/Holana
|
|
@ -1,41 +0,0 @@
|
||||||
const { GiveawaysManager } = require("discord-giveaways");
|
|
||||||
const giveawayModel = require('./schemas/giveawaysSchema');
|
|
||||||
|
|
||||||
module.exports = (client) =>{
|
|
||||||
|
|
||||||
class GiveawayManagerCustom extends GiveawaysManager {
|
|
||||||
|
|
||||||
|
|
||||||
async getAllGiveaways() {
|
|
||||||
return await giveawayModel.find().lean().exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
async saveGiveaway(messageId, giveawayData) {
|
|
||||||
await giveawayModel.create(giveawayData);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
async editGiveaway(messageId, giveawayData) {
|
|
||||||
await giveawayModel.updateOne({ messageId }, giveawayData, { omitUndefined: true }).exec();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
async deleteGiveaway(messageId) {
|
|
||||||
await giveawayModel.deleteOne({ messageId }).exec();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const manager = new GiveawayManagerCustom(client, {
|
|
||||||
storage: false,
|
|
||||||
updateCountdownEvery: 10000,
|
|
||||||
default: {
|
|
||||||
botsCanWin: false,
|
|
||||||
exemptPermissions: [],
|
|
||||||
embedColor: "#FF0000",
|
|
||||||
reaction: "🎉"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
client.giveawaysManager = manager
|
|
||||||
}
|
|
1
giveaways.json
Normal file
1
giveaways.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
[{"messageId":"1178260749441830943","channelId":"553759294953357314","guildId":"553759294953357312","startAt":1700989652527,"endAt":1700989652557,"ended":true,"winnerCount":1,"prize":"test","messages":{"giveaway":"🎉🎉 **GIVEAWAY** 🎉🎉","giveawayEnded":"🎉🎉 **GIVEAWAY ENDED** 🎉🎉","title":"{this.prize}","inviteToParticipate":"React with 🎉 to participate!","winMessage":"Congratulations, {winners}! You won **{this.prize}**!","drawing":"Drawing: {timestamp}","dropMessage":"Be the first to react with 🎉 !","embedFooter":"Giveaways","noWinner":"Giveaway cancelled, no valid participations.","winners":"winner(s)","endedAt":"Ended at","hostedBy":"Hosted by: {this.hostedBy}"},"hostedBy":"<@234542843732033537>"},{"messageId":"1178260884200620084","channelId":"553759294953357314","guildId":"553759294953357312","startAt":1700989684632,"endAt":1700989724632,"ended":true,"winnerCount":1,"prize":"test","messages":{"giveaway":"🎉🎉 **GIVEAWAY** 🎉🎉","giveawayEnded":"🎉🎉 **GIVEAWAY ENDED** 🎉🎉","title":"{this.prize}","inviteToParticipate":"React with 🎉 to participate!","winMessage":"Congratulations, {winners}! You won **{this.prize}**!","drawing":"Drawing: {timestamp}","dropMessage":"Be the first to react with 🎉 !","embedFooter":"Giveaways","noWinner":"Giveaway cancelled, no valid participations.","winners":"winner(s)","endedAt":"Ended at","hostedBy":"Hosted by: {this.hostedBy}"},"hostedBy":"<@234542843732033537>","winnerIds":["234542843732033537"]}]
|
7
host.js
7
host.js
|
@ -1,7 +0,0 @@
|
||||||
// const express = require('express');
|
|
||||||
// const app = express();
|
|
||||||
// const port = 3000;
|
|
||||||
// app.listen(port, () => console.log(`Bot running on http://127.0.0.1:${port}`));
|
|
||||||
|
|
||||||
const http = require("http");
|
|
||||||
http.createServer((_, res) => res.end("Holana online")).listen(8080)
|
|
181
index.js
181
index.js
|
@ -1,114 +1,103 @@
|
||||||
process.title = 'Giveaway Child';
|
process.title = 'Holana';
|
||||||
|
|
||||||
const Discord = require("discord.js");
|
|
||||||
const { Client, GatewayIntentBits, Partials } = require("discord.js");
|
|
||||||
const chalk = require("chalk");
|
|
||||||
const config = require("./config.json");
|
|
||||||
const Handler = require("discord-handlers");
|
|
||||||
const handler = new Handler();
|
|
||||||
const { connect } = require("mongoose");
|
|
||||||
const GiveawaysManager = require("./giveawayInit");
|
|
||||||
const client = new Client({
|
|
||||||
partials: [
|
|
||||||
Partials.Channel, // for text channel
|
|
||||||
Partials.GuildMember, // for guild member
|
|
||||||
Partials.Reaction, // for message reaction
|
|
||||||
],
|
|
||||||
intents: [
|
|
||||||
GatewayIntentBits.Guilds, // for guild related things
|
|
||||||
GatewayIntentBits.GuildMessages, // for guild messages things
|
|
||||||
GatewayIntentBits.GuildMessageReactions, // for message reactions things
|
|
||||||
],
|
|
||||||
});
|
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
|
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const client = new Discord.Client({
|
||||||
|
intents: [
|
||||||
|
Discord.GatewayIntentBits.Guilds,
|
||||||
|
Discord.GatewayIntentBits.GuildMembers,
|
||||||
|
Discord.GatewayIntentBits.GuildMessageReactions,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const config = require("./config.json");
|
||||||
client.config = config;
|
client.config = config;
|
||||||
|
|
||||||
(async () => {
|
const synchronizeSlashCommands = require("discord-sync-commands");
|
||||||
await connect(config.MONGODB_URI).catch((err) =>
|
|
||||||
console.log(chalk.red(`[MONGO DB]: Error: ${err}`))
|
// Init discord giveaways
|
||||||
|
const { GiveawaysManager } = require("discord-giveaways");
|
||||||
|
client.giveawaysManager = new GiveawaysManager(client, {
|
||||||
|
storage: "./giveaways.json",
|
||||||
|
default: {
|
||||||
|
botsCanWin: false,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
reaction: "🎉",
|
||||||
|
lastChance: {
|
||||||
|
enabled: true,
|
||||||
|
content: "⚠️ **LAST CHANCE TO ENTER !** ⚠️",
|
||||||
|
threshold: 10000,
|
||||||
|
embedColor: "#FF0000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// We now have a client.giveawaysManager property to manage our giveaways!
|
||||||
|
|
||||||
|
client.giveawaysManager.on(
|
||||||
|
"giveawayReactionAdded",
|
||||||
|
(giveaway, member, reaction) => {
|
||||||
|
console.log(
|
||||||
|
`${member.user.tag} entered giveaway #${giveaway.messageId} (${reaction.emoji.name})`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
client.giveawaysManager.on(
|
||||||
|
"giveawayReactionRemoved",
|
||||||
|
(giveaway, member, reaction) => {
|
||||||
|
console.log(
|
||||||
|
`${member.user.tag} unreact to giveaway #${giveaway.messageId} (${reaction.emoji.name})`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
client.giveawaysManager.on("giveawayEnded", (giveaway, winners) => {
|
||||||
|
console.log(
|
||||||
|
`Giveaway #${giveaway.messageId} ended! Winners: ${winners
|
||||||
|
.map((member) => member.user.username)
|
||||||
|
.join(", ")}`
|
||||||
);
|
);
|
||||||
})();
|
|
||||||
|
|
||||||
handler.handleMongoEvents("./events/mongo", client);
|
|
||||||
|
|
||||||
// Initialise discord giveaways
|
|
||||||
|
|
||||||
GiveawaysManager(client);
|
|
||||||
|
|
||||||
|
|
||||||
//<:confetti:984296694357319730>
|
|
||||||
//<:warning:984663315412303922>
|
|
||||||
/* Load all events (discord based) */
|
|
||||||
|
|
||||||
fs.readdir("./events/discord", (_err, files) => {
|
|
||||||
files.forEach((file) => {
|
|
||||||
if (!file.endsWith(".js")) return;
|
|
||||||
const event = require(`./events/discord/${file}`);
|
|
||||||
let eventName = file.split(".")[0];
|
|
||||||
console.log(`[Event] ✅ Loaded: ${eventName}`);
|
|
||||||
client.on(eventName, event.bind(null, client));
|
|
||||||
delete require.cache[require.resolve(`./events/discord/${file}`)];
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Load all events (giveaways based) */
|
/* Load all commands */
|
||||||
|
client.commands = new Discord.Collection();
|
||||||
fs.readdir("./events/giveaways", (_err, files) => {
|
fs.readdir("./commands/", (_err, files) => {
|
||||||
files.forEach((file) => {
|
files.forEach((file) => {
|
||||||
if (!file.endsWith(".js")) return;
|
if (!file.endsWith(".js")) return;
|
||||||
const event = require(`./events/giveaways/${file}`);
|
let props = require(`./commands/${file}`);
|
||||||
let eventName = file.split(".")[0];
|
|
||||||
console.log(`[Event] 🎉 Loaded: ${eventName}`);
|
|
||||||
client.giveawaysManager.on(eventName, (...file) =>
|
|
||||||
event.execute(...file, client)
|
|
||||||
),
|
|
||||||
delete require.cache[require.resolve(`./events/giveaways/${file}`)];
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// if(config.privateMessageInformation === true) {
|
|
||||||
// fs.readdirSync('./events/giveaways').forEach(async (dir) => {
|
|
||||||
// const events = fs.readdirSync(`./events/giveaways/${dir}`).filter(file => file.endsWith('.js'));
|
|
||||||
|
|
||||||
// for(const file of events) {
|
|
||||||
// const event = require(`./events/giveaways/${dir}/${file}`);
|
|
||||||
// if(event.name) {
|
|
||||||
// // console.log(`[GIVEAWAYS EVENTS]` + ` Event ${file.split(".")[0]} loaded!`);
|
|
||||||
|
|
||||||
// client.giveawaysManager.on(event.name, (...args) => event.execute(...args, client))
|
|
||||||
// delete require.cache[require.resolve(`./events/giveaways/${dir}/${file}`)];
|
|
||||||
// } else {
|
|
||||||
// console.log(`[GIVEAWAYS EVENTS]` + ` Failed to load event: ${file.split('.')[0]}!`);
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// return console.log(`[WARNING]`.yellow + ` Private Message Information is disabled!`);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* Load all events (mongo based) */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// let interactions be a new collection ( slash commands )
|
|
||||||
client.interactions = new Discord.Collection();
|
|
||||||
// creating an empty array for registering slash commands
|
|
||||||
client.register_arr = [];
|
|
||||||
/* Load all slash commands */
|
|
||||||
fs.readdir("./slash/", (_err, files) => {
|
|
||||||
files.forEach((file) => {
|
|
||||||
if (!file.endsWith(".js")) return;
|
|
||||||
let props = require(`./slash/${file}`);
|
|
||||||
let commandName = file.split(".")[0];
|
let commandName = file.split(".")[0];
|
||||||
client.interactions.set(commandName, {
|
client.commands.set(commandName, {
|
||||||
name: commandName,
|
name: commandName,
|
||||||
...props,
|
...props,
|
||||||
});
|
});
|
||||||
client.register_arr.push(props);
|
console.log(`👌 Command loaded: ${commandName}`);
|
||||||
|
});
|
||||||
|
synchronizeSlashCommands(
|
||||||
|
client,
|
||||||
|
client.commands.map((c) => ({
|
||||||
|
name: c.name,
|
||||||
|
description: c.description,
|
||||||
|
options: c.options,
|
||||||
|
type: Discord.ApplicationCommandType.ChatInput,
|
||||||
|
})),
|
||||||
|
{
|
||||||
|
debug: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Load all events */
|
||||||
|
fs.readdir("./events/", (_err, files) => {
|
||||||
|
files.forEach((file) => {
|
||||||
|
if (!file.endsWith(".js")) return;
|
||||||
|
const event = require(`./events/${file}`);
|
||||||
|
let eventName = file.split(".")[0];
|
||||||
|
console.log(`👌 Event loaded: ${eventName}`);
|
||||||
|
client.on(eventName, event.bind(null, client));
|
||||||
|
delete require.cache[require.resolve(`./events/${file}`)];
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Login through the client
|
// Login
|
||||||
client.login(config.token);
|
client.login(config.token);
|
3842
package-lock.json
generated
3842
package-lock.json
generated
File diff suppressed because it is too large
Load diff
35
package.json
35
package.json
|
@ -4,37 +4,30 @@
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node index.js"
|
"start": "node index.js",
|
||||||
},
|
"dev": "nodemon index.js"
|
||||||
"engines": {
|
|
||||||
"node": "16.x"
|
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/EmotionChild/Giveaway-Child.git"
|
"url": "git+https://toastielab.dev/toastie_t0ast/Holana.git"
|
||||||
},
|
},
|
||||||
"author": "EmotionChild",
|
"author": "Toastie",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/EmotionChild/Giveaway-Child/issues"
|
"url": "https://toastielab.dev/toastie_t0ast/Holana/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/EmotionChild/Giveaway-Child#readme",
|
"homepage": "https://toastielab.dev/toastie_t0ast/Holana#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.27.2",
|
"beautify": "0.0.8",
|
||||||
"chalk": "^4.1.2",
|
|
||||||
"discord-giveaways": "^6.0.1",
|
"discord-giveaways": "^6.0.1",
|
||||||
"discord-handlers": "^0.0.1",
|
"discord-sync-commands": "0.3.0",
|
||||||
"discord.js": "^14.6.0",
|
"discord.js": "^14.9.0",
|
||||||
"dotenv": "^16.0.3",
|
"fero-ms": "^2.0.7",
|
||||||
"japi.rest": "^1.0.1",
|
"ms": "^2.1.3",
|
||||||
"moment": "^2.29.4",
|
"quickdb": "1.0.5",
|
||||||
"mongoose": "^6.9.0",
|
"quickmongo": "4.0.0"
|
||||||
"ms": "^3.0.0-canary.1",
|
|
||||||
"node-fetch": "^3.3.0",
|
|
||||||
"parsec": "^2.0.2",
|
|
||||||
"quickmongo": "^4.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"node": "^16.9.1"
|
"nodemon": "^2.0.22"
|
||||||
}
|
}
|
||||||
}
|
}
|
1060
pnpm-lock.yaml
Normal file
1060
pnpm-lock.yaml
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,60 +0,0 @@
|
||||||
const mongoose = require('mongoose');
|
|
||||||
|
|
||||||
const giveawaySchema = new mongoose.Schema({
|
|
||||||
messageId: String,
|
|
||||||
channelId: String,
|
|
||||||
guildId: String,
|
|
||||||
startAt: Number,
|
|
||||||
endAt: Number,
|
|
||||||
ended: Boolean,
|
|
||||||
winnerCount: Number,
|
|
||||||
prize: String,
|
|
||||||
messages: {
|
|
||||||
giveaway: String,
|
|
||||||
giveawayEnded: String,
|
|
||||||
inviteToParticipate: String,
|
|
||||||
drawing: String,
|
|
||||||
dropMessage: String,
|
|
||||||
winMessage: mongoose.Mixed,
|
|
||||||
embedFooter: mongoose.Mixed,
|
|
||||||
noWinner: String,
|
|
||||||
winners: String,
|
|
||||||
endedAt: String,
|
|
||||||
hostedBy: String
|
|
||||||
},
|
|
||||||
thumbnail: String,
|
|
||||||
hostedBy: String,
|
|
||||||
winnerIds: { type: [String], default: undefined },
|
|
||||||
reaction: mongoose.Mixed,
|
|
||||||
botsCanWin: Boolean,
|
|
||||||
embedColor: mongoose.Mixed,
|
|
||||||
embedColorEnd: mongoose.Mixed,
|
|
||||||
exemptPermissions: { type: [], default: undefined },
|
|
||||||
exemptMembers: String,
|
|
||||||
bonusEntries: String,
|
|
||||||
extraData: mongoose.Mixed,
|
|
||||||
lastChance: {
|
|
||||||
enabled: Boolean,
|
|
||||||
content: String,
|
|
||||||
threshold: Number,
|
|
||||||
embedColor: mongoose.Mixed
|
|
||||||
},
|
|
||||||
pauseOptions: {
|
|
||||||
isPaused: Boolean,
|
|
||||||
content: String,
|
|
||||||
unpauseAfter: Number,
|
|
||||||
embedColor: mongoose.Mixed,
|
|
||||||
durationAfterPause: Number,
|
|
||||||
infiniteDurationText: String
|
|
||||||
},
|
|
||||||
isDrop: Boolean,
|
|
||||||
allowedMentions: {
|
|
||||||
parse: { type: [String], default: undefined },
|
|
||||||
users: { type: [String], default: undefined },
|
|
||||||
roles: { type: [String], default: undefined }
|
|
||||||
}
|
|
||||||
}, { id: false });
|
|
||||||
|
|
||||||
const giveawayModel = mongoose.model('giveaways', giveawaySchema);
|
|
||||||
|
|
||||||
module.exports = giveawayModel;
|
|
|
@ -1,9 +0,0 @@
|
||||||
const { Schema, model } = require('mongoose');
|
|
||||||
|
|
||||||
const guildSchema = new Schema({
|
|
||||||
_id: Schema.Types.ObjectId,
|
|
||||||
guildId: String,
|
|
||||||
guildName: String,
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = model("Guild", guildSchema, "guilds");
|
|
|
@ -1,29 +0,0 @@
|
||||||
const { ApplicationCommandOptionType, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'avatar',
|
|
||||||
description: 'Shows User Avatar',
|
|
||||||
options: [{
|
|
||||||
name: 'user',
|
|
||||||
type: ApplicationCommandOptionType.User,
|
|
||||||
description: 'Select a user',
|
|
||||||
required: false,
|
|
||||||
}],
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
const user = interaction.options.getUser('user') || interaction.user
|
|
||||||
|
|
||||||
const row = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Avatar URL`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(`${user.displayAvatarURL({ dynamic: false, format: 'png', size: 1024 })}`))
|
|
||||||
|
|
||||||
const embed = new EmbedBuilder()
|
|
||||||
.setTitle(`${user.username}'s Avatar`)
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setFooter({ text: `Requested by: ${interaction.user.username}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) })
|
|
||||||
.setImage(user.displayAvatarURL({ dynamic: true, size: 1024 }))
|
|
||||||
interaction.reply({ embeds: [embed], components: [row] });
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
const {
|
|
||||||
ApplicationCommandOptionType,
|
|
||||||
EmbedBuilder,
|
|
||||||
ActionRowBuilder,
|
|
||||||
ButtonBuilder,
|
|
||||||
ButtonStyle,
|
|
||||||
} = require("discord.js");
|
|
||||||
module.exports = {
|
|
||||||
name: "avatar",
|
|
||||||
description: "Shows User Avatar",
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: "user",
|
|
||||||
type: ApplicationCommandOptionType.User,
|
|
||||||
description: "Select a user",
|
|
||||||
required: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
const user = interaction.options.getUser("user") || interaction.user;
|
|
||||||
const fetch = require("axios");
|
|
||||||
let userdata = await fetch.get(
|
|
||||||
`https://discord.com/api/guilds/${interaction.guild.id}/members/${user.id}`,
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bot ${client.token}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (userdata.data.avatar !== undefined && userdata.data.avatar !== null) {
|
|
||||||
let AvatarURL = `https://cdn.discordapp.com/guilds/${interaction.guild.id}/users/${user.id}/avatars/${userdata.data.avatar}.webp?size=1024`;
|
|
||||||
const row = new ActionRowBuilder().addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Avatar URL`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(AvatarURL)
|
|
||||||
);
|
|
||||||
|
|
||||||
const embed = new EmbedBuilder()
|
|
||||||
.setTitle(`${user.username}'s Avatar`)
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setFooter({
|
|
||||||
text: `Requested by: ${interaction.user.username}`,
|
|
||||||
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
|
|
||||||
})
|
|
||||||
.setImage(AvatarURL);
|
|
||||||
interaction.reply({ embeds: [embed], components: [row] });
|
|
||||||
} else {
|
|
||||||
const row = new ActionRowBuilder().addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Avatar URL`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(
|
|
||||||
`${user.displayAvatarURL({
|
|
||||||
dynamic: false,
|
|
||||||
format: "png",
|
|
||||||
size: 1024,
|
|
||||||
})}`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
const embed = new EmbedBuilder()
|
|
||||||
.setTitle(`${user.username}'s Avatar`)
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setFooter({
|
|
||||||
text: `Requested by: ${interaction.user.username}`,
|
|
||||||
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
|
|
||||||
})
|
|
||||||
.setImage(user.displayAvatarURL({ dynamic: true, size: 1024 }));
|
|
||||||
interaction.reply({ embeds: [embed], components: [row] });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,72 +0,0 @@
|
||||||
const { ApplicationCommandOptionType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'edit',
|
|
||||||
description: '🎉 Edit a giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'giveaway',
|
|
||||||
description: 'The giveaway to end (message ID)',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'duration',
|
|
||||||
description: 'Setting time of mentioned giveaway. Eg. 1h sets the current giveaway to end after an hour!',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'winners',
|
|
||||||
description: 'How many winners the giveaway should have',
|
|
||||||
type: ApplicationCommandOptionType.Integer,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'prize',
|
|
||||||
description: 'What the prize of the giveaway should be',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '<:x_:1010816180719722566> You need to have the manage messages permissions to start giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const gid = interaction.options.getString('giveaway');
|
|
||||||
const time = interaction.options.getString('duration');
|
|
||||||
const winnersCount = interaction.options.getInteger('winners');
|
|
||||||
const prize = interaction.options.getString('prize');
|
|
||||||
|
|
||||||
await interaction.deferReply({
|
|
||||||
ephemeral: true
|
|
||||||
})
|
|
||||||
// Edit the giveaway
|
|
||||||
try {
|
|
||||||
await client.giveawaysManager.edit(gid, {
|
|
||||||
newWinnersCount: winnersCount,
|
|
||||||
newPrize: prize,
|
|
||||||
addTime: time
|
|
||||||
})
|
|
||||||
} catch(e) {
|
|
||||||
return interaction.editReply({
|
|
||||||
content:
|
|
||||||
`No giveaway found with the given message ID: \`${gid}\``,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
interaction.editReply({
|
|
||||||
content:
|
|
||||||
`This giveaway has now been edited!`,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
65
slash/end.js
65
slash/end.js
|
@ -1,65 +0,0 @@
|
||||||
const { ApplicationCommandOptionType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "end",
|
|
||||||
description: '🎉 End an already running giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'giveaway',
|
|
||||||
description: 'The giveaway to end (message ID or giveaway prize)',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '<:x_:1010816180719722566> You need to have the manage messages permissions to end giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const query = interaction.options.getString('giveaway');
|
|
||||||
|
|
||||||
// fetching the giveaway with message Id or prize
|
|
||||||
const giveaway =
|
|
||||||
// Search with giveaway prize
|
|
||||||
client.giveawaysManager.giveaways.find((g) => g.prize === query && g.guildId === interaction.guild.id) ||
|
|
||||||
// Search with giveaway Id
|
|
||||||
client.giveawaysManager.giveaways.find((g) => g.messageId === query && g.guildId === interaction.guild.id);
|
|
||||||
|
|
||||||
// If no giveaway was found with the corresponding input
|
|
||||||
if (!giveaway) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: 'Unable to find a giveaway for `' + query + '`.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (giveaway.ended) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: 'This giveaway has already ended!',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit the giveaway
|
|
||||||
client.giveawaysManager.end(giveaway.messageId)
|
|
||||||
// Success message
|
|
||||||
.then(() => {
|
|
||||||
// Success message
|
|
||||||
interaction.reply(`**[This Giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})** Has Now Ended!`);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
interaction.reply({
|
|
||||||
content: e,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
108
slash/help.js
108
slash/help.js
|
@ -1,108 +0,0 @@
|
||||||
const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder, SelectMenuBuilder, ComponentType } = require('discord.js');
|
|
||||||
const config = require('../config.json');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'help',
|
|
||||||
description: '📜 View all the commands available to the bot!',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
const embed = new EmbedBuilder()
|
|
||||||
.setTitle(`Commands of ${client.user.username}`)
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setDescription('Please Select a category to view all its commands\n<:invi:1000459192555024404><:next:1000472400049209385> **Giveaway Commands** \n<:invi:1000459192555024404><:next:1000472400049209385> **Configuration Commands**')
|
|
||||||
.setThumbnail('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://i.imgur.com/sB02Hbz.png')
|
|
||||||
});
|
|
||||||
|
|
||||||
const giveaway = new EmbedBuilder()
|
|
||||||
.setTitle("Categories » Giveaway")
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setDescription("<:sort:1003268901360115842> Here are the giveaway commands")
|
|
||||||
.addFields(
|
|
||||||
{ name: 'Create / Start' , value: `Start a giveaway in your guild!\n > **Type: \`/start\`**`, inline: true },
|
|
||||||
{ name: 'Edit' , value: `Edit an already running giveaway!\n > **Type: \`/edit\`**`, inline: true },
|
|
||||||
{ name: 'End' , value: `End an already running giveaway!\n > **Type: \`/end\`**`, inline: true },
|
|
||||||
{ name: 'Pause' , value: `Pause an already running giveaway!\n > **Type: \`/pause\`**`, inline: true },
|
|
||||||
{ name: 'Reroll' , value: `Reroll an ended giveaway!\n > **Type: \`/reroll\`**`, inline: true },
|
|
||||||
{ name: 'Resume' , value: `Resume a paused giveaway!\n > **Type: \`/resume\`**`, inline: true },
|
|
||||||
)
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
});
|
|
||||||
|
|
||||||
const general = new EmbedBuilder()
|
|
||||||
.setTitle("Categories » Configuration")
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setDescription("<:sort:1003268901360115842> Here are the configuration commands in slash")
|
|
||||||
.addFields(
|
|
||||||
{ name: 'Help', value: `Show the help menu.\n > **Type: \`/help\`**`, inline: true },
|
|
||||||
{ name: 'About', value: `Show Info About Holana.\n > **Type: \`/about\`**`, inline: true },
|
|
||||||
{ name: 'Server Info', value: `Shows server info.\n > **Type: \`/serverinfo\`**`, inline: true },
|
|
||||||
{ name: 'Server Icon', value: `Shows server icon.\n > **Type: \`/servericon\`**`, inline: true },
|
|
||||||
{ name: 'User Info', value: `Shows user info.\n > **Type: \`/userinfo\`**`, inline: true },
|
|
||||||
{ name: 'User Avatar', value: `Shows user avatar.\n > **Type: \`/avatar\`**`, inline: true },
|
|
||||||
{ name: 'Invite', value: `Get the bot's invite link.\n > **Type: \`/invite\`**`, inline: true },
|
|
||||||
{ name: 'Ping', value: `Check the bot's ping!\n > **Type: \`/ping\`**`, inline: true },
|
|
||||||
{ name: 'System', value: `Check the bot's System info.\n > **Type: \`/info\`**`, inline: true },
|
|
||||||
)
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
});
|
|
||||||
|
|
||||||
const components = (state) => [
|
|
||||||
new ActionRowBuilder().addComponents(
|
|
||||||
new StringSelectMenuBuilder()
|
|
||||||
.setCustomId("help-menu")
|
|
||||||
.setPlaceholder("Please Select a Category")
|
|
||||||
.setDisabled(state)
|
|
||||||
.addOptions([{
|
|
||||||
label: `Giveaways`,
|
|
||||||
value: `giveaway`,
|
|
||||||
description: `View all the giveaway based commands!`,
|
|
||||||
emoji: `<:confetti:984296694357319730>`
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: `Configuration`,
|
|
||||||
value: `general`,
|
|
||||||
description: `View all the general bot commands!`,
|
|
||||||
emoji: `<:Discord_settings:990669159849414736>`
|
|
||||||
}
|
|
||||||
])
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
const initialMessage = await interaction.reply({ embeds: [embed], components: components(false) });
|
|
||||||
|
|
||||||
const filter = (interaction) => interaction.user.id === interaction.member.id;
|
|
||||||
|
|
||||||
const collector = interaction.channel.createMessageComponentCollector(
|
|
||||||
{
|
|
||||||
filter,
|
|
||||||
componentType: ComponentType.SelectMenu,
|
|
||||||
idle: 300000,
|
|
||||||
dispose: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
collector.on('collect', (interaction) => {
|
|
||||||
if (interaction.values[0] === "giveaway") {
|
|
||||||
interaction.update({ embeds: [giveaway], components: components(false) }).catch((e) => { });
|
|
||||||
} else if (interaction.values[0] === "general") {
|
|
||||||
interaction.update({ embeds: [general], components: components(false) }).catch((e) => { });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
collector.on('end', (collected, reason) => {
|
|
||||||
if (reason == "time") {
|
|
||||||
initialMessage.edit({
|
|
||||||
content: "Collector Destroyed, Try Again!",
|
|
||||||
components: [],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'info',
|
|
||||||
description: '📚 Check my system info!',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
let ccount = client.channels.cache.size;
|
|
||||||
let mcount = 0;
|
|
||||||
client.guilds.cache.forEach((guild) => {
|
|
||||||
mcount += guild.memberCount
|
|
||||||
})
|
|
||||||
|
|
||||||
const row = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Invite ${client.user.username}`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL("https://discord.com/api/oauth2/authorize?client_id=973436715819745290&permissions=406881561681&scope=bot%20applications.commands")
|
|
||||||
.setEmoji('973537545289875486'),
|
|
||||||
)
|
|
||||||
|
|
||||||
let pembed = new EmbedBuilder()
|
|
||||||
.setAuthor({name: "Holana", iconURL: "https://ellie.gcoms.xyz/Ellise.png" })
|
|
||||||
.setTitle('Information')
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setTimestamp()
|
|
||||||
.addFields(
|
|
||||||
{ name: "\Server", value: `\`\`\`ini\n[ ${client.guilds.cache.size} ]\n\`\`\``, inline: true },
|
|
||||||
{name: "Users", value: `\`\`\`ini\n[ ${mcount} ]\n\`\`\``, inline: true },
|
|
||||||
{name: "Channels", value: `\`\`\`ini\n[ ${ccount} ]\n\`\`\``, inline: true}
|
|
||||||
)
|
|
||||||
.setDescription(`
|
|
||||||
**= STATISTICS =**
|
|
||||||
> **• Discord.js** : v14.7.1
|
|
||||||
> **• Node** : v18.13.0
|
|
||||||
|
|
||||||
**= SYSTEM =**
|
|
||||||
> **• Hosting** : -
|
|
||||||
> **• Platform** : Windows
|
|
||||||
|
|
||||||
**= CPU =**
|
|
||||||
> **• Model** : -
|
|
||||||
> **• Speed** : -
|
|
||||||
> **• Cores** : -`)
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ IVON`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
})
|
|
||||||
interaction.reply({
|
|
||||||
embeds: [pembed], components: [row]
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,33 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
const config = require('../config.json');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'invite',
|
|
||||||
description: '➕ Invite the bot to your server!',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
const row = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Invite ${client.user.username}`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setEmoji('973537545289875486')
|
|
||||||
.setURL(`https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=406881561681&scope=bot%20applications.commands`),
|
|
||||||
)
|
|
||||||
let invite = new EmbedBuilder()
|
|
||||||
.setAuthor({
|
|
||||||
name: `Invite ${client.user.username}`,
|
|
||||||
iconURL: client.user.displayAvatarURL()
|
|
||||||
})
|
|
||||||
.setTitle("Invite & Support Link!")
|
|
||||||
.setDescription(`I'm A Giveaway bot to host Giveaways easily on your server with multiple options, Including role requirements, bonus roles, bonus points and server joinings. Get started with Holana today!`)
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setTimestamp()
|
|
||||||
.setThumbnail('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
})
|
|
||||||
|
|
||||||
interaction.reply({ embeds: [invite], components: [row]});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
const { ApplicationCommandOptionType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "pause",
|
|
||||||
description: '⏸ Pause a giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'giveaway',
|
|
||||||
description: 'The giveaway to pause (message ID)',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '<:x_:1010816180719722566> You need to have the manage messages permissions to pause giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const query = interaction.options.getString('giveaway');
|
|
||||||
|
|
||||||
// try to find the giveaway with prize alternatively with ID
|
|
||||||
const giveaway =
|
|
||||||
// Search with giveaway ID
|
|
||||||
client.giveawaysManager.giveaways.find((g) => g.messageId === query && g.guildId === interaction.guild.id);
|
|
||||||
|
|
||||||
// If no giveaway was found
|
|
||||||
if (!giveaway) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: 'Unable to find a giveaway for `' + query + '`.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (giveaway.pauseOptions.isPaused) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: `**[This giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})** is already paused.`,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit the giveaway
|
|
||||||
client.giveawaysManager.pause(giveaway.messageId)
|
|
||||||
// Success message
|
|
||||||
.then(() => {
|
|
||||||
// Success message
|
|
||||||
interaction.reply(`**[This giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})** has now been paused!`);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
interaction.reply({
|
|
||||||
content: e,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,22 +0,0 @@
|
||||||
const { EmbedBuilder } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'ping',
|
|
||||||
description: '🏓Check my ping!',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
let pembed = new EmbedBuilder()
|
|
||||||
.setTitle("Pong!")
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setThumbnail('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
.addFields({name: '**Latency**', value: `\`\`\`ini\n[ ${Date.now() - interaction.createdTimestamp}ms ]\n\`\`\``, inline: true},
|
|
||||||
{name: '**API Latency**', value: `\`\`\`ini\n[ ${Math.round(client.ws.ping)}ms ]\n\`\`\``, inline: true})
|
|
||||||
.setTimestamp()
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise.png')
|
|
||||||
})
|
|
||||||
interaction.reply({
|
|
||||||
embeds: [pembed]
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,62 +0,0 @@
|
||||||
const { ApplicationCommandOptionType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "reroll",
|
|
||||||
description: '🎉 Reroll a giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'giveaway',
|
|
||||||
description: 'The giveaway to reroll (message ID)',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '<:x_:1010816180719722566> You need to have the manage messages permission to reroll giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const query = interaction.options.getString('giveaway');
|
|
||||||
|
|
||||||
// try to find the giveaway with the provided prize OR with the ID
|
|
||||||
const giveaway =
|
|
||||||
// Search with giveaway ID
|
|
||||||
client.giveawaysManager.giveaways.find((g) => g.messageId === query && g.guildId === interaction.guild.id);
|
|
||||||
|
|
||||||
// If no giveaway was found
|
|
||||||
if (!giveaway) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: 'Unable to find a giveaway for `' + query + '`.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!giveaway.ended) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: `[This Giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId}) has not been ended yet`,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reroll the giveaway
|
|
||||||
client.giveawaysManager.reroll(giveaway.messageId)
|
|
||||||
.then(() => {
|
|
||||||
// Success message
|
|
||||||
interaction.reply(`Rerolled **[this giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})!**`);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
interaction.reply({
|
|
||||||
content: e,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,63 +0,0 @@
|
||||||
const { ApplicationCommandOptionType } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "resume",
|
|
||||||
description: '▶ Resume a paused giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'giveaway',
|
|
||||||
description: 'The giveaway to resume (message ID)',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '<:x_:1010816180719722566> You need to have the manage messages permissions to pause giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const query = interaction.options.getString('giveaway');
|
|
||||||
|
|
||||||
// try to find the giveaway with prize alternatively with ID
|
|
||||||
const giveaway =
|
|
||||||
// Search with giveaway ID
|
|
||||||
client.giveawaysManager.giveaways.find((g) => g.messageId === query && g.guildId === interaction.guild.id);
|
|
||||||
|
|
||||||
// If no giveaway was found
|
|
||||||
if (!giveaway) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: 'Unable to find a giveaway for `' + query + '`.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!giveaway.pauseOptions.isPaused) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: `**[This giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})** is not paused!`,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit the giveaway
|
|
||||||
client.giveawaysManager.unpause(giveaway.messageId)
|
|
||||||
// Success message
|
|
||||||
.then(() => {
|
|
||||||
// Success message
|
|
||||||
interaction.reply(`**[This giveaway](https://discord.com/channels/${giveaway.guildId}/${giveaway.channelId}/${giveaway.messageId})** has been successfully resumed!`);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
interaction.reply({
|
|
||||||
content: e,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'servericon',
|
|
||||||
description: 'sends the Server Icon',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
const row = new ActionRowBuilder()
|
|
||||||
.addComponents(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setLabel(`Server Icon URL`)
|
|
||||||
.setStyle(ButtonStyle.Link)
|
|
||||||
.setURL(`${interaction.guild.iconURL()}?size=1024`))
|
|
||||||
|
|
||||||
let embed = new EmbedBuilder()
|
|
||||||
.setAuthor({ name: interaction.guild.name })
|
|
||||||
.setImage(interaction.guild.iconURL({ dynamic: true, size: 1024 }))
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise')
|
|
||||||
})
|
|
||||||
interaction.reply({embeds: [embed], components: [row]});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
const { EmbedBuilder } = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: 'serverinfo',
|
|
||||||
description: 'sends the serverinfo',
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
const guild = client.guilds.resolve(interaction.guildId)
|
|
||||||
const voicechannels = await guild.channels.cache.filter(
|
|
||||||
(ch) => ch.type === ChannelType.GuildVoice
|
|
||||||
).size
|
|
||||||
const textchannels = await guild.channels.cache.filter(
|
|
||||||
(ch) => ch.type === ChannelType.GuildText
|
|
||||||
).size
|
|
||||||
|
|
||||||
let embed = new EmbedBuilder()
|
|
||||||
.setTitle("**Server Information**")
|
|
||||||
.setColor('#2F3136')
|
|
||||||
.setThumbnail(interaction.guild.iconURL({ dynamic: true }))
|
|
||||||
.setDescription(`
|
|
||||||
<:profile:1000770439406157904> **Name:** \`${interaction.guild.name}\`
|
|
||||||
<:invi:1000459192555024404><:next:1000472400049209385> **Server ID:** ${interaction.guild.id}
|
|
||||||
<:vip:990606565344182302> **Owner:** <@${(interaction.guild.ownerId)}>
|
|
||||||
<:invi:1000459192555024404><:next:1000472400049209385> **Owner ID:** ${(await interaction.guild.ownerId)}\n
|
|
||||||
<:birthday:1000469205520502935> **Created At: ** <t:${parseInt(interaction.guild.createdTimestamp / 1000)}:R>
|
|
||||||
<:member:1000768159952949258> **Members:** \`${interaction.guild.memberCount}\`
|
|
||||||
<:role:1000449831157907556> **Roles:** \`${interaction.guild.roles.cache.size}\`
|
|
||||||
<:boost:990601774438166609> **Emojis:** \`${interaction.guild.emojis.cache.size}\`
|
|
||||||
<a:nitro:990601542463807528> **Animated Emojis:** \`${interaction.guild.emojis.cache.filter(emoji => emoji.animated).size}\`
|
|
||||||
<:channel:990666581493284915> **Text Channels:** \`${textchannels}\`
|
|
||||||
<:voice:990666579182223431> **Voice Channels:** \`${voicechannels}\`\n\n
|
|
||||||
**Boost Information**\n
|
|
||||||
<:boosters:1000708963626668052> **Total Boosts:** \`${interaction.guild.premiumSubscriptionCount}\`
|
|
||||||
<:boost:984643370511118378> **Boost Level:** \`${interaction.guild.premiumTier}\``)
|
|
||||||
.setAuthor({ name: interaction.guild.name })
|
|
||||||
.setFooter({
|
|
||||||
text: `©️ Holana`,
|
|
||||||
iconURL: ('https://ellie.gcoms.xyz/Ellise')
|
|
||||||
})
|
|
||||||
interaction.reply({embeds: [embed]});
|
|
||||||
}
|
|
||||||
}
|
|
164
slash/start.js
164
slash/start.js
|
@ -1,164 +0,0 @@
|
||||||
const Discord = require("discord.js")
|
|
||||||
const { ApplicationCommandOptionType, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
|
||||||
const messages = require("../utils/message");
|
|
||||||
const ms = require("ms")
|
|
||||||
module.exports = {
|
|
||||||
name: 'start',
|
|
||||||
description: '🎉 Start a giveaway',
|
|
||||||
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'duration',
|
|
||||||
description: 'How long the giveaway should last for. Example values: 1m, 1h, 1d',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'winners',
|
|
||||||
description: 'How many winners the giveaway should have',
|
|
||||||
type: ApplicationCommandOptionType.Integer,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'prize',
|
|
||||||
description: 'What the prize of the giveaway should be',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'channel',
|
|
||||||
description: 'The channel to start the giveaway in',
|
|
||||||
type: ApplicationCommandOptionType.Channel,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'bonusrole',
|
|
||||||
description: 'Role which would recieve bonus entries',
|
|
||||||
type: ApplicationCommandOptionType.Role,
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'bonusamount',
|
|
||||||
description: 'The amount of bonus entries the role will recieve',
|
|
||||||
type: ApplicationCommandOptionType.Integer,
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'description',
|
|
||||||
description: 'Add more details about your giveaway',
|
|
||||||
type: ApplicationCommandOptionType.String,
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'role',
|
|
||||||
description: 'Role you want to add as giveaway joining requirement',
|
|
||||||
type: ApplicationCommandOptionType.Role,
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
run: async (client, interaction) => {
|
|
||||||
|
|
||||||
// If the member doesn't have enough permissions
|
|
||||||
if (!interaction.member.permissions.has('MANAGE_MESSAGES') && !interaction.member.roles.cache.some((r) => r.name === "Giveaways")) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: ':x: You need to have the manage messages permissions to start giveaways.',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const giveawayChannel = interaction.options.getChannel('channel');
|
|
||||||
const giveawayDuration = interaction.options.getString('duration');
|
|
||||||
const giveawayWinnerCount = interaction.options.getInteger('winners');
|
|
||||||
const giveawayPrize = interaction.options.getString('prize');
|
|
||||||
|
|
||||||
if (!giveawayChannel.isTextBased()) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: ':x: Please select a text channel!',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(isNaN(ms(giveawayDuration))) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: ':x: Please select a valid duration!',
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (giveawayWinnerCount < 1) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: ':x: Please select a valid winner count! greater or equal to one.',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const bonusRole = interaction.options.getRole('bonusrole')
|
|
||||||
const bonusEntries = interaction.options.getInteger('bonusamount')
|
|
||||||
let rolereq = interaction.options.getRole('role')
|
|
||||||
let invite = interaction.options.getString('description')
|
|
||||||
|
|
||||||
if (bonusRole) {
|
|
||||||
if (!bonusEntries) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: `:x: You must specify how many bonus entries would ${bonusRole} recieve!`,
|
|
||||||
ephemeral: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
await interaction.deferReply({ ephemeral: true })
|
|
||||||
|
|
||||||
if (rolereq) {
|
|
||||||
messages.inviteToParticipate = `**React with <:confetti:984296694357319730> to participate!**\n>>> - Only members having ${rolereq} are allowed to participate in this giveaway!`
|
|
||||||
}
|
|
||||||
if (rolereq && invite) {
|
|
||||||
messages.inviteToParticipate = `**React with <:confetti:984296694357319730> to participate!**\n>>> - Only members having ${rolereq} are allowed to participate in this giveaway!`
|
|
||||||
}
|
|
||||||
if (!rolereq && invite) {
|
|
||||||
messages.inviteToParticipate = `**React with <:confetti:984296694357319730> to participate!**\n>>> Read more details about this giveaway down below!`
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// start giveaway
|
|
||||||
await client.giveawaysManager.start(giveawayChannel, {
|
|
||||||
// The giveaway duration
|
|
||||||
duration: ms(giveawayDuration),
|
|
||||||
// The giveaway prize
|
|
||||||
prize: giveawayPrize,
|
|
||||||
// The giveaway Host
|
|
||||||
hostedBy: `<@${interaction.user.id}>`,
|
|
||||||
// The giveaway winner count
|
|
||||||
winnerCount: parseInt(giveawayWinnerCount),
|
|
||||||
// BonusEntries If Provided
|
|
||||||
bonusEntries: [
|
|
||||||
{
|
|
||||||
// Members who have the role which is assigned to "rolename" get the amount of bonus entries which are assigned to "BonusEntries"
|
|
||||||
bonus: new Function('member', `return member.roles.cache.some((r) => r.name === \'${bonusRole ?.name}\') ? ${bonusEntries} : null`),
|
|
||||||
cumulative: false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
// Messages
|
|
||||||
messages,
|
|
||||||
extraData: {
|
|
||||||
role: rolereq == null ? "null" : rolereq.id,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
interaction.editReply({
|
|
||||||
content:
|
|
||||||
`Giveaway started in ${giveawayChannel}!`,
|
|
||||||
ephemeral: true
|
|
||||||
})
|
|
||||||
|
|
||||||
if (bonusRole) {
|
|
||||||
let giveaway = new Discord.EmbedBuilder()
|
|
||||||
.setAuthor({ name: `Bonus Entries Alert!` })
|
|
||||||
.setDescription(
|
|
||||||
`**${bonusRole}** Has **${bonusEntries}** Extra Entries in this giveaway!`
|
|
||||||
)
|
|
||||||
.setColor("#2F3136")
|
|
||||||
.setTimestamp();
|
|
||||||
giveawayChannel.send({ embeds: [giveaway] });
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
|
@ -1,234 +0,0 @@
|
||||||
const {
|
|
||||||
EmbedBuilder,
|
|
||||||
ActionRowBuilder,
|
|
||||||
ApplicationCommandOptionType,
|
|
||||||
AttachmentBuilder,
|
|
||||||
} = require("discord.js");
|
|
||||||
const moment = require("moment");
|
|
||||||
const japiRestPkg = require("japi.rest");
|
|
||||||
const japiRest = new japiRestPkg('API Key'); // Get ur japi key from https://key.japi.rest
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
name: "userinfo",
|
|
||||||
description: "Gives information about a user or server",
|
|
||||||
UserPerms: ["MANAGE_MESSAGES"],
|
|
||||||
BotPerms: ["EMBED_LINKS"],
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: "member",
|
|
||||||
description:
|
|
||||||
"Please select a server member of whose information you want",
|
|
||||||
type: ApplicationCommandOptionType.User,
|
|
||||||
required: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
/**
|
|
||||||
* @param {Client} client
|
|
||||||
* @param {CommandInteraction} interaction
|
|
||||||
* @param {String[]} args
|
|
||||||
*/
|
|
||||||
run: async (client, interaction, args) => {
|
|
||||||
const flags = {
|
|
||||||
DISCORD_EMPLOYEE: "<:BadgeStaff:990666549163610252>", //Replace your emoji here
|
|
||||||
DISCORD_PARTNER: "<:Partner:990667758654091274>", //Replace your emoji here
|
|
||||||
BUGHUNTER_LEVEL_1: "<:bughunterlv1:990666534609354843>", //Replace your emoji here
|
|
||||||
BUGHUNTER_LEVEL_2: "<:bughunterlv2:990666595795873832>", //Replace your emoji here
|
|
||||||
HYPESQUAD_EVENTS: "<:discord_serveur:990666593455452200>", //Replace your emoji here
|
|
||||||
HOUSE_BRAVERY: "<:bravery:990666567593373736>", //Replace your emoji here
|
|
||||||
HOUSE_BRILLIANCE: "<:brillance:990666570013479042>", //Replace your emoji here
|
|
||||||
HOUSE_BALANCE: "<:balance:990666565273911427>", //Replace your emoji here
|
|
||||||
EARLY_SUPPORTER: "<:earlysupporter:990666536802992188>", //Replace your emoji here
|
|
||||||
SYSTEM: "<:developer:974687011040526376>", //Replace your emoji here
|
|
||||||
VERIFIED_BOT: "<:gg:991441731163803799><:ggg:991441739590156290>", //Replace your emoji here
|
|
||||||
VERIFIED_DEVELOPER: "<:developersofDiscord:990666539218899004>", //Replace your emoji here
|
|
||||||
ACTIVE_DEVELOPER: "<:active_developer:1040582016112013382>",
|
|
||||||
NITRO: "<:DiscordNitro:990666558235877396>", //Replace your emoji here
|
|
||||||
BOOSTER_1: "<:1m:991804502455885824>", //Replace your emoji here
|
|
||||||
BOOSTER_2: "<:2m:991804500388102305>", //Replace your emoji here
|
|
||||||
BOOSTER_3: "<:3m:991804504678867026>", //Replace your emoji here
|
|
||||||
BOOSTER_4: "<:6m:991804497384972490>", //Replace your emoji here
|
|
||||||
BOOSTER_5: "<:9m:991804517706375278>", //Replace your emoji here
|
|
||||||
BOOSTER_6: "<:12m:991804515198193674>", //Replace your emoji here
|
|
||||||
BOOSTER_7: "<:15m:991804512434147418>", //Replace your emoji here
|
|
||||||
BOOSTER_8: "<:18m:991804509766557767>", //Replace your emoji here
|
|
||||||
BOOSTER_9: "<:24m:991804507308707850>", //Replace your emoji here
|
|
||||||
};
|
|
||||||
//badge system
|
|
||||||
|
|
||||||
const { options } = interaction;
|
|
||||||
const user = (await options.getUser("member")) || interaction.user;
|
|
||||||
const member = await interaction.guild.members.fetch(user);
|
|
||||||
const owner = await interaction.guild.fetchOwner();
|
|
||||||
|
|
||||||
const avpng = member.user.displayAvatarURL({
|
|
||||||
format: "png",
|
|
||||||
dynamic: true,
|
|
||||||
});
|
|
||||||
const joinedServerAt = `${moment(member.joinedTimestamp).format(
|
|
||||||
"DD/MM/YYYY"
|
|
||||||
)}`;
|
|
||||||
const isBot = member.user.bot
|
|
||||||
? "<:true:990666572366499940>"
|
|
||||||
: "<:false:990666574295867393>";
|
|
||||||
let memberPermissons = `${member.permissions
|
|
||||||
.toArray()
|
|
||||||
.map((p) => `${p}`)
|
|
||||||
.join(", ")}`;
|
|
||||||
if (member.user.id === owner.id) {
|
|
||||||
memberPermissons = "SERVER_OWNER";
|
|
||||||
}
|
|
||||||
const joinedDiscordAt = `${moment(member.user.createdTimestamp).format(
|
|
||||||
"DD/MM/YYYY"
|
|
||||||
)}`;
|
|
||||||
const statuses = {
|
|
||||||
online: "🟢",
|
|
||||||
idle: "🌙",
|
|
||||||
dnd: "⛔",
|
|
||||||
offline: "⚫️",
|
|
||||||
};
|
|
||||||
const status = `${statuses[member.presence?.status]} ${
|
|
||||||
member.presence?.status
|
|
||||||
}`;
|
|
||||||
const activity = member.presence?.activities[0];
|
|
||||||
var userstatus = "None";
|
|
||||||
if (activity) {
|
|
||||||
if (activity.type === "CUSTOM_STATUS") {
|
|
||||||
let emoji = `${
|
|
||||||
activity.emoji
|
|
||||||
? activity.emoji.id
|
|
||||||
? `<${activity.emoji.animated ? "a" : ""}:${
|
|
||||||
activity.emoji.name
|
|
||||||
}:${activity.emoji.id}>`
|
|
||||||
: activity.emoji.name
|
|
||||||
: ""
|
|
||||||
}`;
|
|
||||||
userstatus = `${emoji} \`${activity.state || "None"}\``;
|
|
||||||
} else {
|
|
||||||
userstatus = `\`${
|
|
||||||
activity.type.toLowerCase().charAt(0).toUpperCase() +
|
|
||||||
activity.type.toLowerCase().slice(1)
|
|
||||||
} ${activity.name}\``;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const totalRoles = await member.roles.cache.size;
|
|
||||||
const roles = await member.roles;
|
|
||||||
const highestRole =
|
|
||||||
member.roles.highest.id === interaction.guild.id
|
|
||||||
? "None"
|
|
||||||
: member.roles.highest;
|
|
||||||
function trimArray(arr, maxLen = 25) {
|
|
||||||
if (Array.from(arr.values()).length > maxLen) {
|
|
||||||
const len = Array.from(arr.values()).length - maxLen;
|
|
||||||
arr = Array.from(arr.values())
|
|
||||||
.sort((a, b) => b.rawPosition - a.rawPosition)
|
|
||||||
.slice(0, maxLen);
|
|
||||||
arr.map((role) => `<@&${role.id}>`);
|
|
||||||
arr.push(`${len} more...`);
|
|
||||||
}
|
|
||||||
return arr.join(", ");
|
|
||||||
}
|
|
||||||
const Roles =
|
|
||||||
(await member.roles.cache.size) < 25
|
|
||||||
? Array.from(roles.cache.values())
|
|
||||||
.sort((a, b) => b.rawPosition - a.rawPosition)
|
|
||||||
.map((role) => `<@&${role.id}>`)
|
|
||||||
.join(", ")
|
|
||||||
: roles.cache.size > 25
|
|
||||||
? trimArray(roles.cache)
|
|
||||||
: "None";
|
|
||||||
|
|
||||||
japiRest.discord.getUser(user.id).then((user) => {
|
|
||||||
data = user.data;
|
|
||||||
fetch(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
async function fetch(data) {
|
|
||||||
const badges = data.public_flags_array
|
|
||||||
? data.public_flags_array.map((flag) => {
|
|
||||||
return flags[flag];
|
|
||||||
})
|
|
||||||
: "No Badges.";
|
|
||||||
|
|
||||||
const fetchh = require("axios");
|
|
||||||
|
|
||||||
let userdata = await fetchh.get(
|
|
||||||
`https://discord.com/api/users/${user.id}`,
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bot ${client.token}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
let banner = userdata.data.banner;
|
|
||||||
//if (!banner && !userdata.data.accent_color) banner = "a_" + userdata.data.accent_color.toString(16);
|
|
||||||
if (banner) {
|
|
||||||
fileType = banner.startsWith("a_") ? ".gif" : ".png";
|
|
||||||
const url = `https://cdn.discordapp.com/banners/${user.id}/${banner}${fileType}?size=1024`;
|
|
||||||
const UserInfoEm = new EmbedBuilder()
|
|
||||||
.setColor("2f3136")
|
|
||||||
.setTitle("**WHO THE HELL IS THIS?**")
|
|
||||||
.setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
|
|
||||||
.setImage(`${url}`)
|
|
||||||
.setDescription(
|
|
||||||
`
|
|
||||||
**Name:** \`${member.user.username}\`
|
|
||||||
> Nickname: **${member.nickname == null ? "No nickname set" : member.nickname}**
|
|
||||||
> Tag: **${member.user.tag}**
|
|
||||||
> ID: **${member.user.id}**
|
|
||||||
> Avatar: [PNG](${avpng})\n
|
|
||||||
**Creation:** <t:${parseInt(
|
|
||||||
member.user.createdTimestamp / 1000
|
|
||||||
)}:R>
|
|
||||||
**Joined:** <t:${parseInt(
|
|
||||||
member.joinedTimestamp / 1000
|
|
||||||
)}:R>
|
|
||||||
**Bot:** ${isBot}
|
|
||||||
**Discord Badges:** ${badges}\n
|
|
||||||
**Highest Role:** \n${highestRole}\n
|
|
||||||
**Roles:** \n${Roles}\n
|
|
||||||
**Permissions:** \n\`\`\`ini\n[ ${memberPermissons} ]\`\`\``
|
|
||||||
)
|
|
||||||
.setFooter({
|
|
||||||
text: "©️ Holana",
|
|
||||||
iconURL: "https://ellie.gcoms.xyz/Ellise",
|
|
||||||
});
|
|
||||||
await interaction.reply({
|
|
||||||
content: `Information about **${member.user.tag}**`,
|
|
||||||
embeds: [UserInfoEm],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const UserInfoEm = new EmbedBuilder()
|
|
||||||
.setColor("2f3136")
|
|
||||||
.setTitle("**WHO THE HELL IS THIS?**")
|
|
||||||
.setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
|
|
||||||
.setDescription(
|
|
||||||
`
|
|
||||||
**Name:** \`${member.user.username}\`
|
|
||||||
> Nickname: **${member.nickname == null ? "No nickname set" : member.nickname}**
|
|
||||||
> Tag: **${member.user.tag}**
|
|
||||||
> ID: **${member.user.id}**
|
|
||||||
> Avatar: [Click here](${avpng})\n
|
|
||||||
**Creation:** <t:${parseInt(
|
|
||||||
member.user.createdTimestamp / 1000
|
|
||||||
)}:R>
|
|
||||||
**Joined:** <t:${parseInt(
|
|
||||||
member.joinedTimestamp / 1000
|
|
||||||
)}:R>
|
|
||||||
**Bot:** ${isBot}
|
|
||||||
**Discord Badges:** ${badges}\n
|
|
||||||
**Highest Role:** \n${highestRole}\n
|
|
||||||
**Roles:** \n${Roles}\n
|
|
||||||
**Permissions:** \n\`\`\`ini\n[ ${memberPermissons} ]\`\`\``
|
|
||||||
)
|
|
||||||
.setFooter({
|
|
||||||
text: "©️ Holana",
|
|
||||||
iconURL: "https://ellie.gcoms.xyz/Ellise",
|
|
||||||
});
|
|
||||||
await interaction.reply({
|
|
||||||
content: `Information about **${member.user.tag}**`,
|
|
||||||
embeds: [UserInfoEm],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,55 +0,0 @@
|
||||||
const Discord = require('discord.js');
|
|
||||||
|
|
||||||
module.exports = async(client, commands, options = {
|
|
||||||
debug: false,
|
|
||||||
guildId: null
|
|
||||||
}) => {
|
|
||||||
|
|
||||||
const log = (message) => options.debug && console.log(message);
|
|
||||||
|
|
||||||
const ready = client.readyAt ? Promise.resolve() : new Promise(resolve => client.once('ready', resolve));
|
|
||||||
await ready;
|
|
||||||
const currentCommands = await client.application.commands.fetch(options.guildId && { guildId: options.guildId });
|
|
||||||
|
|
||||||
log(`Synchronizing commands...`);
|
|
||||||
log(`Currently ${currentCommands.size} commands are registered to the bot.`);
|
|
||||||
|
|
||||||
const newCommands = commands.filter((command) => !currentCommands.some((c) => c.name === command.name));
|
|
||||||
for (let newCommand of newCommands) {
|
|
||||||
await client.application.commands.create(newCommand, options.guildId);
|
|
||||||
}
|
|
||||||
|
|
||||||
log(`Created ${newCommands.length} commands!`);
|
|
||||||
|
|
||||||
const deletedCommands = currentCommands.filter((command) => !commands.some((c) => c.name === command.name)).toJSON();
|
|
||||||
for (let deletedCommand of deletedCommands) {
|
|
||||||
await deletedCommand.delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
log(`Deleted ${deletedCommands.length} commands!`);
|
|
||||||
|
|
||||||
const updatedCommands = commands.filter((command) => currentCommands.some((c) => c.name === command.name));
|
|
||||||
let updatedCommandCount = 0;
|
|
||||||
for (let updatedCommand of updatedCommands) {
|
|
||||||
const newCommand = updatedCommand;
|
|
||||||
const previousCommand = currentCommands.find((c) => c.name === updatedCommand.name);
|
|
||||||
let modified = false;
|
|
||||||
if (previousCommand.description !== newCommand.description) modified = true;
|
|
||||||
if (!Discord.ApplicationCommand.optionsEqual(previousCommand.options ?? [], newCommand.options ?? [])) modified = true;
|
|
||||||
if (modified) {
|
|
||||||
await previousCommand.edit(newCommand);
|
|
||||||
updatedCommandCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log(`Updated ${updatedCommandCount} commands!`);
|
|
||||||
|
|
||||||
log(`Commands synchronized!`);
|
|
||||||
|
|
||||||
return {
|
|
||||||
currentCommandCount: currentCommands.size,
|
|
||||||
newCommandCount: newCommands.length,
|
|
||||||
deletedCommandCount: deletedCommands.length,
|
|
||||||
updatedCommandCount
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in a new issue