如何使用discord.py实现Discord机器人编辑历史消息添加文本
解决方案:discord.py 实现策略游戏预约机器人的消息编辑功能
核心逻辑
要完成需求,关键是先获取原始消息的完整内容,定位到目标国家的行进行修改,再将修改后的内容重新同步到原消息,而不是直接用message.edit()盲目替换内容。
具体实现步骤
1. 获取原始消息对象
既然你已经拿到了原始消息ID,先通过ID获取对应的消息实例:
# 先获取频道对象(可通过bot.get_channel(频道ID)提前获取) channel = bot.get_channel(CHANNEL_ID) # 根据ID拉取原始消息 original_message = await channel.fetch_message(ORIGINAL_MESSAGE_ID)
2. 解析并修改消息内容
将原始消息按行拆分,遍历找到目标国家的行,追加用户标识:
# 把消息内容拆成每行的列表 content_lines = original_message.content.split('\n') # 从用户指令中提取目标国家(比如!reserve 德意志,就提取"德意志") target_country = "用户指定的国家名称" # 遍历修改行内容 for idx, line in enumerate(content_lines): # 这里可以根据你的列表格式调整匹配规则,比如精确匹配行内容、或者行以目标国家开头 if line.strip() == target_country: # 用ctx.author.mention生成@用户的格式 content_lines[idx] = f"{line} - {ctx.author.mention}" break # 把修改后的行重新拼接成字符串 new_content = '\n'.join(content_lines)
3. 执行消息编辑
最后用修改后的内容更新原始消息:
await original_message.edit(content=new_content)
实用优化点
- 避免重复预约:可以在遍历的时候判断当前行是否已经包含用户的mention,如果有就返回提示“你已经预约过这个国家了”。
- 匹配规则容错:如果你的国家列表带前缀(比如
- 法兰西),可以用line.endswith(target_country)或者正则匹配,避免误改类似名称的国家。 - 状态持久化:如果需要重启机器人后保留预约记录,修改完消息后可以把新内容写回
host-template.txt文件。
完整指令示例
把上述逻辑整合到!reserve指令中:
@bot.command() async def reserve(ctx, *, country): try: # 替换成你的频道ID和原始消息ID channel = bot.get_channel(1234567890) original_msg = await channel.fetch_message(9876543210) content_lines = original_msg.content.split('\n') updated = False for idx, line in enumerate(content_lines): # 假设原始行格式是“国家名称”,如果有前缀请调整判断逻辑 if country in line and ctx.author.mention not in line: content_lines[idx] = f"{line} - {ctx.author.mention}" updated = True break if not updated: await ctx.send("这个国家不存在,或者你已经预约过了!") return await original_msg.edit(content='\n'.join(content_lines)) await ctx.send(f"成功预约{country}!") except Exception as e: await ctx.send(f"预约失败:{str(e)}")
内容的提问来源于stack exchange,提问作者user24391360
相关产品推荐
相关产品推荐

