我有一项服务,当我的服务有更新时,如何自动向 Discord 发送消息? 我试着喜欢这样
import discord
import asyncio
from threading import Thread
from discord.ext import commands
class DiscordBot:
def __init__(self):
self.token = "token"
self.imageFolder = "folder"
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
self.client = discord.Client(intents=intents)
self.bot = commands.Bot(command_prefix="!", intents=intents,description="Một con bot Ree đến từ stock-chat")
self.loop = asyncio.get_event_loop()
self.loop.create_task(self.client.start(self.token))
# self.thread = Thread(target=self.loop.run_forever)
# self.thread.start()
async def sendMessage(self, content_message):
for guild in self.bot.guilds:
for member in guild.members:
if not member.bot:
await member.send("Welcome!")
def runbot(self):
self.bot.run(self.token,reconnect=True)
bot_discord = DiscordBot()
bot_discord.runbot()
bot_discord.sendMessage("Welcome!")
但是我在调用runbot后无法调用sendMessage
在
bot.run()
之后无法执行某些操作,因为它正在阻塞呼叫。
但是,您可以从异步函数 sendMessage()
事件调用
on_ready
:
async def on_ready(self) -> None:
await sendMessage()
但这里值得一提的是,
on_ready
可能会执行多次。为了防止下次触发,可以创建一个标志 was_ready_once
:
class DiscordBot:
def __init__(self):
self.token = "token"
self.imageFolder = "folder"
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
self.client = discord.Client(intents=intents)
self.bot = commands.Bot(command_prefix="!", intents=intents, description="Một con bot Ree đến từ stock-chat")
self.loop = asyncio.get_event_loop()
self.loop.create_task(self.client.start(self.token))
self._was_ready_one = False # create flag
self._add_events() # add event handlers
async def sendMessage(self, content_message):
for guild in self.bot.guilds:
for member in guild.members:
if not member.bot:
await member.send("Welcome!")
def _add_events(self): # function to add event handler
@self.bot.event
async def on_ready():
if not self._was_ready_once: # check if bot was ready before
self._was_ready_once = True
await self.sendMessage("content")
def runbot(self):
self.bot.run(self.token, reconnect=True)
bot_discord = DiscordBot()
bot_discord.runbot()