Compare commits

..

No commits in common. "2c5bf1272e90db7bd807774cca5a0f1c107ddd73" and "8f1c6e10faaae4f45fa377a26f96ea71b403f35b" have entirely different histories.

3 changed files with 26 additions and 49 deletions

View File

@ -1,8 +1,8 @@
import { GuildMember, GuildScheduledEvent, GuildScheduledEventStatus } from "discord.js"; import { GuildScheduledEvent, GuildScheduledEventStatus, Collection, Snowflake, GuildScheduledEventUser } from "discord.js";
import { v4 as uuid } from "uuid";
import { jellyfinHandler } from "../..";
import { getGuildSpecificTriggerRoleId } from "../helper/roleFilter";
import { logger } from "../logger"; import { logger } from "../logger";
import { jellyfinHandler } from "../.."
import { v4 as uuid } from "uuid";
import { getGuildSpecificTriggerRoleId } from "../helper/roleFilter";
export const name = 'guildScheduledEventUpdate' export const name = 'guildScheduledEventUpdate'
@ -12,23 +12,14 @@ export async function execute(oldEvent: GuildScheduledEvent, newEvent: GuildSche
logger.info(JSON.stringify(newEvent, null, 2)) logger.info(JSON.stringify(newEvent, null, 2))
const requestId = uuid() const requestId = uuid()
if (newEvent.description?.toLowerCase().includes("!wp") && [GuildScheduledEventStatus.Active, GuildScheduledEventStatus.Completed].includes(newEvent.status)) { if (newEvent.description?.includes("!WP") && [GuildScheduledEventStatus.Active, GuildScheduledEventStatus.Completed].includes(newEvent.status)) {
const roles = getGuildSpecificTriggerRoleId(newEvent.guildId).map((key, value)=> value) const roles = getGuildSpecificTriggerRoleId(newEvent.guildId).map((key, value)=> value)
const eventMembers = (await newEvent.fetchSubscribers({ withMember: true })).filter(member => !member.member.roles.cache.hasAny(...roles)).map((value, _) => value.member) const members = (await newEvent.fetchSubscribers({ withMember: true })).filter(member => !member.member.roles.cache.hasAny(...roles))
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) if (newEvent.status === GuildScheduledEventStatus.Active)
createJFUsers(members, newEvent.name, requestId) createJFUsers(members, newEvent.name, requestId)
else { else {
members.forEach(member => { 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.`)) 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) deleteJFUsers(newEvent.guildId, requestId)
} }
@ -37,11 +28,11 @@ export async function execute(oldEvent: GuildScheduledEvent, newEvent: GuildSche
logger.error(error) logger.error(error)
} }
} }
async function createJFUsers(members: GuildMember[], movieName: string, requestId?: string) { async function createJFUsers(members: Collection<Snowflake, GuildScheduledEventUser<true>>, movieName: string, requestId?: string) {
logger.info(`Creating users for: \n ${JSON.stringify(members, null, 2)}`) logger.info(`Creating users for: \n ${JSON.stringify(members, null, 2)}`)
members.forEach(member => { members.forEach(member => {
member.createDM().then(channel => channel.send(`Hey! Du hast dich für die Watchparty von ${movieName} angemeldet! Es geht gleich los!`)) 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) jellyfinHandler.upsertUser(member.member, "TEMPORARY", requestId)
}) })
} }

View File

@ -1,8 +1,7 @@
import { VoiceState } from "discord.js"; import { GuildScheduledEvent, GuildScheduledEventStatus, Collection, Snowflake, GuildScheduledEventUser, User, VoiceState } from "discord.js";
import { v4 as uuid } from "uuid";
import { jellyfinHandler } from "../..";
import { UserUpsertResult } from "../jellyfin/handler";
import { logger } from "../logger"; import { logger } from "../logger";
import { jellyfinHandler } from "../.."
import { v4 as uuid } from "uuid";
export const name = 'voiceStateUpdate' export const name = 'voiceStateUpdate'
@ -10,15 +9,13 @@ export const name = 'voiceStateUpdate'
export async function execute(oldState: VoiceState, newState: VoiceState) { export async function execute(oldState: VoiceState, newState: VoiceState) {
try { try {
logger.info(JSON.stringify(newState, null, 2))
//ignore events like mute/unmute //ignore events like mute/unmute
if(newState.channel?.id === oldState.channel?.id) { 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 return
} }
const scheduledEvents = (await newState.guild.scheduledEvents.fetch()) const scheduledEvents = (await newState.guild.scheduledEvents.fetch())
.filter((key, value) => key.description?.toLowerCase().includes("!wp") && key.isActive()) .filter((key, value) => key.description?.includes("!WP") && key.isActive())
.map((key, value) => key) .map((key, value) => 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}))))
@ -32,26 +29,19 @@ export async function execute(oldState: VoiceState, newState: VoiceState) {
userFound = true; userFound = true;
}) })
}) })
if(userFound) { 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 return
}
if (scheduledEvents.find(event => event.channelId === newState.channelId)) { if (scheduledEvents.find(event => event.channelId === newState.channelId)) {
if(newState.member){ if(newState.member){
logger.info("YO! Da ist jemand dem Channel mit dem Event beigetreten, ich kümmer mich mal um nen Account!") 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 leg dir mal nen Account an, damit du mitschauen kannst!`))
newState.member.createDM().then(channel => channel.send(`Hey! Du bist unserer Watchparty beigetreten, ich hab dir gerade die Zugangsdaten für den Mediaserver geschickt!`)) jellyfinHandler.upsertUser(newState.member, "TEMPORARY", uuid())
} 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 { } else {
logger.error("WTF? Expected Member?? When doing things") logger.error("WTF? Expected Member?? When doing things")
} }
} else {
logger.info("VoiceState channelId was not the id of any channel with events")
} }
}catch(error){ }catch(error){
logger.error(error) logger.error(error)

View File

@ -1,11 +1,12 @@
import { GuildMember } from "discord.js"; import { GuildMember } from "discord.js";
import { Config } from "../configuration";
import { Maybe, PermissionLevel } from "../interfaces";
import { logger } from "../logger";
import { CreateUserByNameOperationRequest, DeleteUserRequest, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis"; import { CreateUserByNameOperationRequest, DeleteUserRequest, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis";
import { UpdateUserPasswordRequest } from "./models";
import { UserDto } from "./models/UserDto"; import { UserDto } from "./models/UserDto";
import { Configuration, ConfigurationParameters } from "./runtime"; import { Configuration, ConfigurationParameters } from "./runtime";
import { CreateUserByNameRequest, UpdateUserEasyPasswordRequest, UpdateUserPasswordRequest, UpdateUserPolicyRequest } from "./models";
import { Config } from "../configuration";
import { logger } from "../logger";
import { Maybe, PermissionLevel } from "../interfaces";
import { v4 as uuid } from "uuid";
export class JellyfinHandler { export class JellyfinHandler {
@ -209,20 +210,15 @@ export class JellyfinHandler {
} }
} }
public async upsertUser(newMember: GuildMember, level: PermissionLevel, requestId?: string): Promise<UserUpsertResult> { public async upsertUser(newMember: GuildMember, level: PermissionLevel, requestId?: string) {
logger.info(`Trying to upsert user ${newMember.displayName}, with permissionLevel ${level}`, { guildId: newMember.guild.id, requestId }) logger.error(`Trying to upsert user ${newMember.displayName}, with permissionLevel ${level}`, { guildId: newMember.guild.id, requestId })
const jfuser = await this.getUser(newMember, requestId) const jfuser = await this.getUser(newMember, requestId)
if (jfuser && !jfuser.policy?.isDisabled) { if (jfuser) {
logger.info(`User with name ${newMember.displayName} is already present`, { guildId: newMember.guild.id, requestId }) logger.info(`User with name ${newMember.displayName} is already present`, { guildId: newMember.guild.id, requestId })
await this.enableUser(jfuser, newMember.guild.id, requestId) await this.enableUser(jfuser, newMember.guild.id, requestId)
return UserUpsertResult.enabled
} else { } else {
this.createUserAccountForDiscordUser(newMember, level, newMember.guild.id, requestId) this.createUserAccountForDiscordUser(newMember, level, newMember.guild.id, requestId)
return UserUpsertResult.created
} }
} }
} }
export enum UserUpsertResult {enabled, created}