2020-07-06 01:51:48 +03:00
|
|
|
import { utilityCmd } from "../types";
|
2020-07-06 02:57:21 +03:00
|
|
|
import { multiSorter, resolveMember, sorter } from "../../../utils";
|
|
|
|
import { GuildChannel, MessageContent } from "eris";
|
2020-07-06 01:51:48 +03:00
|
|
|
import { getCurrentUptime } from "../../../uptime";
|
|
|
|
import humanizeDuration from "humanize-duration";
|
|
|
|
import LCL from "last-commit-log";
|
|
|
|
import path from "path";
|
|
|
|
import moment from "moment-timezone";
|
2020-08-10 01:02:48 +03:00
|
|
|
import { getGuildTz, inGuildTz } from "../../../utils/timezones";
|
|
|
|
import { rootDir } from "../../../paths";
|
|
|
|
import { getDateFormat } from "../../../utils/dateFormats";
|
2020-07-06 01:51:48 +03:00
|
|
|
|
|
|
|
export const AboutCmd = utilityCmd({
|
|
|
|
trigger: "about",
|
|
|
|
description: "Show information about Zeppelin's status on the server",
|
|
|
|
permission: "can_about",
|
|
|
|
|
|
|
|
async run({ message: msg, pluginData }) {
|
|
|
|
const uptime = getCurrentUptime();
|
|
|
|
const prettyUptime = humanizeDuration(uptime, { largest: 2, round: true });
|
|
|
|
|
|
|
|
let lastCommit;
|
|
|
|
|
|
|
|
try {
|
2020-08-10 01:02:48 +03:00
|
|
|
const lcl = new LCL(rootDir);
|
2020-07-06 01:51:48 +03:00
|
|
|
lastCommit = await lcl.getLastCommit();
|
|
|
|
} catch (e) {} // tslint:disable-line:no-empty
|
|
|
|
|
|
|
|
let lastUpdate;
|
|
|
|
let version;
|
|
|
|
|
|
|
|
if (lastCommit) {
|
2020-08-10 01:02:48 +03:00
|
|
|
lastUpdate = inGuildTz(pluginData, moment.utc(lastCommit.committer.date, "X")).format(
|
|
|
|
getDateFormat(pluginData, "pretty_datetime"),
|
|
|
|
);
|
2020-07-06 01:51:48 +03:00
|
|
|
version = lastCommit.shortHash;
|
|
|
|
} else {
|
|
|
|
lastUpdate = "?";
|
|
|
|
version = "?";
|
|
|
|
}
|
|
|
|
|
|
|
|
const shard = pluginData.client.shards.get(pluginData.client.guildShardMap[pluginData.guild.id]);
|
|
|
|
|
|
|
|
const lastReload = humanizeDuration(Date.now() - pluginData.state.lastReload, {
|
|
|
|
largest: 2,
|
|
|
|
round: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
const basicInfoRows = [
|
|
|
|
["Uptime", prettyUptime],
|
|
|
|
["Last reload", `${lastReload} ago`],
|
|
|
|
["Last update", lastUpdate],
|
|
|
|
["Version", version],
|
|
|
|
["API latency", `${shard.latency}ms`],
|
2020-08-10 00:24:06 +03:00
|
|
|
["Server timezone", getGuildTz(pluginData)],
|
2020-07-06 01:51:48 +03:00
|
|
|
];
|
|
|
|
|
|
|
|
const loadedPlugins = Array.from(
|
|
|
|
pluginData
|
|
|
|
.getKnubInstance()
|
|
|
|
.getLoadedGuild(pluginData.guild.id)
|
|
|
|
.loadedPlugins.keys(),
|
|
|
|
);
|
|
|
|
loadedPlugins.sort();
|
|
|
|
|
|
|
|
const aboutContent: MessageContent = {
|
|
|
|
embed: {
|
|
|
|
title: `About ${pluginData.client.user.username}`,
|
|
|
|
fields: [
|
|
|
|
{
|
|
|
|
name: "Status",
|
|
|
|
value: basicInfoRows
|
|
|
|
.map(([label, value]) => {
|
|
|
|
return `${label}: **${value}**`;
|
|
|
|
})
|
|
|
|
.join("\n"),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: `Loaded plugins on this server (${loadedPlugins.length})`,
|
|
|
|
value: loadedPlugins.join(", "),
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const supporters = await pluginData.state.supporters.getAll();
|
|
|
|
supporters.sort(
|
|
|
|
multiSorter([
|
|
|
|
[r => r.amount, "DESC"],
|
|
|
|
[r => r.name.toLowerCase(), "ASC"],
|
|
|
|
]),
|
|
|
|
);
|
|
|
|
|
|
|
|
if (supporters.length) {
|
|
|
|
aboutContent.embed.fields.push({
|
|
|
|
name: "Zeppelin supporters 🎉",
|
|
|
|
value: supporters.map(s => `**${s.name}** ${s.amount ? `${s.amount}€/mo` : ""}`.trim()).join("\n"),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// For the embed color, find the highest colored role the bot has - this is their color on the server as well
|
|
|
|
const botMember = await resolveMember(pluginData.client, pluginData.guild, pluginData.client.user.id);
|
|
|
|
let botRoles = botMember.roles.map(r => (msg.channel as GuildChannel).guild.roles.get(r));
|
|
|
|
botRoles = botRoles.filter(r => !!r); // Drop any unknown roles
|
|
|
|
botRoles = botRoles.filter(r => r.color); // Filter to those with a color
|
|
|
|
botRoles.sort(sorter("position", "DESC")); // Sort by position (highest first)
|
|
|
|
if (botRoles.length) {
|
|
|
|
aboutContent.embed.color = botRoles[0].color;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Use the bot avatar as the embed image
|
|
|
|
if (pluginData.client.user.avatarURL) {
|
|
|
|
aboutContent.embed.thumbnail = { url: pluginData.client.user.avatarURL };
|
|
|
|
}
|
|
|
|
|
|
|
|
msg.channel.createMessage(aboutContent);
|
|
|
|
},
|
|
|
|
});
|