当循环通过字典时,Discord Py bot会阻塞频道

问题描述 投票:1回答:1
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”时,机器人会发送一堆模因:

get dank meme
get dank meme
dank 2
get dank meme

但是当我输入“meow”或memes字典中的最后一个值时,它工作正常,只发送一个图像。

我已经发现这有一些来自asyncio的await,因为当我使用print()时它只将一次发送到控制台。看来await是必需的,因为如果没有它,脚本将不会做任何事情。在for循环中使用break也无济于事。

有没有办法让循环在找到关键字后停止,或只让它发送一个图像并使用await

loops dictionary python-3.6 python-asyncio discord
1个回答
2
投票

问题可能是你的一个样本模因get dank meme包含触发器本身。一个新的on_message选择它,并以新的模因响应,它可以再次包含触发器,依此类推。这与print不会发生,因为print不会传输到频道,因此无法触发meme响应。

要解决这个问题,要么小心避免在meme响应中使用触发器,要么包含忽略来自bot本身的触发器的代码。

© www.soinside.com 2019 - 2024. All rights reserved.