How do I mention a user in discord.py?

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')

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

So I finally figured out how to do this after few days of trial and error hoping others would benefit from this and have less pain than I actually had..
The solution was ultimately easy..

  if message.content.startswith('!best'):
        myid = '<@201909896357216256>'
        await client.send_message(message.channel, ' : %s is the best ' % myid)

Method 2

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.

Method 3

If you’re working on commands, you’re best to use discord.py’s built in command functions, your hug command will become:

import discord
from discord.ext import commands

@commands.command(pass_context=True)
async def hug(self, ctx):
    await self.bot.say("hugs {}".format(ctx.message.author.mention()))

This is assuming you’ve done something like this at the start of your code:

def __init__(self):
    self.bot = discord.Client(#blah)

Method 4

From a User object, use the attribute User.mention to get a string that represents a mention for the user. To get a user object from their ID, you need Client.get_user_info(id). To get the a user from a username (‘ZERO’) and discriminator (‘#6885’) use the utility function discord.utils.get(iterable, **attrs). In context:

if message.content.startswith('!best'):
    user = discord.utils.get(message.server.members, name = 'ZERO', discriminator = 6885)
    # user = client.get_user_info(id) is used to get User from ID, but OP doesn't need that
    await client.send_message(message.channel, user.mention + ' mentioned')

Method 5

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)

Method 6

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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x