Skip to content
This repository was archived by the owner on Jul 9, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ If you need help with the bot, feel free to [join our support server](https://di
**Other Information**
Invite Manager requires Node.js v12 or higher.

[License](https://github.com/TheShadowGamer/invite-manager/blob/master/LICENSE)
[Acknowledgements](https://github.com/TheShadowGamer/invite-manager/blob/master/acknowledgements.md)
[License](https://github.com/TheShadowGamer/invite-manager/blob/master/LICENSE) <br>
[Acknowledgements](https://github.com/TheShadowGamer/invite-manager/blob/master/acknowledgements.md) <br>
[Plugins](https://github.com/TheShadowGamer/invite-manager-plugins)

Please note we are not responsible for if anything happens to your bot account. It is your responsibility to keep the token away from anyone you don't trust. The bot uses discord.js to interact with the Discord API with your bot token. Do not share your .env file with anyone once filled out.

Expand Down
4 changes: 2 additions & 2 deletions commands/invites/invites.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ module.exports.slashCommand = async (client, interaction, args, respond) => {
const member = await interaction.guild.members.fetch(args[0].value);
const amount = args[1].value;
interaction.member = await interaction.guild.members.fetch(interaction.member.user.id);
if(!interaction.member.roles.cache.some(role => role.name === 'Manage Invites') && !message.member.permissions.has(['BAN_MEMBERS', 'KICK_MEMBERS', 'MANAGE_GUILD', 'MANAGE_CHANNELS'])) client.handler.emit('missingPermissions', respond, client.handler.findCommand('invites'), 'user', 'Manage Invites');
if(!interaction.member.roles.cache.some(role => role.name === 'Manage Invites') && !interaction.member.permissions.has(['BAN_MEMBERS', 'KICK_MEMBERS', 'MANAGE_GUILD', 'MANAGE_CHANNELS'])) client.handler.emit('missingPermissions', respond, client.handler.findCommand('invites'), 'user', 'Manage Invites');
let entry = await invites.findOrCreate({where: {discordUser: member.id, guildID: interaction.guild.id}, defaults: {discordUser: member.id, invites: 0, guildID: interaction.guild.id}});
await entry[0].increment('invites', {by: amount});
let embed = new MessageEmbed()
Expand Down Expand Up @@ -64,7 +64,7 @@ module.exports.slashCommand = async (client, interaction, args, respond) => {
const member = await interaction.guild.members.fetch(args[0].value);
const amount = args[1].value;
interaction.member = await interaction.guild.members.fetch(interaction.member.user.id);
if(!interaction.member.roles.cache.some(role => role.name === 'Manage Invites') && !message.member.permissions.has(['BAN_MEMBERS', 'KICK_MEMBERS', 'MANAGE_GUILD', 'MANAGE_CHANNELS'])) client.handler.emit('missingPermissions', respond, client.handler.findCommand('invites'), 'user', 'Manage Invites');
if(!interaction.member.roles.cache.some(role => role.name === 'Manage Invites') && !interaction.member.permissions.has(['BAN_MEMBERS', 'KICK_MEMBERS', 'MANAGE_GUILD', 'MANAGE_CHANNELS'])) client.handler.emit('missingPermissions', respond, client.handler.findCommand('invites'), 'user', 'Manage Invites');
let embed = new MessageEmbed()
.setColor(client.config.colors.main)
.setFooter(client.user.username, client.user.displayAvatarURL({dynamic: true}))
Expand Down
2 changes: 1 addition & 1 deletion commands/invites/removeinvites.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ module.exports = class RemoveInvitesCommand extends Command {
return message.channel.send(embed);
};
await entry[0].decrement('invites', {by: amount});
embed.setDescription(`Added ${amount} invites to ${member.toString()}! They now have ${entry[0].invites - amount} invites!`);
embed.setDescription(`Removed ${amount} invites from ${member.toString()}! They now have ${entry[0].invites - amount} invites!`);
return message.channel.send(embed);
};
};
7 changes: 7 additions & 0 deletions functions/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require('fs')
.readdirSync(__dirname)
.filter(file => file !== 'index.js')
.forEach(filename => {
const moduleName = filename.split('.')[0];
exports[moduleName] = require(`${__dirname}/${filename}`);
});
32 changes: 17 additions & 15 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
const { AkairoClient, CommandHandler, ListenerHandler } = require('discord-akairo');
const { Team } = require('discord.js');
const { readdir, stat } = require('fs');
const { prefix } = require('./config');
const { Team } = require('discord.js');
const { join } = require('path');
const Sequelize = require('sequelize');
const path = require('path');
const fs = require('fs');
const app = require('express')()
require('dotenv').config();
app.get("/", (req, res) => res.sendStatus(200))
let listener = app.listen(process.env.PORT, () => console.log('Your app is currently listening on port: ' + listener.address().port));
let client = new AkairoClient({partials: ['GUILD_MEMBER']});
client.config = require('./config')
client.tools = require('./functions')
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: '.data/db.sqlite',
Expand All @@ -25,6 +26,7 @@ invites.sync();
client.invites = invites;
const guildInvites = new Map();
client.guildInvites = guildInvites;
client.sequelize = sequelize
const slashCommandList = [];
client.slashCommandList = slashCommandList;
let commandHandler = new CommandHandler(client, {
Expand All @@ -42,13 +44,13 @@ let commandHandler = new CommandHandler(client, {
},
commandUtil: true
});
commandHandler.resolver.addType("custom-MEMBER", async (message, phrase) => {
if(!phrase) return null;
let member;
try {member = await message.guild.members.fetch(phrase)} catch (error) {};
if(!member) member = client.util.resolveMember(phrase, message.guild.members.cache);
if(!member) member = (await (message.guild.members.fetch({query: phrase}))).first();
return member || null;
readdir(join(__dirname, './types/'), async (err, files) => {
if(err) return console.log(chalk.red('An error occured when checking the types folder for types to load: ' + err));
files.forEach(async (file) => {
if(!file.endsWith('.js')) return;
let typeFile = require(join(__dirname, 'types', file));
commandHandler.resolver.addType(file.split('.')[0], async (message, phrase) => typeFile(message, phrase, client))
});
});
client.handler = commandHandler;
let listenerHandler = new ListenerHandler(client, {
Expand All @@ -61,19 +63,19 @@ listenerHandler.setEmitters({
});
listenerHandler.loadAll();
commandHandler.loadAll();
async function registerSlashCommands(dir) {;
fs.readdir(path.join(__dirname, dir), async (err, files) => {
async function registerSlashCommands(dir) {
readdir(join(__dirname, dir), async (err, files) => {
if(err){
return console.log(chalk.red('An error occured when checking the commands folder for commands to load: ' + err));
};
files.forEach(async (file) => {
fs.stat(path.join(__dirname, dir, file), (err, stat) => {
stat(join(__dirname, dir, file), (err, stat) => {
if(err) return console.log(chalk.red('An error occured when checking the commands folder for commands to load: ' + err));
if(stat.isDirectory()) {
registerSlashCommands(path.join(dir, file));
registerSlashCommands(join(dir, file));
} else {
if(!file.endsWith('.js')) return;
let commandFile = require(path.join(__dirname, dir, file));
let commandFile = require(join(__dirname, dir, file));
slashCommandList.push({
run: commandFile.slashCommand,
name: file.split('.')[0]
Expand Down
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "invite-manager",
"version": "2.0.6",
"version": "2.1.0",
"description": "Invite manager is an open source bot that allows you to track people's invites. You can join the support server here if you need help with anything: https://discord.gg/xNks8jb",
"main": "index.js",
"dependencies": {
"chalk": "^4.1.0",
"discord-akairo": "^8.1.0",
"discord.js": "^12.5.2",
"discord.js": "^12.5.3",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"figlet": "^1.4.0",
Expand Down
92 changes: 92 additions & 0 deletions slash-commands/mainBot.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
module.exports = [
{
name: 'uptime',
description: 'Tells you how long the bot has been up.'
},
{
name: 'invites',
description: 'Add, remove, reset, or view invites.',
options: [
{
name: 'show',
description: 'Shows you the amount of invites someone has.',
type: 1,
options: [
{
name: 'member',
description: 'The member to see the invites of. If none is provided, shows your invites.',
type: 6,
required: false
}
]
},
{
name: 'add',
description: 'Add invites to a member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to add invites from.',
type: 6,
required: true
},
{
name: 'amount',
description: 'The amount of invites to add.',
type: 4,
required: true
}
]
},
{
name: 'remove',
description: 'Remove invites from a member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to remove invites from.',
type: 6,
required: true
},
{
name: 'amount',
description: 'The amount of invites to remove.',
type: 4,
required: true
}
]
},
{
name: 'reset',
description: 'Remove all invites from the mentioned member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to reset the invites of.',
type: 6,
required: true
}
]
},
]
},
{
name: 'help',
description: 'Displays a list of available command, or detailed information for a specific command.',
options: [
{
name: 'command',
description: 'A command to get more information about.',
type: 3,
required: false
}
]
},
{
name: 'leaderboard',
description: 'Sends a list of the top ten inviters.'
}
]
113 changes: 12 additions & 101 deletions slash-setup.js
Original file line number Diff line number Diff line change
@@ -1,101 +1,16 @@
let commands = [
{
name: 'uptime',
description: 'Tells you how long the bot has been up.'
},
{
name: 'invites',
description: 'Add, remove, reset, or view invites.',
options: [
{
name: 'show',
description: 'Shows you the amount of invites someone has.',
type: 1,
options: [
{
name: 'member',
description: 'The member to see the invites of. If none is provided, shows your invites.',
type: 6,
required: false
}
]
},
{
name: 'add',
description: 'Add invites to a member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to add invites from.',
type: 6,
required: true
},
{
name: 'amount',
description: 'The amount of invites to add.',
type: 4,
required: true
}
]
},
{
name: 'remove',
description: 'Remove invites from a member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to remove invites from.',
type: 6,
required: true
},
{
name: 'amount',
description: 'The amount of invites to remove.',
type: 4,
required: true
}
]
},
{
name: 'reset',
description: 'Remove all invites from the mentioned member.',
type: 1,
options: [
{
name: 'member',
description: 'The member to reset the invites of.',
type: 6,
required: true
}
]
},
]
},
{
name: 'help',
description: 'Displays a list of available command, or detailed information for a specific command.',
options: [
{
name: 'command',
description: 'A command to get more information about.',
type: 3,
required: false
}
]
},
{
name: 'leaderboard',
description: 'Sends a list of the top ten inviters.'
}
]
const { Client } = require('discord.js')
const { readdir } = require('fs')
const { red } = require('chalk')

let commands = []

readdir('./slash-commands/', (err, files) => {
if(err) return console.log(red('An error occured when checking the slash commands folder for slash commands to load: ' + err));
files.forEach(file => {
let commandFile = require(`./slash-commands/${file}`)
commandFile.forEach(command => commands.push(command))
})
})

/**
* Adds all slash commands to the passed client
* @param {Client} client - The client to add slash commands to
*/
module.exports.registerCommands = async (client) => {
let application = await client.fetchApplication();
for (let i = 0; i < commands.length; i++) {
Expand All @@ -107,10 +22,6 @@ module.exports.registerCommands = async (client) => {
}
}

/**
* Deletes all slash commands from the passed client
* @param {Client} client - The client to remove slash commands from
*/
module.exports.deleteCommands = async (client) => {
let application = await client.fetchApplication()
let commands = await client.api.applications(application.id).commands.get()
Expand Down
8 changes: 8 additions & 0 deletions types/custom-MEMBER.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = async (message, phrase, client) => {
if(!phrase) return null;
let member;
try {member = await message.guild.members.fetch(phrase)} catch (error) {};
if(!member) member = client.util.resolveMember(phrase, message.guild.members.cache);
if(!member) member = (await (message.guild.members.fetch({query: phrase}))).first();
return member || null;
}