Discord Bot w/ Discord.py 跳线

Posted

技术标签:

【中文标题】Discord Bot w/ Discord.py 跳线【英文标题】:Discord Bot w/ Discord.py skipping lines 【发布时间】:2018-12-02 22:55:46 【问题描述】:

我今天尝试制作一个基于 python discord.py 的机器人以获得一些乐趣,并且遵循一些随机教程并复制代码效果很好,一旦掌握了它,我就添加了一些新命令,但显然大多数命令随机停止工作,由于某种原因,现在只有最底层的命令实际上在不和谐中运行,任何想法为什么会这样? 代码:

import discord
from discord.ext import commands

description = 'Tutorial Bot'
bot_prefix = '!'

client = commands.Bot(description=description, command_prefix=bot_prefix)

list_of_strings = ['hello', 'hi']

@client.event
async def on_ready():
    print('Connected')

@client.event
async def on_message(message):
    if message.content.startswith('!what'):
        await client.send_message(message.channel, 'Huh?')

@client.event
async def on_message(message):
    if message.content in list_of_strings:
        await client.send_message(message.channel, 'Hey there')

client.run('*set to code before attempting*')

我已经将 client.run 设置为最新的代码,但是每当我使用字符串命令的底部列表时它都可以正常工作,但是 !what 部分不起作用。我尝试扭转它们,但同样的问题仍然存在,无论它们处于哪个顺序,只有最底部的一个在工作。我可能在这里遗漏了一些明显的东西吗?

【问题讨论】:

我以前没用过这个,但大概第二个会覆盖第一个... 【参考方案1】:

我不是 Python 专家,但您的部分问题可能是两个函数声明以相同的方式完全定义。我想第二个函数正在重新定义第一个函数。

@client.event
async def on_message(message):
    //Function 1 code
@client.event
async def on_message(message):
    //Function 2 code

不是使用两个,而是像这样将第二个的条件移动到第一个:

@client.event
async def on_message(message):
    if message.content.startswith('!what'):
        await client.send_message(message.channel, 'Huh?')

    elif message.content in list_of_strings:
        await client.send_message(message.channel, 'Hey there')

【讨论】:

【参考方案2】:

当您使用 Client.event 装饰器时,实际上是将 client.on_message 属性分配为您编写的协程。 client.on_message 不能同时是两个东西,所以旧的被丢弃了。

不过,您的想法是正确的:您应该将命令拆分为离散的单元,而不是将它们保存在一个单一的整体协同程序中。为此,您实际上使用了 Bot.command() 装饰器。

import discord
from discord.ext import commands

description = 'Tutorial Bot'
bot_prefix = '!'

client = commands.Bot(description=description, command_prefix=bot_prefix)

list_of_strings = ['hello', 'hi']

@client.event
async def on_ready():
    print('Connected')

@client.command(pass_context=True)
async def what(ctx):
    await client.say('Huh?')

@client.event
async def on_message(message):
    if message.author == client.user:
        return  # We don't want our bot to respond to itself
    if message.content in list_of_strings:
        await client.send_message(message.channel, 'Hey there')
    await client.process_commands(message)  # Hand off to the command logic

client.run('*set to code before attempting*')

【讨论】:

以上是关于Discord Bot w/ Discord.py 跳线的主要内容,如果未能解决你的问题,请参考以下文章

Discord bot 运行命令两次 discord.py

Discord.py Bot 将文件发送到 Discord 频道

@bot.event 在一个 cog discord.py

discord.py 'Bot' 对象没有属性 'send_message'

Discord bot 添加对消息 discord.py 的反应(无自定义表情符号)

discord.py bot 不会响应命令