You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人逻辑优化:仅在用户表情回应后发送新消息

Discord机器人重复触发问题修复方案

问题说明

  • 需求:用户发送消息后,机器人先发送消息;待用户用表情回应后,再发送后续中文指令。
  • 当前问题:用户发送第二条消息时,机器人会重复发送初始消息,不符合预期。

原代码问题分析

原代码中responsed是局部变量,每次触发on_message事件都会重新初始化,无法持续记录用户状态;同时存在未定义的channel变量,逻辑分支混乱,导致状态控制完全失效。

修复后的代码

import asyncio
import discord
from discord.ext import commands

class CommandCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        # 用字典记录处于等待回应状态的用户,键为用户ID,避免不同用户互相干扰
        self.user_in_progress = {}

    @commands.Cog.listener()
    async def on_message(self, message):
        # 仅处理私信消息,忽略机器人自身发送的消息
        if str(message.channel.type) != "private" or message.author == self.bot.user:
            return
        
        user_id = message.author.id
        # 检查用户是否正在等待回应,若是则直接忽略新消息
        if user_id in self.user_in_progress:
            return
        
        # 标记用户进入等待状态
        self.user_in_progress[user_id] = True
        try:
            # 发送初始消息并添加目标表情
            hello_msg = await message.author.send("你好")
            await hello_msg.add_reaction("✅")

            # 定义反应检查逻辑:仅接受当前用户对这条消息的✅反应
            def check(reaction, user):
                return user == message.author and reaction.emoji == "✅" and reaction.message == hello_msg

            # 等待用户反应,超时时间设为5分钟(可自行调整)
            await self.bot.wait_for('reaction_add', check=check, timeout=300)

            # 用户回应后发送后续指令
            await message.author.send("你最近怎么样?")
        except asyncio.TimeoutError:
            # 超时提示,可根据需求修改
            await message.author.send("等待超时,若需要重新触发请再次发送消息")
        finally:
            # 无论成功或超时,都移除用户的等待状态标记
            if user_id in self.user_in_progress:
                del self.user_in_progress[user_id]

async def setup(bot):
    await bot.add_cog(CommandCog(bot))

流程说明

  • 用户发送消息→检查是否处于等待回应状态→若是则忽略,否则启动流程
  • 机器人发送「你好」并添加✅表情,标记用户为等待状态,禁止重复触发初始消息
  • 用户点击✅表情完成回应
  • 机器人发送「你最近怎么样?」,并移除用户的等待状态标记

内容的提问来源于stack exchange,提问作者Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:40:37