Could not leave a discord guild - discord.js

I'm trying to make my bot leave any guilds if the guilds size reaches 2 guilds
I tried everything from the Discord.js docs using leave()
// Here is my code on guildCreate.js event
const Discord = require('discord.js');
const client = new Discord.Client();
let guildArray = client.guilds.array();
module.exports = async function (msg,guild) {
if(guildArray.size > 1)
await guild.leave()
};
It should works and leave the guild because the size is more than 2 guilds but it do nothing .

I think you want something like this if I am right:
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
let guildnumber = client.guilds.size;
while(guildnumber > 2 )
{
client.guilds.first().leave();
guildnumber--;
}
});
client.log(token);
You can put it into ready and/or guildAdd as guildAdd only emits when your bot gets added to a guild and is online so you should check if your bot was added during it was offline

Related

How can a bot read embed messages sent by another bot and post a message if it contains a specific content?

I'm trying to code a Discord bot that would read embed messages sent by another bot and ping a specific role if the embed contains '(FREE)' in the title, as displayed here:
https://i.stack.imgur.com/kPsR1.png
Unfortunately, my code produces nothing. I don't run into any error, the bot simply doesn't post a message when conditions are matched to do so — yet it is online and has the permissions to post messages in the channel.
Any help would be really appreciated. I went through all the questions related to this topic on SO, but I couldn't find a working solution to my issue. I'd like to mention that I'm a beginner in JS.
Thank you so much.
const Discord = require('discord.js');
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_WEBHOOKS"] })
client.on('ready', () => {
console.log(`Logged in...`);
});
client.on('messageCreate', (message) => {
if (message.embeds) {
const embed = message.embeds[0]
if (embed.title === '(FREE)') {
return message.channel.send('#Free mint')
}
}
})
Edit: I believe my question is different from the one suggested in the comment as I'm looking for specific content in the embed.
I managed to make the bot work with the following code, thanks #Gavin for suggesting it:
const Discord = require('discord.js');
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_WEBHOOKS"] })
client.on('ready', () => {
console.log(`Logged in...`);
});
client.on('messageCreate', message => {
for (let embed of message.embeds) {
if (embed.title.includes('FREE')) {
return message.channel.send("<#&" + roleId + ">")
}
}
});

Discord.js 'CLIENT_MISSING_INTENTS' Error

I am trying to make my Discord bot appear online, but I am getting an error
Code:
const Discord = require('discord.js');
const client = new Discord.Client();
client.once('ready' , () => {
console.log('Bot is online');
});
client.login('My token');
Can anyone point me in the right direction?
Intents were introduced in discord.js v13 and ensure that the bot only does what it intends to do - i.e. it doesn't waste processing power.
//example from the official Discord.js guide
const { Client, Intents } = require('discord.js');
const myIntents = new Intents();
myIntents.add(Intents.FLAGS.GUILD_PRESENCES, Intents.FLAGS.GUILD_MEMBERS);
const client = new Client({ intents: myIntents });
client.login('mytoken');
The docs are always a good place to look first.

Ways to login to multiple bot accounts with one script?

The ways I've tried.
Loop through tokens, this is fine but not much room to customise what bot does what. Example having each bot type in a specific channel, with this I've realised the bots type in the same location right after each other.
const auth = require('./tokens.json')
const Discord = require('discord.js')
for (const token of auth.Tokens) {
const client = new Discord.Client()
client.on('ready', () => {
console.log('I am ready !')
console.log(client.user.id)
})
client.login(token)
}
Also by creating multiple instances of a discord.client
const Discord = require('discord.js');
const client1 = new Discord.Client();
const client2 = new Discord.Client();
ect...
client1.once('ready',() => {
})
client1.on('message', async(message) => {
})
client2.once('ready',() => {
})
client2.on('message', async(message) => {
})
client1.login(CONFIG.Token1);
client2.login(CONFIG.Token2);
I am just wondering if there is other ways of doing this, lets say I have 5-6 bots and I do the 2nd method the code will get quite long depending on what i want to add into it.
I did think about adding a loop something like this.
for(var i = 0; i < token.length; i++)
And having a channel id linked to a specific number as the i++ is increasing it. So each bot would get its own number and channel id, but I'm not sure if that's even a thing that would work or if it would be good enough to use.
Any suggestions would be greatly appreciated and thank you for reading.
I think your second method:
creating multiple instances of a discord.client
Would be the best way to do it.
The easiest way to give the bots specific channels is to change their discord permissions and physically assigning them the channels.
Another way could be something like:
client.channelID = <ID of channel you want the bot in>
client2.channelID = <ID of channel you want the bot in>
// ... code
client.on('message', message => {
if (message channel.id !== client.channelID) return;
// ...
I was able to run multiple bots from the same script using this code:
const auth = ['TOKEN1', 'TOKEN2']
const Discord = require('discord.js')
for (const token of auth) {
const client = new Discord.Client()
client.on('ready', () => {
console.log('I am ready !')
console.log(client.user.id)
});
client.on('message', (msg) => {
if (msg.content === '!ping') {msg.reply('pong!')}
});
client.login(token);
}

I want to get System Messages Channel in discord.js v12

I want to get SystemChannel. I am using discord.js v12, this is what I have so far:
bot.on('guildMemberAdd', member => {
// I want to get this channel, not by name
[System Messages Channel][1]
const channel = (getDefaultChannel)
if(!channel) return;
channel.send(`hello ${member}!`);
});
You can get the SystemChannel by using member.guild.systemChannel, or member.guild.systemChannelID in case you want the channel's ID, in your guildMemberAdd event.
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
// Get the "System Messages Channel"
const systemMessagesChannel = client.guilds.cache.first().systemChannel;
// Send a message to the channel
systemMessagesChannel.send('Hello from the bot!');
});
client.login('YOUR_BOT_TOKEN_HERE');

Discord.js send message if have a role

I want to send dm to anyone who has the role of "xxx" when the bot starts. Can you help me?
You can do it with this code:
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
const list = client.guilds.get("guild ID");
list.members.forEach(member => {
if (member.roles.some(role => role.name === 'Your role')) {
member.send('Your message')
}
});
});
The way it works is when the bot is ready it will check each member if they have the specified role and if they do then the bot will send it a DM.
A tip, when asking questions like this provide more information on what the problem is, what you've tried and you're current code.

Resources