discord.py throws error with on_member_join - python

I'm trying to make an on_member_join function for a discord.py bot that sends a welcome message when someone joins my server.
This is the code I have for the function:
#client.event
async def on_member_join(member):
print(f"{member.name} JOINED!")
welkomChannel = client.get_channel(channel id)
await welkomChannel.send(f"Hello!")
When I join the server with an alt account, it throws this error: discord.errors.PrivilegedIntentsRequired. I went to discord.com/developers/applications and turned on the SERVER MEMBERS intent;
And I added these lines to my code after the imports:
intents = discord.Intents.default()
intents.members = True
client = commands.Bot(command_prefix="!", intents=intents)
So if I have enabled it on the website and I put the intents in the code, why does it still throw the error?

intents = discord.Intents()
intents.members = True
intents.Default basically includes presence, member, so you need to activate presence intents or change to Intents().
docs

Related

Welcome message

I tried to greet users on the server but nothing works.
This my code:
#client.event
async def on_member_join(member):
await client.get_channel(918604938085548064).send(f"{member.name} has joined")
I also tried code like this:
#client.event
async def on_member_join(member):
# check if the guild the member is joining is equal to your guild's id
if member.guild.id != GUILD ID:
return
# if it's the same guild id, it continues
embed = discord.Embed(color=0x6c5ce7)
# etc, other code
I thought that this code was enough, but I never received a message or an error in the console.
Console output:
If you don't get any message or an error then it's probably happening because you didn't enable Privileged Gateway intents and your bot doesn't get the member. As you can see in the docs - on_member_join requires intents.Members.
Enable Server Members Intent on the Discord Developer site in the Bot section.
Then, add something like this to your code:
intents = discord.Intents.default()
intents.members = True
client = commands.Bot(command_prefix="!", intents=intents)

Welcoming new members not working with discord.py

I'm trying to setup a simple discord.py enabled bot and having trouble welcoming new members. I have the following code and when a new member joins, the bot is able to process the default welcome message Discord sends but doesn't process anything in the on_member_join() function. I've enabled intents within Discord (both gateway and member) and still can't figure out why it won't process a new member joining. I've also tested with a brand-new created member and still won't trigger.
import discord
intents = discord.Intents.default()
intents.members = True
client = discord.Client()
#client.event
async def on_ready(): # When ready
print('We have logged in as {0.user}'.format(client))
#client.event
async def on_member_join(member):
print('Someone new!')
await member.send("Welcome")
#client.event
async def on_message(message): # On every message
if message.author == client.user: # Cancel own message
return
if message.content.startswith('?'):
await message.channel.send('Command')
client.run(DISCORD_TOKEN)
This is not related to using Client instead of Bot.
You created the intents variable, but you're never using it. You're supposed to pass it into your discord.Client(), which you aren't doing, so the members intent will always be disabled.
# Original question
intents = discord.Intents.default()
intents.members = True
client = discord.Client() # <-- You're not passing intents here! The variable is never used so intents are disabled
That's also why your answer fixes it: because you're actually using your intents (...intents=intents...).
# Your "fix"
client = commands.Bot(command_prefix = "!", intents = intents) # <-- Notice the intents
Using discord.Client or commands.Bot has no influence on this: commands.Bot without passing intents wouldn't do anything either.
# This would cause the exact same issue, because intents aren't used
client = commands.Bot(command_prefix = "!")
Passing your intents into the Client would also work, just like that fixes the problem for your Bot.
client = discord.Client(intents=intents)
EDIT: See answer. Changing the below correctly passed intents (with members = True) to the bot.
Unsure why but I needed to use bot commands in order to resolve the issue.
Added:
from discord.ext import commands
and changed
client = discord.Client()
to
client = commands.Bot(command_prefix = "!", intents = intents)
I think this is what was required to 'fully enable' intents, but I'm not fully sure why this corrected the issue.

discord py bot sees only one member

I'm trying to get the # of all users on server, the bot sees only itself although it responds to the messages of the others.
client = discord.Client()
#client.event
async def on_message(message):
msg=message.content
if message.author == client.user:
return
if msg.startswith("count"):
await message.channel.send(client.users)
The code outputs a list with one user (bot itself)
You need to enable the Intents, they are missing.
Make sure to turn them on in the Discord Developer Portal for your application (Settings -> Bot).
To implement them to your code you can use the following:
intents = discord.Intents.all() # Imports all the Intents
client = commands.Bot(command_prefix="YourPrefix", intents=intents)
Or in your case:
intents = discord.Intents.all() # Imports all the Intents
client = discord.Client(intents=intents)
You can read more in the Docs here.
Well the issue you're having is because since version 1.5 (not 1.6 as i initially tought, thanks Łukasz Kwieciński) discord.py needs you to specify the intents your bot needs in order to receive such information from discord's API.
Your code will work if you change this:
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
For it to work though you'll need to go to your bot's page and enable the members intent.
For what i can see in your code it appears you're trying to make a command, i strongly suggest you start using the commands extension. Your code would look like this:
from discord.ext import commands
intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix='.', intents=intents)
#bot.command()
async def count(ctx):
await ctx.send(bot.users)
bot.run(TOKEN)
The resulting code is more compact, readable and maintainable.
You can check other examples here

Discord.py Enabling Intents for on_member_join Event

I am fixing an old bot from before the intents changes were made and I am trying to just do a simple on_server_join Event but it isn't working, I am not getting any error and assume that this is caused by an issue with intents. I have enabled both privileged intents in the developer portal and tried to implement it into my code however it still isn't functioning correctly.
import discord
from discord.ext import commands
from discord.utils import get
intents = discord.Intents(messages=True)
client = commands.Bot(command_prefix ='-', intents=intents)
#client.event
async def on_member_join(member):
channel = client.get_channel(751225399798923315)
print("Person Joined")
await channel.send("Welcome!")
client.run('Token')
Here is a sample of the code any help is appreciated.
You only enabled intents.messages, you need intents.members for any on_member_* event. Also I suggest you simply enabling default intents + intents.members and everything should be working fine.
intents = discord.Intents.default()
intents.members = True
client = commands.Bot(command_prefix ='-', intents=intents)
Also make sure to enable them in the developer portal

Discord.py on_member_join not working, no error message

I am trying to make a discord bot with the Discord.py library. The commands with the #client.command() decorator work fine for me, but none of the event ones that I tried work.
#client.event
async def on_member_join(member):
channel = client.get_channel(ChannelId) #I did define channel Id in my code
await channel.send("someone has joined")
#client.event
async def on_member_remove(member):
print("Someone has left")
I would expect this to output to the terminal or in the channel id I put in, but nothing appears, not even an error message.
*I used client. for all functions.
*I am doing this on mac.
Im not quite sure why its working, I do not get any error messages, and I cant seem to find anyone else with this problem.
Thanks in advance
With version >1.5.0 you can do something like this:
import discord
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
#client.event
async def on_member_join(member):
await member.send("Welcome!")
You also need to enable intents in the developer portal in https://discord.com/developers/applications. Bot > Bot > Presence & Server Members Intents > Toggle On
import discord
intents = discord.Intents.all()
discord.member = True
bot = commands.Bot(command_prefix="[",intents = intents)
and you need to go to developer portal --> applications(select your bot)
and under the setting have a bot. Click it under the page has PRESENCE INTENT and SERVER MEMBERS INTENT you need to open it. That will be working.
If you are using discord.py v1.5.0, see the docs for Gateway Intents

Categories