import { format } from "date-fns"; import { GuildScheduledEvent, Message, MessageCreateOptions, TextChannel } from "discord.js"; import { ScheduledTask } from "node-cron"; import { v4 as uuid } from "uuid"; import { client, yavinJellyfinHandler } from "../.."; import { config } from "../configuration"; import { Maybe } from "../interfaces"; import { logger } from "../logger"; import { SemanticClassificationFormat } from "typescript"; export const name = 'guildScheduledEventCreate' export enum Emotes { "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟" } export const NONE_OF_THAT = "❌" export let task: ScheduledTask | undefined export async function execute(event: GuildScheduledEvent) { const requestId = uuid() logger.debug(`New event created: ${JSON.stringify(event, null, 2)}`, { guildId: event.guildId, requestId }) if (event.name.toLowerCase().includes("!nextwp")) { logger.info("Event was a placeholder event to start a new watchparty and voting. Creating vote!", { guildId: event.guildId, requestId }) logger.debug("Renaming event", { guildId: event.guildId, requestId }) event.edit({ name: "Watchparty - Voting offen" }) const movies = await yavinJellyfinHandler.getRandomMovieNames(5, event.guildId, requestId) logger.info(`Got ${movies.length} random movies. Creating voting`, { guildId: event.guildId, requestId }) logger.debug(`Movies: ${JSON.stringify(movies)}`, { guildId: event.guildId, requestId }) const announcementChannel: Maybe = client.getAnnouncementChannelForGuild(event.guildId) if(!announcementChannel) { logger.error("Could not find announcement channel. Aborting", { guildId: event.guildId, requestId }) return } logger.debug(`Found channel ${JSON.stringify(announcementChannel, null, 2)}`, { guildId: event.guildId, requestId }) if(!event.scheduledStartAt) { logger.info("EVENT DOES NOT HAVE STARTDATE; CANCELLING", {guildId: event.guildId, requestId}) return } const date = format(event.scheduledStartAt, "dd.MM") const time = format(event.scheduledStartAt, "HH:mm") let message = `[Abstimmung]\n<@&${config.bot.announcement_role}> Es gibt eine neue Abstimmung für die nächste Watchparty am ${date} um ${time}! Stimme hierunter für den nächsten Film ab!\n` for (let i = 0; i < movies.length; i++) { message = message.concat(Emotes[i]).concat(": ").concat(movies[i]).concat("\n") } message = message.concat(NONE_OF_THAT).concat(": Wenn dir nichts davon gefällt.") const options: MessageCreateOptions = { allowedMentions: { parse: ["roles"]}, content: message } const sentMessage: Message = await (await announcementChannel.fetch()).send(options) for (let i = 0; i < movies.length; i++) { sentMessage.react(Emotes[i]) } sentMessage.react(NONE_OF_THAT) // sentMessage.pin() //todo: uncomment when bot has permission to pin messages. Also update closepoll.ts to only fetch pinned messages } }