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

Discord服务器表情列表命令触发字符超限错误求解决

嘿,我完全懂你碰到的这个麻烦——当服务器里的自定义表情数量一多,把它们全拼在一条消息里发送肯定会触发Discord的2000字符上限。这里有几个实用的修复方案,你可以根据自己的需求来选:

方案1:拆分消息成多个片段发送

最直接的思路就是把表情列表切割成多个不超过2000字符的块,逐个发送。这样既保留了表情的可使用格式,又不会触发超限错误:

// lists all emotes of the current server
let emojiRegex = new RegExp('^' + prefix + '((emoji)|(emotes))$', 'gi');
if (emojiRegex.exec(msg)) {
  const emojiArray = message.guild.emojis.map(e => e.toString());
  let currentMessage = '';
  
  for (const emoji of emojiArray) {
    // 检查添加当前表情后是否会超过字符限制(+1是预留空格的长度)
    if (currentMessage.length + emoji.length + 1 > 2000) {
      message.channel.send(currentMessage);
      currentMessage = emoji;
    } else {
      currentMessage += (currentMessage ? ' ' : '') + emoji;
    }
  }
  
  // 发送最后剩下的表情片段
  if (currentMessage) {
    message.channel.send(currentMessage);
  }
}
方案2:用嵌入消息(Embed)分栏展示

如果觉得拆分多条消息太杂乱,可以用Discord的Embed组件来整理表情,分栏展示的方式既整洁又能高效利用消息空间:

// lists all emotes of the current server
let emojiRegex = new RegExp('^' + prefix + '((emoji)|(emotes))$', 'gi');
if (emojiRegex.exec(msg)) {
  const emojiArray = message.guild.emojis.map(e => e.toString());
  const chunks = [];
  const chunkSize = 50; // 每栏放置的表情数量,可根据实际调整
  
  // 把表情数组分割成多个小片段
  for (let i = 0; i < emojiArray.length; i += chunkSize) {
    chunks.push(emojiArray.slice(i, i + chunkSize).join(' '));
  }
  
  // 创建嵌入消息
  const embed = {
    title: '服务器表情列表',
    color: 0x0099ff,
    fields: chunks.map((chunk, index) => ({
      name: `第${index + 1}栏`,
      value: chunk || '暂无表情',
      inline: true // 让栏位并排显示,节省空间
    }))
  };
  
  message.channel.send({ embeds: [embed] });
}
方案3:只展示表情名称+图片链接(可选)

如果不需要直接发送可使用的表情格式,也可以只输出表情名称和对应的图片链接,这样字符数会大幅减少:

// lists all emotes of the current server
let emojiRegex = new RegExp('^' + prefix + '((emoji)|(emotes))$', 'gi');
if (emojiRegex.exec(msg)) {
  const emojiInfo = message.guild.emojis.map(e => `${e.name}: ${e.url}`).join('\n');
  // 同样做消息拆分避免超限
  const messages = [];
  let current = '';
  
  for (const line of emojiInfo.split('\n')) {
    if (current.length + line.length + 1 > 2000) {
      messages.push(current);
      current = line;
    } else {
      current += (current ? '\n' : '') + line;
    }
  }
  if (current) messages.push(current);
  
  messages.forEach(msgSegment => message.channel.send(msgSegment));
}

简单解释下:Discord每条消息有2000字符的硬限制,而每个自定义表情的字符串形式(比如<:emojiName:123456789>)大概占20-30个字符,服务器表情数量超过60个左右就会触发超限,所以拆分消息或者用Embed是最常用的解决思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:02:42