英文:
discord.py "send message" function
问题
I need to send a message in the discord channel based on a trigger that occurs in my program. My program runs in one main "while True" loop. Ideally, I'd like to call the "send_message(text, picture)" function.
What I have now:
class MyClient(discord.Client):
async def on_ready(self):
print(f'Logged on as {self.user}!')
async def on_message(self, message):
# This part works correctly, but that's not what I'm asking about.
if str(message.author) != 'BOT' and message.content == "Show":
print(f'Message from {message.author}: {message.content} in {message.channel.id}')
is_success, buffer = cv2.imencode(".jpg", frame)
io_buf = io.BytesIO(buffer)
await message.channel.send(file=discord.File(io_buf, 'image.png'))
async def my_send(picture_to_send, text_to_send):
print("trying to send")
c_id = ID
channel_to = MyClient.get_channel(id=int(c_id))
is_success, buffer = cv2.imencode(".jpg", picture_to_send)
io_buf = io.BytesIO(buffer)
await channel_to.send(content=str(text_to_send), file=discord.File(io_buf, 'image.png'))
def dis_start():
intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
client.run('TOKEN')
dis_Call = threading.Thread(target=dis_start, daemon=True)
dis_Call.start()
When I try MyClient.my_send(frame, text)
, I receive the error "RuntimeWarning: coroutine 'MyClient.my_send' was never awaited". Maybe I'm trying to do it wrong; tell me how you would do it.
英文:
I need to send a message in the discord channel based on a trigger that occurs in my program. My program runs in one main "while True" loop. Ideally I'd like to call the "send_message(text, picture)" function.
What i have now:
class MyClient(discord.Client):
async def on_ready(self):
print(f'Logged on as {self.user}!')
async def on_message(self, message):
#This part work correctly, but that's not what I'm asking about.
if str(message.author)!='BOT' and message.content=="Show":
print(f'Message from {message.author}: {message.content} in {message.channel.id}')
is_success, buffer = cv2.imencode(".jpg", frame)
io_buf = io.BytesIO(buffer)
await message.channel.send(file=discord.File(io_buf, 'image.png'))
async def my_send(picture_to_send, text_to_send):
print("trying to send")
c_id=ID
channel_to = MyClient.get_channel(id=int(c_id))
is_success, buffer = cv2.imencode(".jpg", picture_to_send)
io_buf = io.BytesIO(buffer)
await channel_to.send(content=str(text_to_send), file=discord.File(io_buf, 'image.png'))
def dis_start():
intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
client.run('TOKEN')
dis_Call = threading.Thread(target=dis_start, daemon=True)
dis_Call.start()
when i try MyClient.my_send(frame, text) i recieve error "RuntimeWarning: coroutine 'MyClient.my_send' was never awaited".
Maybe I'm trying to do it wrong, tell me how you would do it.
答案1
得分: 0
Since the my_send() method is asynchronous (marked with the async keyword), you need to use await to properly call it.
To fix your problem, you should modify the line where you call MyClient.my_send(frame, text) to be await MyClient.my_send(frame, text).
Additionally I noticed that your my_send() method is missing self keyword, which should be always the first parameter of class method.
async def my_send(self, picture_to_send, text_to_send):
英文:
Since the my_send() method is asynchronous (marked with the async keyword), you need to use await to properly call it.
To fix your problem, you should modify the line where you call MyClient.my_send(frame, text) to be await MyClient.my_send(frame, text).
Additionally I noticed that your my_send() method is missing self keyword, which should be always the first parameter of class method.
async def my_send(self, picture_to_send, text_to_send):
答案2
得分: 0
因为async/await函数的复杂性,我仍然不太明白如何正确执行client.my_send,我使用了一个非常糟糕但有效的“支架”(在英语中叫做这个吗?)。 Discord.py有一个标准的on_ready事件。我们在async def on_ready函数中添加一个While True
循环,检查flag的值,如果flag==True,我们发送消息并将flag设置为False。不要忘记我们必须使用await asyncio.sleep(1)
来确保循环不会运行得太快。由于我们使用了asyncio.sleep
而不是time.sleep
,所以不会减慢程序的运行,我也没有注意到CPU的严重负载。如何使用它?我们将消息文本放入任何全局变量中,然后调用flag=True。当if flag:
触发时,它会在While True:
中运行,程序将发送带有指定文本的消息。
在主程序中:
text_to_dis['text'] = our_text
text_to_dis['flag'] = True
在主程序中添加以上代码。
英文:
So, due to the complexity of async / await functions, I still did not understand how to correctly execute client.my_send, I made a very bad, but working "crutch" (is that what it's called in English?). Discord.py has a standard on_ready event. We add a While True
loop to the async def on_ready
function, where we check the value of flag, if flag==True
, we send the message and do flag=False
. Don't forget that we MUST use await asyncio.sleep(1)
so that the loop doesn't run too fast. Since we used asyncio.sleep
instead of time.sleep
, we do not slow down our program, and I did not notice a serious load on the CPU. How to use it? We place the text of our message in any global variable, and call flag=True. The if flag:
is fired, which spins in While True:
and our program sends a message with the specified text.
async def on_ready(self):
print(f'Logged on as {self.user}!')
channel_to = self.get_channel(ID)
while True:
if text_to_dis['flag']:
print("trying to send")
text_to_send=''
for t_i in text_to_dis['text']:
text_to_send+=t_i+'
await channel_to.send(content=str(text_to_send))
text_to_dis['flag']=False
await asyncio.sleep(3)
In main program:
text_to_dis['text']=our_text
text_to_dis['flag']=True
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论