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。考虑使用 commandsprefix 而不是手动解析每条消息 (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 事件未被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .json 文件 discord.py 中获取信息

如何在 discord.py 中使用 sqlite3 配置欢迎事件?

Discord 机器人帮助命令 [discord.py]

Discord 音乐机器人 - 队列 (discord.py)

两个机器人之间的通信? (discord.py)

不和谐.py |更新频道名称 on_member_join