Compare commits
No commits in common. "development" and "v3.0.0-beta" have entirely different histories.
developmen
...
v3.0.0-bet
66 changed files with 5583 additions and 2605 deletions
18
.github/dependabot.yml
vendored
Normal file
18
.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
# 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"
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
|||
node_modules
|
||||
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
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2023 Toastie_t0ast
|
||||
Copyright 2023 EmotionChild
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
|
48
README.md
48
README.md
|
@ -1,46 +1,38 @@
|
|||
# Holana
|
||||
|
||||
## Updates
|
||||
|
||||
- Update discord.js version to v13.
|
||||
- Format the code looks more cleaner.
|
||||
- Minor bot fixes and improvements.
|
||||
# Giveaway-Child
|
||||
|
||||
## Requirements
|
||||
|
||||
- Bot needs v16 of nodejs to work
|
||||
- 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.
|
||||
- Nodejs v16
|
||||
- Invite your bot with bot and applications scope
|
||||
|
||||
## Features
|
||||
|
||||
- Lightning fast giveaways created using best databases, like: mongodb, quick.db, etc.
|
||||
- LAST CHANCE TO ENTER warning when giveaway is about to end.
|
||||
- Slash commands for faster and simpler giveaway creating.
|
||||
- Drop giveaway ability, drop giveaway anytime in your server with drop command.
|
||||
- Pause and un-pause giveaways.
|
||||
- Fast giveaways created using the best databases, like: mongodb, quick.db, .etc
|
||||
- LAST CHANCE TO ENTER warning when a giveaway is about to end.
|
||||
- Slash commands for faster giveaway creating.
|
||||
Drop giveaway ability, drop giveaways anytime in your server with the drop command.
|
||||
- Pause and un-pause giveaway feature.
|
||||
|
||||
|
||||
## Links
|
||||
|
||||
- 🔗 [Invite Link](https://discord.com/api/oauth2/authorize?client_id=726333575091454002&permissions=8&scope=bot)
|
||||
- ℹ [Support Server Link](https://discord.gg/etQdZxSyEH)
|
||||
- 📑 [Commands](https://docs.elliebot.net/Giveaway-child/Commands)
|
||||
- 🌐 [Website](https://docs.elliebot.net/category/holana)
|
||||
|
||||
## Setup
|
||||
- ℹ [Support Server Link](https://discord.gg/SVQVzJq)
|
||||
- 📑 [Commands](https://docs.elliebot.net/Giveaway-Child/Commands/)
|
||||
- 🌐 [Website](https://docs.elliebot.net/coming_soon)
|
||||
|
||||
## Custom/External Database setup
|
||||
|
||||
- Check the example folder to get the custom database examples
|
||||
- Read the [README](Database%20Examples/README.md) file and you are good to go to use custom db's.
|
||||
|
||||
## Manual setup on local machine
|
||||
## Setup
|
||||
|
||||
- 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`
|
||||
- `npm i`
|
||||
- Pick a database from the Database Examples folder.
|
||||
- Just copy and paste it into the [index file](index.js)
|
||||
- Fill out the [config file](config.example.json) and save it as config.js.
|
||||
- Then run the bot with `npm run start`
|
||||
|
||||
## Credits
|
||||
|
||||
**Thanks to [Androz](https://github.com/Androz2091) for his package which make this bot possible [discord-giveaways](https://www.npmjs.com/package/discord-giveaways) give him a star for his work.**
|
||||
**Thanks to [Androz](https://github.com/Androz2091) for his package which make this bot possible [discord-giveaways](https://www.npmjs.com/package/discord-giveaways) give him a star for his work.**
|
|
@ -1,68 +0,0 @@
|
|||
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}!`);
|
||||
},
|
||||
};
|
|
@ -1,71 +0,0 @@
|
|||
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,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
|
@ -1,44 +0,0 @@
|
|||
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,
|
||||
});
|
||||
},
|
||||
};
|
|
@ -1,35 +0,0 @@
|
|||
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,
|
||||
});
|
||||
},
|
||||
};
|
|
@ -1,71 +0,0 @@
|
|||
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,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
|
@ -1,39 +0,0 @@
|
|||
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] });
|
||||
},
|
||||
};
|
|
@ -1,70 +0,0 @@
|
|||
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,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
|
@ -1,77 +0,0 @@
|
|||
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}!`);
|
||||
},
|
||||
};
|
|
@ -1,87 +0,0 @@
|
|||
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] });
|
||||
},
|
||||
};
|
|
@ -1,71 +0,0 @@
|
|||
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,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
9
config.example.json
Normal file
9
config.example.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"token": "",
|
||||
"prefix": "!",
|
||||
"everyoneMention": false,
|
||||
"copyright": "Holana",
|
||||
"hostedBy": false,
|
||||
"MONGODB_URI": "",
|
||||
"privateMessageInformation": true
|
||||
}
|
15
events/discord/interactionCreate.js
Normal file
15
events/discord/interactionCreate.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
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);
|
||||
}
|
||||
}
|
20
events/discord/messageCreate.js
Normal file
20
events/discord/messageCreate.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
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);
|
||||
};
|
53
events/discord/ready.js
Normal file
53
events/discord/ready.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
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/' })
|
||||
|
||||
};*/
|
14
events/giveaways/endedGiveawayReactionAdded.js
Normal file
14
events/giveaways/endedGiveawayReactionAdded.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
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) => {});
|
||||
},
|
||||
};
|
34
events/giveaways/giveawayEnded.js
Normal file
34
events/giveaways/giveawayEnded.js
Normal file
|
@ -0,0 +1,34 @@
|
|||
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 => {})
|
||||
});
|
||||
}
|
||||
}
|
64
events/giveaways/giveawayReactionAdded.js
Normal file
64
events/giveaways/giveawayReactionAdded.js
Normal file
|
@ -0,0 +1,64 @@
|
|||
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 => {})
|
||||
}
|
||||
}
|
||||
}
|
27
events/giveaways/giveawayReactionRemoved.js
Normal file
27
events/giveaways/giveawayReactionRemoved.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
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 => {})
|
||||
}
|
||||
}
|
36
events/giveaways/giveawayRerolled.js
Normal file
36
events/giveaways/giveawayRerolled.js
Normal file
|
@ -0,0 +1,36 @@
|
|||
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 => {})
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
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);
|
||||
}
|
8
events/mongo/connected.js
Normal file
8
events/mongo/connected.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
const chalk = require('chalk');
|
||||
|
||||
module.exports = {
|
||||
name: "connected",
|
||||
execute() {
|
||||
console.log(chalk.greenBright("[MONGO DB]: Connected to MongoDB!"));
|
||||
},
|
||||
};
|
8
events/mongo/connecting.js
Normal file
8
events/mongo/connecting.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
const chalk = require('chalk');
|
||||
|
||||
module.exports = {
|
||||
name: "connecting",
|
||||
execute() {
|
||||
console.log(chalk.cyan("[MONGO DB]: Connecting to MongoDB..."));
|
||||
},
|
||||
};
|
8
events/mongo/disconnected.js
Normal file
8
events/mongo/disconnected.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
const chalk = require('chalk');
|
||||
|
||||
module.exports = {
|
||||
name: 'disconnected',
|
||||
execute(client) {
|
||||
console.log(chalk.red("[MONGO DB]: Disconnected from MongoDB!"));
|
||||
},
|
||||
};
|
8
events/mongo/err.js
Normal file
8
events/mongo/err.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
const chalk = require('chalk');
|
||||
|
||||
module.exports = {
|
||||
name: "err",
|
||||
execute(err) {
|
||||
console.log(chalk.red("[MONGO DB]: Error: " + err + ""));
|
||||
},
|
||||
};
|
|
@ -1,21 +0,0 @@
|
|||
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);
|
||||
};
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"token": "Discord Bot Token",
|
||||
"everyoneMention": false,
|
||||
"hostedBy": true
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"rules": {
|
||||
"no-restricted-globals": "off"
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
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);
|
|
@ -1,133 +0,0 @@
|
|||
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);
|
|
@ -1,144 +0,0 @@
|
|||
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);
|
|
@ -1,81 +0,0 @@
|
|||
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);
|
|
@ -1,76 +0,0 @@
|
|||
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);
|
|
@ -1,87 +0,0 @@
|
|||
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);
|
|
@ -1,71 +0,0 @@
|
|||
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);
|
|
@ -1,83 +0,0 @@
|
|||
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 +0,0 @@
|
|||
// Example bot available on https://toastielab.dev/toastie_t0ast/Holana
|
41
giveawayInit.js
Normal file
41
giveawayInit.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
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 +0,0 @@
|
|||
[{"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
Normal file
7
host.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
// 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)
|
177
index.js
177
index.js
|
@ -1,103 +1,114 @@
|
|||
process.title = 'Holana';
|
||||
|
||||
const fs = require("fs");
|
||||
process.title = 'Giveaway Child';
|
||||
|
||||
const Discord = require("discord.js");
|
||||
const client = new Discord.Client({
|
||||
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: [
|
||||
Discord.GatewayIntentBits.Guilds,
|
||||
Discord.GatewayIntentBits.GuildMembers,
|
||||
Discord.GatewayIntentBits.GuildMessageReactions,
|
||||
GatewayIntentBits.Guilds, // for guild related things
|
||||
GatewayIntentBits.GuildMessages, // for guild messages things
|
||||
GatewayIntentBits.GuildMessageReactions, // for message reactions things
|
||||
],
|
||||
});
|
||||
const fs = require("fs");
|
||||
|
||||
const config = require("./config.json");
|
||||
client.config = config;
|
||||
|
||||
const synchronizeSlashCommands = require("discord-sync-commands");
|
||||
|
||||
// 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(", ")}`
|
||||
(async () => {
|
||||
await connect(config.MONGODB_URI).catch((err) =>
|
||||
console.log(chalk.red(`[MONGO DB]: Error: ${err}`))
|
||||
);
|
||||
});
|
||||
})();
|
||||
|
||||
/* Load all commands */
|
||||
client.commands = new Discord.Collection();
|
||||
fs.readdir("./commands/", (_err, files) => {
|
||||
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;
|
||||
let props = require(`./commands/${file}`);
|
||||
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) */
|
||||
|
||||
fs.readdir("./events/giveaways", (_err, files) => {
|
||||
files.forEach((file) => {
|
||||
if (!file.endsWith(".js")) return;
|
||||
const event = require(`./events/giveaways/${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];
|
||||
client.commands.set(commandName, {
|
||||
client.interactions.set(commandName, {
|
||||
name: commandName,
|
||||
...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}`)];
|
||||
client.register_arr.push(props);
|
||||
});
|
||||
});
|
||||
|
||||
// Login
|
||||
// Login through the client
|
||||
client.login(config.token);
|
3842
package-lock.json
generated
Normal file
3842
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
35
package.json
35
package.json
|
@ -4,30 +4,37 @@
|
|||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node index.js",
|
||||
"dev": "nodemon index.js"
|
||||
"start": "node index.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://toastielab.dev/toastie_t0ast/Holana.git"
|
||||
"url": "git+https://github.com/EmotionChild/Giveaway-Child.git"
|
||||
},
|
||||
"author": "Toastie",
|
||||
"author": "EmotionChild",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://toastielab.dev/toastie_t0ast/Holana/issues"
|
||||
"url": "https://github.com/EmotionChild/Giveaway-Child/issues"
|
||||
},
|
||||
"homepage": "https://toastielab.dev/toastie_t0ast/Holana#readme",
|
||||
"homepage": "https://github.com/EmotionChild/Giveaway-Child#readme",
|
||||
"dependencies": {
|
||||
"beautify": "0.0.8",
|
||||
"axios": "^0.27.2",
|
||||
"chalk": "^4.1.2",
|
||||
"discord-giveaways": "^6.0.1",
|
||||
"discord-sync-commands": "0.3.0",
|
||||
"discord.js": "^14.9.0",
|
||||
"fero-ms": "^2.0.7",
|
||||
"ms": "^2.1.3",
|
||||
"quickdb": "1.0.5",
|
||||
"quickmongo": "4.0.0"
|
||||
"discord-handlers": "^0.0.1",
|
||||
"discord.js": "^14.6.0",
|
||||
"dotenv": "^16.0.3",
|
||||
"japi.rest": "^1.0.1",
|
||||
"moment": "^2.29.4",
|
||||
"mongoose": "^6.9.0",
|
||||
"ms": "^3.0.0-canary.1",
|
||||
"node-fetch": "^3.3.0",
|
||||
"parsec": "^2.0.2",
|
||||
"quickmongo": "^4.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^2.0.22"
|
||||
"node": "^16.9.1"
|
||||
}
|
||||
}
|
1060
pnpm-lock.yaml
1060
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
60
schemas/giveawaysSchema.js
Normal file
60
schemas/giveawaysSchema.js
Normal file
|
@ -0,0 +1,60 @@
|
|||
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;
|
9
schemas/guild.js
Normal file
9
schemas/guild.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
const { Schema, model } = require('mongoose');
|
||||
|
||||
const guildSchema = new Schema({
|
||||
_id: Schema.Types.ObjectId,
|
||||
guildId: String,
|
||||
guildName: String,
|
||||
});
|
||||
|
||||
module.exports = model("Guild", guildSchema, "guilds");
|
29
slash/about.js
Normal file
29
slash/about.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
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] });
|
||||
}
|
||||
}
|
74
slash/avatar.js
Normal file
74
slash/avatar.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
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] });
|
||||
}
|
||||
},
|
||||
};
|
72
slash/edit.js
Normal file
72
slash/edit.js
Normal file
|
@ -0,0 +1,72 @@
|
|||
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
Normal file
65
slash/end.js
Normal file
|
@ -0,0 +1,65 @@
|
|||
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
Normal file
108
slash/help.js
Normal file
|
@ -0,0 +1,108 @@
|
|||
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: [],
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
53
slash/info.js
Normal file
53
slash/info.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
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]
|
||||
});
|
||||
},
|
||||
};
|
33
slash/invite.js
Normal file
33
slash/invite.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
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]});
|
||||
}
|
||||
}
|
63
slash/pause.js
Normal file
63
slash/pause.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
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
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
};
|
22
slash/ping.js
Normal file
22
slash/ping.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
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]
|
||||
});
|
||||
},
|
||||
};
|
62
slash/reroll.js
Normal file
62
slash/reroll.js
Normal file
|
@ -0,0 +1,62 @@
|
|||
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
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
};
|
63
slash/resume.js
Normal file
63
slash/resume.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
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
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
};
|
26
slash/servericon.js
Normal file
26
slash/servericon.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
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]});
|
||||
|
||||
}
|
||||
}
|
41
slash/serverinfo.js
Normal file
41
slash/serverinfo.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
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
Normal file
164
slash/start.js
Normal file
|
@ -0,0 +1,164 @@
|
|||
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] });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
234
slash/userinfo.js
Normal file
234
slash/userinfo.js
Normal file
|
@ -0,0 +1,234 @@
|
|||
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],
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
55
utils/slashsync.js
Normal file
55
utils/slashsync.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
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