add userinfo
This commit is contained in:
parent
017c1839fc
commit
6717e96dfe
1 changed files with 323 additions and 0 deletions
323
src/modules/utility/userinfo.js
Normal file
323
src/modules/utility/userinfo.js
Normal file
|
@ -0,0 +1,323 @@
|
||||||
|
const Command = require("@lib/command.js");
|
||||||
|
|
||||||
|
const {
|
||||||
|
ActivityTypeNames,
|
||||||
|
APIEndpoints,
|
||||||
|
ApplicationFlags,
|
||||||
|
BadgeURLs,
|
||||||
|
CDNEndpoints,
|
||||||
|
UserFlags,
|
||||||
|
} = require("@util/dconstants.js");
|
||||||
|
const {
|
||||||
|
RegExp: {Snowflake: SNOWFLAKE_REGEX},
|
||||||
|
Icons,
|
||||||
|
} = require("@util/constants.js");
|
||||||
|
|
||||||
|
const {formatUsername, getDefaultAvatar} = require("@util/misc.js");
|
||||||
|
const {snowflakeToTimestamp} = require("@util/time.js");
|
||||||
|
|
||||||
|
const ONE_MONTH = 2628000;
|
||||||
|
|
||||||
|
const userinfo = new Command("userinfo");
|
||||||
|
userinfo.category = "utility";
|
||||||
|
userinfo.helpText = "Get information on a user";
|
||||||
|
userinfo.usage = "<user id>";
|
||||||
|
userinfo.addAlias("user");
|
||||||
|
userinfo.addAlias("uinfo");
|
||||||
|
userinfo.addAlias("ui");
|
||||||
|
userinfo.addAlias("profile");
|
||||||
|
userinfo.addAlias("whois");
|
||||||
|
userinfo.callback = async function (msg, line) {
|
||||||
|
let id;
|
||||||
|
if (!line || line == "") {
|
||||||
|
id = msg.author.id;
|
||||||
|
} else {
|
||||||
|
if (!SNOWFLAKE_REGEX.test(line)) return "Not a snowflake.";
|
||||||
|
id = line.match(SNOWFLAKE_REGEX)[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!id) return "Failed to get ID somehow.";
|
||||||
|
|
||||||
|
let user;
|
||||||
|
try {
|
||||||
|
user = await hf.bot.requestHandler.request("GET", APIEndpoints.USER(id), false);
|
||||||
|
} catch (err) {
|
||||||
|
if (err.code == 10013) {
|
||||||
|
return "User not found.";
|
||||||
|
} else {
|
||||||
|
return `${Icons.silk.error} Failed to get user:\n\`\`\`\n${err}\`\`\``;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!user) return `${Icons.silk.error} Failed to get user without erroring.`;
|
||||||
|
|
||||||
|
let guild, member;
|
||||||
|
if (msg.guildID) {
|
||||||
|
guild = msg.channel.guild || hf.bot.guilds.get(msg.guildID);
|
||||||
|
member = guild.members.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: horrible, probably needs to be moved out of this function for later
|
||||||
|
const badges = [];
|
||||||
|
|
||||||
|
if ((user.flags & UserFlags.STAFF) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.staff}](${BadgeURLs.staff})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.PARTNER) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.partner}](${BadgeURLs.partner})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.CERTIFIED_MODERATOR) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.certified_moderator}](${BadgeURLs.certified_moderator})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.HYPESQUAD) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.hypesquad}](${BadgeURLs.hypesquad})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.HYPESQUAD_ONLINE_HOUSE_1) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.hypesquad_house_1}](${BadgeURLs.hypesquad_house_1})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.HYPESQUAD_ONLINE_HOUSE_2) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.hypesquad_house_2}](${BadgeURLs.hypesquad_house_2})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.HYPESQUAD_ONLINE_HOUSE_3) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.hypesquad_house_3}](${BadgeURLs.hypesquad_house_3})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.BUG_HUNTER_LEVEL_1) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.bug_hunter_level_1}](${BadgeURLs.bug_hunter_level_1})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.BUG_HUNTER_LEVEL_2) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.bug_hunter_level_2}](${BadgeURLs.bug_hunter_level_2})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.ACTIVE_DEVELOPER) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.active_developer}](${BadgeURLs.active_developer})`);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.VERIFIED_DEVELOPER) !== 0) {
|
||||||
|
badges.push(Icons.badges.verified_developer);
|
||||||
|
}
|
||||||
|
if ((user.flags & UserFlags.PREMIUM_EARLY_SUPPORTER) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.early_supporter}](${BadgeURLs.early_supporter})`);
|
||||||
|
}
|
||||||
|
if (user.banner || user.avatar.startsWith("a_")) {
|
||||||
|
badges.push(`[${Icons.badges.premium}](${BadgeURLs.premium})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let boosting = member?.premiumSince;
|
||||||
|
let anyMember = member;
|
||||||
|
if (!boosting) {
|
||||||
|
for (const g of hf.bot.guilds.values()) {
|
||||||
|
const m = g.members.get(id);
|
||||||
|
if (!boosting && m?.premiumSince) {
|
||||||
|
boosting = m.premiumSince;
|
||||||
|
anyMember = m;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!anyMember) {
|
||||||
|
for (const g of hf.bot.guilds.values()) {
|
||||||
|
const m = g.members.get(id);
|
||||||
|
if (m != null) {
|
||||||
|
anyMember = m;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (boosting) {
|
||||||
|
let icon = Icons.badges.guild_booster_lvl1;
|
||||||
|
const delta = Date.now() - Math.floor(boosting / 1000);
|
||||||
|
if (delta >= ONE_MONTH * 2) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl2;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 3) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl3;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 6) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl4;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 9) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl5;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 12) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl6;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 15) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl7;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 18) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl8;
|
||||||
|
}
|
||||||
|
if (delta >= ONE_MONTH * 24) {
|
||||||
|
icon = Icons.badges.guild_booster_lvl9;
|
||||||
|
}
|
||||||
|
|
||||||
|
badges.push(`[${icon}](${BadgeURLs.premium})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let botDeleted = false;
|
||||||
|
if (user.bot) {
|
||||||
|
try {
|
||||||
|
const app = await hf.bot.requestHandler.request("GET", APIEndpoints.APPLICATION_RPC(id), false);
|
||||||
|
|
||||||
|
if ((app.flags & ApplicationFlags.APPLICATION_COMMAND_BADGE) !== 0) {
|
||||||
|
badges.push(`[${Icons.badges.bot_commands}](${BadgeURLs.bot_commands})`);
|
||||||
|
}
|
||||||
|
if ((app.flags & ApplicationFlags.AUTO_MODERATION_RULE_CREATE_BADGE) !== 0) {
|
||||||
|
badges.push(Icons.badges.automod);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
if (err.code == 10002) {
|
||||||
|
botDeleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.avatar_decoration_data?.expires_at || user.avatar_decoration_data?.sku_id == "1226939756617793606") {
|
||||||
|
badges.push(`[${Icons.badges.quest_completed}](${BadgeURLs.quest_completed})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultAvatar = getDefaultAvatar(id, user.discriminator ?? 0);
|
||||||
|
const avatar = user.avatar ? CDNEndpoints.USER_AVATAR(id, user.avatar) : defaultAvatar;
|
||||||
|
|
||||||
|
const banner = user.banner && CDNEndpoints.BANNER(id, user.banner);
|
||||||
|
|
||||||
|
const images = [];
|
||||||
|
|
||||||
|
const avatarRes = await fetch(avatar, {method: "HEAD"});
|
||||||
|
const avatarMod = avatarRes.headers.get("last-modified");
|
||||||
|
let avatarUrl = `[Avatar](${avatar})`;
|
||||||
|
if (avatarMod && avatar != defaultAvatar) {
|
||||||
|
const modDate = Math.floor(new Date(avatarMod).getTime() / 1000);
|
||||||
|
avatarUrl += ` \u2022 Updated <t:${modDate}:R>`;
|
||||||
|
}
|
||||||
|
images.push(avatarUrl);
|
||||||
|
|
||||||
|
if (banner) {
|
||||||
|
const bannerRes = await fetch(banner, {method: "HEAD"});
|
||||||
|
const bannerMod = bannerRes.headers.get("last-modified");
|
||||||
|
let bannerUrl = `[Banner](${banner})`;
|
||||||
|
if (bannerMod) {
|
||||||
|
const modDate = Math.floor(new Date(bannerMod).getTime() / 1000);
|
||||||
|
bannerUrl += ` \u2022 Updated <t:${modDate}:R>`;
|
||||||
|
}
|
||||||
|
images.push(bannerUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
const guildImages = [];
|
||||||
|
if (member) {
|
||||||
|
const guildAvatar = member.avatar && CDNEndpoints.GUILD_MEMBER_AVATAR(msg.guildID, id, member.avatar);
|
||||||
|
if (guildAvatar) {
|
||||||
|
const avatarRes = await fetch(guildAvatar, {method: "HEAD"});
|
||||||
|
const avatarMod = avatarRes.headers.get("last-modified");
|
||||||
|
let avatarUrl = `[Guild Avatar](${guildAvatar})`;
|
||||||
|
if (avatarMod) {
|
||||||
|
const modDate = Math.floor(new Date(avatarMod).getTime() / 1000);
|
||||||
|
avatarUrl += ` \u2022 Updated <t:${modDate}:R>`;
|
||||||
|
}
|
||||||
|
guildImages.push(avatarUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
const memberObj = await hf.bot.requestHandler.request("GET", APIEndpoints.GUILD_MEMBER(msg.guildID, id), true);
|
||||||
|
const guildBanner = memberObj.banner && CDNEndpoints.GUILD_MEMBER_BANNER(msg.guildID, id, memberObj.banner);
|
||||||
|
if (guildBanner) {
|
||||||
|
const bannerRes = await fetch(guildBanner, {method: "HEAD"});
|
||||||
|
const bannerMod = bannerRes.headers.get("last-modified");
|
||||||
|
let bannerUrl = `[Guild Banner](${guildBanner})`;
|
||||||
|
if (bannerMod) {
|
||||||
|
const modDate = Math.floor(new Date(bannerMod).getTime() / 1000);
|
||||||
|
bannerUrl += ` \u2022 Updated <t:${modDate}:R>`;
|
||||||
|
}
|
||||||
|
guildImages.push(bannerUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const shared = Array.from(hf.bot.guilds.values()).filter((g) => g.members.get(id) != null);
|
||||||
|
|
||||||
|
const descLines = [];
|
||||||
|
if (badges.length > 0) {
|
||||||
|
descLines.push(badges.join(""));
|
||||||
|
}
|
||||||
|
if (botDeleted) {
|
||||||
|
descLines.push("*This bot's application has been deleted*");
|
||||||
|
}
|
||||||
|
if (user.clan) {
|
||||||
|
// TODO: badge emojis via color aproximation of the default presets
|
||||||
|
descLines.push(`**${user.clan.tag}** (\`${user.clan.identity_guild_id}\`)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anyMember) {
|
||||||
|
const icons = [];
|
||||||
|
for (const platform of Object.keys(anyMember.clientStatus)) {
|
||||||
|
const status = anyMember.clientStatus[platform];
|
||||||
|
if (status == "offline") continue;
|
||||||
|
|
||||||
|
icons.push(Icons.presence[platform][status]);
|
||||||
|
}
|
||||||
|
|
||||||
|
descLines.push("");
|
||||||
|
if (icons.length > 0) {
|
||||||
|
descLines.push(icons.join(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const activity of anyMember.activities) {
|
||||||
|
if (activity.type == 4 || activity.type == 6) {
|
||||||
|
descLines.push(ActivityTypeNames[activity.type]);
|
||||||
|
} else {
|
||||||
|
descLines.push(`${ActivityTypeNames[activity.type]} **${activity.name}**`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const embed = {
|
||||||
|
color: user.accent_color,
|
||||||
|
thumbnail: {
|
||||||
|
url: avatar,
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
url: banner,
|
||||||
|
},
|
||||||
|
title: `${formatUsername(user)} ${user.bot ? Icons.boat : ""}`,
|
||||||
|
description: descLines.join("\n"),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "Created",
|
||||||
|
value: `<t:${Math.floor(snowflakeToTimestamp(id) / 1000)}:R>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
member && {
|
||||||
|
name: "Joined",
|
||||||
|
value: `<t:${Math.floor(member.joinedAt / 1000)}:R>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
member?.nick && {
|
||||||
|
name: "Nickname",
|
||||||
|
value: member.nick,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
member?.roles?.length > 0 && {
|
||||||
|
name: "Roles",
|
||||||
|
value: member.roles
|
||||||
|
.sort((a, b) => guild.roles.get(b).position - guild.roles.get(a).position)
|
||||||
|
.map((role) => `<@&${role}>`)
|
||||||
|
.join(", "),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
shared.length > 0 && {
|
||||||
|
name: "Bot Mutual Servers",
|
||||||
|
value: `${shared.length} servers`,
|
||||||
|
inline: false,
|
||||||
|
},
|
||||||
|
images.length > 0 && {
|
||||||
|
name: "\u200b",
|
||||||
|
value: images.join("\n"),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
guildImages.length > 0 && {
|
||||||
|
name: "\u200b",
|
||||||
|
value: guildImages.join("\n"),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
].filter((x) => !!x),
|
||||||
|
};
|
||||||
|
|
||||||
|
return {embeds: [embed]};
|
||||||
|
};
|
||||||
|
hf.registerCommand(userinfo);
|
Loading…
Reference in a new issue