我今天尝试制作一个基于python discord.py的机器人,这很有趣,并遵循一些随机教程和复制代码,效果很好,并且在掌握了一些技巧之后,我添加了一些新命令,但是显然大多数命令是随机停止工作的,由于某种原因,现在只有最底部的命令实际上不协调地起作用,为什么会有这样的想法? 代码:
Maybe you should add all the scripts before the closing tag body?
<body>
<script src="https://unpkg.com/react@15.6.2/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@15.6.2/dist/react-dom.js">
</script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js">
</script>
<script src="js/script.js"type="text/jsx"></script>
</body>
我已经将client.run设置为最新代码,但是每当我使用底部的字符串列表命令时,它都可以正常工作,但是!what部分无效。我尝试将它们反转,并且相同的问题仍然存在,无论它们处于哪个顺序,只有最底层的一个仍在工作。在这里是否可能缺少明显的东西?
答案 0 :(得分:2)
我不是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')
答案 1 :(得分: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*')