带Discord.py跳线的Discord Bot

时间:2018-06-23 21:43:45

标签: python bots discord discord.py

我今天尝试制作一个基于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部分无效。我尝试将它们反转,并且相同的问题仍然存在,无论它们处于哪个顺序,只有最底层的一个仍在工作。在这里是否可能缺少明显的东西?

2 个答案:

答案 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*')