Discord.py 欢迎机器人 on_member_join 事件未被调用
Posted
技术标签:
【中文标题】Discord.py 欢迎机器人 on_member_join 事件未被调用【英文标题】:Discord.py welcome bot on_member_join event not getting callded 【发布时间】:2021-01-16 09:11:01 【问题描述】:我最近对使用不和谐机器人很感兴趣,据我所见,这段代码应该可以工作,但它不是...... 我只是在玩 API,因为它很有趣,所以我对此很陌生。我只是希望机器人在某人加入时欢迎他们。
import discord
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as 0.user'.format(client))
channel = client.guilds[0].get_channel(CHANNEL ID)
await channel.send("Bot online")
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
@client.event
async def on_member_join(member):
print(f'member.name has joined the server')
channel = client.guilds[0].get_channel(CHANNEL ID)
print(channel)
await channel.send(f'member.name has joined the server')
@client.event
async def on_member_remove(member):
print(f'member.name has left the server')
channel = client.guilds[0].get_channel(CHANNEL ID)
print(channel)
await channel.send(f'member.name has left the server')
client.run('TOKEN HERE')
【问题讨论】:
您是否遇到任何错误?你on_ready()
开火了吗?我真的不明白为什么这不起作用。 PS。考虑使用 commands
和 prefix
而不是手动解析每条消息 (if message.content.startswith...
)
我的 on_ready 事件正在触发,但没有别的。这个确切的代码已经在另一个系统上进行了测试,它工作正常。我不知道为什么它对我不起作用。
【参考方案1】:
而不是 member.name 使用 member 并且如果该 dosnt 工作添加这个你有你的变量意图 = discord.Intents(messages = True, guilds = True, reaction = True, members = True, presents = True) client = commands.Bot(command_prefix = '*', intents = intents)
【讨论】:
【参考方案2】:FOR discord.py >= 1.5
1.5 增加了对Gateway Intents 的支持,默认情况下,您的机器人无法像以前的版本那样访问公会成员。如果您的机器人位于少于 100 台服务器中,那么您无需验证即可启用这些意图。您应该在 Discord 开发者门户的 Bot 页面底部看到这些设置。如果您同时启用两者,那么您需要更改您的客户端(或 commands.Bot)实例化:
intents = discord.Intents.all()
client = discord.Client(intents=intents)
当我对此进行测试时,事件正在触发,但我敢打赌你的问题在于:
channel = client.guilds[0].get_channel(CHANNEL ID)
使用 client.get_channel 来确保您实际上获取了预期的频道会更加可靠,discord 上的所有频道 ID 都是唯一的,因此您不需要使用公会对象。 CHANNEL ID
也不是一个有效的变量,但我猜你只是修改了它。
【讨论】:
我已经测试过了,我也不能让它触发,即使它应该触发的唯一行是打印行。我怀疑这是否会引发我们不理解的问题。 如果我完全复制您的代码,请将您的所有client.guilds[0].get_channel
更改为 client.get_channel
您所有的事件都对我有用
你的机器人在目标频道有发送消息权限吗?
你说得对。尽管如此,我的 on_ready 事件正在触发,但没有别的。这个确切的代码已经在另一个系统上进行了测试,它工作正常。我不知道为什么它对我不起作用
你运行的是什么版本?我让它与 discord.py 1.4.1、Python 3.8.5 一起使用【参考方案3】:
你忘记了装饰器的括号。
@client.event
应该是
@client.event()
编辑:显然不是。当 OP 回复更多信息时,将更新此答案。
【讨论】:
我认为这不是问题所在。如果是这样,用户将不会触发他们的 on_ready 事件,并且他们会发布关于此的问题。我一直在装饰器中编写没有括号的事件。可能不应该,但我愿意。 刚刚测试过,它只适用于您的main
文件,它会立即在Cogs
中崩溃。我想你是对的,但你真的不应该有这么大的主文件(假设你有,正如你所说的你“一直”这样做)。
discord.py event
装饰器没有括号,但像 command
装饰器这样的东西确实需要它们
我的 on_ready 事件正在触发,但没有别的。这个确切的代码已经在另一个系统上进行了测试,它工作正常。我不知道为什么它对我不起作用。以上是关于Discord.py 欢迎机器人 on_member_join 事件未被调用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 discord.py 中使用 sqlite3 配置欢迎事件?