implement announcement role management by reaction
This commit is contained in:
		@@ -1,11 +1,14 @@
 | 
				
			|||||||
import { Guild, GuildMember, GuildScheduledEvent, GuildScheduledEventEditOptions, GuildScheduledEventSetStatusArg, GuildScheduledEventStatus, Message, MessageCreateOptions, MessageEditOptions, TextChannel, messageLink } from 'discord.js'
 | 
					import { 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 { config } from '../configuration'
 | 
					import { config } from '../configuration'
 | 
				
			||||||
import { Emotes } from '../events/guildScheduledEventCreate'
 | 
					 | 
				
			||||||
import { logger } from '../logger'
 | 
					import { logger } from '../logger'
 | 
				
			||||||
import { Command } from '../structures/command'
 | 
					import { Command } from '../structures/command'
 | 
				
			||||||
import { RunOptions } from '../types/commandTypes'
 | 
					import { RunOptions } from '../types/commandTypes'
 | 
				
			||||||
import { client } from '../..'
 | 
					import { off } from 'process'
 | 
				
			||||||
 | 
					import { ScheduledTask, schedule } from 'node-cron'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let task: ScheduledTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default new Command({
 | 
					export default new Command({
 | 
				
			||||||
    name: 'announce',
 | 
					    name: 'announce',
 | 
				
			||||||
@@ -29,7 +32,7 @@ export default new Command({
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function isAdmin(member: GuildMember): boolean {
 | 
					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 sendAnnouncement(guildId: string, requestId: string): Promise<void> {
 | 
				
			||||||
@@ -47,5 +50,55 @@ Für eine Erklärung wie das alles funktioniert mach einfach /mitgucken für ein
 | 
				
			|||||||
        content: body
 | 
					        content: body
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const message: Message<true> = await announcementChannel.send(options)
 | 
					    const message: Message<true> = await announcementChannel.send(options)
 | 
				
			||||||
    message.react("🎫")
 | 
					    await message.react("🎫")
 | 
				
			||||||
 | 
					    // await message.pin()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    task = schedule("* * * * * *", async () => {
 | 
				
			||||||
 | 
					        const reactions = await message.reactions.resolve("🎫")
 | 
				
			||||||
 | 
					        if (reactions) {
 | 
				
			||||||
 | 
					            manageAnnouncementRoles(message.guild, reactions)
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            logger.error("Did not get reactions! Aborting!", { guildId, requestId })
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function manageAnnouncementRoles(guild: Guild, reaction: MessageReaction) {
 | 
				
			||||||
 | 
					    const requestId = uuid()
 | 
				
			||||||
 | 
					    const guildId = guild.id
 | 
				
			||||||
 | 
					    logger.info("Managing roles", { guildId, requestId })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const announcementRole: Role | undefined = (await guild.roles.fetch()).find(role => role.id === config.bot.announcement_role)
 | 
				
			||||||
 | 
					    if (!announcementRole) {
 | 
				
			||||||
 | 
					        logger.error(`Could not find announcement role! Aborting! Was looking for role with id: ${config.bot.announcement_role}`, { guildId, requestId })
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const usersWhoWantRole: User[] = (await reaction.users.fetch()).filter(user => !user.bot).map(user => user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const allUsers = (await guild.members.fetch())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const usersWhoHaveRole: GuildMember[] = allUsers
 | 
				
			||||||
 | 
					        .filter(member=> member.roles.cache
 | 
				
			||||||
 | 
					            .find(role => role.id === config.bot.announcement_role) !== undefined)
 | 
				
			||||||
 | 
					        .map(member => member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const usersWhoNeedRoleRevoked: GuildMember[] = usersWhoHaveRole
 | 
				
			||||||
 | 
					        .filter(userWhoHas => !usersWhoWantRole.map(wanter => wanter.id).includes(userWhoHas.id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const usersWhoDontHaveRole: GuildMember[] = allUsers
 | 
				
			||||||
 | 
					        .filter(member => member.roles.cache
 | 
				
			||||||
 | 
					            .find(role=> role.id === config.bot.announcement_role) === undefined)
 | 
				
			||||||
 | 
					        .map(member => member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const usersWhoNeedRole: GuildMember[] = usersWhoDontHaveRole
 | 
				
			||||||
 | 
					        .filter(userWhoNeeds => usersWhoWantRole.map(wanter => wanter.id).includes(userWhoNeeds.id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    logger.debug(`Theses users will get the role removed: ${JSON.stringify(usersWhoNeedRoleRevoked)}`, {guildId, requestId})
 | 
				
			||||||
 | 
					    logger.debug(`Theses users will get the role added: ${JSON.stringify(usersWhoNeedRole)}`, {guildId, requestId})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    usersWhoNeedRoleRevoked.forEach(user => user.roles.remove(announcementRole))
 | 
				
			||||||
 | 
					    usersWhoNeedRole.forEach(user => user.roles.add(announcementRole))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ export interface Config {
 | 
				
			|||||||
    workaround_token: string
 | 
					    workaround_token: string
 | 
				
			||||||
    watcher_role: string
 | 
					    watcher_role: string
 | 
				
			||||||
    jf_admin_role: string
 | 
					    jf_admin_role: string
 | 
				
			||||||
 | 
					    announcement_role: string
 | 
				
			||||||
    announcement_channel_id: string
 | 
					    announcement_channel_id: string
 | 
				
			||||||
    jf_collection_id: string
 | 
					    jf_collection_id: string
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -57,6 +58,7 @@ export const config: Config = {
 | 
				
			|||||||
    workaround_token: process.env.TOKEN ?? "",
 | 
					    workaround_token: process.env.TOKEN ?? "",
 | 
				
			||||||
    watcher_role: process.env.WATCHER_ROLE ?? "",
 | 
					    watcher_role: process.env.WATCHER_ROLE ?? "",
 | 
				
			||||||
    jf_admin_role: process.env.ADMIN_ROLE ?? "",
 | 
					    jf_admin_role: process.env.ADMIN_ROLE ?? "",
 | 
				
			||||||
 | 
					    announcement_role: process.env.WATCHPARTY_ANNOUNCEMENT_ROLE ?? "",
 | 
				
			||||||
    announcement_channel_id: process.env.CHANNEL_ID ?? "",
 | 
					    announcement_channel_id: process.env.CHANNEL_ID ?? "",
 | 
				
			||||||
    jf_collection_id: process.env.JELLYFIN_COLLECTION_ID ?? ""
 | 
					    jf_collection_id: process.env.JELLYFIN_COLLECTION_ID ?? ""
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user