Skip to content

Instantly share code, notes, and snippets.

@dooderstem
Last active September 20, 2023 16:32
Show Gist options
  • Save dooderstem/c10835cca9a21d0f7652635d05bb7202 to your computer and use it in GitHub Desktop.
Save dooderstem/c10835cca9a21d0f7652635d05bb7202 to your computer and use it in GitHub Desktop.
DiscordBot
// ./app.js
const discord = require("discord.js");
const config = require("./config.json");
const fs = require("node:fs");
const path = require("node:path");
require("dotenv").config();

const intents = [
 discord.GatewayIntentBits.Guilds,
 discord.GatewayIntentBits.GuildMessages,
 discord.GatewayIntentBits.MessageContent,
];

const client = new discord.Client({
 disableEveryone: false,
 intents,
});

const $PREFIX = config.default_prefix;
client.commands = new discord.Collection();

["command"].forEach((handler) => {
 require(`./handlers/${handler}`)(client);
});

// on client ready
client.once(discord.Events.ClientReady, (c) => {
 console.log(`${c.user.tag} is Online!`);
 client.user.setPresence({
   activities: [
     {
       name: "with DISCORD.JS",
       type: discord.ActivityType.Playing,
     },
   ],
   status: "dnd",
 });
});

client.on("messageCreate", async (message) => {
 if (message.author.bot) return;
 if (!message.content.startsWith($PREFIX)) return;

 // array of everything in the message but the prefix
 const argsArr = message.content
   .toLowerCase()
   .slice($PREFIX.length)
   .trim()
   .split(/ +/g);
 // the command (coming right after the prefix)
 const cmd = argsArr.shift().toLowerCase();

 if (cmd.length === 0) return;
 let command = client.commands.get(cmd);
 if (command) {
   command.run(client, message, argsArr);
   console.log(command);
 }
 if (!command) console.log("Command Not Found");
 // bot mentioned
 const prefixMention = new RegExp(`^<@!?${client.user.id}>( |)$`);
 if (message.content.match(prefixMention)) {
   console.log(`${client.user.tag} was mentioned`);
   message.reply(`My prefix is \`${config.default_prefix}\``);
 }
});

client.login(process.env.TOKEN);
// handlers/command.js
const fs = require("node:fs");
const path = require("node:path");
const ascii = require("ascii-table");

const commands = path.join(__dirname, "../commands");

let table = new ascii(`${commands}`);
table.setHeading("Command", "Category", "Description", "Load status");

const read = (client) => {
 fs.readdirSync(commands).forEach((dir) => {
   const commandsContainer = `${commands}/${dir}/`;
   const commandsArray = fs
     .readdirSync(commandsContainer)
     .filter((file) => file.endsWith(".js"));

   for (const file of commandsArray) {
     const pull = require(`${commandsContainer}/${file}`);
     const { name, category, description, run } = pull;
     if (name) cmdName = name.toString().toLowerCase();
     else cmdName = "";

     if (cmdName && category && description && run) {
       client.commands.set(cmdName, pull);
       table.addRow(cmdName, category, description, "✅");
     } else {
       table.addRow(cmdName);
       continue;
     }
   }
 });
 console.log(table.toString());
};

module.exports = read;
// commands/uptime/uptime.js
function uptime(client) {
 let days = Math.floor(client.uptime / 86400000);
 let hrs = Math.floor(client.uptime / 3600000) % 24;
 let minutes = Math.floor(client.uptime / 60000) % 60;
 let seconds = Math.floor(client.uptime / 1000) % 60;
 return `__Uptime:__\n${days}d ${hrs}h ${minutes}m ${seconds}s`;
}
const obj = {
 name: "Uptime",
 category: "Utility",
 description: "Uptime",
 run: async (client, message, args) => {
   message.channel.send(uptime(client));
 },
};
module.exports = obj;
// Package things needed for the bot & commands.
//const Discord = require('discord.js');
//const client = new Discord.Client({partials: ['MESSAGE', 'CHANNEL', 'REACTION'], intents: [ Discord.Intents.FLAGS.GUILDS, Discord.Intents.FLAGS.GUILD_MESSAGES, Discord.Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Discord.Intents.FLAGS.GUILD_MEMBERS ]});
const {
Client,
GatewayIntentBits,
Partials,
ActivityType,
} = require('discord.js');
const client = new Client({
partials: [Partials.Message, Partials.Channel, Partials.Reaction],
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
GatewayIntentBits.GuildMessageReactions,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildPresences,
],
});
const ud = require('urban-dictionary');
const mysql = require('mysql');
const request = require('request');
const fs = require('fs');
const http = require('http');
const https = require('https');
const math = require('mathjs');
const unixTime = Math.floor(Date.now() / 1000);
// Create a connection to the mysql database
function mysqlConnect() {
var mysqlParams = mysql.createConnection({
host: '127.0.0.1',
user: 'ur user here',
password: 'ur password here',
database: 'ur db here',
});
return mysqlParams;
}
const objMysq = mysqlConnect();
// Functions needed for commands.
// Removes first word.
function rmF(str) {
const indexOfSpace = str.indexOf(' ');
if (indexOfSpace === -1) {
return '';
}
return str.substring(indexOfSpace + 1);
}
// Sleep function, when you want the command to pause for a bit.
function sleep(time, callback) {
var stop = new Date().getTime();
while (new Date().getTime() < stop + time) {}
callback();
}
const { SlashCommandBuilder, Routes } = require('discord.js');
const { REST } = require('@discordjs/rest');
const commands = [
new SlashCommandBuilder()
.setName('i')
.setDescription('Searches Google Images')
.addStringOption((option) =>
option
.setName('search')
.setDescription('enter search term')
.setRequired(true)
),
new SlashCommandBuilder()
.setName('r')
.setDescription('Performs your last /i search again'),
].map((command) => command.toJSON());
const rest = new REST({ version: '10' }).setToken('ur token here');
rest
.put(
Routes.applicationGuildCommands(
'ur server shit here ig',
'ur server shit here ig'
),
{ body: commands }
)
.then(() => console.log('Successfully registered application commands.'))
.catch(console.error);
client.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
const { commandName } = interaction;
var senderID = interaction.user.id;
(async () => {
//await needs async
const member = await interaction.guild.members.fetch(senderID); //remember you still need async
var membersStatus = member.presence?.status;
if (membersStatus === null || membersStatus === undefined) {
var membersStatus = 'offline';
}
// Determine if this chat is allowed to use the bot.
var sql = 'SELECT * FROM discord WHERE discord_id = ?';
objMysq.query(sql, [senderID], function (err, rows, fields) {
if (err) throw err;
var preventError = rows.length;
var errorCheck = preventError.toString();
if (errorCheck > '0') {
// Grab information about sender from the database.
const myTeleID = rows[0].discord_id;
const myBanned = rows[0].banned;
const aiEnabled = rows[0].ai_enabled;
const aaDmin = rows[0].ai_admin;
const myLastI = rows[0].last_search;
// Check whether or not the sender is banned from using JustaBot.
if (commandName === 'i') {
if (myBanned === 'yes') {
//interaction.reply("im confused. it seems ur offline <:pepesmile:961516075135160330>");
} else {
var searchQuery = interaction.options.getString('search');
//await interaction.reply('use -i for now <:pepeGrin:1001962955820245152>');
let query =
"UPDATE discord SET last_search='" +
searchQuery +
"' WHERE discord_id='" +
senderID +
"'";
objMysq.query(query, (err, rows) => {});
var r = request.get(
'seledity inc secret url delete this if u cant figure out how to make your own web server with google custom search api' +
searchQuery,
function (err, res, body) {
interaction.reply(body);
}
);
}
}
if (commandName === 'r') {
if (myBanned === 'yes') {
//interaction.reply("im confused. it seems ur offline <:pepesmile:961516075135160330>");
} else {
var searchQuery = interaction.options.getString('search');
//await interaction.reply('use -i for now <:pepeGrin:1001962955820245152>');
var sql = 'SELECT * FROM discord WHERE discord_id = ?';
objMysq.query(sql, [senderID], function (err, rows, fields) {
if (err) throw err;
var preventError = rows.length;
var errorCheck = preventError.toString();
if (errorCheck > '0') {
const myLastI = rows[0].last_search;
var r = request.get(
'seledity inc secret url delete this if u cant figure out how to make your own web server with google custom search api' +
myLastI,
function (err, res, body) {
interaction.reply(body);
}
);
}
});
}
}
}
});
})();
});
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
client.user.setPresence({
activities: [{ name: `you. GET OFF INVIS`, type: ActivityType.Watching }],
status: 'online',
});
});
// Add role if reaction is added.
client.on('messageReactionAdd', async (reaction, user) => {
if (reaction.message.partial) await reaction.message.fetch();
// Verify member if they react to the message in #rules.
if (reaction.message.id === '1007001408958103562') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('961462248281362453');
}
// 18+ Role.
if (reaction.message.id === '1027217198445502494') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('975932941291114547');
}
// #95a9df Role.
if (reaction.message.id === '1022701182071885904') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1007010851003322379');
}
// #518efa Role.
if (reaction.message.id === '1022702263858376754') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1017995357734584392');
}
// #0da2a2 Role.
if (reaction.message.id === '1022702315922276382') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1018714201218367559');
}
// #deb887 Role.
if (reaction.message.id === '1022702368518852638') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1020092393288110153');
}
// #078b00 Role.
if (reaction.message.id === '1022703032074518649') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1022696313453809674');
}
// #00e1ff Role.
if (reaction.message.id === '1022703064114802728') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1022696509344579615');
}
// #a725ff Role.
if (reaction.message.id === '1022703421993791619') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1022696608481157120');
}
// #ff6f6f Role.
if (reaction.message.id === '1022703953466622062') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1022703622515064923');
}
// #ee15c3 Role.
if (reaction.message.id === '1027215978867736646') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1023316979064508610');
}
// #ccc105 Role.
if (reaction.message.id === '1027216081988878436') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1023317213287043204');
}
// #ffc128 Role.
if (reaction.message.id === '1027216165229039668') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1023317358128930887');
}
// #6ceb00 Role.
if (reaction.message.id === '1027216226495234099') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1023317500512968834');
}
// #25ffc1 Role.
if (reaction.message.id === '1027216287899857077') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.add('1027215369468915712');
}
});
// Remove role if reaction is removed.
client.on('messageReactionRemove', async (reaction, user) => {
if (reaction.message.partial) await reaction.message.fetch();
// 18+ Role.
if (reaction.message.id === '1027217198445502494') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('975932941291114547');
}
// #95a9df Role.
if (reaction.message.id === '1022701182071885904') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1007010851003322379');
}
// #518efa Role.
if (reaction.message.id === '1022702263858376754') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1017995357734584392');
}
// #0da2a2 Role.
if (reaction.message.id === '1022702315922276382') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1018714201218367559');
}
// #deb887 Role.
if (reaction.message.id === '1022702368518852638') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1020092393288110153');
}
// #078b00 Role.
if (reaction.message.id === '1022703032074518649') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1022696313453809674');
}
// #00e1ff Role.
if (reaction.message.id === '1022703064114802728') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1022696509344579615');
}
// #a725ff Role.
if (reaction.message.id === '1022703421993791619') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1022696608481157120');
}
// #ff6f6f Role.
if (reaction.message.id === '1022703953466622062') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1022703622515064923');
}
// #ee15c3 Role.
if (reaction.message.id === '1027215978867736646') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1023316979064508610');
}
// #ccc105 Role.
if (reaction.message.id === '1027216081988878436') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1023317213287043204');
}
// #ffc128 Role.
if (reaction.message.id === '1027216165229039668') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1023317358128930887');
}
// #6ceb00 Role.
if (reaction.message.id === '1027216226495234099') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1023317500512968834');
}
// #25ffc1 Role.
if (reaction.message.id === '1027216287899857077') {
const member = await reaction.message.guild.members.fetch(user.id);
member.roles.remove('1027215369468915712');
}
});
client.on('messageCreate', (msg) => {
//console.log(msg);
const chatmsg = msg.content;
var senderID = msg.author.id;
(async () => {
//await needs async
const member = await msg.guild.members.fetch(senderID); //remember you still need async
var membersStatus = member.presence?.status;
if (membersStatus === null || membersStatus === undefined) {
var membersStatus = 'offline';
}
//console.log(membersStatus);
//if(membersStatus === 'offline') {
// console.log(membersStatus);
// msg.react('<:getoffinvis:1011041876096323714>');
// msg.react('❌');
// msg.react('💩');
// member.timeout(1 * 60 * 1000, 'chatting while invis')
// .then()
// .catch();
// }
//console.log(membersStatus);
const senderName = '<@' + senderID + '>';
const senderUsername = msg.author.username;
const senderQuery = rmF(chatmsg);
// tiktok 'command' (detects a tiktok url and uploads the video from it)
if (
chatmsg.startsWith('https://vm.tiktok.com/') === true ||
chatmsg.startsWith('https://www.tiktok.com/') === true
) {
msg.delete();
request(
{
uri:
'seledity inc secret url delete this if u cant figure out how to make your own web server with tiktok video grabbing sht' +
chatmsg,
},
function (error, response, body) {
(async function () {
await new Promise((resolve) =>
request(body)
.pipe(fs.createWriteStream('tiktok.mp4'))
.on('finish', function () {
msg.channel.send({
content: senderName + ' sent a tiktok :)',
files: ['./tiktok.mp4'],
});
})
);
})();
}
);
}
// ifunny 'command' (detects a ifunny url and uploads the video from it)
// if(chatmsg.startsWith('https://ifunny.co/video/') === true) {
// msg.delete();
// request({uri: "http://192.168.8.141/ifunny/?u=" + chatmsg},
// function(error, response, body) {
// (async function(){
// await new Promise(resolve =>
// request(body)
// .pipe(fs.createWriteStream('ifunny.h264'))
// .on('finish', async function () {
// console.log('ok now next');
// console.log('....');
// const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
// const ffmpeg = require('fluent-ffmpeg');
// ffmpeg.setFfmpegPath(ffmpegPath);
// var inFilename = "ifunny.h264";
// var outFilename = "ifunny.mp4";
// await new Promise(resolve =>
// ffmpeg(inFilename)
// .outputOptions('-r 24') // this will copy the data instead or reencode it
// .save(outFilename)
// .on('end', function () {
// console.log('ok');
// msg.channel.send({
// content: senderName + " sent an ifunny video :)",
/// files: [
// "./ifunny.mp4"
// ]
// });
// }));
// }));
// })()
// });
/// }
// if a command was detected, by a message starting with "-", this is called
const commandCheck = chatmsg.startsWith('-');
if (commandCheck === true) {
console.log('cmd');
// Determine if this chat is allowed to use the bot.
var sql = 'SELECT * FROM discord WHERE discord_id = ?';
objMysq.query(sql, [senderID], function (err, rows, fields) {
if (err) throw err;
var preventError = rows.length;
var errorCheck = preventError.toString();
if (errorCheck > '0') {
// Grab information about sender from the database.
const myTeleID = rows[0].discord_id;
const myBanned = rows[0].banned;
const aiEnabled = rows[0].ai_enabled;
const aaDmin = rows[0].ai_admin;
const myLastI = rows[0].last_search;
const invis_crackdown = rows[0].invis_crackdown;
// Check whether or not the sender is banned from using JustaBot.
if (myBanned === 'yes') {
msg.react('❌');
}
// If they aren't banned, listen to and respond to 'dash' commands.
else {
// Listen for command: -purge (deletes X msgs)
if (chatmsg.startsWith('-purge') === true && aaDmin === 'true') {
if (senderQuery === '') {
msg.react('🤨');
} else {
if (Number.isInteger(+senderQuery)) {
if (senderQuery >= 100 || senderQuery <= 0) {
msg.react('🤨');
} else {
var senderQueer = +senderQuery + 1;
var senderQueer = senderQueer.toString();
async function clear() {
const fetched = await msg.channel.messages.fetch({
limit: senderQueer,
});
msg.channel.bulkDelete(fetched);
}
clear();
}
} else {
//not a num
msg.react('🤨');
}
}
}
// joey cmd
if (chatmsg.startsWith('-joey') === true) {
msg.channel.send({
content: senderName + ', fuuuuuUTTTUREE',
files: ['./joey.mp4'],
});
}
// Listen for command: -ud (searches Urban Dictionary)
if (chatmsg.startsWith('-ud') === true) {
// If sender forgot to include a search query, let them know.
if (senderQuery === '') {
var botResponse =
senderName +
", you also have to include what you'd like to search for on Urban Dictionary.";
msg.reply(botResponse);
} else {
// Search the query on UD.
ud.define(senderQuery)
.then((results) => {
var word = results[0].word;
var def = results[0].definition;
var botResponse = '**' + word + '**' + ': ' + def;
msg.reply(botResponse);
// If there was an error, describe it below.
})
.catch((error) => {
var botResponse =
senderName +
', I could not find anything for "' +
senderQuery +
'" on Urban Dictionary.';
msg.reply(botResponse);
});
}
}
// Listen for command: -calc (does math n sht)
if (chatmsg.startsWith('-calc') === true) {
if (senderQuery !== '') {
const re = /\d+(\+|\-|\*|\/)\d+/;
if (re.test(senderQuery) === true) {
var doMath = math.evaluate(senderQuery);
var doMath = senderQuery + ' = ' + doMath;
msg.reply(doMath + '\n' + senderName);
} else {
msg.react('🤨');
msg.react('👎');
}
} else {
msg.react('🤨');
}
}
// Listen for command: -i, -R34, -gif, -r (searches Google Images through Google Custom Search API)
if (
chatmsg.startsWith('-i') === true ||
chatmsg.startsWith('-R34') === true ||
chatmsg.startsWith('-gif') === true ||
chatmsg.startsWith('-r') === true
) {
if (senderQuery === '' && chatmsg.startsWith('-r') === false) {
var botResponse =
senderName +
", you also have to include what you'd like to search for on Google Images.";
msg.reply(botResponse);
} else {
var searchQuery = senderQuery;
if (chatmsg.startsWith('-R34') === true) {
var searchQuery = senderQuery + ' rule 34';
}
if (chatmsg.startsWith('-gif') === true) {
var searchQuery = senderQuery + ' gif';
}
if (chatmsg.startsWith('-r') === true) {
var searchQuery = myLastI;
}
let query =
"UPDATE discord SET last_search='" +
searchQuery +
"' WHERE discord_id='" +
senderID +
"'";
objMysq.query(query, (err, rows) => {});
var r = request.get(
'seledity inc secret url delete this if u cant figure out how to make your own web server with google custom search api' +
searchQuery,
function (err, res, body) {
if (err !== null || body === 'failed' || body === 'quota') {
if (body === 'quota') {
var botResponse =
senderName +
', the daily quota for Google Images was exceeded. I saved "' +
searchQuery +
'" as your last search. Type "-r" later to try again.';
} else {
var botResponse =
senderName +
', an error occured while searching for "' +
searchQuery +
'" on Google Images. I will make one more search attempt for you.';
// vv Attempt to search for the image again, if it failed. vv
var retryI = request.get(
'seledity inc secret url delete this if u cant figure out how to make your own web server with google custom search api' +
searchQuery,
function (err, res, body) {
if (
err !== null ||
body === 'failed' ||
body === 'quota'
) {
if (body === 'quota') {
var botResponse =
senderName +
', the daily quota for Google Images was exceeded. I saved "' +
searchQuery +
'" as your last search. Type "-r" later to try again.';
} else {
var botResponse =
senderName +
', searching for "' +
searchQuery +
'" on Google Images failed again. Type "-r" to retry your search.';
}
msg.reply(botResponse);
} else {
var optionalPhotoRetry = {
caption: '"' + searchQuery + '" ' + senderName,
};
var embed = {
image: {
url: body.toString(),
},
};
msg.reply(body);
}
}
);
// ^^ Attempt to search for the image again, if it failed. ^^
}
msg.reply(botResponse);
} else {
var embed = {
image: {
url: body.toString(),
},
};
msg.reply(body);
}
}
);
}
}
// ai
if (chatmsg.startsWith('-ai') === true) {
if (aiEnabled === 'no') {
msg.react('❌');
} else {
const got = require('got');
const question = senderQuery;
(async () => {
const url =
'https://api.openai.com/v1/engines/davinci/completions';
const prompt = `${question}`;
const params = {
prompt: prompt,
max_tokens: 150,
temperature: 0.7,
frequency_penalty: 1,
presence_penalty: 0.4,
stop: '\nHuman',
};
const headers = {
Authorization: `Bearer ${process.env.OPENAI_SECRET_KEY}`,
};
try {
const response = await got
.post(url, { json: params, headers: headers })
.json();
output = `${prompt}${response.choices[0].text}`;
msg.reply(senderName + '\n\n' + output + '...');
} catch (err) {
console.log(err);
}
})();
}
}
// ai
}
} else {
var insdata = {
discord_id: senderID,
username: senderUsername,
last_search: 'undefined',
};
objMysq.query(
'INSERT INTO discord SET ?',
insdata,
function (err, result) {}
);
msg.react('🤨');
}
});
}
})(); // erase this
});
client.login('ur discord key sht');
// src/index.js
const Discord = require("discord.js");
require("dotenv").config();

const commandHandler = require("./commands");

const client = new Discord.Client();

client.once("ready", () => {
  console.log("🤖 Beep beep! I am ready!");
});

client.on("message", commandHandler);

client.login(process.env.BOT_TOKEN);
// src/commands/ping.js
module.exports = async (msg) => {
  await msg.channel.send("pong");
  console.log("Ping Pong! (sent)");
};
// src/commands/help.js
const { stripIndents } = require("common-tags");

module.exports = async (msg, { args, functions }) => {
  if (args.length === 0) {
    let commands = stripIndents`The Available commands are:
        ${"`" + Object.keys(functions).join("`, `") + "`"}

        tip: type ${"`!help <command>`"} for help that command`;
    msg.channel.send(commands);
  } else {
    const helptext = functions[args[0]];
    if (helptext) {
      msg.channel.send(helptext.helptext);
    } else {
      msg.channel.send("command not found");
    }
  }
};
// src/commands/whoami.js
const discord = require("discord.js");

module.exports = async (msg, { args }) => {
  let member;
  if (args.length === 0) {
    member = msg.member;
  } else {
    const allMembers = (await msg.guild.members.fetch())
      .array()
      .filter((member) => {
        try {
          return (
            member.user.username.toLowerCase() ===
              args.join(" ").toLowerCase() ||
            member.nickname.toLowerCase() === args.join(" ").toLowerCase()
          );
        } catch (err) {
          return false;
        }
      });

    if (allMembers.length == 0) {
      return msg.channel.send("❌ User not Found");
    }
    member = (
      await msg.guild.members.fetch({ query: args.join(" ") })
    ).array()[0];
  }

  const joined = Intl.DateTimeFormat("en-US").format(member.joinedAt);
  const created = Intl.DateTimeFormat("en-US").format(member.user.createdAt);

  const avatar = member.user.displayAvatarURL();

  const roles = async () =>
    Promise.all(
      member._roles
        .filter((r) => r.id !== msg.guild.id)
        .map(async (r) => await msg.guild.roles.fetch(r))
    ) || "none";

  var userRoles = await roles();

  if (userRoles.length == 0) {
    userRoles = ["This user has no roles."];
  }

  const inline = true;

  const embed = new discord.MessageEmbed("")
    .setFooter(member.displayName, avatar)
    .setThumbnail(avatar)
    .setColor(
      member.displayHexColor === "#000000" ? "#FFFFFF" : member.displayHexColor
    )
    .addField("status", member.displayName + " is " + member.presence.status)
    .addFields(
      { name: "Display Name", value: member.displayName, inline },
      { name: "Joined at", value: joined, inline },
      { name: "Roles", value: userRoles, inline },
      {
        name: "Bot",
        value: member.user.bot
          ? "This user is a bot, Beep Boop"
          : "This user is not a bot",
        inline,
      },
      { name: "account created", value: created, inline }
    )
    .setAuthor(member.displayName, avatar);

  msg.channel.send(embed);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment