Removed JS structure.

This commit is contained in:
Keanu Timmermans 2020-07-18 23:16:27 +02:00
parent d7f2232dc0
commit a0a322a7ee
18 changed files with 0 additions and 1772 deletions

View File

@ -1,3 +0,0 @@
{
"extends": "tesseract"
}

View File

@ -1,5 +0,0 @@
{
"prefix": "!!", // Bot Prefix
"token": "<token>", // Bot Token
"owners": ["<id>"] // Array of bot owner IDs
}

1228
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,24 +0,0 @@
{
"name": "d.js-v12-bot",
"version": "0.0.1",
"description": "A Discord bot built on Discord.JS v12",
"main": "src/index",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"discord.js",
"bot"
],
"author": "Keanu Timmermans",
"license": "Apache-2.0",
"dependencies": {
"discord.js": "^12.2.0",
"moment": "^2.27.0",
"ms": "^2.1.2"
},
"devDependencies": {
"eslint": "^7.0.0",
"eslint-config-tesseract": "^0.0.2"
}
}

View File

@ -1,16 +0,0 @@
/* eslint-disable no-unused-vars */
const Command = require('./../Structures/Command.js');
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['hallo']
});
}
async run(message, args) {
message.channel.send('Hello');
}
};

View File

@ -1,49 +0,0 @@
const Command = require('../../Structures/Command');
const { MessageEmbed, version: djsversion } = require('discord.js');
const { version } = require('../../../package.json');
const { utc } = require('moment');
const os = require('os');
const ms = require('ms');
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['info', 'bot', 'botinfo'],
category: 'Information'
});
}
run(message) {
const core = os.cpus()[0];
const embed = new MessageEmbed()
.setThumbnail(this.client.user.displayAvatarURL())
.setColor(message.guild.me.displayHexColor || 'BLUE')
.addField('General', [
`** Client:** ${this.client.user.tag} (${this.client.user.id})`,
`** Commands:** ${this.client.commands.size}`,
`** Servers:** ${this.client.guilds.cache.size.toLocaleString()}`,
`** Users:** ${this.client.guilds.cache.reduce((a, b) => a + b.memberCount, 0).toLocaleString()}`,
`** Channels:** ${this.client.channels.cache.size.toLocaleString()}`,
`** Creation Date:** ${utc(this.client.user.createdTimestamp).format('Do MMMM YYYY HH:mm:ss')}`,
`** Node.JS:** ${process.version}`,
`** Version:** v${version}`,
`** Discord.JS:** ${djsversion}`,
'\u200b'
])
.addField('System', [
`** Platform:** ${process.platform}`,
`** Uptime:** ${ms(os.uptime() * 1000, { long: true })}`,
`** CPU:**`,
`\u3000 • Cores: ${os.cpus().length}`,
`\u3000 • Model: ${core.model}`,
`\u3000 • Speed: ${core.speed}MHz`,
`** Memory:**`,
`\u3000 • Total: ${this.client.utils.formatBytes(process.memoryUsage().heapTotal)}`,
`\u3000 • Used: ${this.client.utils.formatBytes(process.memoryUsage().heapTotal)}`
])
.setTimestamp();
message.channel.send(embed);
}
};

View File

@ -1,90 +0,0 @@
/* eslint-disable no-undef */
/* eslint-disable no-warning-comments */
const Command = require('../../Structures/Command');
const { MessageEmbed } = require('discord.js');
const moment = require('moment');
const filterLevels = {
DISABLED: 'Off',
MEMBERS_WITHOUT_ROLES: 'No Role',
ALL_MEMBERS: 'Everyone'
};
const verificationLevels = {
NONE: 'None',
LOW: 'Low',
MEDIUM: 'Medium',
HIGH: '(╯°□°)╯︵ ┻━┻',
VERY_HIGH: '┻━┻ ミヽ(ಠ益ಠ)ノ彡┻━┻'
};
const regions = {
brazil: 'Brazil',
europe: 'Europe',
hongkong: 'Hong Kong',
india: 'India',
japan: 'Japan',
russia: 'Russia',
singapore: 'Singapore',
southafrica: 'South Africa',
sydney: 'Sydney',
'us-central': 'US Central',
'us-east': 'US East',
'us-west': 'US West',
'us-south': 'US South'
};
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['server', 'guild', 'guildinfo'],
category: 'Information'
});
}
async run(message) {
const roles = message.guild.roles.cache.sort((a, b) => b.position - a.position).map(role => role.toString());
const members = message.guild.members.cache;
const channels = message.guild.channels.cache;
const emojis = message.guild.emojis.cache;
const embed = new MessageEmbed()
.setDescription(`**Guild information for __${message.guild.name}__**`)
.setColor('BLUE')
.setThumbnail(message.guild.iconURL({ dynamic: true }))
.addField('General', [
`** Name:** ${message.guild.name}`,
`** ID:** ${message.guild.id}`,
`** Owner:** ${message.guild.owner.user.tag} (${message.guild.ownerID})`,
`** Region:** ${regions[message.guild.region]}`,
`** Boost Tier:** ${message.guild.premiumTier ? `Tier ${message.guild.premiumTier}` : 'None'}`,
`** Explicit Filter:** ${filterLevels[message.guild.explicitContentFilter]}`,
`** Verification Level:** ${verificationLevels[message.guild.verificationLevel]}`,
`** Time Created:** ${moment(message.guild.createdTimestamp).format('LT')} ${moment(message.guild.createdTimestamp).format('LL')} ${moment(message.guild.createdTimestamp).fromNow()})`,
'\u200b'
])
.addField('Statistics', [
`** Role Count:** ${roles.length}`,
`** Emoji Count:** ${emojis.size}`,
`** Regular Emoji Count:** ${emojis.filter(emoji => !emoji.animated).size}`,
`** Animated Emoji Count:** ${emojis.filter(emoji => emoji.animated).size}`,
`** Member Count:** ${message.guild.memberCount}`,
`** Humans:** ${members.filter(member => !member.user.bot).size}`,
`** Bots:** ${members.filter(member => member.user.bot).size}`,
`** Text Channels:** ${channels.filter(channel => channel.type === 'text')}`,
`** Voice Channels:** ${channels.filter(channel => channel.type === 'voice')}`,
`** Boost Count:** ${message.guild.premiumSubscriptionCount || '0'}`,
`\u200b`
])
.addField('Presence', [
`** Online:** ${members.filter(member => member.presence.status === 'online').size}`,
`** Idle:** ${members.filter(member => member.presence.status === 'idle').size}`,
`** Do Not Disturb:** ${members.filter(member => member.presence.stats === 'dnd').size}`,
`** Offline:** ${members.filter(member => member.presence.status === 'offline').size}`,
'\u200b'
])
.addField(`Roles [${roles.length - 1}]`, roles.length < 10 ? roles.join(', ') : roles.length > 10 ? this.client.utils.trimArray(roles) : 'None')
.setTimestamp();
message.channel.send(embed);
}
};

View File

@ -1,60 +0,0 @@
const Command = require('../../Structures/Command');
const { MessageEmbed } = require('discord.js');
const moment = require('moment');
const flags = {
DISCORD_EMPLOYEE: 'Discord Employee',
DISCORD_PARTNER: 'Discord Partner',
BUGHUNTER_LEVEL_1: 'Bug Hunter (Level 1)',
BUGHUNTER_LEVEL_2: 'Bug Hunter (Level 2)',
HYPESQUAD_EVENTS: 'HypeSquad Events',
HOUSE_BRAVERY: 'House of Bravery',
HOUSE_BRILLIANCE: 'House of Brilliance',
HOUSE_BALANCE: 'House of Balance',
EARLY_SUPPORTER: 'Early Supporter',
TEAM_USER: 'Team User',
SYSTEM: 'System',
VERIFIED_BOT: 'Verified Bot',
VERIFIED_DEVELOPER: 'Verified Bot Developer'
};
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['user', 'ui'],
category: 'Information'
});
}
async run(message, [target]) {
const member = message.mentions.members.last() || message.guild.members.cache.get(target) || message.member;
const roles = member.roles.cache
.sort((a, b) => b.position - a.position)
.map(role => role.toString())
.slice(0, -1);
const userFlags = member.user.flags.toArray();
const embed = new MessageEmbed()
.setThumbnail(member.user.displayAvatarURL({ dynamic: true, size: 512 }))
.setColor(member.displayHexColor || 'BLUE')
.addField('User', [
`** Username:** ${member.user.username}`,
`** Discriminator:** ${member.user.discriminator}`,
`** ID:** ${member.id}`,
`** Flags:** ${userFlags.length ? userFlags.map(flag => flags[flag]).join(', ') : 'None'}`,
`** Avatar:** [Link to avatar](${member.user.displayAvatarURL({ dynamic: true })})`,
`** Time Created:** ${moment(member.user.createdTimestamp).format('LT')} ${moment(member.user.createdTimestamp).format('LL')} ${moment(member.user.createdTimestamp).fromNow()}`,
`** Status:** ${member.user.presence.status}`,
`** Game:** ${member.user.presence.game || 'Not playing a game.'}`
])
.addField('Member', [
`** Highest Role:** ${member.roles.highest.id === message.guild.id ? 'None' : member.roles.highest.name}`,
`** Server Join Date:** ${moment(member.joinedAt).format('LL LTS')}`,
`** Hoist Role:** ${member.roles.hoist ? member.roles.hoist.name : 'None'}`,
`** Roles:** [${roles.length}]: ${roles.length < 10 ? roles.join(', ') : roles.length > 10 ? this.client.utils.trimArray(roles) : 'None'}`,
]);
return message.channel.send(embed);
}
};

View File

@ -1,56 +0,0 @@
const Command = require('../../Structures/Command');
const { MessageEmbed } = require('discord.js');
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['help', 'halp'],
category: 'Utilities'
});
}
async run(message, [command]) {
const embed = new MessageEmbed()
.setColor('BLUE')
.setAuthor(`${message.guild.name} Help Menu`, message.guild.iconURL({ dynamic: true }))
.setThumbnail(this.client.user.displayAvatarURL())
.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp();
if (command) {
const cmd = this.client.commands.get(command) || this.client.command.get(this.aliases.get(command));
if (!cmd) return message.channel.send(`\`${command}\` is not a valid command.`);
embed.setAuthor(`${this.client.utils.capitalise(cmd.name)} Command Help`, this.client.user.displayAvatarURL());
embed.setDescription([
`** Aliases:** ${cmd.aliases.length ? cmd.aliases.map(alias => `\`${alias}\``).join(' ') : 'No Aliases'}`,
`** Description:** ${cmd.description}`,
`** Category:** ${cmd.category}`,
`** Usage:** ${cmd.usage}`
]);
return message.channel.send(embed);
} else {
embed.setDescription([
`These are the available commands for ${message.guild.name}`,
`This bot's prefix is: ${this.client.prefix}`,
`Command Parameters: \`<>\` is a strict & \`[]\` is optional`
]);
let categories;
if (!this.client.owners.includes(message.author.id)) {
categories = this.client.utils.removeDuplicates(this.client.commands.filter(cmd => cmd.category !== 'Owner').map(cmd => cmd.category));
} else {
categories = this.client.utils.removeDuplicates(this.client.commands.map(cmd => cmd.category));
}
for (const category of categories) {
embed.addField(`**${this.client.utils.capitalise(category)}**`, this.client.commands.filter(cmd =>
cmd.category === category).map(cmd => `\`${cmd.name}\``).join(' '));
}
return message.channel.send(embed);
}
}
};

View File

@ -1,22 +0,0 @@
const Command = require('../../Structures/Command');
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['pong'],
category: 'Utilities'
});
}
async run(message) {
const msg = await message.channel.send('Pinging...');
const latency = msg.createdTimestamp - message.createdTimestamp;
const choices = ['Is this really my ping?', "Is this okay? I can't look!", "I hope it isn't bad!"];
const response = choices[Math.floor(Math.random() * choices.length)];
msg.edit(`${response} - Bot Latency: \`${latency}ms\`, API Latency: \`${Math.round(this.client.ws.ping)}ms\``);
}
};

View File

@ -1,17 +0,0 @@
const Command = require('../../Structures/Command.js');
const ms = require('ms');
module.exports = class extends Command {
constructor(...args) {
super(...args, {
aliases: ['uptime'],
category: 'Utilities'
});
}
async run(message) {
message.channel.send(`My uptime is \`${ms(this.client.uptime, { long: true })}\``);
}
};

View File

@ -1,25 +0,0 @@
const Event = require('../../Structures/Event');
module.exports = class extends Event {
async run(message) {
const mentionRegex = RegExp(`^<@!${this.client.user.id}>$`);
const mentionRegexPrefix = RegExp(`^<@!${this.client.user.id}> `);
if (!message.guild || message.author.bot) return;
if (message.content.match(mentionRegex)) message.channel.send(`My prefix for ${message.guild.name} is \`${this.client.prefix}\`.`);
const prefix = message.content.match(mentionRegexPrefix) ?
message.content.match(mentionRegexPrefix)[0] : this.client.prefix;
// eslint-disable-next-line no-unused-vars
const [cmd, ...args] = message.content.slice(prefix.length).trim().split(/ +/g);
const command = this.client.commands.get(cmd.toLowerCase()) || this.client.commands.get(this.client.aliases.get(cmd.toLowerCase()));
if (command) {
command.run(message, args);
}
}
};

View File

@ -1,19 +0,0 @@
const Event = require('../Structures/Event');
module.exports = class extends Event {
constructor(...args) {
super(...args, {
once: true
});
}
run() {
console.log([
`Logged in as ${this.client.user.tag}`,
`Loaded ${this.client.commands.size} commands.`,
`Loaded ${this.client.events.size} events.`
].join('\n'));
}
};

View File

@ -1,40 +0,0 @@
const { Client, Collection } = require('discord.js');
const Util = require('./Util.js');
module.exports = class BotClient extends Client {
constructor(options = {}) {
super({
disableMentions: 'everyone'
});
this.validate(options);
this.commands = new Collection();
this.events = new Collection();
this.aliases = new Collection();
this.utils = new Util(this);
this.owners = options.owners;
}
validate(options) {
if (typeof options !== 'object') throw new TypeError('Options should be a type of Object.');
if (!options.token) throw new Error('You must pass a token for the client.');
this.token = options.token;
if (!options.prefix) throw new Error('You must pass a prefix for the client.');
if (typeof options.prefix !== 'string') throw new TypeError('Prefix should be a type of String.');
this.prefix = options.prefix;
}
async start(token = this.token) {
this.utils.loadCommands();
this.utils.loadEvents();
super.login(token);
}
};

View File

@ -1,17 +0,0 @@
module.exports = class Command {
constructor(client, name, options = {}) {
this.client = client;
this.name = options.name || name;
this.aliases = options.aliases || [];
this.description = options.description || 'No description provided.';
this.category = options.category || 'Miscellaneous';
this.usage = `${this.client.prefix}${this.name} ${options.usage || ''}`.trim();
}
// eslint-disable-next-line no-unused-vars
async run(message, args) {
throw new Error(`Command ${this.name} doesn't provide a run method.`);
}
};

View File

@ -1,15 +0,0 @@
/* eslint-disable no-unused-vars */
module.exports = class Event {
constructor(client, name, options = {}) {
this.name = name;
this.client = client;
this.type = options.once ? 'once' : 'on';
this.emitter = (typeof options.emitter === 'string' ? this.client[options.emitter] : options.emitter) || this.client;
}
async run(...args) {
throw new Error(`The run method has not been implemented in ${this.name}`);
}
};

View File

@ -1,81 +0,0 @@
const path = require('path');
const { promisify } = require('util');
const glob = promisify(require('glob'));
const Command = require('./Command.js');
const Event = require('./Event.js');
module.exports = class Util {
constructor(client) {
this.client = client;
}
isClass(input) {
return typeof input === 'function' &&
typeof input.prototype === 'object' &&
input.toString().substring(0, 5) === 'class';
}
get directory() {
return `${path.dirname(require.main.filename)}${path.sep}`;
}
trimArray(arr, maxLen = 10) {
if (arr.length > maxLen) {
const len = arr.length - maxLen;
arr = arr.slice(0, maxLen);
arr.push(`${len} more...`);
}
return arr;
}
formatBytes(bytes) {
if (bytes === 0) return '0 Bytes';
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return `${parseFloat((bytes / Math.pow(1024, i)).toFixed(2))} ${sizes[i]}`;
}
removeDuplicates(arr) {
return [...new Set(arr)];
}
capitalise(string) {
return string.split(' ').map(str => str.slice(0, 1).toUpperCase() + str.slice(1)).join(' ');
}
async loadCommands() {
return glob(`${this.directory}commands/**/*.js`).then(commands => {
for (const commandFile of commands) {
delete require.cache[commandFile];
const { name } = path.parse(commandFile);
const File = require(commandFile);
if (!this.isClass(File)) throw new TypeError(`Command ${name} doesn't export a class.`);
const command = new File(this.client, name.toLowerCase());
if (!(command instanceof Command)) throw new TypeError(`Command ${name} doesn't belong in commands.`);
this.client.commands.set(command.name, command);
if (command.aliases.length) {
for (const alias of command.aliases) {
this.client.aliases.set(alias, command.name);
}
}
}
});
}
async loadEvents() {
return glob(`${this.directory}events/**/*.js`).then(events => {
for (const eventFile of events) {
delete require.cache[eventFile];
const { name } = path.parse(eventFile);
const File = require(eventFile);
if (!this.isClass(File)) throw new TypeError(`Event ${name} doesn't export a class!`);
const event = new File(this.client, name.toLowerCase());
if (!(event instanceof Event)) throw new TypeError(`Event ${name} doesn't belong in the Events Directory.`);
this.client.events.set(event.name, event);
event.emitter[event.type](name, (...args) => event.run(...args));
}
});
}
};

View File

@ -1,5 +0,0 @@
const BotClient = require('./Structures/BotClient');
const config = require('../config.json');
const client = new BotClient(config);
client.start();