2023-06-09 23:56:45 +02:00
import { GuildMember , GuildScheduledEvent , GuildScheduledEventStatus } from "discord.js" ;
2023-06-04 15:02:03 +02:00
import { v4 as uuid } from "uuid" ;
2023-06-23 15:51:07 +02:00
import { jellyfinHandler } from "../.." ;
2023-06-04 16:35:43 +02:00
import { getGuildSpecificTriggerRoleId } from "../helper/roleFilter" ;
2023-06-09 23:56:45 +02:00
import { logger } from "../logger" ;
2023-06-04 15:02:03 +02:00
export const name = 'guildScheduledEventUpdate'
export async function execute ( oldEvent : GuildScheduledEvent , newEvent : GuildScheduledEvent ) {
2023-06-24 21:09:56 +02:00
try {
const requestId = uuid ( )
// 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
}
if ( newEvent . description ? . toLowerCase ( ) . includes ( "!wp" ) && [ GuildScheduledEventStatus . Active , GuildScheduledEventStatus . Completed ] . includes ( newEvent . status ) ) {
const roles = getGuildSpecificTriggerRoleId ( ) . map ( ( key , value ) = > value )
const eventMembers = ( await newEvent . fetchSubscribers ( { withMember : true } ) ) . filter ( member = > ! member . member . roles . cache . hasAny ( . . . roles ) ) . map ( ( value ) = > value . member )
const channelMembers = newEvent . channel ? . members . filter ( member = > ! member . roles . cache . hasAny ( . . . roles ) ) . map ( ( value ) = > value )
const allMembers = eventMembers . concat ( channelMembers ? ? [ ] )
const members : GuildMember [ ] = [ ]
for ( const member of allMembers ) {
if ( ! members . find ( x = > x . id == member . id ) )
members . push ( member )
}
if ( newEvent . status === GuildScheduledEventStatus . Active )
createJFUsers ( members , newEvent . name , requestId )
else {
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. ` ) )
} )
deleteJFUsers ( newEvent . guildId , requestId )
}
}
} catch ( error ) {
logger . error ( error )
}
2023-06-04 15:02:03 +02:00
}
2023-06-10 14:23:10 +02:00
2023-06-09 23:56:45 +02:00
async function createJFUsers ( members : GuildMember [ ] , movieName : string , requestId? : string ) {
2023-06-24 21:09:56 +02:00
logger . info ( ` Creating users for: \ n ${ JSON . stringify ( members , null , 2 ) } ` )
members . forEach ( member = > {
member . createDM ( ) . then ( channel = > channel . send ( ` Hey! Du hast dich für die Watchparty von ${ movieName } angemeldet! Es geht gleich los! ` ) )
jellyfinHandler . upsertUser ( member , "TEMPORARY" , requestId )
} )
2023-06-04 15:02:03 +02:00
}
2023-06-04 16:35:43 +02:00
async function deleteJFUsers ( guildId : string , requestId? : string ) {
2023-06-24 21:09:56 +02:00
logger . info ( ` Watchparty ended, deleting tmp users ` , { guildId , requestId } )
jellyfinHandler . purge ( guildId , requestId )
}