Added query to lsemotes and searching other guilds
This commit is contained in:
parent
705e093999
commit
90c41c8df4
File diff suppressed because it is too large
Load Diff
|
@ -6,6 +6,7 @@ import {CommonLibrary, formatBytes, trimArray} from "../core/lib";
|
||||||
import {verificationLevels, filterLevels, regions, flags} from "../defs/info";
|
import {verificationLevels, filterLevels, regions, flags} from "../defs/info";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import utc from "moment";
|
import utc from "moment";
|
||||||
|
import {Guild} from "discord.js";
|
||||||
|
|
||||||
const {version} = require("../../package.json");
|
const {version} = require("../../package.json");
|
||||||
|
|
||||||
|
@ -73,73 +74,40 @@ export default new Command({
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
guild: new Command({
|
guild: new Command({
|
||||||
description: "Displays info about the current guild.",
|
description: "Displays info about the current guild or another guild.",
|
||||||
|
usage: "(<guild name>/<guild ID>)",
|
||||||
async run($: CommonLibrary): Promise<any> {
|
async run($: CommonLibrary): Promise<any> {
|
||||||
if ($.guild) {
|
if ($.guild) {
|
||||||
const members = await $.guild.members.fetch({
|
$.channel.send(await getGuildInfo($.guild, $.guild));
|
||||||
withPresences: true,
|
|
||||||
force: true
|
|
||||||
});
|
|
||||||
const roles = $.guild.roles.cache
|
|
||||||
.sort((a, b) => b.position - a.position)
|
|
||||||
.map((role) => role.toString());
|
|
||||||
const channels = $.guild.channels.cache;
|
|
||||||
const emojis = $.guild.emojis.cache;
|
|
||||||
const iconURL = $.guild.iconURL({dynamic: true});
|
|
||||||
const embed = new MessageEmbed()
|
|
||||||
.setDescription(`**Guild information for __${$.guild.name}__**`)
|
|
||||||
.setColor("BLUE");
|
|
||||||
if (iconURL)
|
|
||||||
embed
|
|
||||||
.setThumbnail(iconURL)
|
|
||||||
.addField("General", [
|
|
||||||
`**❯ Name:** ${$.guild.name}`,
|
|
||||||
`**❯ ID:** ${$.guild.id}`,
|
|
||||||
`**❯ Owner:** ${$.guild.owner?.user.tag} (${$.guild.ownerID})`,
|
|
||||||
`**❯ Region:** ${regions[$.guild.region]}`,
|
|
||||||
`**❯ Boost Tier:** ${$.guild.premiumTier ? `Tier ${$.guild.premiumTier}` : "None"}`,
|
|
||||||
`**❯ Explicit Filter:** ${filterLevels[$.guild.explicitContentFilter]}`,
|
|
||||||
`**❯ Verification Level:** ${verificationLevels[$.guild.verificationLevel]}`,
|
|
||||||
`**❯ Time Created:** ${moment($.guild.createdTimestamp).format("LT")} ${moment(
|
|
||||||
$.guild.createdTimestamp
|
|
||||||
).format("LL")} ${moment($.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:** ${$.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").size}`,
|
|
||||||
`**❯ Voice Channels:** ${channels.filter((channel) => channel.type === "voice").size}`,
|
|
||||||
`**❯ Boost Count:** ${$.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.status === "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 ? trimArray(roles) : "None"
|
|
||||||
)
|
|
||||||
.setTimestamp();
|
|
||||||
|
|
||||||
$.channel.send(embed);
|
|
||||||
} else {
|
} else {
|
||||||
$.channel.send("Please execute this command in a guild.");
|
$.channel.send("Please execute this command in a guild.");
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
any: new Command({
|
||||||
|
description: "Display info about a guild by finding its name or ID.",
|
||||||
|
async run($: CommonLibrary): Promise<any> {
|
||||||
|
// If a guild ID is provided (avoid the "number" subcommand because of inaccuracies), search for that guild
|
||||||
|
if ($.args.length === 1 && /^\d{17,19}$/.test($.args[0])) {
|
||||||
|
const id = $.args[0];
|
||||||
|
const guild = $.client.guilds.cache.get(id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
$.channel.send(await getGuildInfo(guild, $.guild));
|
||||||
|
} else {
|
||||||
|
$.channel.send(`None of the servers I'm in matches the guild ID \`${id}\`!`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const query: string = $.args.join(" ").toLowerCase();
|
||||||
|
const guild = $.client.guilds.cache.find((guild) => guild.name.toLowerCase().includes(query));
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
$.channel.send(await getGuildInfo(guild, $.guild));
|
||||||
|
} else {
|
||||||
|
$.channel.send(`None of the servers I'm in matches the query \`${query}\`!`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
user: new Command({
|
user: new Command({
|
||||||
|
@ -190,3 +158,64 @@ export default new Command({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
async function getGuildInfo(guild: Guild, currentGuild: Guild | null) {
|
||||||
|
const members = await guild.members.fetch({
|
||||||
|
withPresences: true,
|
||||||
|
force: true
|
||||||
|
});
|
||||||
|
const roles = guild.roles.cache.sort((a, b) => b.position - a.position).map((role) => role.toString());
|
||||||
|
const channels = guild.channels.cache;
|
||||||
|
const emojis = guild.emojis.cache;
|
||||||
|
const iconURL = guild.iconURL({dynamic: true});
|
||||||
|
const embed = new MessageEmbed().setDescription(`**Guild information for __${guild.name}__**`).setColor("BLUE");
|
||||||
|
const displayRoles = !!(currentGuild && guild.id === currentGuild.id);
|
||||||
|
if (iconURL) {
|
||||||
|
embed
|
||||||
|
.setThumbnail(iconURL)
|
||||||
|
.addField("General", [
|
||||||
|
`**❯ Name:** ${guild.name}`,
|
||||||
|
`**❯ ID:** ${guild.id}`,
|
||||||
|
`**❯ Owner:** ${guild.owner?.user.tag} (${guild.ownerID})`,
|
||||||
|
`**❯ Region:** ${regions[guild.region]}`,
|
||||||
|
`**❯ Boost Tier:** ${guild.premiumTier ? `Tier ${guild.premiumTier}` : "None"}`,
|
||||||
|
`**❯ Explicit Filter:** ${filterLevels[guild.explicitContentFilter]}`,
|
||||||
|
`**❯ Verification Level:** ${verificationLevels[guild.verificationLevel]}`,
|
||||||
|
`**❯ Time Created:** ${moment(guild.createdTimestamp).format("LT")} ${moment(
|
||||||
|
guild.createdTimestamp
|
||||||
|
).format("LL")} ${moment(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:** ${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").size}`,
|
||||||
|
`**❯ Voice Channels:** ${channels.filter((channel) => channel.type === "voice").size}`,
|
||||||
|
`**❯ Boost Count:** ${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.status === "dnd").size}`,
|
||||||
|
`**❯ Offline:** ${members.filter((member) => member.presence.status === "offline").size}`,
|
||||||
|
displayRoles ? "\u200b" : ""
|
||||||
|
])
|
||||||
|
.setTimestamp();
|
||||||
|
|
||||||
|
// Only add the roles if the guild the bot is sending the message to is the same one that's being requested.
|
||||||
|
if (displayRoles) {
|
||||||
|
embed.addField(
|
||||||
|
`Roles [${roles.length - 1}]`,
|
||||||
|
roles.length < 10 ? roles.join(", ") : roles.length > 10 ? trimArray(roles) : "None"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return embed;
|
||||||
|
}
|
||||||
|
|
|
@ -1,32 +1,81 @@
|
||||||
|
import {GuildEmoji} from "discord.js";
|
||||||
import {MessageEmbed} from "discord.js";
|
import {MessageEmbed} from "discord.js";
|
||||||
import Command from "../../core/command";
|
import Command from "../../core/command";
|
||||||
import {CommonLibrary} from "../../core/lib";
|
import {CommonLibrary} from "../../core/lib";
|
||||||
|
|
||||||
export default new Command({
|
export default new Command({
|
||||||
description: "Lists all emotes the bot has in it's registry,",
|
description: "Lists all emotes the bot has in it's registry,",
|
||||||
endpoint: true,
|
usage: "<regex pattern> (-flags)",
|
||||||
async run($: CommonLibrary): Promise<any> {
|
async run($: CommonLibrary): Promise<any> {
|
||||||
const nsfw: string | string[] = [];
|
displayEmoteList($, $.client.emojis.cache.array());
|
||||||
const pages = $.client.emojis.cache.filter((x) => !nsfw.includes(x.guild.id), this).array();
|
},
|
||||||
const pagesSplit = $(pages).split(20);
|
any: new Command({
|
||||||
$.log(pagesSplit);
|
description:
|
||||||
var embed = new MessageEmbed().setTitle("**Emoji list!**").setColor("AQUA");
|
"Filters emotes by via a regular expression. Flags can be added by adding a dash at the end. For example, to do a case-insensitive search, do %prefix%lsemotes somepattern -i",
|
||||||
let desc = "";
|
async run($: CommonLibrary): Promise<any> {
|
||||||
|
// If a guild ID is provided, filter all emotes by that guild (but only if there aren't any arguments afterward)
|
||||||
|
if ($.args.length === 1 && /^\d{17,19}$/.test($.args[0])) {
|
||||||
|
const guildID: string = $.args[0];
|
||||||
|
|
||||||
for (const emote of pagesSplit[0]) {
|
displayEmoteList($, $.client.emojis.cache.filter((emote) => emote.guild.id === guildID).array());
|
||||||
desc += `${emote} | ${emote.name}\n`;
|
} else {
|
||||||
|
// Otherwise, search via a regex pattern
|
||||||
|
let flags: string | undefined = undefined;
|
||||||
|
|
||||||
|
if (/^-[dgimsuy]{1,7}$/.test($.args[$.args.length - 1])) {
|
||||||
|
flags = $.args.pop().substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
displayEmoteList(
|
||||||
|
$,
|
||||||
|
$.client.emojis.cache
|
||||||
|
.filter((emote) => new RegExp($.args.join(" "), flags).test(emote.name))
|
||||||
|
.array()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
async function displayEmoteList($: CommonLibrary, emotes: GuildEmoji[]) {
|
||||||
|
emotes.sort((a, b) => {
|
||||||
|
const first = a.name.toLowerCase();
|
||||||
|
const second = b.name.toLowerCase();
|
||||||
|
|
||||||
|
if (first > second) return 1;
|
||||||
|
else if (first < second) return -1;
|
||||||
|
else return 0;
|
||||||
|
});
|
||||||
|
const sections = $(emotes).split(20);
|
||||||
|
const pages = sections.length;
|
||||||
|
const embed = new MessageEmbed().setTitle("**Emotes**").setColor("AQUA");
|
||||||
|
let desc = "";
|
||||||
|
|
||||||
|
// Gather the first page (if it even exists, which it might not if there no valid emotes appear)
|
||||||
|
if (pages > 0) {
|
||||||
|
for (const emote of sections[0]) {
|
||||||
|
desc += `${emote} ${emote.name} (**${emote.guild.name}**)\n`;
|
||||||
}
|
}
|
||||||
|
|
||||||
embed.setDescription(desc);
|
embed.setDescription(desc);
|
||||||
const msg = await $.channel.send({embed});
|
|
||||||
|
|
||||||
$.paginate(msg, $.author.id, pages.length, (page) => {
|
if (pages > 1) {
|
||||||
let desc = "";
|
embed.setTitle(`**Emotes** (Page 1 of ${pages})`);
|
||||||
for (const emote of pagesSplit[page]) {
|
const msg = await $.channel.send({embed});
|
||||||
desc += `${emote} | ${emote.name}\n`;
|
|
||||||
}
|
$.paginate(msg, $.author.id, pages, (page) => {
|
||||||
embed.setDescription(desc);
|
let desc = "";
|
||||||
msg.edit(embed);
|
for (const emote of sections[page]) {
|
||||||
});
|
desc += `${emote} ${emote.name} (**${emote.guild.name}**)\n`;
|
||||||
|
}
|
||||||
|
embed.setTitle(`**Emotes** (Page ${page + 1} of ${pages})`);
|
||||||
|
embed.setDescription(desc);
|
||||||
|
msg.edit(embed);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await $.channel.send({embed});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$.channel.send("No valid emotes found by that query.");
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
Loading…
Reference in New Issue