import asyncio
import random
import discord
memes = {
'r/dank_memes': {'imgur_url':'https://imgur.com/r/dankmemes/', 'trigger': 'get dank', 'memes':['get dank meme', 'sample meme']},
'r/cats': {'imgur_url':'https://imgur.com/r/cats/', 'trigger': 'meow', 'memes':['cat meme', 'i love cats']},
}
@client.event
async def on_message(message):
message.content = message.content.lower()
for name, trigger in memes.items():
if trigger['trigger'] in message.content:
#print(random.choice(memes[name]['memes'])) # This works fine
await client.send_message(message.channel, random.choice(memes[name]['memes']))
我正在制作一个不和谐机器人,当我在我的频道中说出某个关键字时,我会在网上抓取随机模因。
我的问题是当我输入"变得潮湿"在不和谐中,机器人会发送一堆模因:
get dank meme
get dank meme
dank 2
get dank meme
但是当我输入" meow"或者在memes字典中的最后一个值,然后它工作正常,只发送一个图像。
我已经发现这可以从asyncio执行await
,因为当我使用print()时它只将一次发送到控制台。看来await
是必需的,因为如果没有它,脚本就不会做任何事情。在for循环中使用break也没有帮助。
有没有办法让圈子在找到关键字后停止,或只让它发送一张图片并使用await
。
答案 0 :(得分:2)
问题可能是您的一个示例模因get dank meme
包含触发器本身。一个新的on_message
选择它,并以新的模因响应,它可以再次包含触发器,依此类推。 print
不会发生这种情况,因为print
不会传输到频道,因此无法触发meme响应。
要解决此问题,请小心避免在meme响应中触发,或者包含忽略来自bot本身的触发器的代码。