循环浏览字典时 Discord Py bot 垃圾邮件通道
Discord Py bot spams channel when looping through a dictionary
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']))
我正在制作一个 discord 机器人,当在我的频道中说出某个关键字时,它会发布我在网上抓取的随机模因。
我的问题是,当我在 discord 中输入 "get dank" 时,机器人会发送一堆垃圾邮件:
get dank meme
get dank meme
dank 2
get dank meme
但是当我输入 "meow" 或模因字典中最后一个值时,它工作正常并且只发送一张图像。
我发现这与 asyncio 中的 await
有关,因为当我使用 print() 时,它只向控制台发送一次。看起来 await
是必需的,因为没有它脚本将不会执行任何操作。在 for 循环中使用 break 也无济于事。
有没有办法在找到关键字后停止循环,或者只发送一张图像并使用 await
。
问题可能是您的模因示例之一 get dank meme
包含触发器本身。一个新的 on_message
拾起它,并用一个新的模因做出回应,它可以再次包含触发器,等等。 print
不会发生这种情况,因为 print
不会传输到频道,因此无法触发模因响应。
要解决此问题,请小心避免在您的模因响应中触发,或者包含忽略来自机器人本身的触发器的代码。
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']))
我正在制作一个 discord 机器人,当在我的频道中说出某个关键字时,它会发布我在网上抓取的随机模因。
我的问题是,当我在 discord 中输入 "get dank" 时,机器人会发送一堆垃圾邮件:
get dank meme
get dank meme
dank 2
get dank meme
但是当我输入 "meow" 或模因字典中最后一个值时,它工作正常并且只发送一张图像。
我发现这与 asyncio 中的 await
有关,因为当我使用 print() 时,它只向控制台发送一次。看起来 await
是必需的,因为没有它脚本将不会执行任何操作。在 for 循环中使用 break 也无济于事。
有没有办法在找到关键字后停止循环,或者只发送一张图像并使用 await
。
问题可能是您的模因示例之一 get dank meme
包含触发器本身。一个新的 on_message
拾起它,并用一个新的模因做出回应,它可以再次包含触发器,等等。 print
不会发生这种情况,因为 print
不会传输到频道,因此无法触发模因响应。
要解决此问题,请小心避免在您的模因响应中触发,或者包含忽略来自机器人本身的触发器的代码。