From 9dd060aa2862fc7389af7819aa00323b486f7d8c Mon Sep 17 00:00:00 2001
From: Supositware <sup@libtar.de>
Date: Wed, 21 Sep 2022 20:55:47 +0200
Subject: [PATCH] Server and user info command

---
 commands/utility/serverinfo.js | 33 +++++++++++++++++
 commands/utility/userinfo.js   | 66 ++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+)
 create mode 100644 commands/utility/serverinfo.js
 create mode 100644 commands/utility/userinfo.js

diff --git a/commands/utility/serverinfo.js b/commands/utility/serverinfo.js
new file mode 100644
index 00000000..57cfb7d7
--- /dev/null
+++ b/commands/utility/serverinfo.js
@@ -0,0 +1,33 @@
+import { SlashCommandBuilder, EmbedBuilder } from 'discord.js';
+
+export default {
+	data: new SlashCommandBuilder()
+		.setName('serverinfo')
+		.setDescription('Show info about the server'),
+	category: 'utility',
+	alias: ['server'],
+	async execute(interaction, args, client) {
+		await interaction.guild.members.fetch();
+		const botCount = interaction.guild.members.cache.filter(member => member.user.bot).size;
+		const guildOwner = await client.users.fetch(interaction.guild.ownerId);
+
+		const addEmbed = new EmbedBuilder()
+			.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
+			.setTitle(interaction.guild.name)
+			.setThumbnail(interaction.guild.iconURL())
+			.addFields(
+				{ name: 'Number of users', value: (interaction.guild.memberCount - botCount).toString(), inline: true },
+				{ name: 'Number of bots', value: botCount.toString(), inline: true },
+				{ name: 'Total number of members', value: interaction.guild.memberCount.toString(), inline: true },
+				{ name: 'Number of channels', value: interaction.guild.channels.cache.size.toString(), inline: true },
+				{ name: '​', value:'​' },
+				{ name: 'Date when guild created', value: interaction.guild.createdAt.toString(), inline: true },
+				{ name: 'Owner', value: guildOwner.toString(), inline: true },
+			)
+			.setTimestamp();
+
+
+		interaction.reply({ embeds: [addEmbed] });
+
+	},
+};
diff --git a/commands/utility/userinfo.js b/commands/utility/userinfo.js
new file mode 100644
index 00000000..0d4534b5
--- /dev/null
+++ b/commands/utility/userinfo.js
@@ -0,0 +1,66 @@
+import { SlashCommandBuilder, EmbedBuilder } from 'discord.js';
+
+export default {
+	data: new SlashCommandBuilder()
+		.setName('userinfo')
+		.setDescription('Show info about a user')
+		.addMentionableOption(option =>
+			option.setName('user')
+				.setDescription('Which user you want to see the info of?')
+				.setRequired(false)),
+	category: 'utility',
+	alias: ['user'],
+	async execute(interaction, args, client) {
+		await interaction.guild.members.fetch();
+		let member = interaction.member;
+		let user = interaction.user;
+		if (args.user) {
+			user = client.users.resolve(args.user);
+			member = interaction.guild.members.resolve(args.user);
+		}
+		const Embed = new EmbedBuilder()
+			.setColor(member ? member.displayHexColor : 'Navy')
+			.setAuthor({ name: `${user.tag} (${user.id})`, iconURL:  user.displayAvatarURL() })
+			.addFields(
+				{ name: 'Current rank hex color', value: member ? member.displayHexColor : 'No rank color', inline: true },
+				{ name: 'Joined guild at', value: member ? member.joinedAt.toString() : 'Not in this guild', inline: true },
+				{ name: 'Date when account created', value: user.createdAt.toString(), inline: true },
+			)
+			.setTimestamp();
+
+
+		Embed.addFields({ name: '​', value: '​' });
+
+		// Show user status
+		/* Missing presence intent.
+		if (user.presence.activities[0]) {
+			Embed.addField('Presence', user.presence.activities[0], true);
+			if (user.presence.activities[0].details) Embed.addField('​', user.presence.activities[0].details, true);
+			if (user.presence.activities[0].state) Embed.addField('​', user.presence.activities[0].state, true);
+		}
+        */
+		// Is the user a bot?
+		if (user.bot) Embed.addFields({ name: 'Is a bot?', value: '✅', inline: true });
+
+		// Show on which platform they are using discord from if its not a bot
+		/* Missing presence intent.
+		if (user.presence.clientStatus && !user.bot) {
+			Embed.addFields({ name: '​', value: '​' });
+			if (user.presence.clientStatus.mobile) Embed.addFields({ name: 'Using discord on', value: '📱 ' + user.presence.clientStatus.mobile, inline: true });
+			if (user.presence.clientStatus.desktop) Embed.addFields({ name: 'Using discord on', value: '💻 ' + user.presence.clientStatus.desktop, inline: true });
+			if (user.presence.clientStatus.web) Embed.addFields({ name: 'Using discord on', value: '☁️ ' + user.presence.clientStatus.web, inline: true });
+		}
+        */
+
+		if (member) {
+			// Show since when this user have been boosting the current guild
+			if (member.premiumSince) Embed.addFields({ name: 'Boosting this guild since', value: member.premiumSince.toString(), inline: true });
+			// Show guild nickname
+			if (member.nickname) Embed.addFields({ name: 'Nickname', value: member.nickname, inline: true });
+			// Show member roles
+			if (member.roles) Embed.addFields({ name: 'Roles', value: `${[...member.roles.cache.values()].join(', ')}` });
+		}
+
+		return interaction.reply({ embeds: [Embed] });
+	},
+};