代码之家  ›  专栏  ›  技术社区  ›  Xaztek

在字典中循环时,Discord Py bot垃圾邮件通道

  •  1
  • Xaztek  · 技术社区  · 7 年前
    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
    

    但当我在memes字典中键入“喵”或任何最后一个值时,它工作正常,只发送一个图像。

    我发现这与 await 因为当我使用print()时,它只向控制台发送一次。看起来 等候 是必需的,因为没有它脚本将无法执行任何操作。在for循环中使用break也没有帮助。

    有没有一种方法可以让循环在找到关键字后停止,或者只发送一张图像,然后使用 等候 .

    1 回复  |  直到 7 年前
        1
  •  2
  •   user4815162342    7 年前

    问题可能是你的一个模因样本, get dank meme ,包含触发器本身。一个新的 on_message 拿起它,并用一个新的模因进行响应,该模因可以再次包含触发器,依此类推。这不会发生在 print 因为 打印 不会传输到通道,因此无法触发meme响应。

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