mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2024-12-23 00:03:09 +02:00
feat: notify when staff are offline (closes #304)
This commit is contained in:
parent
ee90fed50a
commit
59dec28804
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "discord-tickets",
|
"name": "discord-tickets",
|
||||||
"version": "4.0.0-beta.9",
|
"version": "4.0.0-beta.10",
|
||||||
"private": "true",
|
"private": "true",
|
||||||
"description": "An open-source Discord bot for ticket management",
|
"description": "An open-source Discord bot for ticket management",
|
||||||
"main": "src/",
|
"main": "src/",
|
||||||
|
@ -23,10 +23,11 @@ module.exports = class Client extends FrameworkClient {
|
|||||||
GatewayIntentBits.Guilds,
|
GatewayIntentBits.Guilds,
|
||||||
GatewayIntentBits.GuildMembers,
|
GatewayIntentBits.GuildMembers,
|
||||||
GatewayIntentBits.GuildMessages,
|
GatewayIntentBits.GuildMessages,
|
||||||
|
GatewayIntentBits.GuildPresences,
|
||||||
],
|
],
|
||||||
partials: [
|
partials: [
|
||||||
Partials.Message,
|
|
||||||
Partials.Channel,
|
Partials.Channel,
|
||||||
|
Partials.Message,
|
||||||
Partials.Reaction,
|
Partials.Reaction,
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
@ -403,6 +403,11 @@ ticket:
|
|||||||
description: Your changes have been saved.
|
description: Your changes have been saved.
|
||||||
title: ✅ Ticket updated
|
title: ✅ Ticket updated
|
||||||
feedback: Thank you for your feedback.
|
feedback: Thank you for your feedback.
|
||||||
|
offline:
|
||||||
|
description:
|
||||||
|
There aren't any staff members available at the moment, so it may
|
||||||
|
take longer than usual to get a response.
|
||||||
|
title: 😴 We're not online
|
||||||
opening_message:
|
opening_message:
|
||||||
content: |
|
content: |
|
||||||
{staff}
|
{staff}
|
||||||
|
@ -690,6 +690,7 @@ module.exports = class TicketManager {
|
|||||||
const currentHours = workingHours[now.day()];
|
const currentHours = workingHours[now.day()];
|
||||||
const start = now.time(currentHours[0]);
|
const start = now.time(currentHours[0]);
|
||||||
const end = now.time(currentHours[1]);
|
const end = now.time(currentHours[1]);
|
||||||
|
let working = true;
|
||||||
|
|
||||||
if (currentHours[0] === currentHours[1] || now.isAfter(end)) { // staff have the day off or have finished for the day
|
if (currentHours[0] === currentHours[1] || now.isAfter(end)) { // staff have the day off or have finished for the day
|
||||||
// first look for the next working day *this* week (after today)
|
// first look for the next working day *this* week (after today)
|
||||||
@ -697,6 +698,7 @@ module.exports = class TicketManager {
|
|||||||
// if there isn't one, look for the next working day *next* week (before and including today's weekday)
|
// if there isn't one, look for the next working day *next* week (before and including today's weekday)
|
||||||
if (!nextIndex) nextIndex = workingHours.findIndex((hours, i) => i <= now.day() && hours[0] !== hours[1]);
|
if (!nextIndex) nextIndex = workingHours.findIndex((hours, i) => i <= now.day() && hours[0] !== hours[1]);
|
||||||
if (nextIndex) {
|
if (nextIndex) {
|
||||||
|
working = false;
|
||||||
const next = workingHours[nextIndex];
|
const next = workingHours[nextIndex];
|
||||||
let then = now.add(nextIndex - now.day(), 'day');
|
let then = now.add(nextIndex - now.day(), 'day');
|
||||||
if (nextIndex <= now.day()) then = then.add(1, 'week');
|
if (nextIndex <= now.day()) then = then.add(1, 'week');
|
||||||
@ -711,6 +713,7 @@ module.exports = class TicketManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (now.isBefore(start)) { // staff haven't started working yet
|
} else if (now.isBefore(start)) { // staff haven't started working yet
|
||||||
|
working = false;
|
||||||
const timestamp = Math.ceil(start.d.getTime() / 1000); // in seconds
|
const timestamp = Math.ceil(start.d.getTime() / 1000); // in seconds
|
||||||
await channel.send({
|
await channel.send({
|
||||||
embeds: [
|
embeds: [
|
||||||
@ -722,7 +725,25 @@ module.exports = class TicketManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: !staff
|
|
||||||
|
if (working) {
|
||||||
|
let online = 0;
|
||||||
|
for (const [, member] of message.channel.members) {
|
||||||
|
if (!await isStaff(message.channel.guild, member.id)) continue;
|
||||||
|
if (member.presence && member.presence !== 'offline') online++;
|
||||||
|
}
|
||||||
|
if (online === 0) {
|
||||||
|
await channel.send({
|
||||||
|
embeds: [
|
||||||
|
new ExtendedEmbedBuilder()
|
||||||
|
.setColor(category.guild.primaryColour)
|
||||||
|
.setTitle(getMessage('ticket.offline.title'))
|
||||||
|
.setDescription(getMessage('ticket.offline.description')),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
this.client.keyv.set(`offline/${channel.id}`, Date.now(), ms('1h'));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -182,6 +182,7 @@ module.exports = class extends Listener {
|
|||||||
} else {
|
} else {
|
||||||
const settings = await client.prisma.guild.findUnique({ where: { id: message.guild.id } });
|
const settings = await client.prisma.guild.findUnique({ where: { id: message.guild.id } });
|
||||||
if (!settings) return;
|
if (!settings) return;
|
||||||
|
const getMessage = client.i18n.getLocale(settings.locale);
|
||||||
let ticket = await client.prisma.ticket.findUnique({ where: { id: message.channel.id } });
|
let ticket = await client.prisma.ticket.findUnique({ where: { id: message.channel.id } });
|
||||||
|
|
||||||
if (ticket) {
|
if (ticket) {
|
||||||
@ -230,7 +231,25 @@ module.exports = class extends Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: if (!message.author.bot) staff status alert, working hours alerts
|
if (!message.author.bot) {
|
||||||
|
const key = `offline/${message.channel.id}`;
|
||||||
|
let online = 0;
|
||||||
|
for (const [, member] of message.channel.members) {
|
||||||
|
if (!await isStaff(message.channel.guild, member.id)) continue;
|
||||||
|
if (member.presence && member.presence !== 'offline') online++;
|
||||||
|
}
|
||||||
|
if (online === 0 && !client.keyv.has(key)) {
|
||||||
|
await message.channel.send({
|
||||||
|
embeds: [
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setColor(settings.primaryColour)
|
||||||
|
.setTitle(getMessage('ticket.offline.title'))
|
||||||
|
.setDescription(getMessage('ticket.offline.description')),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
client.keyv.set(key, Date.now(), ms('1h'));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto-tag
|
// auto-tag
|
||||||
|
Loading…
Reference in New Issue
Block a user