format more files
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Compile the repository / compile (pull_request) Successful in 1m12s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Compile the repository / compile (pull_request) Successful in 1m12s
				
			This commit is contained in:
		@@ -10,39 +10,39 @@ 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
 | 
			
		||||
    }
 | 
			
		||||
	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
 | 
			
		||||
      }
 | 
			
		||||
		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<TextChannel> = client.getAnnouncementChannelForGuild(guildId)
 | 
			
		||||
			const channel: Maybe<TextChannel> = client.getAnnouncementChannelForGuild(guildId)
 | 
			
		||||
 | 
			
		||||
      if (!channel) {
 | 
			
		||||
        logger.error("Could not obtain announcement channel. Aborting announcement.", { guildId, requestId })
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
			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)}`
 | 
			
		||||
			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 })
 | 
			
		||||
    }
 | 
			
		||||
			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(<string>error, { guildId, requestId })
 | 
			
		||||
  }
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		// sendFailureDM(error)
 | 
			
		||||
		logger.error(<string>error, { guildId, requestId })
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,48 +16,48 @@ export const NONE_OF_THAT = "❌"
 | 
			
		||||
export let task: ScheduledTask | undefined
 | 
			
		||||
 | 
			
		||||
export async function execute(event: GuildScheduledEvent) {
 | 
			
		||||
  const requestId = uuid()
 | 
			
		||||
	const requestId = uuid()
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
	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 })
 | 
			
		||||
		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<TextChannel> = 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 })
 | 
			
		||||
		const announcementChannel: Maybe<TextChannel> = 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
 | 
			
		||||
    }
 | 
			
		||||
    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`
 | 
			
		||||
		if (!event.scheduledStartAt) {
 | 
			
		||||
			logger.info("EVENT DOES NOT HAVE STARTDATE; CANCELLING", { guildId: event.guildId, requestId })
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		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")
 | 
			
		||||
    }
 | 
			
		||||
    message = message.concat(NONE_OF_THAT).concat(": Wenn dir nichts davon gefällt.")
 | 
			
		||||
		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 options: MessageCreateOptions = {
 | 
			
		||||
			allowedMentions: { parse: ["roles"] },
 | 
			
		||||
			content: message,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    const sentMessage: Message<true> = await (await announcementChannel.fetch()).send(options)
 | 
			
		||||
		const sentMessage: Message<true> = await (await announcementChannel.fetch()).send(options)
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < movies.length; i++) {
 | 
			
		||||
      sentMessage.react(Emotes[i])
 | 
			
		||||
    }
 | 
			
		||||
    sentMessage.react(NONE_OF_THAT)
 | 
			
		||||
		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
 | 
			
		||||
  }
 | 
			
		||||
		// sentMessage.pin() //todo: uncomment when bot has permission to pin messages. Also update closepoll.ts to only fetch pinned messages
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,46 +7,46 @@ 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
 | 
			
		||||
	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
 | 
			
		||||
      }
 | 
			
		||||
		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 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(<string>error, { guildId: newEvent.guildId, requestId })
 | 
			
		||||
  }
 | 
			
		||||
			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(<string>error, { guildId: newEvent.guildId, requestId })
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function filterAnnouncementsByPendingWPs(messages: Collection<string, Message<true>>, events: Collection<string, GuildScheduledEvent<GuildScheduledEventStatus>>): Message<true>[] {
 | 
			
		||||
  const filteredMessages: Message<true>[] = []
 | 
			
		||||
  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
 | 
			
		||||
}
 | 
			
		||||
	const filteredMessages: Message<true>[] = []
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,24 +6,24 @@ import { v4 as uuid } from "uuid"
 | 
			
		||||
 | 
			
		||||
export const name = 'guildMemberUpdate'
 | 
			
		||||
export async function execute(oldMember: GuildMember, newMember: GuildMember) {
 | 
			
		||||
  try {
 | 
			
		||||
    const requestId = uuid()
 | 
			
		||||
    const changedRoles: ChangedRoles = filterRolesFromMemberUpdate(oldMember, newMember)
 | 
			
		||||
    const triggerRoleIds: Collection<string, PermissionLevel> = getGuildSpecificTriggerRoleId()
 | 
			
		||||
	try {
 | 
			
		||||
		const requestId = uuid()
 | 
			
		||||
		const changedRoles: ChangedRoles = filterRolesFromMemberUpdate(oldMember, newMember)
 | 
			
		||||
		const triggerRoleIds: Collection<string, PermissionLevel> = getGuildSpecificTriggerRoleId()
 | 
			
		||||
 | 
			
		||||
    triggerRoleIds.forEach((level, key) => {
 | 
			
		||||
      const addedRoleMatches = changedRoles.addedRoles.find(aRole => aRole.id === key)
 | 
			
		||||
      if (addedRoleMatches) {
 | 
			
		||||
        jellyfinHandler.upsertUser(newMember, level, requestId)
 | 
			
		||||
      }
 | 
			
		||||
      const removedRoleMatches = changedRoles.removedRoles.find(rRole => rRole.id === key)
 | 
			
		||||
      if (removedRoleMatches) {
 | 
			
		||||
        jellyfinHandler.removeUser(newMember, level, requestId)
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error(error)
 | 
			
		||||
  }
 | 
			
		||||
		triggerRoleIds.forEach((level, key) => {
 | 
			
		||||
			const addedRoleMatches = changedRoles.addedRoles.find(aRole => aRole.id === key)
 | 
			
		||||
			if (addedRoleMatches) {
 | 
			
		||||
				jellyfinHandler.upsertUser(newMember, level, requestId)
 | 
			
		||||
			}
 | 
			
		||||
			const removedRoleMatches = changedRoles.removedRoles.find(rRole => rRole.id === key)
 | 
			
		||||
			if (removedRoleMatches) {
 | 
			
		||||
				jellyfinHandler.removeUser(newMember, level, requestId)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		console.error(error)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,51 +9,51 @@ export const name = 'voiceStateUpdate'
 | 
			
		||||
 | 
			
		||||
export async function execute(oldState: VoiceState, newState: VoiceState) {
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    logger.info(JSON.stringify(newState, null, 2))
 | 
			
		||||
    //ignore events like mute/unmute
 | 
			
		||||
    if (newState.channel?.id === oldState.channel?.id) {
 | 
			
		||||
      logger.info("Not handling VoiceState event because channelid of old and new was the same (i.e. mute/unmute event)")
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
	try {
 | 
			
		||||
		logger.info(JSON.stringify(newState, null, 2))
 | 
			
		||||
		//ignore events like mute/unmute
 | 
			
		||||
		if (newState.channel?.id === oldState.channel?.id) {
 | 
			
		||||
			logger.info("Not handling VoiceState event because channelid of old and new was the same (i.e. mute/unmute event)")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    const scheduledEvents = (await newState.guild.scheduledEvents.fetch())
 | 
			
		||||
      .filter((key) => key.description?.toLowerCase().includes("!wp") && key.isActive())
 | 
			
		||||
      .map((key) => key)
 | 
			
		||||
		const scheduledEvents = (await newState.guild.scheduledEvents.fetch())
 | 
			
		||||
			.filter((key) => key.description?.toLowerCase().includes("!wp") && key.isActive())
 | 
			
		||||
			.map((key) => key)
 | 
			
		||||
 | 
			
		||||
    const scheduledEventUsers = (await Promise.all(scheduledEvents.map(event => event.fetchSubscribers({ withMember: true }))))
 | 
			
		||||
		const scheduledEventUsers = (await Promise.all(scheduledEvents.map(event => event.fetchSubscribers({ withMember: true }))))
 | 
			
		||||
 | 
			
		||||
    //Dont handle users, that are already subscribed to the event. We only want to handle unsubscribed users here
 | 
			
		||||
    let userFound = false;
 | 
			
		||||
    scheduledEventUsers.forEach(collection => {
 | 
			
		||||
      collection.each(key => {
 | 
			
		||||
        logger.info(JSON.stringify(key, null, 2))
 | 
			
		||||
        if (key.member.user.id === newState.member?.user.id)
 | 
			
		||||
          userFound = true;
 | 
			
		||||
      })
 | 
			
		||||
    })
 | 
			
		||||
    if (userFound) {
 | 
			
		||||
      logger.info(`Not handling VoiceState event because user was already subscribed and got an account from there. User: ${JSON.stringify(newState.member, null, 2)}`)
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
		//Dont handle users, that are already subscribed to the event. We only want to handle unsubscribed users here
 | 
			
		||||
		let userFound = false;
 | 
			
		||||
		scheduledEventUsers.forEach(collection => {
 | 
			
		||||
			collection.each(key => {
 | 
			
		||||
				logger.info(JSON.stringify(key, null, 2))
 | 
			
		||||
				if (key.member.user.id === newState.member?.user.id)
 | 
			
		||||
					userFound = true;
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
		if (userFound) {
 | 
			
		||||
			logger.info(`Not handling VoiceState event because user was already subscribed and got an account from there. User: ${JSON.stringify(newState.member, null, 2)}`)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (scheduledEvents.find(event => event.channelId === newState.channelId)) {
 | 
			
		||||
      if (newState.member) {
 | 
			
		||||
        logger.info("YO! Da ist jemand dem Channel mit dem Event beigetreten, ich kümmer mich mal um nen Account!")
 | 
			
		||||
        const result = await jellyfinHandler.upsertUser(newState.member, "TEMPORARY", uuid())
 | 
			
		||||
        if (result === UserUpsertResult.created) {
 | 
			
		||||
          newState.member.createDM().then(channel => channel.send(`Hey! Du bist unserer Watchparty beigetreten, ich hab dir gerade die Zugangsdaten für den Mediaserver geschickt!`))
 | 
			
		||||
        } else {
 | 
			
		||||
          newState.member.createDM().then(channel => channel.send(`Hey! Du bist unserer Watchparty beigetreten aber du hast bereits einen Account. Falls du ein neues Passwort brauchst nutze /reset_passwort!`))
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        logger.error("WTF? Expected Member?? When doing things")
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      logger.info("VoiceState channelId was not the id of any channel with events")
 | 
			
		||||
    }
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    logger.error(error)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		if (scheduledEvents.find(event => event.channelId === newState.channelId)) {
 | 
			
		||||
			if (newState.member) {
 | 
			
		||||
				logger.info("YO! Da ist jemand dem Channel mit dem Event beigetreten, ich kümmer mich mal um nen Account!")
 | 
			
		||||
				const result = await jellyfinHandler.upsertUser(newState.member, "TEMPORARY", uuid())
 | 
			
		||||
				if (result === UserUpsertResult.created) {
 | 
			
		||||
					newState.member.createDM().then(channel => channel.send(`Hey! Du bist unserer Watchparty beigetreten, ich hab dir gerade die Zugangsdaten für den Mediaserver geschickt!`))
 | 
			
		||||
				} else {
 | 
			
		||||
					newState.member.createDM().then(channel => channel.send(`Hey! Du bist unserer Watchparty beigetreten aber du hast bereits einen Account. Falls du ein neues Passwort brauchst nutze /reset_passwort!`))
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				logger.error("WTF? Expected Member?? When doing things")
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			logger.info("VoiceState channelId was not the id of any channel with events")
 | 
			
		||||
		}
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		logger.error(error)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,51 +8,51 @@ import { logger } from "../logger";
 | 
			
		||||
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 })
 | 
			
		||||
    if (!newEvent.guild) {
 | 
			
		||||
      logger.error("Event has no guild, aborting.", { guildId: newEvent.guildId, requestId })
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
	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 ?? [])
 | 
			
		||||
		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)
 | 
			
		||||
      }
 | 
			
		||||
			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 {
 | 
			
		||||
			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)
 | 
			
		||||
  }
 | 
			
		||||
				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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function createJFUsers(members: GuildMember[], movieName: string, requestId?: string) {
 | 
			
		||||
  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)
 | 
			
		||||
  })
 | 
			
		||||
	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)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function deleteJFUsers(guildId: string, requestId?: string) {
 | 
			
		||||
  logger.info(`Watchparty ended, deleting tmp users`, { guildId, requestId })
 | 
			
		||||
  jellyfinHandler.purge(guildId, requestId)
 | 
			
		||||
}
 | 
			
		||||
	logger.info(`Watchparty ended, deleting tmp users`, { guildId, requestId })
 | 
			
		||||
	jellyfinHandler.purge(guildId, requestId)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,17 +5,17 @@ import { logger } from "../logger"
 | 
			
		||||
 | 
			
		||||
export const name = 'interactionCreate'
 | 
			
		||||
export async function execute(interaction: ExtendedInteraction) {
 | 
			
		||||
  //console.dir(interaction, { depth: null })
 | 
			
		||||
  if (interaction.isCommand()) {
 | 
			
		||||
    logger.info(`Interaction is a command.`, { guildId: interaction.guild?.id })
 | 
			
		||||
    await interaction.deferReply({ ephemeral: true })
 | 
			
		||||
    const command = client.commands.get(interaction.commandName)
 | 
			
		||||
    if (!command)
 | 
			
		||||
      return interaction.followUp('Invalid command')
 | 
			
		||||
    command.run({
 | 
			
		||||
      args: interaction.options as CommandInteractionOptionResolver,
 | 
			
		||||
      client,
 | 
			
		||||
      interaction
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
	//console.dir(interaction, { depth: null })
 | 
			
		||||
	if (interaction.isCommand()) {
 | 
			
		||||
		logger.info(`Interaction is a command.`, { guildId: interaction.guild?.id })
 | 
			
		||||
		await interaction.deferReply({ ephemeral: true })
 | 
			
		||||
		const command = client.commands.get(interaction.commandName)
 | 
			
		||||
		if (!command)
 | 
			
		||||
			return interaction.followUp('Invalid command')
 | 
			
		||||
		command.run({
 | 
			
		||||
			args: interaction.options as CommandInteractionOptionResolver,
 | 
			
		||||
			client,
 | 
			
		||||
			interaction
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,5 +2,5 @@ import { Message } from "discord.js"
 | 
			
		||||
 | 
			
		||||
export const name = 'messageCreate'
 | 
			
		||||
export function execute(message: Message) {
 | 
			
		||||
  console.log(`${JSON.stringify(message)} has been created`)
 | 
			
		||||
	console.log(`${JSON.stringify(message)} has been created`)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user