mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2024-12-23 08:13:09 +02:00
"stats" command
This commit is contained in:
parent
ceac5801fd
commit
448a1e793f
@ -34,6 +34,7 @@
|
|||||||
"cryptr": "^6.0.2",
|
"cryptr": "^6.0.2",
|
||||||
"discord.js": "^12.5.1",
|
"discord.js": "^12.5.1",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
|
"keyv": "^4.0.3",
|
||||||
"leeks.js": "^0.2.2",
|
"leeks.js": "^0.2.2",
|
||||||
"leekslazylogger-fastify": "^0.1.1",
|
"leekslazylogger-fastify": "^0.1.1",
|
||||||
"node-emoji": "^1.10.0",
|
"node-emoji": "^1.10.0",
|
||||||
|
@ -8,6 +8,7 @@ specifiers:
|
|||||||
discord.js: ^12.5.1
|
discord.js: ^12.5.1
|
||||||
dotenv: ^8.2.0
|
dotenv: ^8.2.0
|
||||||
eslint: ^7.21.0
|
eslint: ^7.21.0
|
||||||
|
keyv: ^4.0.3
|
||||||
leeks.js: ^0.2.2
|
leeks.js: ^0.2.2
|
||||||
leekslazylogger-fastify: ^0.1.1
|
leekslazylogger-fastify: ^0.1.1
|
||||||
mariadb: ^2.5.2
|
mariadb: ^2.5.2
|
||||||
@ -32,6 +33,7 @@ dependencies:
|
|||||||
cryptr: 6.0.2
|
cryptr: 6.0.2
|
||||||
discord.js: 12.5.1
|
discord.js: 12.5.1
|
||||||
dotenv: 8.2.0
|
dotenv: 8.2.0
|
||||||
|
keyv: 4.0.3
|
||||||
leeks.js: 0.2.2
|
leeks.js: 0.2.2
|
||||||
leekslazylogger-fastify: 0.1.1
|
leekslazylogger-fastify: 0.1.1
|
||||||
node-emoji: 1.10.0
|
node-emoji: 1.10.0
|
||||||
@ -1399,6 +1401,10 @@ packages:
|
|||||||
resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
|
resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/json-buffer/3.0.1:
|
||||||
|
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/json-schema-traverse/0.4.1:
|
/json-schema-traverse/0.4.1:
|
||||||
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
|
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
|
||||||
|
|
||||||
@ -1446,6 +1452,12 @@ packages:
|
|||||||
json-buffer: 3.0.0
|
json-buffer: 3.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/keyv/4.0.3:
|
||||||
|
resolution: {integrity: sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==}
|
||||||
|
dependencies:
|
||||||
|
json-buffer: 3.0.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/latest-version/5.1.0:
|
/latest-version/5.1.0:
|
||||||
resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
|
resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
const Command = require('../modules/commands/command');
|
const Command = require('../modules/commands/command');
|
||||||
|
const Keyv = require('keyv');
|
||||||
const { MessageEmbed } = require('discord.js');
|
const { MessageEmbed } = require('discord.js');
|
||||||
|
|
||||||
module.exports = class StatsCommand extends Command {
|
module.exports = class StatsCommand extends Command {
|
||||||
@ -13,10 +14,70 @@ module.exports = class StatsCommand extends Command {
|
|||||||
args: [],
|
args: [],
|
||||||
staff_only: true
|
staff_only: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.cache = new Keyv({
|
||||||
|
namespace: 'cache.commands.stats'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async execute(message, args) {
|
async execute(message) {
|
||||||
let settings = await message.guild.settings;
|
let settings = await message.guild.settings;
|
||||||
const i18n = this.client.i18n.getLocale(settings.locale);
|
const i18n = this.client.i18n.getLocale(settings.locale);
|
||||||
|
|
||||||
|
const messages = await this.client.db.models.Message.findAndCountAll();
|
||||||
|
|
||||||
|
let stats = await this.cache.get(message.guild.id);
|
||||||
|
|
||||||
|
if (!stats) {
|
||||||
|
let tickets = await this.client.db.models.Ticket.findAndCountAll({
|
||||||
|
where: {
|
||||||
|
guild: message.guild.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
stats = { // maths
|
||||||
|
tickets: tickets.count,
|
||||||
|
messages: settings.log_messages
|
||||||
|
? await messages.rows
|
||||||
|
.reduce(async (acc, row) => (await this.client.db.models.Ticket.findOne({
|
||||||
|
where: {
|
||||||
|
id: row.ticket
|
||||||
|
}
|
||||||
|
})).guild === message.guild.id
|
||||||
|
? await acc + 1
|
||||||
|
: await acc, 0)
|
||||||
|
: null,
|
||||||
|
|
||||||
|
response_time: Math.floor(tickets.rows.reduce((acc, row) => row.first_response
|
||||||
|
? acc + ((Math.abs(new Date(row.createdAt) - new Date(row.first_response)) / 1000) / 60)
|
||||||
|
: acc, 0) / tickets.count)
|
||||||
|
};
|
||||||
|
await this.cache.set(message.guild.id, stats, 60 * 60 * 1000); // cache for an hour
|
||||||
|
}
|
||||||
|
|
||||||
|
let guild_embed = new MessageEmbed()
|
||||||
|
.setColor(settings.colour)
|
||||||
|
.setTitle(i18n('commands.stats.response.guild.title'))
|
||||||
|
.setDescription(i18n('commands.stats.response.guild.description'))
|
||||||
|
.addField(i18n('commands.stats.fields.tickets'), stats.tickets, true)
|
||||||
|
.addField(i18n('commands.stats.fields.response_time.title'), i18n('commands.stats.fields.response_time.minutes', stats.response_time), true)
|
||||||
|
.setFooter(settings.footer, message.guild.iconURL());
|
||||||
|
|
||||||
|
if (stats.messages) guild_embed.addField(i18n('commands.stats.fields.messages'), stats.messages, true);
|
||||||
|
|
||||||
|
await message.channel.send(guild_embed);
|
||||||
|
|
||||||
|
if (this.client.guilds.cache.size > 1) {
|
||||||
|
await message.channel.send(
|
||||||
|
new MessageEmbed()
|
||||||
|
.setColor(settings.colour)
|
||||||
|
.setTitle(i18n('commands.stats.response.global.title'))
|
||||||
|
.setDescription(i18n('commands.stats.response.global.description'))
|
||||||
|
.addField(i18n('commands.stats.fields.tickets'), stats.tickets, true)
|
||||||
|
.addField(i18n('commands.stats.fields.response_time.title'), i18n('commands.stats.fields.response_time.minutes', stats.response_time), true)
|
||||||
|
.addField(i18n('commands.stats.fields.messages'), stats.messages, true)
|
||||||
|
.setFooter(settings.footer, message.guild.iconURL())
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -330,8 +330,25 @@
|
|||||||
"aliases": {},
|
"aliases": {},
|
||||||
"args": {},
|
"args": {},
|
||||||
"description": "Display ticket statistics",
|
"description": "Display ticket statistics",
|
||||||
|
"fields": {
|
||||||
|
"messages": "Messages",
|
||||||
|
"response_time": {
|
||||||
|
"minutes": "%s minutes",
|
||||||
|
"title": "Avg. response time"
|
||||||
|
},
|
||||||
|
"tickets": "Tickets"
|
||||||
|
},
|
||||||
"name": "stats",
|
"name": "stats",
|
||||||
"response": {}
|
"response": {
|
||||||
|
"global": {
|
||||||
|
"description": "Statistics about tickets across all guilds where this Discord TIckets instance is used.",
|
||||||
|
"title": "📊 Global stats"
|
||||||
|
},
|
||||||
|
"guild": {
|
||||||
|
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
|
||||||
|
"title": "📊 This server's stats"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"topic": {
|
"topic": {
|
||||||
"aliases": {},
|
"aliases": {},
|
||||||
|
Loading…
Reference in New Issue
Block a user