import { editTicket, getOpenTickets } from "@stealth-developers/db"; import { getTextChannel } from "@/lib"; import { addTimer } from "@/timers"; import { getGuildActor } from "../guild-actor"; import { channelName, closeTicket, messageChannel } from "./actions"; // time in minutes before a ticket is considered inactive const CLAIMANT_INACTIVITY_THRESHOLD = 0.25; const SUBJECT_INACTIVITY_THRESHOLD = 0.25; addTimer({ name: "Check if tickets are inactive", interval: 1, callback: async () => { const openTickets = await getOpenTickets(); for (const ticket of openTickets) { const { lastClaimantActivityAt, lastSubjectActivityAt } = ticket; if (lastClaimantActivityAt) { const now = Date.now(); const timeSinceLastActivity = now - lastClaimantActivityAt.getTime(); if (timeSinceLastActivity / 60_000 > CLAIMANT_INACTIVITY_THRESHOLD && ticket.channelId) { const channel = await getTextChannel(ticket.channelId); editTicket(ticket.id, { claimedAt: null, claimedBy: null, lastClaimantActivityAt: null, }); messageChannel(channel.id, { content: `This ticket has been automatically unclaimed due to inactivity, someone else will be with you shortly.`, }); channel .edit({ name: channelName(ticket.localId, "open"), }) .catch(); } continue; } if (!lastSubjectActivityAt && ticket.guild) { const now = Date.now(); const timeSinceLastActivity = now - ticket.openedAt.getTime(); if (timeSinceLastActivity / 60_000 > SUBJECT_INACTIVITY_THRESHOLD) { const guildActor = getGuildActor(ticket.guild.discordId); if (!guildActor) continue; await closeTicket( guildActor, ticket.id, { public: `Ticket closed after ${SUBJECT_INACTIVITY_THRESHOLD} minutes of inactivity`, private: null, }, true, ); } } } }, });