Itachi Sama
Itachi Sama

Reputation: 926

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

Upvotes: 22

Views: 146899

Answers (6)

JayTurnr
JayTurnr

Reputation: 183

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)

Upvotes: 7

Taku
Taku

Reputation: 33764

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.

Upvotes: 21

user2863294
user2863294

Reputation: 472

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.

Upvotes: 2

technoplato
technoplato

Reputation: 3431

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)

Upvotes: 3

Peter G
Peter G

Reputation: 2821

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

Upvotes: 4

Itachi Sama
Itachi Sama

Reputation: 926

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)

Upvotes: 40

Related Questions