Compare commits

...

2 Commits

Author SHA1 Message Date
198a25d145 ping watch role when voting starts and closes 2023-06-13 23:15:03 +02:00
baefcf9bb9 add options for announcements 2023-06-13 21:12:32 +02:00
3 changed files with 38 additions and 14 deletions

View File

@ -1,4 +1,4 @@
import { Guild, GuildMember, Message, MessageCreateOptions, MessageReaction, Role, TextChannel, User } from 'discord.js' import { ApplicationCommandOptionType, Guild, GuildMember, Message, MessageCreateOptions, MessageReaction, Role, TextChannel, User } from 'discord.js'
import { v4 as uuid } from 'uuid' import { v4 as uuid } from 'uuid'
import { client } from '../..' import { client } from '../..'
import { config } from '../configuration' import { config } from '../configuration'
@ -13,12 +13,24 @@ let task: ScheduledTask
export default new Command({ export default new Command({
name: 'announce', name: 'announce',
description: 'Neues announcement im announcement Channel an alle senden.', description: 'Neues announcement im announcement Channel an alle senden.',
options: [], options: [{
name: "typ",
type: ApplicationCommandOptionType.String,
description:"Was für ein announcement?",
choices: [{name: "initial", value:"initial"},{name: "votepls", value:"votepls"},{name: "cancel", value:"cancel"}],
required: true
}],
run: async (interaction: RunOptions) => { run: async (interaction: RunOptions) => {
const command = interaction.interaction const command = interaction.interaction
const requestId = uuid() const requestId = uuid()
const guildId = command.guildId! const guildId = command.guildId!
logger.info("Got command for announcing!", { guildId, requestId }) const announcementType = command.options.data.find(option => option.name.includes("typ"))
logger.info(`Got command for announcing ${announcementType?.value}!`, { guildId, requestId })
if(!announcementType) {
logger.error("Did not get an announcement type!", { guildId, requestId })
return
}
if (!isAdmin(command.member)) { if (!isAdmin(command.member)) {
logger.info(`Announcement was requested by ${command.member.displayName} but they are not an admin! Not sending announcement.`, { guildId, requestId }) logger.info(`Announcement was requested by ${command.member.displayName} but they are not an admin! Not sending announcement.`, { guildId, requestId })
@ -26,8 +38,13 @@ export default new Command({
} else { } else {
logger.info(`User ${command.member.displayName} seems to be admin`) logger.info(`User ${command.member.displayName} seems to be admin`)
} }
sendAnnouncement(guildId, requestId)
if((<string>announcementType.value).includes("initial")) {
sendInitialAnnouncement(guildId, requestId)
command.followUp("Ist rausgeschickt!") command.followUp("Ist rausgeschickt!")
} else {
command.followUp(`${announcementType.value} ist aktuell noch nicht implementiert`)
}
} }
}) })
@ -35,15 +52,15 @@ function isAdmin(member: GuildMember): boolean {
return member.roles.cache.find((role, _) => role.id === config.bot.jf_admin_role) !== undefined return member.roles.cache.find((role, _) => role.id === config.bot.jf_admin_role) !== undefined
} }
async function sendAnnouncement(guildId: string, requestId: string): Promise<void> { async function sendInitialAnnouncement(guildId: string, requestId: string): Promise<void> {
logger.info("Sending announcement") logger.info("Sending initial announcement")
const announcementChannel: TextChannel = client.getAnnouncementChannelForGuild(guildId) const announcementChannel: TextChannel = client.getAnnouncementChannelForGuild(guildId)
const currentPinnedAnnouncementMessages = (await announcementChannel.messages.fetchPinned()).filter(message => message.cleanContent.includes("[announcement]")) const currentPinnedAnnouncementMessages = (await announcementChannel.messages.fetchPinned()).filter(message => message.cleanContent.includes("[initial]"))
currentPinnedAnnouncementMessages.forEach(async (message) => await message.unpin()) currentPinnedAnnouncementMessages.forEach(async (message) => await message.unpin())
currentPinnedAnnouncementMessages.forEach(message => message.delete()) currentPinnedAnnouncementMessages.forEach(message => message.delete())
const body = `[announcement] Hey! @everyone! Hier ist der Watchparty Bot vom Hartzarett. const body = `[initial] Hey! @everyone! Hier ist der Watchparty Bot vom Hartzarett.
Wir machen in Zukunft regelmäßig Watchparties! Falls du mitmachen möchtest, reagiere einfach auf diesen Post mit 🎫, dann bekommst du automatisch eine Rolle zugewiesen und wirst benachrichtigt sobald es in der Zukunft weitere Watchparties und Filme zum abstimmen gibt. Wir machen in Zukunft regelmäßig Watchparties! Falls du mitmachen möchtest, reagiere einfach auf diesen Post mit 🎫, dann bekommst du automatisch eine Rolle zugewiesen und wirst benachrichtigt sobald es in der Zukunft weitere Watchparties und Filme zum abstimmen gibt.

View File

@ -61,15 +61,16 @@ export async function closePoll(guild: Guild, requestId: string) {
} }
async function updateMessage(movie: string, message: Message, guildId: string, requestId: string) { async function updateMessage(movie: string, message: Message, guildId: string, requestId: string) {
const role = (await message.guild!.roles.fetch()).find(role => role.id === config.bot.announcement_role)
const body = `[Abstimmung beendet] Gewonnen hat: ${movie}` const body = `[Abstimmung beendet] Gewonnen hat: ${movie}`
.concat(message.cleanContent.substring("[Abstimmung]".length)) .concat(message.content.substring("[Abstimmung]".length))
const options: MessageEditOptions = { const options: MessageEditOptions = {
content: body, content: body,
allowedMentions: { parse: ["roles"] }
} }
logger.info("Updating message.", { guildId, requestId }) logger.info("Updating message.", { guildId, requestId })
message.edit(options) message.edit(options)
} }
async function updateEvent(votes: Vote[], guild: Guild, guildId: string, requestId: string) { async function updateEvent(votes: Vote[], guild: Guild, guildId: string, requestId: string) {

View File

@ -1,4 +1,4 @@
import { GuildScheduledEvent, Message, TextChannel } from "discord.js"; import { GuildScheduledEvent, Message, MessageCreateOptions, TextChannel } from "discord.js";
import { ScheduledTask, schedule } from "node-cron"; import { ScheduledTask, schedule } from "node-cron";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { client, jellyfinHandler } from "../.."; import { client, jellyfinHandler } from "../..";
@ -30,14 +30,20 @@ export async function execute(event: GuildScheduledEvent) {
const announcementChannel: TextChannel = client.getAnnouncementChannelForGuild(event.guildId) const announcementChannel: TextChannel = client.getAnnouncementChannelForGuild(event.guildId)
logger.debug(`Found channel ${JSON.stringify(announcementChannel, null, 2)}`, { guildId: event.guildId, requestId }) logger.debug(`Found channel ${JSON.stringify(announcementChannel, null, 2)}`, { guildId: event.guildId, requestId })
const role = (await event.guild!.roles.fetch()).find(role => role.id === config.bot.announcement_role)
let message = "[Abstimmung]\nEs gibt eine neue Abstimmung für die nächste Watchparty! Stimme hierunter für den nächsten Film ab!\n" let message = `[Abstimmung]\n<@&${role ? role.id : "hab die Rolle nicht gefunden"}> Es gibt eine neue Abstimmung für die nächste Watchparty! Stimme hierunter für den nächsten Film ab!\n`
for (let i = 0; i < movies.length; i++) { for (let i = 0; i < movies.length; i++) {
message = message.concat(Emotes[i]).concat(": ").concat(movies[i].name!).concat("\n") message = message.concat(Emotes[i]).concat(": ").concat(movies[i].name!).concat("\n")
} }
const sentMessage: Message<true> = await (await announcementChannel.fetch()).send(message) const options: MessageCreateOptions = {
allowedMentions: { parse: ["roles"]},
content: message
}
const sentMessage: Message<true> = await (await announcementChannel.fetch()).send(options)
for (let i = 0; i < movies.length; i++) { for (let i = 0; i < movies.length; i++) {
sentMessage.react(Emotes[i]) sentMessage.react(Emotes[i])