From 5138ddd8add598c870f791fad6d34a0d6ff1035a Mon Sep 17 00:00:00 2001
From: Supositware <sup@libtar.de>
Date: Wed, 17 Aug 2022 21:05:01 +0200
Subject: [PATCH] Stats command

---
 commands/utility/stats.js   | 52 +++++++++++++++++++++++++++++++++++++
 scripts/deploy-commands.cjs |  4 +++
 2 files changed, 56 insertions(+)
 create mode 100644 commands/utility/stats.js

diff --git a/commands/utility/stats.js b/commands/utility/stats.js
new file mode 100644
index 00000000..baf47857
--- /dev/null
+++ b/commands/utility/stats.js
@@ -0,0 +1,52 @@
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { MessageEmbed, version } from 'discord.js';
+import os from 'node:os';
+
+export default {
+	data: new SlashCommandBuilder()
+		.setName('stats')
+		.setDescription('Show some stats about the bot'),
+	async execute(interaction) {
+		const client = interaction.client;
+		const uptime = process.uptime();
+		const date = new Date(uptime * 1000);
+		const days = date.getUTCDate() - 1,
+			hours = date.getUTCHours(),
+			minutes = date.getUTCMinutes(),
+			seconds = date.getUTCSeconds();
+
+
+		const segments = [];
+
+		// Format the uptime string.
+		if (days > 0) segments.push(days + ' day' + ((days == 1) ? '' : 's'));
+		if (hours > 0) segments.push(hours + ' hour' + ((hours == 1) ? '' : 's'));
+		if (minutes > 0) segments.push(minutes + ' minute' + ((minutes == 1) ? '' : 's'));
+		if (seconds > 0) segments.push(seconds + ' second' + ((seconds == 1) ? '' : 's'));
+		const dateString = segments.join(', ');
+
+		const bytesToSize = (bytes) => {
+			const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+			if (bytes == 0) return '0 Byte';
+			const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
+			return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
+		};
+
+		const statsEmbed = new MessageEmbed()
+			.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
+			.setTitle('Bot stats')
+			.setAuthor({ name: client.user.tag, iconURL: client.user.displayAvatarURL(), url: 'https://libtar.de' })
+			.addField('Servers', client.guilds.cache.size.toString(), true)
+			.addField('Channels', client.channels.cache.size.toString(), true)
+			.addField('Users', client.users.cache.size.toString(), true)
+			.addField('Ram usage', `${bytesToSize(process.memoryUsage().heapUsed)}/${bytesToSize(os.totalmem)}`, true)
+			.addField('CPU', `${os.cpus()[0].model} (${os.cpus().length} core)`, true)
+			.addField('OS', `${os.platform()} ${os.release()}`, true)
+			.addField('Nodejs version', process.version, true)
+			.addField('Discord.js version', version, true)
+			.addField('Uptime', dateString, true)
+			.setTimestamp();
+
+		return interaction.reply({ embeds: [statsEmbed] });
+	},
+};
diff --git a/scripts/deploy-commands.cjs b/scripts/deploy-commands.cjs
index f07bc0db..aa5911d5 100644
--- a/scripts/deploy-commands.cjs
+++ b/scripts/deploy-commands.cjs
@@ -81,6 +81,10 @@ const commands = [
 	new SlashCommandBuilder()
 		.setName('about')
 		.setDescription('About me (The bot)'),
+
+	new SlashCommandBuilder()
+		.setName('stats')
+		.setDescription('Show some stats about the bot'),
 ]
 	.map(command => command.toJSON());