Skip to content

Commit

Permalink
updated a variety of commands, added stats command
Browse files Browse the repository at this point in the history
  • Loading branch information
sabattle committed Aug 30, 2020
1 parent da0b05a commit 9ddf699
Show file tree
Hide file tree
Showing 19 changed files with 249 additions and 133 deletions.
5 changes: 5 additions & 0 deletions package-lock.json

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

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"minimist": ">=1.2.2",
"moment": "^2.22.2",
"ms": "^2.1.2",
"node-os-utils": "^1.3.0",
"node-pre-gyp": "^0.11.0",
"node-schedule": "^1.3.2",
"winston": "^3.2.1",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/admin/setcrownchannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ module.exports = class SetCrownChannelCommand extends Command {
const crownChannel = this.getChannelFromMention(message, args[0]) || message.guild.channels.cache.get(args[0]);
if (!crownChannel || (crownChannel.type != 'text' && crownChannel.type != 'news') || !crownChannel.viewable)
return this.sendErrorMessage(message, 0, stripIndent`
Please mention an accessible text or announcement channel or provide a valid text or announcement channel ID
Please mention an accessible text or announcement channel or provide a valid text or announcement channel ID
`);

message.client.db.settings.updateCrownChannelId.run(crownChannel.id, message.guild.id);
Expand Down
30 changes: 12 additions & 18 deletions src/commands/info/botinfo.js
Original file line number Diff line number Diff line change
@@ -1,54 +1,48 @@
const Command = require('../Command.js');
const { MessageEmbed } = require('discord.js');
const pkg = require(__basedir + '/package.json');
const moment = require('moment');
const { owner } = require('../../utils/emojis.json');
const { oneLine } = require('common-tags');
const { oneLine, stripIndent } = require('common-tags');

module.exports = class BotInfoCommand extends Command {
constructor(client) {
super(client, {
name: 'botinfo',
aliases: ['bot', 'bi'],
usage: 'botinfo',
description: 'Fetches Calypso\'s information and statistics.',
description: 'Fetches Calypso\'s bot information.',
type: client.types.INFO
});
}
run(message) {
const botOwner = message.client.users.cache.get(message.client.ownerId);
const prefix = message.client.db.settings.selectPrefix.pluck().get(message.guild.id);
const d = moment.duration(message.client.uptime);
const days = (d.days() == 1) ? `${d.days()} day` : `${d.days()} days`;
const hours = (d.hours() == 1) ? `${d.hours()} hour` : `${d.hours()} hours`;
const tech = stripIndent`
Version :: ${pkg.version}
Library :: Discord.js v12.2.0
Environment :: Node.js v12.16.3
Database :: SQlite
`;
const embed = new MessageEmbed()
.setTitle('Calypso\'s Bot Information')
.setThumbnail('https://raw.githubusercontent.com/sabattle/CalypsoBot/develop/data/images/Calypso.png')
.setDescription(oneLine`
Calypso is a feature-rich Discord bot built with customizability in mind.
She comes packaged with a variety of commands and a
multitude of settings that can be tailored to your specific needs.
Her codebase also serves as a base framework to easily create Discord bots of all kinds.
She first went live on **February 22nd, 2018**.
`)
.addField('Username', message.client.user.username, true)
.addField('Discriminator', `\`#${message.client.user.discriminator}\``, true)
.addField('ID', `\`${message.client.user.id}\``, true)
.addField('Nickname', (message.guild.me.nickname) ? message.guild.me.nickname : '`None`', true)
.addField('Prefix', `\`${prefix}\``, true)
.addField('Detected Users', `\`${message.client.users.cache.size - 1}\``, true)
.addField('Servers', `\`${message.client.guilds.cache.size}\``, true)
.addField(`Owner ${owner}`, botOwner, true)
.addField('Uptime', `\`${days}\` and \`${hours}\``, true)
.addField('Current Version', `\`${pkg.version}\``, true)
.addField('Library/Environment', 'Discord.js 12.2.0\nNode.js 12.16.3', true)
.addField('Database', 'SQLite', true)
.addField('Client ID', `\`${message.client.user.id}\``, true)
.addField(`Developer ${owner}`, botOwner, true)
.addField('Tech', `\`\`\`asciidoc\n${tech}\`\`\``)
.addField(
'Links',
'**[Invite Me](https://discordapp.com/oauth2/authorize?client_id=416451977380364288&scope=bot&permissions=403008599) | ' +
'[Support Server](https://discord.gg/pnYVdut) | ' +
'[Repository](https://github.com/sabattle/CalypsoBot)**'
)
.setImage('https://raw.githubusercontent.com/sabattle/CalypsoBot/develop/data/images/Calypso_Title.png')
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp()
.setColor(message.guild.me.displayHexColor);
Expand Down
14 changes: 10 additions & 4 deletions src/commands/info/channelinfo.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const Command = require('../Command.js');
const { MessageEmbed } = require('discord.js');
const moment = require('moment');
const { voice } = require('../../utils/emojis.json');
const { oneLine } = require('common-tags');
const { oneLine, stripIndent } = require('common-tags');
const channelTypes = {
dm: 'DM',
text: 'Text',
Expand Down Expand Up @@ -39,15 +39,17 @@ module.exports = class ChannelInfoCommand extends Command {
.addField('Type', `\`${channelTypes[channel.type]}\``, true)
.addField('Members', `\`${channel.members.size}\``, true)
.addField('Bots', `\`${channel.members.array().filter(b => b.user.bot).length}\``, true)
.addField('Created On', moment(channel.createdAt).format('MMM DD YYYY'), true)
.addField('Created On', `\`${moment(channel.createdAt).format('MMM DD YYYY')}\``, true)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp()
.setColor(message.guild.me.displayHexColor);
if (channel.type === 'text') {
if (channel.topic) embed.setDescription(channel.topic);
embed // Text embed
.spliceFields(3, 0, { name: 'Rate Limit', value: `\`${channel.rateLimitPerUser}\``, inline: true })
.spliceFields(6, 0, { name: 'NSFW', value: `\`${channel.nsfw}\``, inline: true });
} else if (channel.type === 'news') {
embed // News embed
.spliceFields(6, 0, { name: 'NSFW', value: `\`${channel.nsfw}\``, inline: true });
} else if (channel.type === 'voice') {
embed // Voice embed
.spliceFields(0, 1, { name: 'Channel', value: `${voice} ${channel.name}`, inline: true })
Expand All @@ -56,7 +58,11 @@ module.exports = class ChannelInfoCommand extends Command {
const members = channel.members.array();
if (members.length > 0)
embed.addField('Members Joined', message.client.utils.trimArray(channel.members.array()).join(' '));
}
} else return this.sendErrorMessage(message, 0, stripIndent`
Please enter mention a valid text or announcement channel` +
' or provide a valid text, announcement, or voice channel ID'
);
if (channel.topic) embed.addField('Topic', channel.topic);
message.channel.send(embed);
}
};
12 changes: 5 additions & 7 deletions src/commands/info/members.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,18 @@ module.exports = class MembersCommand extends Command {
});
}
run(message) {
const online = message.guild.members.cache.array().filter((m) => m.presence.status === 'online').length;
const offline = message.guild.members.cache.array().filter((m) => m.presence.status === 'offline').length;
const dnd = message.guild.members.cache.array().filter((m) => m.presence.status === 'dnd').length;
const afk = message.guild.members.cache.array().filter((m) => m.presence.status === 'idle').length;
const members = message.guild.members.cache.array();
const online = members.filter((m) => m.presence.status === 'online').length;
const offline = members.filter((m) => m.presence.status === 'offline').length;
const dnd = members.filter((m) => m.presence.status === 'dnd').length;
const afk = members.filter((m) => m.presence.status === 'idle').length;
const embed = new MessageEmbed()
.setTitle(`Member Status [${message.guild.members.cache.size}]`)
.setThumbnail(message.guild.iconURL({ dynamic: true }))
.setDescription(stripIndent`
${emojis.online} **Online:** \`${online}\` members
${emojis.dnd} **Busy:** \`${dnd}\` members
${emojis.idle} **AFK:** \`${afk}\` members
${emojis.offline} **Offline:** \`${offline}\` members
`)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
Expand Down
16 changes: 11 additions & 5 deletions src/commands/info/permissions.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,19 @@ module.exports = class PermissionsCommand extends Command {
const member = this.getMemberFromMention(message, args[0]) ||
message.guild.members.cache.get(args[0]) ||
message.member;
const memberPermissions = member.permissions.toArray().sort((a, b) => {
return Object.keys(permissions).indexOf(a) - Object.keys(permissions).indexOf(b);
}).map(p => '`' + permissions[p] + '`').join('\n');

// Get member permissions
const memberPermissions = member.permissions.toArray();
const finalPermissions = [];
for (const permission in permissions) {
if (memberPermissions.includes(permission)) finalPermissions.push(`+ ${permissions[permission]}`);
else finalPermissions.push(`- ${permissions[permission]}`);
}

const embed = new MessageEmbed()
.setTitle(`${member.displayName}'s Permissions`)
.setThumbnail(member.user.displayAvatarURL())
.setDescription(memberPermissions)
.setThumbnail(member.user.displayAvatarURL({ dynamic: true }))
.setDescription(`\`\`\`diff\n${finalPermissions.join('\n')}\`\`\``)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp()
.setColor(member.displayHexColor);
Expand Down
13 changes: 6 additions & 7 deletions src/commands/info/ping.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const Command = require('../Command.js');
const { MessageEmbed } = require('discord.js');
const { pong } = require('../../utils/emojis.json');
const { stripIndent } = require('common-tags');

module.exports = class PingCommand extends Command {
constructor(client) {
Expand All @@ -14,16 +13,16 @@ module.exports = class PingCommand extends Command {
}
async run(message) {
const embed = new MessageEmbed()
.setDescription('Pinging...')
.setDescription('`Pinging...`')
.setColor(message.guild.me.displayHexColor);
const msg = await message.channel.send(embed);
const timestamp = (message.editedTimestamp) ? message.editedTimestamp : message.createdTimestamp; // Check if edited
const ping = stripIndent`
Latency: ${Math.floor(msg.createdTimestamp - timestamp)}ms
API Latency: ${Math.round(message.client.ws.ping)}ms
`;
const latency = `\`\`\`ini\n[ ${Math.floor(msg.createdTimestamp - timestamp)}ms ]\`\`\``;
const apiLatency = `\`\`\`ini\n[ ${Math.round(message.client.ws.ping)}ms ]\`\`\``;
embed.setTitle(`Pong! ${pong}`)
.setDescription(`\`\`\`prolog\n${ping}\`\`\``)
.setDescription('')
.addField('Latency', latency, true)
.addField('API Latency', apiLatency, true)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp();
msg.edit(embed);
Expand Down
19 changes: 12 additions & 7 deletions src/commands/info/roleinfo.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,13 @@ module.exports = class RoleInfoCommand extends Command {
if (!role)
return this.sendErrorMessage(message, 0, 'Please mention a role or provide a valid role ID');

const rolePermissions = role.permissions.toArray().sort((a, b) => {
return Object.keys(permissions).indexOf(a) - Object.keys(permissions).indexOf(b);
}).map(p => '`' + permissions[p] + '`');
// Get role permissions
const rolePermissions = role.permissions.toArray();
const finalPermissions = [];
for (const permission in permissions) {
if (rolePermissions.includes(permission)) finalPermissions.push(`+ ${permissions[permission]}`);
else finalPermissions.push(`- ${permissions[permission]}`);
}

// Reverse role position
const position = `\`${message.guild.roles.cache.size - role.position}\`/\`${message.guild.roles.cache.size}\``;
Expand All @@ -33,12 +37,13 @@ module.exports = class RoleInfoCommand extends Command {
.addField('Role', role, true)
.addField('Role ID', `\`${role.id}\``, true)
.addField('Position', position, true)
.addField('Hoisted', `\`${role.hoist}\``, true)
.addField('Mentionable', `\`${role.mentionable}\``, true)
.addField('Bot Role', `\`${role.managed}\``, true)
.addField('Color', `\`${role.hexColor.toUpperCase()}\``, true)
.addField('Members', `\`${role.members.size}\``, true)
.addField('Mentionable', `\`${role.mentionable}\``, true)
.addField('Created On', moment(role.createdAt).format('MMM DD YYYY'), true)
.addField('Permissions', (rolePermissions.length > 0) ? rolePermissions.join(' ') : '`None`')
.addField('Hoisted', `\`${role.hoist}\``, true)
.addField('Created On', `\`${moment(role.createdAt).format('MMM DD YYYY')}\``, true)
.addField('Permissions', `\`\`\`diff\n${finalPermissions.join('\n')}\`\`\``)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp()
.setColor(role.hexColor);
Expand Down
11 changes: 8 additions & 3 deletions src/commands/info/servercount.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
const Command = require('../Command.js');
const { MessageEmbed } = require('discord.js');
const { stripIndent } = require('common-tags');

module.exports = class ServerCountCommand extends Command {
constructor(client) {
super(client, {
name: 'servercount',
aliases: ['sc'],
aliases: ['usercount', 'sc', 'uc'],
usage: 'servercount',
description: 'Fetches Calypso\'s current server count.',
description: 'Fetches Calypso\'s current server and user count.',
type: client.types.INFO
});
}
run(message) {
const counts = stripIndent`
Servers :: ${message.client.guilds.cache.size}
Users :: ${message.client.users.cache.size}
`;
const embed = new MessageEmbed()
.setTitle('Calypso\'s Server Count')
.setDescription(`\`\`\`prolog\nCurrent Servers: ${message.client.guilds.cache.size}\`\`\``)
.setDescription(stripIndent`\`\`\`asciidoc\n${counts}\`\`\``)
.setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true }))
.setTimestamp()
.setColor(message.guild.me.displayHexColor);
Expand Down
Loading

0 comments on commit 9ddf699

Please sign in to comment.