DiscordTickets/src/routes/api/client.js

43 lines
1.6 KiB
JavaScript
Raw Normal View History

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 closedTickets = tickets.filter(t => t.closedAt);
2022-07-16 01:19:42 +03:00
const users = await client.prisma.user.findMany({ select: { messageCount: true } });
cached = {
avatar: client.user.avatarURL(),
discriminator: client.user.discriminator,
id: client.user.id,
portal: process.env.PORTAL || null,
2022-09-05 14:43:27 +03:00
public: !!process.env.PUBLIC,
2022-07-16 01:19:42 +03:00
stats: {
activatedUsers: users.length,
2022-09-05 14:43:27 +03:00
archivedMessages: users.reduce((total, user) => total + user.messageCount, 0), // don't count archivedMessage table rows, they can be deleted
avgResolutionTime: ms(closedTickets.reduce((total, ticket) => total + (ticket.closedAt - ticket.createdAt), 0) ?? 1 / closedTickets.length),
avgResponseTime: ms(closedTickets.reduce((total, ticket) => total + (ticket.firstResponseAt - ticket.createdAt), 0) ?? 1 / closedTickets.length),
2022-07-16 01:19:42 +03:00
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,
};
2022-08-05 16:01:19 +03:00
await client.keyv.set(cacheKey, cached, ms('15m'));
2022-07-16 01:19:42 +03:00
}
return cached;
},
});