Discordpy welcome bot

#python-3.x #discord.py

#python-3.x #discord.py

Вопрос:

Итак, я попытался создать бота, который отправляет embed на определенный канал каждый раз, когда пользователь присоединяется к моему серверу. Код выглядит следующим образом

 import discord
import asyncio
import datetime
from discord.ext import commands

intents = discord.Intents()
intents.members = True
intents.messages = True
intents.presences = True

bot = commands.Bot(command_prefix="a!", intents=intents)

@bot.event
async def on_ready():
    print('Bot is ready.')

@bot.event
async def on_member_join(ctx, member):
    embed = discord.Embed(colour=0x1abc9c, description=f"Welcome {member.name} to {member.guild.name}!")
    embed.set_thumbnail(url=f"{member.avatar_url}")
    embed.set_author(name=member.name, icon_url=member.avatar_url)
    embed.timestamp = datetime.datetime.utcnow()

    channel = guild.get_channel(816353040482566164)

    await channel.send(embed=embed)
 

и я получил сообщение об ошибке

 Ignoring exception in on_member_join
Traceback (most recent call last):
  File "C:UsersPieroAppDataRoamingPythonPython39site-packagesdiscordclient.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "C:UsersPieroDocumentsDiscorda-chanachan_botmain.py", line 24, in on_member_join
    channel = guild.get_channel(816353040482566164)
NameError: name 'guild' is not defined
 

Кто-нибудь знает, что не так в моем коде?

Комментарии:

1. Вы нигде не определили guild свой код, так как же Python должен знать, что это такое?

2. Я не думаю, что ctx это параметр, который передается on_member_join . Глядя на документацию , кажется, что она только member передана.

Ответ №1:

Прежде всего, просматривая discord.py документацию, ctx не передается on_member_join в ссылку на событие. Однако вы можете использовать атрибуты member , которые передаются, чтобы получить нужные вам значения.

 @bot.event
async def on_member_join(member):
    embed = discord.Embed(
        colour=0x1abc9c, 
        description=f"Welcome {member.name} to {member.guild.name}!"
    )
    embed.set_thumbnail(url=f"{member.avatar_url}")
    embed.set_author(name=member.name, icon_url=member.avatar_url)
    embed.timestamp = datetime.datetime.utcnow()

    channel = member.guild.get_channel(816353040482566164)
    await channel.send(embed=embed)
 

Интересно, что вы сделали это идеально для получения названия гильдии, но, похоже, вы забыли сделать то же самое при извлечении channel .

Ответ №2:

Вы не определили guild . Чтобы определить свою гильдию, вы можете сделать следующее:

 guild = bot.get_guild(GuildID)
 

Это тот же метод, который вы использовали для определения своего channel , только для вашего guild сейчас.

Для получения дополнительной информации вы можете ознакомиться с документами: https: //discordpy.readthedocs.io/ru/latest/api.html#discord.Клиент.get_guild

Также примите во внимание, что у нас нет параметра, как ctx в on_member_join событии. Событие просто имеет параметр member в вашем случае:

 @bot.event
async def on_member_join(member): #Removed ctx