able to duplicate channel with only joining
All checks were successful
release-tag / release-image (push) Successful in 24s

This commit is contained in:
moriese 2025-01-13 01:47:27 +01:00
parent 6193865220
commit 3f7864be1b
6 changed files with 149 additions and 33 deletions

View File

@ -0,0 +1,52 @@
import config from "config";
import client from "lib/client";
import { getRandomInt } from "lib/utils";
import { } from "./dynamicChannel.components.ts";
import {
Client,
EmbedBuilder,
type Message,
type CacheType,
type GuildMember,
type Interaction,
type OmitPartialGroupDMChannel,
VoiceState,
VoiceChannel,
StageChannel,
Events,
type VoiceBasedChannel,
} from "discord.js";
export class DynamicChannelService {
async handleInteraction(interaction: Interaction<CacheType>) {
// todo
}
async createChannel(oldState: VoiceState, newState: VoiceState, channel: VoiceBasedChannel): Promise<StageChannel | VoiceChannel> {
console.log("createChannel()");
const newChannel = await channel.clone({
name: channel.name + " " + newState.member?.displayName,
position: channel.position
});
return newChannel;
}
async deleteChannel(oldState: VoiceState, newState: VoiceState, newChannel: StageChannel | VoiceChannel, channelListeners: Map<any, any>, channelListener: (oldState: VoiceState, newState: VoiceState) => void) {
console.log("deleteChannel()");
if (oldState.channelId === newChannel.id || newState.channelId === newChannel.id) {
if (newChannel.members.size === 0) {
newChannel.delete()
.catch(console.error);
client.removeListener(Events.VoiceStateUpdate, channelListener);
channelListeners.delete(newChannel.id);
}
}
return channelListeners;
}
}

View File

@ -8,31 +8,31 @@ export const dmAcceptedContent = `huhu! du wurdest als lernende:r akzeptiert :3\
export function getWelcomeContent(member: GuildMember) { export function getWelcomeContent(member: GuildMember) {
const welcomeContents = [ const welcomeContents = [
`willkommen auf dem server, ${member}! 💕`, `willkommen auf dem server, ${member}! fuehl dich wie zuhause💕`,
`hey ${member}! schoen, dass du hier bist! 😊`, `hey ${member}! schoen, dass du hier bist! 😊`,
`hi ${member}, willkommen! viel spass hier! 💖`, `hi ${member}, willkommen! viel spass hier! 💖`,
`willkommen, ${member}! schoen, dass du da bist! 🥳`, `willkommen, ${member}! schoen, dass du da bist! :3`,
`moin ${member}! viel spass im server! c:`, `moin ${member}! viel spass im server! c:`,
`hey ${member}, herzlich willkommen! fuehl dich wie zu hause! <3`, `hey ${member}, herzlich willkommen! fuehl dich wie zu hause! <3`,
`hi ${member}! cool, dass du da bist! 👏`, `hi ${member}! cool, dass du da bist! <3`,
`willkommen, ${member}! wir freuen uns, dass du hier bist! 💕`, `willkommen, ${member}! wir freuen uns, dass du hier bist! 💕`,
`hey ${member}! schoen, dass du bei uns bist! :3`, `hey ${member}! schoen, dass du bei uns bist! :3`,
`willkommen auf dem server, ${member}! viel spass hier! ✨`, `willkommen auf dem server, ${member}! viel spass hier! ✨`,
`hi ${member}, super, dass du dabei bist! 😊`, `hi ${member}, super, dass du dabei bist! :3`,
`hey ${member}, willkommen bei uns! 💖`, `hey ${member}, willkommen bei uns! 💖`,
`moin ${member}! schoen, dass du dabei bist! 🥳`, `moin ${member}! schoen, dass du dabei bist! :)`,
`hi ${member}, willkommen in unserer kleinen community! ✨`, `hi ${member}, willkommen in unserer kleinen community! ✨`,
`willkommen, ${member}! fuehl dich wie zu hause! 💕`, `willkommen, ${member}! fuehl dich wie zu hause! 💕`,
`hey ${member}, schoen, dass du uns gefunden hast! 😊`, `hey ${member}, schoen, dass du uns gefunden hast! <333`,
`hi ${member}, willkommen in unserer runde! 🎉`, `hi ${member}, willkommen in unserer runde! c:`,
`willkommen, ${member}! schoen, dass du hier bist! 💖`, `willkommen, ${member}! schoen, dass du hier bist! 💖`,
`moin ${member}! lass uns zusammen spass haben! ✨`, `moin ${member}! lass uns zusammen spass haben! ✨`,
`hey ${member}, herzlich willkommen bei uns! 😊`, `hey ${member}, herzlich willkommen bei uns! 😊`,
`hi ${member}! schoen, dass du dabei bist! 💕`, `hi ${member}! schoen, dass du dabei bist! 💕`,
`willkommen auf dem server, ${member}! wir freuen uns auf dich! 🎉`, `willkommen auf dem server, ${member}! wir freuen uns auf dich! <3`,
`hey ${member}, schoen, dass du da bist! ✨`, `hey ${member}, schoen, dass du da bist! ✨`,
`hi ${member}, willkommen! fuehl dich wie zu hause! 💖`, `hi ${member}, willkommen! fuehl dich wie zu hause! 💖`,
`willkommen, ${member}! lass uns gemeinsam eine tolle zeit haben! 😊`, `willkommen, ${member}! lass uns gemeinsam eine tolle zeit haben! :3`,
]; ];
return welcomeContents[Math.floor(Math.random() * welcomeContents.length)]; return welcomeContents[Math.floor(Math.random() * welcomeContents.length)];
} }

View File

@ -5,16 +5,22 @@ export default {
// avocadi // avocadi
serverID: process.env.DISCORD_SERVER_ID || "", serverID: process.env.DISCORD_SERVER_ID || "",
// texxt channel
channelIdBot: process.env.DISCORD_CHANNEL_ID_BOT || "", channelIdBot: process.env.DISCORD_CHANNEL_ID_BOT || "",
channelIdFeedback: process.env.DISCORD_CHANNEL_ID_FEEDBACK || "",
channelIdNotification: process.env.DISCORD_CHANNEL_ID_NOTIFICATION || "", channelIdNotification: process.env.DISCORD_CHANNEL_ID_NOTIFICATION || "",
channelIdWelcome: process.env.DISCORD_CHANNEL_ID_WELCOME || "", channelIdWelcome: process.env.DISCORD_CHANNEL_ID_WELCOME || "",
channelIdRules: process.env.DISCORD_CHANNEL_ID_RULE || "", channelIdRules: process.env.DISCORD_CHANNEL_ID_RULE || "",
channelIdNews: process.env.DISCORD_CHANNEL_ID_NEWS || "", channelIdNews: process.env.DISCORD_CHANNEL_ID_NEWS || "",
channelIdIntroduction: process.env.DISCORD_CHANNEL_ID_INTRODUCTION || "", channelIdIntroduction: process.env.DISCORD_CHANNEL_ID_INTRODUCTION || "",
channelIdOffTopic: process.env.DISCORD_CHANNEL_ID_OFF_TOPIC || "", channelIdOffTopic: process.env.DISCORD_CHANNEL_ID_OFF_TOPIC || "",
channelIdFeedback: process.env.DISCORD_CHANNEL_ID_FEEDBACK || "",
channelIdHelp: process.env.DISCORD_CHANNEL_ID_HELP || "", channelIdHelp: process.env.DISCORD_CHANNEL_ID_HELP || "",
// voice channel#
vchannelIdForTwo: process.env.DISCORD_VCHANNEL_ID_FOR_TWO || "",
vchannelIdForThree: process.env.DISCORD_VCHANNEL_ID_FOR_THREE || "",
vchannelIdForFour: process.env.DISCORD_VCHANNEL_ID_FOR_FOUR || "",
vchannelIdForGroup: process.env.DISCORD_VCHANNEL_ID_FOR_GROUP || "",
// roles
roleStudy: process.env.PEOPLE || "", roleStudy: process.env.PEOPLE || "",
// other // other

View File

@ -1,6 +1,10 @@
import { Commands, type CommandsType } from "commands"; import { Commands, type CommandsType } from "commands";
import { import {
ChannelType, ChannelType,
Client,
Events,
IntentsBitField,
VoiceState,
type ButtonInteraction, type ButtonInteraction,
type CacheType, type CacheType,
type ChatInputCommandInteraction, type ChatInputCommandInteraction,
@ -17,6 +21,8 @@ import { GreetingService } from "actions/greeting/greeting.service";
import { ActivityService } from "actions/activity/activity.service"; import { ActivityService } from "actions/activity/activity.service";
import { DmService } from "actions/dm/dm.service"; import { DmService } from "actions/dm/dm.service";
import { CustomMessageService } from "actions/customMessage/customMessage.service"; import { CustomMessageService } from "actions/customMessage/customMessage.service";
import { DynamicChannelService } from "actions/dynamicChannel/dynamicChannel.service";
import config from "config";
export default class DiscordController extends EventEmitter { export default class DiscordController extends EventEmitter {
private discordService!: DiscordService; private discordService!: DiscordService;
@ -27,6 +33,8 @@ export default class DiscordController extends EventEmitter {
activityService: ActivityService; activityService: ActivityService;
dmService: DmService; dmService: DmService;
customMessageService: CustomMessageService; customMessageService: CustomMessageService;
channelListeners = new Map();
dynamicChannelService: DynamicChannelService;
constructor() { constructor() {
super(); super();
@ -38,6 +46,9 @@ export default class DiscordController extends EventEmitter {
this.activityService = new ActivityService(); this.activityService = new ActivityService();
this.dmService = new DmService(); this.dmService = new DmService();
this.customMessageService = new CustomMessageService(); this.customMessageService = new CustomMessageService();
this.dynamicChannelService = new DynamicChannelService();
var channelListeners = new Map();
// log when running // log when running
client.once("ready", async () => { client.once("ready", async () => {
await this.setActivity(); await this.setActivity();
@ -58,6 +69,58 @@ export default class DiscordController extends EventEmitter {
client.on("guildMemberAdd", async (member) => { client.on("guildMemberAdd", async (member) => {
await this.greetingService.welcome(member); await this.greetingService.welcome(member);
}); });
client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceState) => {
// check if user joined a vc
if (!oldState.channelId && newState.channelId) {
// check if right vc
if (newState.channelId === config.discord.vchannelIdForTwo || newState.channelId === config.discord.vchannelIdForThree || newState.channelId === config.discord.vchannelIdForFour || newState.channelId === config.discord.vchannelIdForGroup) {
const channel = newState.channel;
if (!channel) {
console.error("channel not found");
return;
}
try {
// create new channel with same settings
/*const newChannel = await channel.clone({
name: channel.name + "; " + newState.member?.displayName,
position: channel.position
});*/
const newChannel = await this.dynamicChannelService.createChannel(oldState, newState, channel);
// move user in new channel
await newState.setChannel(newChannel);
// create specific listener for channel
const channelListener = async (oldState: VoiceState, newState: VoiceState) => {
/*if (oldState.channelId === newChannel.id || newState.channelId === newChannel.id) {
// check if channel empty
if (newChannel.members.size === 0) {
newChannel.delete()
.catch(console.error);
// delete listener for this channel
client.removeListener(Events.VoiceStateUpdate, channelListener);
channelListeners.delete(newChannel.id);
}
}*/
channelListeners = await this.dynamicChannelService.deleteChannel(oldState, newState, newChannel, channelListeners, channelListener);
};
// save listener in map
channelListeners.set(newChannel.id, channelListener);
// add listener
client.on(Events.VoiceStateUpdate, channelListener);
} catch (error) {
console.error("error while duplicating channel", error);
}
}
}
});
} }
async setActivity() { async setActivity() {

View File

@ -1,28 +1,23 @@
import config from "config"; import config from "config";
import { import { Client, GatewayIntentBits, Partials, ChannelType, Events, IntentsBitField } from "discord.js";
Client,
GatewayIntentBits,
Partials,
IntentsBitField,
} from "discord.js";
const client = new Client({ const client = new Client({
intents: [ intents: [IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers,
IntentsBitField.Flags.GuildMembers, IntentsBitField.Flags.GuildModeration,
IntentsBitField.Flags.GuildModeration, IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.GuildMessageReactions,
IntentsBitField.Flags.GuildMessageReactions, IntentsBitField.Flags.GuildMessagePolls,
IntentsBitField.Flags.GuildMessagePolls, IntentsBitField.Flags.MessageContent,
IntentsBitField.Flags.MessageContent, IntentsBitField.Flags.DirectMessages,
IntentsBitField.Flags.DirectMessages, IntentsBitField.Flags.DirectMessageReactions,
IntentsBitField.Flags.DirectMessageReactions, IntentsBitField.Flags.DirectMessageTyping,
IntentsBitField.Flags.DirectMessageTyping, IntentsBitField.Flags.DirectMessagePolls,
IntentsBitField.Flags.DirectMessagePolls, GatewayIntentBits.DirectMessages,
GatewayIntentBits.DirectMessages, GatewayIntentBits.MessageContent,
GatewayIntentBits.MessageContent, GatewayIntentBits.Guilds,
], GatewayIntentBits.GuildVoiceStates,],
partials: [Partials.Channel, Partials.Message], partials: [Partials.Channel, Partials.Message]
}); });
await client.login(config.discord.token); await client.login(config.discord.token);