Discord.NET 1.0.2如何修改服务器中SocketMessage的内容?
解决Discord.NET 1.0.2消息内容替换并同步到服务器的问题
我来帮你搞定这个问题!先理清你之前的尝试为什么没成功,再给你一个靠谱的解决方案。
为什么之前的方法失效?
- 反射修改本地实例:你通过反射改
SocketMessage的Content属性,只是修改了本地内存里的缓存对象,完全不会同步到Discord服务器。Discord的API根本不认可这种“偷偷改本地数据”的操作,必须通过官方提供的API方法来修改服务器上的消息。 - RestUserMessage修改失败:你尝试获取
RestUserMessage再调用ModifyAsync,其实没必要绕这一步,大概率是因为机器人缺少权限导致失败——Discord修改消息要求机器人必须拥有Manage Messages权限,没这个权限的话API会直接拒绝请求。
可行的解决方案
以下是正确的实现步骤和代码:
1. 确保机器人拥有必要权限
先在Discord服务器的角色设置里,给你的机器人角色开启Manage Messages权限,同时要确认对应频道的权限设置没有覆盖这个权限。
2. 正确的代码实现
用户发送的消息本质是SocketUserMessage类型,它实现了IUserMessage接口,自带ModifyAsync方法可以直接调用,不用额外转换:
private async Task MsgRec(SocketMessage e) { // 跳过机器人自身的消息,避免无限循环 if (e.Author.IsBot) return; // 确认这是用户发送的可修改消息 if (e is IUserMessage userMessage) { string originalContent = userMessage.Content; // 检测脏话(可以用正则匹配大小写变体,更健壮) if (originalContent.Contains("fuck")) { try { // 替换脏话 string censoredContent = originalContent.Replace("fuck", "f*ck"); // 调用API修改服务器上的消息 await userMessage.ModifyAsync(msg => msg.Content = censoredContent); } catch (Exception ex) { // 给发送者返回更详细的错误信息,方便排查 await e.Author.SendMessageAsync($"修改消息失败:{ex.Message}\n{ex.StackTrace}"); } } } }
3. 优化建议(可选)
如果要匹配更多脏话变体(比如Fuck、FUCK、fUcK),可以用正则表达式来检测和替换:
using System.Text.RegularExpressions; // ... if (Regex.IsMatch(originalContent, @"\bfuck\b", RegexOptions.IgnoreCase)) { string censoredContent = Regex.Replace(originalContent, @"\bfuck\b", "f*ck", RegexOptions.IgnoreCase); await userMessage.ModifyAsync(msg => msg.Content = censoredContent); }
关键注意点
- 必须保证机器人有
Manage Messages权限,否则ModifyAsync会抛出权限不足的异常。 - 跳过机器人消息是必要的,不然如果你的机器人发送了包含关键词的消息,会触发自己修改自己的消息,导致循环。
- 所有服务器上的操作都必须通过Discord.NET提供的异步API方法完成,不要试图修改本地缓存对象。
内容的提问来源于stack exchange,提问作者Zoltán Nagy
相关产品推荐
相关产品推荐

