@chinchillaenterprises/mcp-discord
Version:
Modular Discord MCP server with 45+ tools for comprehensive server management, featuring clean architecture and discord_ prefixed tools
84 lines • 6.38 kB
JavaScript
import { ChannelType } from "discord.js";
export const toolDefinition = {
name: "discord_move_member",
description: "Move a member to a different voice channel",
inputSchema: {
type: "object",
properties: {
userId: {
type: "string",
description: "User ID to move",
},
channelId: {
type: "string",
description: "Voice channel ID or name to move to (null to disconnect)",
},
reason: {
type: "string",
description: "Reason for moving (optional)",
},
},
required: ["userId"],
}
};
export const handler = async (args, services) => {
const { userId, channelId, reason } = args;
const guild = await services.getGuild();
const client = await services.getActiveClient();
try {
const member = await guild.members.fetch(userId);
if (!member) {
throw new Error(`Member ${userId} not found`);
}
if (!member.voice.channel) {
throw new Error(`${member.user.username} is not in a voice channel`);
}
const currentChannel = member.voice.channel;
if (channelId) {
// Resolve channel name to ID if needed
const resolvedChannelId = await services.resolveChannel(channelId);
const targetChannel = await client.channels.fetch(resolvedChannelId);
if (!targetChannel || targetChannel.type !== ChannelType.GuildVoice) {
throw new Error(`Channel ${channelId} is not a voice channel`);
}
await member.voice.setChannel(targetChannel, reason);
return {
content: [
{
type: "text",
text: `Successfully moved member!
User: ${member.user.username}#${member.user.discriminator} (${userId})
From: ${currentChannel.name}
To: ${targetChannel.name}
${reason ? `Reason: ${reason}` : 'No reason provided'}
Server: ${guild.name}
Moved at: ${new Date().toISOString()}`
}
]
};
}
else {
// Disconnect from voice
await member.voice.disconnect(reason);
return {
content: [
{
type: "text",
text: `Successfully disconnected member from voice!
User: ${member.user.username}#${member.user.discriminator} (${userId})
From: ${currentChannel.name}
${reason ? `Reason: ${reason}` : 'No reason provided'}
Server: ${guild.name}
Disconnected at: ${new Date().toISOString()}`
}
]
};
}
}
catch (error) {
console.error(`[MoveMember] Error moving member:`, error);
throw new Error(`Failed to move member: ${error.message}`);
}
};
export { MoveMemberArgsSchema as schema } from "../../schemas/moderation.js";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS1tZW1iZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvbW9kZXJhdGlvbi9tb3ZlLW1lbWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLFlBQVksQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQVM7SUFDbEMsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixXQUFXLEVBQUUsNENBQTRDO0lBQ3pELFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDBEQUEwRDthQUN4RTtZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsOEJBQThCO2FBQzVDO1NBQ0Y7UUFDRCxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7S0FDckI7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFvQixFQUFFLFFBQTBCLEVBQUUsRUFBRTtJQUNoRixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7SUFFaEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFD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