2022-07-16 01:19:42 +03:00
|
|
|
const ms = require('ms');
|
|
|
|
|
|
|
|
module.exports.get = () => ({
|
|
|
|
handler: async (req, res) => {
|
|
|
|
/** @type {import("client")} */
|
|
|
|
const client = res.context.config.client;
|
|
|
|
const cacheKey = 'cache/stats/client';
|
|
|
|
let cached = await client.keyv.get(cacheKey);
|
|
|
|
|
|
|
|
if (!cached) {
|
|
|
|
const tickets = await client.prisma.ticket.findMany({
|
|
|
|
select: {
|
|
|
|
createdAt: true,
|
|
|
|
firstResponseAt: true,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
const users = await client.prisma.user.findMany({ select: { messageCount: true } });
|
|
|
|
cached = {
|
|
|
|
avatar: client.user.avatarURL(),
|
|
|
|
discriminator: client.user.discriminator,
|
|
|
|
id: client.user.id,
|
2022-07-22 02:17:07 +03:00
|
|
|
portal: process.env.PORTAL || null,
|
2022-07-16 01:19:42 +03:00
|
|
|
stats: {
|
|
|
|
activatedUsers: users.length,
|
|
|
|
archivedMessages: users.reduce((total, user) => total + user.messageCount, 0), // don't count archivedMessage table rows, they get deleted
|
|
|
|
avgResponseTime: ms(tickets.reduce((total, ticket) => total + (ticket.firstResponseAt - ticket.createdAt), 0) ?? 1 / tickets.length),
|
|
|
|
categories: await client.prisma.category.count(),
|
|
|
|
guilds: client.guilds.cache.size,
|
|
|
|
members: client.guilds.cache.reduce((t, g) => t + g.memberCount, 0),
|
|
|
|
tags: await client.prisma.tag.count(),
|
|
|
|
tickets: tickets.length,
|
|
|
|
},
|
|
|
|
username: client.user.username,
|
|
|
|
};
|
|
|
|
await client.keyv.set(cacheKey, cached, ms('5m'));
|
|
|
|
}
|
|
|
|
|
|
|
|
return cached;
|
|
|
|
},
|
|
|
|
});
|