如何在没有命令

时间:2018-04-14 20:09:33

标签: python bots discord discord.py

import discord
import asyncio

client = discord.Client()
@client.event
async def on_ready():
    print("I'm ready.")

async def send(message):
    await client.send_message(client.get_channel("412678093006831617"), message)

client.run("token")

loop = asyncio.get_event_loop()
loop.run_until_complete(send("hello"))

嗨,我想制作一个GUI。当有人输入他的名字并按“确定”时,我的不和谐机器人应发送消息。基本上我以为我用它的名字称为异步,不起作用。然后我做了一个事件循环。使用print(),但机器人不发送消息,所以我认为它没有准备好,当我把wait_until_ready()放在那里它没有执行任何东西,所以我想我必须把client.run(“令牌“)在事件循环之前,也没有工作。

你能帮助我吗? :)

2 个答案:

答案 0 :(得分:6)

您的代码无法正常工作的原因是因为client.run正在阻塞,这意味着它不会执行任何操作。这意味着永远无法联系到loop

要解决此问题,请使用client.loop.create_task

discord.py的github有一个后台任务示例,找到here。您应该可以将此作为参考。目前,该任务每分钟都会向指定频道发布一条消息,但您可以轻松修改该消息以等待特定操作。

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = discord.Object(id='channel_id_here')
    while not client.is_closed:
        counter += 1
        await client.send_message(channel, counter)
        await asyncio.sleep(60) # task runs every 60 seconds

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run('token')

答案 1 :(得分:0)

对于响应行为,您有两个选择:您可以编写on_message事件处理程序,或使用discord.ext.commands模块。我建议使用commands,因为它更强大,并且不会将所有内容保存在单个协程中。

from discord.ext.commands import Bot

bot = Bot(command_prefix='!')

@bot.event
async def on_ready():
    print("I'm ready.")
    global target_channel
    target_channel = bot.get_channel("412678093006831617")

@bot.command()
async def send(*, message)
    global target_channel
    await bot.send_message(channel, message)

将使用!send Some message调用此方法。 *, message语法只是告诉机器人不要再尝试解析消息内容。