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")在事件循环之前,也不起作用。
你们能帮我吗?:)
代码不工作的原因是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不要尝试进一步解析消息内容。