如何让Discord机器人发送格式提醒私信时附带用户原始消息
Discord机器人私信附带用户原始发帖实现方案
核心前置要求:必须在执行消息删除操作前缓存原始消息内容,删除完成后message实例的内容属性可能无法正常读取,导致拿不到用户原发帖内容。
两种实现方式按需选择即可:
方案1:原始消息直接拼接在格式提醒内容中
适合用户发帖长度普遍较短的场景,用户只需要看一条私信就能收到全部信息,阅读成本低。
修改后的代码如下:
if valid_check: if re.match(self.regex, message.content) or re.match(self.regex2, message.content) and not gutted: pass else: if not message.author.bot: try: # 先缓存原始消息内容,再执行删除 original_content = message.content await message.delete() content = "Please use the following Format when posting:\n" \ "[Location] [H] [W]\n" \ "\nExample:\n" \ "[USA-CA] Narnia [H] Faun Hoof" \ "[W] Lions Tears.\n" \ "\n---\n" \ "The content you posted is as follows:\n" \ f"> {original_content}" # 用引用块包裹原内容,和提醒规则做区分 await message.author.send(content=content) except: pass
如果用户发帖带图片、附件,可以在拼接内容时额外遍历message.attachments把附件链接追加到original_content后面,避免附件信息丢失。
注意如果拼接后的总内容超过Discord单条消息2000字符上限,会导致私信发送失败,这种场景请用第二种方案。
方案2:格式提醒和原始消息分两条私信发送
适合用户发帖长度不确定、可能存在长文的场景,两条消息分开推送不容易触发字符上限。
修改后的代码如下:
if valid_check: if re.match(self.regex, message.content) or re.match(self.regex2, message.content) and not gutted: pass else: if not message.author.bot: try: # 提前缓存原始内容 original_content = message.content await message.delete() # 第一条发格式提醒 remind_content = "Please use the following Format when posting:\n" \ "[Location] [H] [W]\n" \ "\nExample:\n" \ "[USA-CA] Narnia [H] Faun Hoof" \ "[W] Lions Tears.\n" await message.author.send(content=remind_content) # 第二条单独发用户原始发帖 await message.author.send(content="The content you posted is as follows:\n" + original_content) except: pass
额外优化点
- 附件补全逻辑:如果需要展示原消息带的图片、文件,在缓存original_content之后追加附件链接即可:
if message.attachments: original_content += "\n[Attachments]\n" for att in message.attachments: original_content += f"{att.url}\n" - 正则逻辑修复:现有判断存在运算符优先级问题,
and优先级高于or,实际执行逻辑会变成「匹配regex1 或者 (匹配regex2 且 不是gutted)」。如果预期逻辑是「两个正则匹配任意一个,且满足not gutted」,需要给or的两个条件加括号:(re.match(self.regex, message.content) or re.match(self.regex2, message.content)) and not gutted,避免误删合规帖子。
内容的提问来源于stack exchange,提问作者twilight
相关产品推荐
相关产品推荐

