diff --git a/adapters/discord/src/entities/channels/voice/voice-channels.service.ts b/adapters/discord/src/entities/channels/voice/voice-channels.service.ts index 8838060..f22d81b 100644 --- a/adapters/discord/src/entities/channels/voice/voice-channels.service.ts +++ b/adapters/discord/src/entities/channels/voice/voice-channels.service.ts @@ -1,6 +1,6 @@ import type { VoiceChannelsServiceInterface } from "@avocadi/bot-core/entities/channels/voice/voice-channels.service"; import { config } from "config"; -import { ChannelType, type VoiceChannel } from "discord.js"; +import { ChannelType, type User, type VoiceChannel } from "discord.js"; import client from "lib/client"; import { logger } from "lib/common-logger"; @@ -35,13 +35,21 @@ export class VoiceChannelsService } async cloneVoiceChannel( + user_id: string, channel: VoiceChannel, options?: { name?: string; position?: number }, ) { const clonedChannel = await channel.clone({ name: options?.name, position: options?.position, + permissionOverwrites: [ + { + id: user_id, + allow: ["ManageChannels"], + }, + ], }); + logger.info("DONE"); return clonedChannel; } diff --git a/adapters/discord/src/listeners/voice-state/handle-dynamic-voice-channel-creation.ts b/adapters/discord/src/listeners/voice-state/handle-dynamic-voice-channel-creation.ts index bcc1547..b7d147f 100644 --- a/adapters/discord/src/listeners/voice-state/handle-dynamic-voice-channel-creation.ts +++ b/adapters/discord/src/listeners/voice-state/handle-dynamic-voice-channel-creation.ts @@ -17,9 +17,17 @@ export const handleDynamicVoiceChannelCreation = async ( return; } + const member = newState.member; + if (!member) { + logger.error("Member not found for VoiceStateUpdate event"); + return; + } // New channel is created if user joined one of the specific channels (e.g. "Join to Create") or switched to one of them const newChannel = - await dynamicVoiceChannelService.createDynamicVoiceChannel(channel.id); + await dynamicVoiceChannelService.createDynamicVoiceChannel( + member.id, + channel.id, + ); logger.debug(`Channel found for VoiceStateUpdate event: ${channel.name}`); if (newChannel) { await newState.setChannel(newChannel); diff --git a/adapters/fluxer/src/listeners/guild-members/guild-members.listener.ts b/adapters/fluxer/src/listeners/guild-members/guild-members.listener.ts index 6a06324..c95aba6 100644 --- a/adapters/fluxer/src/listeners/guild-members/guild-members.listener.ts +++ b/adapters/fluxer/src/listeners/guild-members/guild-members.listener.ts @@ -7,10 +7,7 @@ import { logger } from "lib/common-logger"; client.on(Events.GuildMemberAdd, async (member: GuildMember) => { logger.info(`${member.user.username} joined the server}`); - if (member.user.bot) { - // Don't send a welcome message for bots (sorry tom) - return; - } + if (member.user.bot) return; const channel = await client.channels.fetch( process.env.NODE_ENV === "production" diff --git a/adapters/fluxer/src/listeners/index.ts b/adapters/fluxer/src/listeners/index.ts index b5bccdd..ec3895a 100644 --- a/adapters/fluxer/src/listeners/index.ts +++ b/adapters/fluxer/src/listeners/index.ts @@ -3,3 +3,4 @@ import "./stop.listener"; import "./messages/messages.listener"; import "./reactions/reactions.listener"; import "./guild-members/guild-members.listener"; +import "./voice-state/voice-state.listener"; diff --git a/adapters/fluxer/src/listeners/voice-state/voice-state.listener.ts b/adapters/fluxer/src/listeners/voice-state/voice-state.listener.ts new file mode 100644 index 0000000..5d5e8a2 --- /dev/null +++ b/adapters/fluxer/src/listeners/voice-state/voice-state.listener.ts @@ -0,0 +1,68 @@ +import { Events, type GuildMember, User } from "@fluxerjs/core"; +import client from "lib/client"; +import { logger } from "lib/common-logger"; + +interface VoiceStateUpdate { + guild_id?: string; + channel_id: string | null; + user_id: string; + connection_id: string; + session_id?: string; + deaf: boolean; + mute: boolean; + self_deaf: boolean; + self_mute: boolean; + self_video: boolean; + self_stream: boolean; + is_mobile: boolean; + viewer_stream_keys?: string[]; + version: number; +} + +client.on(Events.VoiceStateUpdate, async (data: VoiceStateUpdate) => { + // logger.debug(data); + // return; + const guildId = data.guild_id; + if (!guildId) return; + + const guild = await client.guilds.fetch(guildId); + if (!guild) return; + + const userId = data.user_id; + if (!userId) return; + + const channelId = data.channel_id; + if (!channelId) { + logger.debug("!channelId"); + return; + } + logger.debug(`channelId: ${channelId}`); + + const member = guild.members.get(userId) ?? (await guild.fetchMember(userId)); + if (!channelId) { + logger.debug("!channelId"); + return; + } + logger.debug(`channelId: ${channelId}`); + + const channel = + client.channels.get(channelId) ?? (await client.channels.fetch(channelId)); + if (!channel) { + logger.debug("!channel"); + return; + } + logger.debug(`channel: ${channel}`); + + if (!member?.user) { + logger.debug("!member?.user"); + return; + } + logger.debug(`member?.user${member?.user}`); + + logger.debug("user joined vc"); + if (!member?.user.bot) { + logger.debug("!member.user.bot"); + return; + } + logger.debug("user joined vc"); +}); diff --git a/core/src/entities/channels/voice/voice-channels.service.ts b/core/src/entities/channels/voice/voice-channels.service.ts index bea1635..a59a74b 100644 --- a/core/src/entities/channels/voice/voice-channels.service.ts +++ b/core/src/entities/channels/voice/voice-channels.service.ts @@ -6,6 +6,7 @@ export interface VoiceChannelsServiceInterface< createVoiceChannel(name: string): Promise; cloneVoiceChannel( + user_id: string, channel: C, options?: { name?: string; position?: number }, ): Promise; diff --git a/core/src/features/dynamic-voice-channels/dynamic-voice-channels.service.ts b/core/src/features/dynamic-voice-channels/dynamic-voice-channels.service.ts index adc1bfb..01d79a8 100644 --- a/core/src/features/dynamic-voice-channels/dynamic-voice-channels.service.ts +++ b/core/src/features/dynamic-voice-channels/dynamic-voice-channels.service.ts @@ -30,27 +30,29 @@ export class DynamicVoiceChannelsService< ); } - async createDynamicVoiceChannel(id: string): Promise { - if (this.validChannelIds.has(id)) { - // Channel is one of the dynamic voice channels, create a new one based on it + async createDynamicVoiceChannel( + user_id: string, + channel_id: string, + ): Promise { + if (!this.validChannelIds.has(channel_id)) return; + // Channel is one of the dynamic voice channels, create a new one based on it - const channel = await this.voiceChannelsService.getVoiceChannelById(id); + const channel = + await this.voiceChannelsService.getVoiceChannelById(channel_id); - if (!channel) return; + if (!channel) return; - const newChannel = await this.voiceChannelsService.cloneVoiceChannel( - channel, - { - name: channel.name, - }, - ); + const newChannel = await this.voiceChannelsService.cloneVoiceChannel( + user_id, + channel, + { + name: channel.name, + }, + ); - this.createdChannelIdsSet.add(newChannel.id); + this.createdChannelIdsSet.add(newChannel.id); - return newChannel; - } else { - // Channel is not a dynamic voice channel, do nothing - } + return newChannel; } deleteDynamicVoiceChannel(channelId: string): Promise {