python - 执行 client.run() 后如何运行 discord 机器人?
问题描述
class MyClient(discord.Client):
def __init__(self, *args, loop=None, **options):
intents = discord.Intents.default()
intents.members = True
self.data = {}
super().__init__(intents=intents, *args, loop=None, **options)
async def on_ready(self):
print('Logged on as {0}!'.format(self.user))
for guild in self.guilds:
members = []
async for member in guild.fetch_members():
members.append(member)
if member.name == "Name":
await member.send("Hello :wave:")
self.data[guild] = members
print(self.data[guild])
async def on_message(self, message):
if message.author == self.user:
return
if message.content.startswith('$hello'):
await message.author.send(":wave:")
async def sendMessage(self, name, message):
for guild in self.data:
for member in self.data[guild]:
if name == member.name:
print(member.name)
await member.send(message)
在另一个文件中,即 main.py 或其他文件中,
client = MyClient()
client.run(TOKEN)
while True:
sleep(5)
client.sendMessage("Me", "Hello")
理想情况下,一旦我的其他代码完成运行或类似性质的东西,我会使用它来通知我。我已经尝试过线程,如本示例https://stackoverflow.com/a/62894021/9092466中所示,但我不知道如何让代码等待客户端完成准备
解决方案
不建议对 discord.py 等异步库使用 using sleep
,您可以使用 discord.py 的任务来运行循环
from discord.ext import tasks
class MyClient(discord.Client):
def __init__(self, *args, loop=None, **options):
intents = discord.Intents.default()
intents.members = True
self.data = {}
super().__init__(intents=intents, *args, loop=None, **options)
self.send_message.start()
@tasks.loop(seconds= 5)
async def send_message(self, name, message):
for guild in self.data:
for member in self.data[guild]:
if name == member.name:
print(member.name)
await member.send(message)
@send_message.before_loop
async def before_sending(self): #waiting until the bot is ready
print('waiting...')
await self.bot.wait_until_ready()
参考:
推荐阅读
- ruby - Net::HTTPForbidden 403 禁止
- dynamics-crm - MS Dynamics CRM 中的时间线是什么?
- javascript - console.time 显示运行相同功能的不同时间
- unity3d - unity3D 时间轴和电影机
- azure - Elk Logstash 无法连接到事件中心 Azure
- c# - 按钮“后退”始终禁用
- php - 问题解决 在 PHP 7.2 上移动上传的文件错误 8 - UPLOAD_ERR_EXTENSION
- javascript - 可观察管道中的异常被抑制
- asp.net-core - 扩展 ResourceManagerStringLocalizer 功能
- php - 元查询 - 在一个查询中比较两个元值