/* eslint-disable no-bitwise */ import moment from 'moment'; import { Message, Member } from 'eris'; import { Client, Command, RichEmbed } from '../class'; import acknowledgements from '../configs/acknowledgements.json'; import { whois as emotes } from '../configs/emotes.json'; export default class Whois extends Command { constructor(client: Client) { super(client); this.name = 'whois'; this.description = 'Provides information on a member.'; this.usage = 'whois [member]'; this.permissions = 0; this.guildOnly = true; this.enabled = true; } public async run(message: Message, args: string[]) { try { let member: Member; if (!args[0]) member = message.member; else { member = this.client.util.resolveMember(args.join(' '), this.client.guilds.get(this.client.config.guildID)); } if (!member) { return this.error(message.channel, 'Member not found.'); } const embed = new RichEmbed(); embed.setAuthor(`${member.user.username}#${member.user.discriminator}`, member.user.avatarURL); /* if (member.roles.includes('453689940140883988')) { embed.setThumbnail('https://static.libraryofcode.org/library_of_code_associate-badge.png'); } else if (member.roles.includes('455972169449734144')) { embed.setThumbnail('https://static.libraryofcode.org/library_of_code_sheriff-badge.png'); } else if (member.roles.includes('662163685439045632')) { embed.setThumbnail('https://static.libraryofcode.org/library_of_code_marshal-badge.png'); } else { embed.setThumbnail(member.avatarURL); } */ embed.setThumbnail(member.avatarURL); const ackResolve = this.resolveStaffInformation(member.id); let description = ''; if (ackResolve) { if (ackResolve?.title) { description += `${emotes.titleAndDepartment} __**${ackResolve.title}**__\n\n`; } if (ackResolve?.emailAddress) { description += `${emotes.email} ${ackResolve.emailAddress}\n`; } if (ackResolve?.gitlab) { description += `${emotes.gitlab} ${ackResolve.gitlab}\n`; } if (ackResolve?.github) { description += `${emotes.github} ${ackResolve.github}\n`; } if (ackResolve?.bio) { description += `${emotes.bio} *${ackResolve.bio}*\n`; } } description += `\n<@${member.id}>`; embed.setDescription(description); for (const role of member.roles.map((r) => this.client.guilds.get(this.client.config.guildID).roles.get(r)).sort((a, b) => b.position - a.position)) { if (role?.color !== 0) { embed.setColor(role.color); break; } } embed.addField('Status', `${member.status[0].toUpperCase()}${member.status.slice(1)}`, true); if (member.bot) { embed.addField('Platform', 'API/WebSocket', true); } else if (member.clientStatus.web === 'online' || member.clientStatus.web === 'idle' || member.clientStatus.web === 'dnd') { embed.addField('Platform', 'Web', true); } else if (member.clientStatus.desktop === 'online' || member.clientStatus.desktop === 'idle' || member.clientStatus.desktop === 'dnd') { embed.addField('Platform', 'Desktop', true); } else if (member.clientStatus.mobile === 'online' || member.clientStatus.mobile === 'idle' || member.clientStatus.mobile === 'dnd') { embed.addField('Platform', 'Mobile', true); } embed.addField('Joined At', `${moment(new Date(member.joinedAt)).format('dddd, MMMM Do YYYY, h:mm:ss A')} ET`, true); embed.addField('Created At', `${moment(new Date(member.user.createdAt)).format('dddd, MMMM Do YYYY, h:mm:ss A')} ET`, true); if (member.roles.length > 0) { embed.addField(`Roles [${member.roles.length}]`, member.roles.map((r) => this.client.guilds.get(this.client.config.guildID).roles.get(r)).sort((a, b) => b.position - a.position).map((r) => `<@&${r.id}>`).join(', ')); } const permissions: string[] = []; const serverAcknowledgements: string[] = []; const bit = member.permission.allow; if (this.client.guilds.get(this.client.config.guildID).ownerID === member.id) serverAcknowledgements.push('Server Owner'); if ((bit | 8) === bit) { permissions.push('Administrator'); serverAcknowledgements.push('Server Admin'); } if ((bit | 20) === bit) { permissions.push('Manage Server'); serverAcknowledgements.push('Server Manager'); } if ((bit | 10) === bit) permissions.push('Manage Channels'); if ((bit | 268435456) === bit) permissions.push('Manage Roles'); if ((bit | 8192) === bit) { permissions.push('Manage Messages'); serverAcknowledgements.push('Server Moderator'); } if ((bit | 134217728) === bit) permissions.push('Manage Nicknames'); if ((bit | 1073741824) === bit) permissions.push('Manage Emojis'); if ((bit | 4) === bit) permissions.push('Ban Members'); if ((bit | 2) === bit) permissions.push('Kick Members'); const account = await this.client.db.member.findOne({ userID: member.id }); if (account?.additional?.langs.length > 0) { const langs: string[] = []; for (const lang of account.additional.langs.sort((a, b) => a.localeCompare(b))) { switch (lang) { case 'asm': langs.push('<:AssemblyLanguage:703448714248716442> Assembly Language'); break; case 'cfam': langs.push('<:clang:553684262193332278> C/C++'); break; case 'csharp': langs.push('<:csharp:553684277280112660> C#'); break; case 'go': langs.push('<:Go:703449475405971466> Go'); break; case 'java': langs.push('<:Java:703449725181100135> Java'); break; case 'js': langs.push('<:JavaScriptECMA:703449987916496946> JavaScript'); break; case 'kt': langs.push('<:Kotlin:703450201838321684> Kotlin'); break; case 'py': langs.push('<:python:553682965482176513> Python'); break; case 'rb': langs.push('<:ruby:604812470451699712> Ruby'); break; case 'rs': langs.push('<:Rust:703450901960196206> Rust'); break; case 'swift': langs.push('<:Swift:703451096093294672> Swift'); break; case 'ts': langs.push('<:TypeScript:703451285789343774> TypeScript'); break; default: break; } } embed.addField('Known Languages', langs.join(', ')); } if (permissions.length > 0) { embed.addField('Permissions', permissions.join(', ')); } if (serverAcknowledgements.length > 0) { embed.addField('Acknowledgements', serverAcknowledgements[0]); } if (ackResolve?.acknowledgements) { embed.addField('Bot Acknowledgements', ackResolve.acknowledgements.join(', ')); } embed.setFooter(this.client.user.username, this.client.user.avatarURL); embed.setTimestamp(); return message.channel.createMessage({ embed }); } catch (err) { return this.client.util.handleError(err, message, this); } } public resolveStaffInformation(id: string) { return acknowledgements.find((m) => m.id === id); } }