提问者:小点点

如何发送不一致的消息。不带命令的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("123456789"), message)

client.run("token")

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

嗨,我想做一个GUI。当有人输入他的名字并按下“确定”时,我的不和机器人应该会发送一条信息。基本上我以为我叫异步的名字,没有工作。然后我做了一个事件循环。使用print(),但是机器人不发送消息,所以我认为它还没有准备好,当我把wait_until_ready()放在那里时,它什么也没执行,所以我认为我必须把client.run("Token")在事件循环之前,也不起作用。

你们能帮我吗?:)


共2个答案

匿名用户

代码不工作的原因是client。run被阻塞,意味着它之后不会执行任何操作。这意味着您的循环将永远无法到达。

要解决这个问题,请使用client。环创建任务

discord的github。py有一个后台任务示例,可在此处找到。您应该能够将其用作参考。当前,该任务每分钟向给定通道发布一条消息,但您可以轻松地修改它以等待特定操作。

新的不和谐。py版本

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = client.get_channel(id=123456789) # replace with channel_id
    while not client.is_closed():
        counter += 1
        await channel.send(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')

较旧的discord.py版本

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')

匿名用户

对于响应行为,您有两个选项:您可以编写一个on_message事件处理程序,或者使用discord.ext.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)

这将通过调用!发送一些消息*,message语法只是告诉bot不要尝试进一步解析消息内容。