diff --git a/server/commands/closepoll.ts b/server/commands/closepoll.ts index ff3dfd8..8d0a3ba 100644 --- a/server/commands/closepoll.ts +++ b/server/commands/closepoll.ts @@ -3,7 +3,7 @@ import { Guild, GuildScheduledEvent, GuildScheduledEventEditOptions, GuildSchedu import { v4 as uuid } from 'uuid' import { client } from '../..' import { config } from '../configuration' -import { Emotes } from '../events/guildScheduledEventCreate' +import { Emotes } from '../events/autoCreateVoteByWPEvent' import { Maybe } from '../interfaces' import { logger } from '../logger' import { Command } from '../structures/command' diff --git a/server/events/announceManualWatchparty.ts b/server/events/announceManualWatchparty.ts new file mode 100644 index 0000000..da29f13 --- /dev/null +++ b/server/events/announceManualWatchparty.ts @@ -0,0 +1,48 @@ +import { GuildScheduledEvent, TextChannel } from "discord.js"; +import { v4 as uuid } from "uuid"; +import { client } from "../.."; +import { config } from "../configuration"; +import { createDateStringFromEvent } from "../helper/dateHelper"; +import { Maybe } from "../interfaces"; +import { logger } from "../logger"; + + +export const name = 'guildScheduledEventCreate' + +export async function execute(event: GuildScheduledEvent) { + const guildId = event.guildId + const requestId = uuid() + try { + if (!event.description) { + logger.debug("Got GuildScheduledEventCreate event. But has no description. Aborting.") + return + } + + if (event.description.includes("!wp")) { + logger.info("Got manual create event of watchparty event!", { guildId, requestId }) + if(event.description.includes("!private")) { + logger.info("Event description contains \"!private\". Won't announce.", { guildId, requestId }) + return + } + + const channel: Maybe = client.getAnnouncementChannelForGuild(guildId) + + if (!channel) { + logger.error("Could not obtain announcement channel. Aborting announcement.", { guildId, requestId }) + return + } + + const message = `[Watchparty] https://discord.com/events/${event.guildId}/${event.id} \nHey <@&${config.bot.announcement_role}>, wir gucken ${event.name} ${createDateStringFromEvent(event, guildId, requestId)}` + + channel.send(message) + } else { + logger.debug("Got GuildScheduledEventCreate event but no !wp in description. Not creating manual wp announcement.", { guildId, requestId }) + } + + } catch (error) { + // sendFailureDM(error) + logger.error(error, { guildId, requestId }) + } + + +} \ No newline at end of file diff --git a/server/events/guildScheduledEventCreate.ts b/server/events/autoCreateVoteByWPEvent.ts similarity index 89% rename from server/events/guildScheduledEventCreate.ts rename to server/events/autoCreateVoteByWPEvent.ts index 74071b2..6377928 100644 --- a/server/events/guildScheduledEventCreate.ts +++ b/server/events/autoCreateVoteByWPEvent.ts @@ -1,9 +1,9 @@ -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 { createDateStringFromEvent } from "../helper/dateHelper"; import { Maybe } from "../interfaces"; import { logger } from "../logger"; @@ -17,8 +17,7 @@ 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 }) @@ -39,9 +38,7 @@ export async function execute(event: GuildScheduledEvent) { 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] für https://discord.com/events/${event.guildId}/${event.id}\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` + let message = `[Abstimmung] für https://discord.com/events/${event.guildId}/${event.id}\n<@&${config.bot.announcement_role}> Es gibt eine neue Abstimmung für die nächste Watchparty ${createDateStringFromEvent(event, event.guildId, requestId)}! 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") diff --git a/server/events/deleteAnnouncementsWhenWPEnds.ts b/server/events/deleteAnnouncementsWhenWPEnds.ts new file mode 100644 index 0000000..df35f4b --- /dev/null +++ b/server/events/deleteAnnouncementsWhenWPEnds.ts @@ -0,0 +1,52 @@ +import { Collection, GuildScheduledEvent, GuildScheduledEventStatus, Message } from "discord.js"; +import { v4 as uuid } from "uuid"; +import { client } from "../.."; +import { logger } from "../logger"; + + +export const name = 'guildScheduledEventUpdate' + +export async function execute(oldEvent: GuildScheduledEvent, newEvent: GuildScheduledEvent) { + const requestId = uuid() + try { + if (!newEvent.guild) { + logger.error("Event has no guild, aborting.", { guildId: newEvent.guildId, requestId }) + return + } + const guildId = newEvent.guildId + + if (newEvent.description?.toLowerCase().includes("!wp") && newEvent.status === GuildScheduledEventStatus.Completed) { + logger.info("A watchparty ended. Cleaning up announcements!", { guildId, requestId }) + const announcementChannel = client.getAnnouncementChannelForGuild(newEvent.guild.id) + if (!announcementChannel) { + logger.error("Could not find announcement channel. Aborting", { guildId: newEvent.guild.id, requestId }) + return + } + + const events = await newEvent.guild.scheduledEvents.fetch() + + const wpAnnouncements = (await announcementChannel.messages.fetch()).filter(message => !message.cleanContent.includes("[initial]")) + const announcementsWithoutEvent = filterAnnouncementsByPendingWPs(wpAnnouncements, events) + logger.info(`Deleting ${announcementsWithoutEvent.length} announcements.`, {guildId, requestId}) + announcementsWithoutEvent.forEach(message => message.delete()) + } + } catch (error) { + logger.error(error, { guildId: newEvent.guildId, requestId }) + } +} + +function filterAnnouncementsByPendingWPs(messages: Collection>, events: Collection>): Message[] { + const filteredMessages: Message[] = [] + for (const message of messages.values()) { + let foundEventForMessage = false + for (const event of events.values()) { + if (message.cleanContent.includes(event.id)) { //announcement always has eventid because of eventbox + foundEventForMessage = true + } + } + if(!foundEventForMessage){ + filteredMessages.push(message) + } + } + return filteredMessages +} \ No newline at end of file diff --git a/server/events/guildMemberUpdate.ts b/server/events/handlePermJFAccountByRole.ts similarity index 100% rename from server/events/guildMemberUpdate.ts rename to server/events/handlePermJFAccountByRole.ts diff --git a/server/events/voiceStateUpdate.ts b/server/events/handleTempJFUserByVoiceEvent.ts similarity index 100% rename from server/events/voiceStateUpdate.ts rename to server/events/handleTempJFUserByVoiceEvent.ts diff --git a/server/events/guildScheduledEventUpdate.ts b/server/events/handleTempJFUsersByWPEvents.ts similarity index 79% rename from server/events/guildScheduledEventUpdate.ts rename to server/events/handleTempJFUsersByWPEvents.ts index eed87e7..42a719c 100644 --- a/server/events/guildScheduledEventUpdate.ts +++ b/server/events/handleTempJFUsersByWPEvents.ts @@ -1,6 +1,6 @@ import { GuildMember, GuildScheduledEvent, GuildScheduledEventStatus } from "discord.js"; import { v4 as uuid } from "uuid"; -import { client, jellyfinHandler } from "../.."; +import { jellyfinHandler } from "../.."; import { getGuildSpecificTriggerRoleId } from "../helper/roleFilter"; import { logger } from "../logger"; @@ -10,7 +10,7 @@ export const name = 'guildScheduledEventUpdate' export async function execute(oldEvent: GuildScheduledEvent, newEvent: GuildScheduledEvent) { try { const requestId = uuid() - logger.debug(`Got scheduledEvent update. New Event: ${JSON.stringify(newEvent, null, 2)}`, { guildId: newEvent.guildId, requestId }) + // logger.debug(`Got scheduledEvent update. New Event: ${JSON.stringify(newEvent, null, 2)}`, { guildId: newEvent.guildId, requestId }) if (!newEvent.guild) { logger.error("Event has no guild, aborting.", { guildId: newEvent.guildId, requestId }) return @@ -32,13 +32,7 @@ export async function execute(oldEvent: GuildScheduledEvent, newEvent: GuildSche if (newEvent.status === GuildScheduledEventStatus.Active) createJFUsers(members, newEvent.name, requestId) else { - const announcementChannel = await client.getAnnouncementChannelForGuild(newEvent.guild.id) - if(!announcementChannel) { - logger.error("Could not find announcement channel. Aborting", { guildId: newEvent.guild.id, requestId }) - return - } - const announcements = (await announcementChannel.messages.fetch()).filter(message => !message.pinned) - announcements.forEach(message => message.delete()) + members.forEach(member => { member.createDM().then(channel => channel.send(`Die Watchparty ist vorbei, dein Account wurde wieder gelöscht. Wenn du einen permanenten Account haben möchtest, melde dich bei Samantha oder Marukus.`)) }) diff --git a/server/helper/dateHelper.ts b/server/helper/dateHelper.ts new file mode 100644 index 0000000..914f533 --- /dev/null +++ b/server/helper/dateHelper.ts @@ -0,0 +1,16 @@ +import { format } from "date-fns"; +import { GuildScheduledEvent } from "discord.js"; +import { logger } from "../logger"; + +export function createDateStringFromEvent(event: GuildScheduledEvent, requestId: string, guildId?: string): string { + if(!event.scheduledStartAt) { + logger.error("Event has no start. Cannot create dateString.", {guildId, requestId}) + return `"habe keinen Startzeitpunkt ermitteln können"` + } + + const date = format(event.scheduledStartAt, "dd.MM") + const time = format(event.scheduledStartAt, "HH:mm") + + + return `am ${date} um ${time}` +} \ No newline at end of file