使用Discord.Net与C#开发机器人时自定义表情无法显示求助
问题
我正在用Discord.Net和C#开发Discord机器人,服务器公告里包含大量自定义表情,但使用以下代码发送消息时,自定义表情无法正常显示,仅呈现纯文本形式。我尝试过转义符、表情ID、ToString()方法及表情名称等方式,均无效。
代码示例:
private Emote getEmote(string slashEmote = "<:338_patch:751808652834373673>") { Emote Emotion; if(Emote.TryParse(slashEmote, out Emotion)) { return Emotion; } return Emotion; } [SlashCommand("emote", "Test function for custom emotes")] public async Task respondEmote() { var test1 = getEmote(); if(test1 == null) { await RespondAsync("EMOTE NOT FOUND"); return; } string test = getEmote() + "**TEST** <:338_patch:751808652834373673>"; await RespondAsync(test); }
运行结果:发送的消息中,自定义表情的代码<:338_patch:751808652834373673>直接以纯文本显示,未渲染为对应的自定义表情。
解决方案
问题根源:直接拼接
Emote对象与字符串时,Emote的ToString()方法返回值不符合渲染要求;且直接在字符串中写入表情代码时,Discord.Net默认会对内容进行转义,导致表情代码无法被识别。修复方案1:使用
MessageBuilder构建消息
这是最可靠的方式,MessageBuilder会自动处理表情的渲染:[SlashCommand("emote", "Test function for custom emotes")] public async Task respondEmote() { var emote = getEmote(); if(emote == null) { await RespondAsync("EMOTE NOT FOUND"); return; } var messageBuilder = new MessageBuilder() .AddEmote(emote) .WithContent("**TEST**"); await RespondAsync(message: messageBuilder); }修复方案2:发送时禁用不必要的转义
若要保留字符串拼接的方式,可通过AllowedMentions.None参数禁用转义,让Discord正常解析表情代码:[SlashCommand("emote", "Test function for custom emotes")] public async Task respondEmote() { var emote = getEmote(); if(emote == null) { await RespondAsync("EMOTE NOT FOUND"); return; } string test = $"{emote} **TEST** <:338_patch:751808652834373673>"; await RespondAsync(test, allowedMentions: AllowedMentions.None); }优化
getEmote方法
简化冗余代码,提升可读性:private Emote GetEmote(string slashEmote = "<:338_patch:751808652834373673>") { Emote.TryParse(slashEmote, out var emote); return emote; }
内容的提问来源于stack exchange,提问作者eatapotart
相关产品推荐
相关产品推荐

