How do I mention a user in discord.py?

Viewed 120996

I'm trying to code a simple bot using discord.py, so I started with the fun commands to get familiar with the library.

import discord

client = discord.Client()

@client.event
async def on_message(message):
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return

    if message.content.startswith('!hug'):
        await message.channel.send(f"hugs {message.author.mention}")

    if message.content.startswith('!best'):
        user_id = "201909896357216256"
        user_mention = ???  # How to convert user_id into a mention
        await message.channel.send(f'{user_mention} is the best')
6 Answers

Updated answer for discord.py 1.x - 2.x (2021):

Some of the other solutions are now obsolete since discord.py's syntaxes has changed and the old versions no longer works.

If you only have the user ID, then it's:

user_id = "201909896357216256"
await message.channel.send(f"<@{user_id}> is the best")

If you have the user/member object, then it's:

await message.channel.send(f"{user.mention} is the best")

If you only have the user name and discriminator (the bot and user must share a server and members cache must be toggled on):

user = discord.utils.get(client.users, name="USERNAME", discriminator="1234")
if user is None:
    print("User not found")
else:
    await message.channel.send(f"{user.mention} is the best")

Replace message.channel if you have a ctx when using commands instead of on_message.

If you just want to respond from the on_message callback, you can grab the mention string from the author like so:

@bot.event
async def on_message(message):
    # No infinite bot loops
    if message.author == bot.user or message.author.bot:
        return

    mention = message.author.mention
    response = f"hey {mention}, you're great!"
    await message.channel.send(response)

While OP's issue is long resolved (and likely forgotten) -- If you're building a Discord bot in Python, it's still a bit difficult to find this information - hopefully this helps someone. If you're trying to use the @bot.command method - the following will work (in python3):

@bot.command(name='ping', help='Ping the bot to text name')
async def ping(ctx):
    await ctx.send('Pong ' + format(ctx.author))
    print("debug: " + dir(ctx.author))

If you want to display the nickname of the "author" (who called the command) you can use this instead":

@bot.command(name='ping', help='Ping the bot to text name')
async def ping(ctx):
    # await ctx.send('Pong {0}'.format(ctx.author))
    await ctx.send('Pong ' + format(ctx.author.display_name))
    print("debug: " + dir(ctx.author))

Another helpful tip: You can use dir(ctx.author) to see the attributes of the ctx.author object.

Related