#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