Discord make channel using bot - javascript

I'm making a discord bot, and I'm trying to make use of the createChannel function shown here in the documentation. For some reason, I am getting the following error:
TypeError: bot.createChannel is not a function.
My code is within a function which I pass a message to, and I have been able to create roles and add users to roles within the same function. It's just the createChannel function that's not working. Below is the relevant portions of the code.
const bot = new Discord.Client();
function makeChannel(message){
var server = message.guild;
var name = message.author.username;
server.createRole(data);
var newrole = server.roles.find("name", name);
message.author.addrole(newrole);
/* The above 3 lines all work perfectly */
bot.createChannel(server,name);
}
I have also tried bot.addChannel, and bot.ChannelCreate, since ChannelCreate.js is the name of the file which contains the code for this command. Also, I have attempted specifying channel type and assigning a callback function as well, but the main issue is the TypeError saying that this isn't a function at all. Any idea what I'm doing wrong?
Additionally, I plan to use ServerChannel.update() at some point in the future, so any advice on getting that to work once the previous problem is resolved would be greatly appreciated.

Alright, after a few days of trying things and going through the docs, I have discovered the solution. I am using a more recent version of Discord than the docs I was reading were written for. In the newer version, channels are created with a method in the server, not a client method. so, the code should be:
const bot = new Discord.Client();
function makeChannel(message){
var server = message.guild;
var name = message.author.username;
server.createChannel(name, "text");
}
The "text" value is the type of channel you are making. Can be text or voice.
I'll post a link to the most recent documentation for anyone else who encounters this problem here.

The answer should update documentation link to the GuildChannelManager which is now responsible for creating new channel.
(Example from docs)
// Create a new text channel
guild.channels.create('new-general', { reason: 'Needed a cool new channel' })
.then(console.log)
.catch(console.error);
https://discord.js.org/#/docs/main/stable/class/GuildChannelManager

#Jim Knee's I think your answer is v11, I'm new in discord.js, using Visual Studio Code's auto-code thingy. You can do all the same things except your thing must be this. If you are poor people, getting errors on doing #Jim Knee's answer, this is the place for "YOU!"
Get rid of server.createChannel(name, "text/voice");
And get it to THIS server.channels.create(name, "text/voice");
Hope I can help at least ;)
I'm just a new guy here too

I think you have not logged in with your bot.
From the docs:
const Discord = require('discord.js');
var client = new Discord.Client();
client.login('mybot#example.com', 'password', output); // you seem to be missing this
function output(error, token) {
if (error) {
console.log(`There was an error logging in: ${error}`);
return;
} else
console.log(`Logged in. Token: ${token}`);
}
Alternatively, you can also login with a token instead. See the docs for the example.

Related

discord.js - guildMemberRemove doesn't work, guildMemberAdd works perfectly fine

Sorry if this is poorly formatted, I've never written a question on here before.
First of all, this is my first time writing anything in JavaScript, so this might be some dumb mistake I'm making that's causing my problem.
What I want to do is send a message when a member joins the server, and send a different message when a member leaves. When someone joins the server, the join message is sent and everything works perfectly fine, but when a member leaves, absolutely nothing happens. I put in some console.logs in the joinMessage and leaveMessage functions, and I get an output for joinMessage but nothing for remove. I have enabled Presence Intent and Server Members Intent on the Discord developer portal.
The join and leave message functions are down at the bottom, but I went ahead and added the entire thing so people could help me better. The bot token and channel IDs have been removed, and they are correct in my version of the code.
console.log('Starting');
const Discord = require('discord.js');
const { Client, Intents } = require('discord.js');
const commandHandler = require("./commands");
const client = new Discord.Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] });
client.login('token');
var server = client.guilds.cache.get('server');
client.on('ready', ready);
function ready()
{
console.log('Authenticated');
server = client.guilds.cache.get('server');
}
client.on('messageCreate', receivedMessage);
function receivedMessage(msg)
{
commandHandler(msg);
}
client.on('guildMemberAdd', joinMessage);
function joinMessage(member)
{
let channelWelcome = server.channels.cache.get('welcome');
let channelIntro = server.channels.cache.get('intro');
channelWelcome.send(`Welcome to the server, ${member}! Head over to ${channelIntro} and introduce yourself!`);
}
client.on('guildMemberRemove', leaveMessage);
function leaveMessage(member)
{
let channelWelcome = server.channels.cache.get('welcome');
channelWelcome.send(`${member} has left the server.`);
}
I've been trying to figure this out for about an hour, so I'd really appreciate it if someone could help me solve this. Thanks!
You need to include following intent: GUILD_PRESENCES
So your code needs to look like this:
const client = new Discord.Client({ intents: [Intents.FLAGS.GUILD_PRESENCES, Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] });
Now your bot will detect if a member leaves the guild.
Try calling the function directly in the event parameters. There might be some sort of confliction when extracting the function
client.on("guildMemberAdd", (member) => {
let channelWelcome = server.channels.cache.get('welcome');
let channelIntro = server.channels.cache.get('intro');
channelWelcome.send(`Welcome to the server, ${member}! Head over to ${channelIntro} and introduce yourself!`);
}
client.on("guildMemberRemove", (member) => {
let channelWelcome = server.channels.cache.get('welcome');
channelWelcome.send(`${member} has left the server.`);
}
Also make sure you have set the right intents (if you are running V13), and gave the bot the correct privileged intents in the developer portal
This question/answer is rather old, but I found that the selected answer here is not fully correct, at least in the current version.
You do not in fact need the Presences Intent to receive guildMemberRemove event. The event is actually not firing in cases when the member data is not cached and will therefore not emit the event.
In order to resolve this, you will need to enable Partials on the client, specifically Partials.GuildMember. This will enable the event to emit on un-cached data.

Kickme Discord.js command

Im trying to make a command that allows any user to !kickme which will obviously kick them. I would also like the command to send them a dm, im having issues getting started on the kickme part of it, i also cant quite figure out how to get it to dm the specific person that initiated the command, could someone point me in the right way? Below is my current code, although im not sure what good it will do
const Discord = require('discord.js')
module.exports.run = async (bot, message, args) => {
const member = message.guild.member(user);
message.member
}
}
module.exports.help = {
name: "kickme"
}
To message a user you would do this:
message.author.send("you have been kicked")
I would send this before kicking the user to simplify the coding process :)
also please ask for help on errors, trying using the docs or existing threads first

Bot is not defined or Client.channel.get is not a funtion... Why?

I have a little problem. I want to create an announcement command for my Discord bot. I found a "reffer code" in a topic but when I use it, the debug console send me "bot is not defined" or when I replace bot by Client "Client.channels.get" is not a function.. Can you explain me what is wrong?
const msg = message.content;
const announceChannel = bot.channels.get("778027412435763233");
if (cmd === '${prefix}announce') {
let announceEmbed = new Discord.RichEmbed()
.setTitle(":flag_jp: **Annonce** :flag_jp:")
.setDescription(msg)
.setColor("#ff0000");
return announceChannel.send(announceEmbed);
}
First of all, please provide the code in text next time you're trying to get support on here, it's a lot better for us when trying to provide support.
With v12 coming along, the channel objects you're getting must be cached, and it can simply be done using the function:
bot.channels.cache.get('channel id here');
In your example you are using Client.login, so I have to assume that Client is your bot. Then you can simply do:
let announceChannel = Client.channels.cache.get('Channel ID Here');
You are using RichEmbed as well, which means wether you are using an outdated version of discord.js or you don't know that it is MessageEmbed in discord.js v12. Type npm i discord.js#latest in your terminal (or whereever you install packages for your bot). Then replace RichEmbed() with MessageEmbed() and use my first example for the channel.

How to fix this 'Attachment is not a constructor' error with my bot?

When I made my bot for Discord and tried to attach an image, I can't because of this error
It's a bot for Discord that runs on Discord.js
I tried const Attachment on the beginning, but that didn't work, removed new and const in the code didn't work too
case 'about':
message.channel.send('I am Damabot, developed by Damadion!')
const attachment = new Attachment('./DidYouThinkIAmTheRealFace.png')
message.channel.send('I am Damabot, developed by Damadion!' + attachment)
console.log('Bot successfully replied')
break;
I expected it to send an attachment, but it didn't and sent this error
You can do it like this:
message.channel.send('I am Damabot, developed by Damadion!', { files: ['./DidYouThinkIAmTheRealFace.png'] });
It adds the file directly into the message, so you don't have to create Attachment. I use this my BOT, and it works just fine.
Attachment is a class within Discord.js. Unless you're using a destructuring assignment for your require statement (const { Attachment } = require('discord.js')), Node.js is trying to construct an Attachment object based on a class within your code. When it finds that there is none, it throws your error.
If you want to stick to constructing Attachment objects, you can use:
const attachment = new Discord.Attachment('./path/to/file.png', 'name'); // name is optional
message.channel.send('Hey there', attachment)
.catch(console.error);
Otherwise, you can use the files property of a message like so:
message.channel.send('Hey there', {
files: ['./path/to/file.png']
})
.catch(console.error);
The latter allows you to also send an embed (and maybe use the attachment in your embed).
Discord.js Docs
For me the following code worked:
const attachment = new Discord.MessageAttachment("url");
channel.send(attachment);
Discord.Attachment was replaced with Discord.MessageAttachement
I had the same problem. I ran npm install to update my packages and to check if my discord version was outdated and therefore causing any issues.
After that, I decided to go through the docs and found this snippet here:
const attachment=new Discord.MessageAttachment("enter the URL u wanna enter here")
const generalChannel=client.channels.cache.get("enter ur channel id here")
$generalChannel.send(attachment);
At least, it has worked for me. Please let me know if it works for you as well.

Discord.js client.addMemberToRole not working

So, I'm programming a Discord bot, and one of the things I want it to do is to assign roles to members given certain conditions. After looking through the documentation, specifically here, I figured bot.addMemberToRole would be a good command to use. However, when I ran it, I got this error message:
TypeError: bot.addMemberToRole is not a function
I was understandably confused, as the documentation clearly says that this IS a function. I have tried doing bot.addMemberToRole(member, role);, addMemberToRole(member, role);, and several other iterations. This is my most recent attempt:
const Discord = require('discord.js');
const bot = new Discord.Client();
bot.addMemberToRole(member, role, function(err){
if(err){
console.log(err);
}
});
I have also done just this:
bot.addMemberToRole(member, role);
Both gave the same TypeError as above.
I have no idea why it doesn't work. I followed the documentation exactly, the member and role variables I pass into it are the proper type, and other Discord.js commands work just fine in my bot. Any help would be appreciated.
You're using an old version of the docs so that function doesn't exist anymore. They should really get rid of those. You're looking for GuildMember.addRole(Role or String).
To add a member to a role, you need a GuildMember and a Role object (or the name of the role). Assuming you have the User object and the Guild object (your bot has a list of the guilds/servers it's joined and most events will have the guild they're associated with), you can get the GuildMember by using Guild.fetchMember(User). From there, you can add the role on the GuildMember using either the string or object based version of addRole.
Here's an example of how to do it upon receiving a message from a user which is very easy since the message has a GuildMember associated with it.
const Discord = require('discord.js');
const bot = new Discord.Client();
bot.on('message', (message) => {
const guildMember = message.member;
guildMember.addRole('bot-added-role');
});

Categories