How to know which user is talking to the bot - discord.py

I'm new to discord.py, and trying to make the bot respond to hi. How do the bot know who is talking to it?
bot = commands.Bot(command_prefix="!", intents=discord.Intents().all())
#bot.command()
async def hi(ctx):
await ctx.send("hi" + bot.user.name)
expected:
Bob: !hi
Bot: hi Bob
Alice: !hi
Bot hi Alice
now:
Bob: !hi
Bot: hi Bot
Alice: !hi
Bot hi Bot

bot.user.name doesn't return the command user's name and has no relation to the command because of bot. Instead, it returns your ClientUser.name aka your bot name Bot.
ctx has the attribute author which gets the command user. This together with name attribute and you'll get the command user's name.
bot = commands.Bot(command_prefix="!", intents=discord.Intents().all())
#bot.command()
async def hi(ctx):
await ctx.send("hi " + ctx.author.name)
Instead of using string concatenation, you can also use f-strings
await ctx.send(f"hi {ctx.author.name}")
This way, you don't need to use the + or str() in the case of integers

Related

How do you send a private message on_ready aka on a #client.event. Discord.py

I had multiple attempts.
# One of the attempts
ch = client.get_user(USERID)
await ch.send("IDK")
#Another
client = discord.Client()
#client.event
async def on_ready():
user = "#name"
user = discord.Member
await user.send(user, "here")
#Another
client = discord.Client()
#client.event
async def on_ready():
user = discord.utils.get(client.get_all_members(), id='USERID')
if user is not None:
await client.send(user, "A message for you")
else:
await client.send(user, "A message for you")
#Another
#client.event
async def on_ready():
ch = client.get_all_members()
await ch.send("Hello")
# Another
ch = client.start_private_message(USERID)
await ch.send("IDK")
As you can see I messed with the variables because I noticed that you can send a message by channel like this
channel = client.get_channel(CHANNELID)
await channel.send("Something)
But that doesn't work with get_user. Thanks in advance also sorry how bad my post/code is.
Allow me to inform you on what is wrong with the pieces of code you have provided.
await client.send(user, "A message for you") is older syntax, and has not been used since the v1.0 migration.
client.get_all_members() shouldn't be used in this case, as you are only getting all the members the bot shares a server with rather than a single user.
client.start_private_message(USERID) does not exist as far as I have read, and therefore we can assume that this wouldn't work.
My recommendation would be to use one of the two methods I will detail.
The first method would be to use client.fetch_user(), which sends a request to the Discord API instead of its internal cache (as the second method will). The only problem you will face with this method is if you retrieve too many users in a small amount of time, which will get you ratelimited. Other than that, I recommend this method.
The second method is to get a server through client.get_guild() and getting your user through there via guild.get_member(). This method will require the user to be in its cache, however, so this shouldn't be your go-to method in my opinion.
Do view both of these methods in the code below.
#client.event
async def on_ready():
# Method 1: Using fetch
user = await client.fetch_user(USER_ID)
await user.send("A message!")
# Method 2: Using 'get'
guild = client.get_guild(GUILD_ID)
user = guild.get_member(USER_ID)
await user.send("A message!")
Other Links:
Send DM to specific User ID - Stackoverflow
DM a specific user - Stackoverflow
Sending DM through python console (Fetch user) - Stackoverflow
DPY v1.0 Migration - Discord.py Documentation

How do I make my discord.py bot recognise it's being pinged

I'm trying to make a discord bot via discord.py and want to create a command that shows the member's pfp. But, I want the bot to recognise when it is being pinged and it's pfp is being requested. How can I reformat this to make my bot recognise it's being refrenced or not as the member pinged (assuming the bots name and id is "Bot#1111")
Refrence command that I want the discord user to input
,membget #Bot#1111
#client.command()
async def membget(ctx, member: Member = None):
if not member:
member = ctx.author
if member == "Bot#1111":
print("1")
await ctx.send('This is me!')
return
await ctx.send(member.avatar_url)
await ctx.send('This here is a user!')
print(member)
Instead of if member == "Bot#1111": you can use if member == bot.user:

Discord.py DM command (To send and recieve a dm)

I'm pretty new to python and well, I wanted to make a discord bot that sends a dm, and when the other user receives the dm, they answer back, and the owner of the code or an admin of a server will be able to see what it says!
Here is my code so far for the dm:
#client.command()
async def dm(ctx, user: discord.User, *, message):
await user.send(message)
How do I make it so that i can see what the user replied to the bot?
For this, you can use client.wait_for() with check(), so add this after await user.send(message):
def check(msg):
return msg.author == user and isinstance(msg.channel, discord.DMChannel)#check for what the answer must be, here the author has to be the same and it has to be in a DM Channel
try:
answer = await client.wait_for("message", check=check, timeout=600.0)#timeout in seconds, optional
await ctx.send(answer.content)
except asyncio.TimeoutError:
await author.send("Your answer time is up.")#do stuff here when the time runs out
all if this is in your dm function.
References:
wait_for(event, *, check=None, timeout=None)

Discord dm bot that can dm back

I am trying to make a donation bot, where in the channel when a person types !donate the bot will Dm them.
I got all that down but I am trying to make so that the person decides on how to donate like !cashapp, !paypal, etc., in the dms. It would send them that specific way to send money, for example once the bot Dms the use user what service they would like to pay with and the user says !cashapp it will send another message with my cashtag, or if they say !paypal it would send my paypal link.
Here's a simple example:
import discord
from discord.ext import commands
client = commands.Bot(command_prefix = "!")
#client.command()
async def donate(ctx, paymentMethod: str):
if (paymentMethod.lower() == "paypal"):
await ctx.send("PayPal link: ...")
elif (paymentMethod.lower() == "cashapp"):
await ctx.send("Cashapp Link: ...")
else:
await ctx.send("The provided payment method is not available.")
#donate.error
async def donate_error(ctx, error):
if isinstance(error, commands.errors.MissingRequiredArgument):
await ctx.send("Incorrect use of command!")
client.run("your bot token here")
Usage:
!donate {payment method} - Without the '{}'
Check the documentation for more information.
You can use user.send to send a message to the user dm and use it in the same way as ctx.send and channel.send.
await ctx.author.send("paypal link: ...") # ctx.author is the member that call the command
And 2 command will have different function so you just need to write both of them in a different way.
If you planning to make it into 1 command you can use if else check
#client.command(pass_context=True)
async def steam(ctx):
if ctx.author.send():
await ctx.send("you not boster")
else:
await ctx.author.send(random.choice(list(open('steam.txt'))))
i want if someone send a dm
its not Returns a dm
someone know how to do this?

I want to output the connected voice channel to the channel by inputting the user ID

I want to output the connected voice channel to the channel by inputting the user ID.
How do I code it?
I'm using a Google Translator.
Please understand that the translation is strange :)
import discord
Me: !s userID
bot : This user is connecting to the #voicechannel.
You need to check member.voice.voice_channel
#bot.command(pass_context=True)
async def whatchannel(ctx, member: discord.Member):
channel = member.voice.voice_channel
if channel is None:
await bot.say(f"{member.mention} is not connected to voice")
else:
await bot.say(f"{member.mention} is connected to {channel.name}")

Resources