create custom channel discord implementation

This commit is contained in:
mo
2026-03-17 09:13:31 +01:00
parent fc8f90a4bc
commit e4425b23be
7 changed files with 107 additions and 22 deletions

View File

@@ -1,6 +1,6 @@
import type { VoiceChannelsServiceInterface } from "@avocadi/bot-core/entities/channels/voice/voice-channels.service"; import type { VoiceChannelsServiceInterface } from "@avocadi/bot-core/entities/channels/voice/voice-channels.service";
import { config } from "config"; 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 client from "lib/client";
import { logger } from "lib/common-logger"; import { logger } from "lib/common-logger";
@@ -35,13 +35,21 @@ export class VoiceChannelsService
} }
async cloneVoiceChannel( async cloneVoiceChannel(
user_id: string,
channel: VoiceChannel, channel: VoiceChannel,
options?: { name?: string; position?: number }, options?: { name?: string; position?: number },
) { ) {
const clonedChannel = await channel.clone({ const clonedChannel = await channel.clone({
name: options?.name, name: options?.name,
position: options?.position, position: options?.position,
permissionOverwrites: [
{
id: user_id,
allow: ["ManageChannels"],
},
],
}); });
logger.info("DONE");
return clonedChannel; return clonedChannel;
} }

View File

@@ -17,9 +17,17 @@ export const handleDynamicVoiceChannelCreation = async (
return; 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 // 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 = const newChannel =
await dynamicVoiceChannelService.createDynamicVoiceChannel(channel.id); await dynamicVoiceChannelService.createDynamicVoiceChannel(
member.id,
channel.id,
);
logger.debug(`Channel found for VoiceStateUpdate event: ${channel.name}`); logger.debug(`Channel found for VoiceStateUpdate event: ${channel.name}`);
if (newChannel) { if (newChannel) {
await newState.setChannel(newChannel); await newState.setChannel(newChannel);

View File

@@ -7,10 +7,7 @@ import { logger } from "lib/common-logger";
client.on(Events.GuildMemberAdd, async (member: GuildMember) => { client.on(Events.GuildMemberAdd, async (member: GuildMember) => {
logger.info(`${member.user.username} joined the server}`); logger.info(`${member.user.username} joined the server}`);
if (member.user.bot) { if (member.user.bot) return;
// Don't send a welcome message for bots (sorry tom)
return;
}
const channel = await client.channels.fetch( const channel = await client.channels.fetch(
process.env.NODE_ENV === "production" process.env.NODE_ENV === "production"

View File

@@ -3,3 +3,4 @@ import "./stop.listener";
import "./messages/messages.listener"; import "./messages/messages.listener";
import "./reactions/reactions.listener"; import "./reactions/reactions.listener";
import "./guild-members/guild-members.listener"; import "./guild-members/guild-members.listener";
import "./voice-state/voice-state.listener";

View File

@@ -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");
});

View File

@@ -6,6 +6,7 @@ export interface VoiceChannelsServiceInterface<
createVoiceChannel(name: string): Promise<C>; createVoiceChannel(name: string): Promise<C>;
cloneVoiceChannel( cloneVoiceChannel(
user_id: string,
channel: C, channel: C,
options?: { name?: string; position?: number }, options?: { name?: string; position?: number },
): Promise<C>; ): Promise<C>;

View File

@@ -30,15 +30,20 @@ export class DynamicVoiceChannelsService<
); );
} }
async createDynamicVoiceChannel(id: string): Promise<C | undefined> { async createDynamicVoiceChannel(
if (this.validChannelIds.has(id)) { user_id: string,
channel_id: string,
): Promise<C | undefined> {
if (!this.validChannelIds.has(channel_id)) return;
// Channel is one of the dynamic voice channels, create a new one based on it // 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( const newChannel = await this.voiceChannelsService.cloneVoiceChannel(
user_id,
channel, channel,
{ {
name: channel.name, name: channel.name,
@@ -48,9 +53,6 @@ export class DynamicVoiceChannelsService<
this.createdChannelIdsSet.add(newChannel.id); this.createdChannelIdsSet.add(newChannel.id);
return newChannel; return newChannel;
} else {
// Channel is not a dynamic voice channel, do nothing
}
} }
deleteDynamicVoiceChannel(channelId: string): Promise<void> { deleteDynamicVoiceChannel(channelId: string): Promise<void> {