如何在换行符处切割Discord.js中超过2000字符的消息
解决Discord长消息换行处切割问题
你需要重写消息切割函数,让它在接近指定长度时优先找最近的换行符(\n)来分割,这样就能保留原有的文本格式。
修改后的切割函数
function splitMessage(str, maxSize) { const chunks = []; let currentIndex = 0; while (currentIndex < str.length) { // 计算当前截取的结束位置,最多到maxSize let endIndex = Math.min(currentIndex + maxSize, str.length); // 如果还没到字符串末尾,找最近的换行符 if (endIndex < str.length) { // 从endIndex往前找最后一个换行符 endIndex = str.lastIndexOf('\n', endIndex); // 如果找不到换行符(比如一段超长无换行的文本),就直接按maxSize截断 if (endIndex === -1) { endIndex = currentIndex + maxSize; } } // 截取当前片段并加入数组 chunks.push(str.substring(currentIndex, endIndex)); // 更新起始位置,跳过换行符本身 currentIndex = endIndex + 1; } return chunks; }
函数逻辑说明
- 循环处理整个字符串,每次从当前位置开始计算最大截取长度
- 优先在
maxSize范围内找最后一个换行符,确保切割位置在段落末尾 - 若遇到无换行的超长文本(极端情况),依然会按
maxSize截断,避免程序卡住 - 每次切割后跳过换行符,避免片段开头出现空行
结合你的代码使用
- 替换你原来的
splitMessage函数 - 调用时保持
1900的长度限制(给Discord的格式标记留余量,避免实际发送时超过2000字符) - 删除代码里未使用的
splitted变量
修改后的发送部分代码:
const channelMessageString = header + playersString + footer + lastUpdated; const messageChunks = splitMessage(channelMessageString, 1900); for (const chunk of messageChunks) { await client.channels.cache.get(listChannel).send(chunk); }
这样切割出来的消息都会在换行处分割,不会破坏你原本的列表格式和排版了。
内容的提问来源于stack exchange,提问作者damskw
相关产品推荐
相关产品推荐

