Discord.js中以A开头的角色列表命令内容过长,如何拆分消息?
嘿,我来帮你搞定这个消息长度超出限制的问题!首先先指出你代码里的一个小错误——你写的colors.size应该是roles.size,不然会因为找不到colors变量报错哦。
接下来回到核心问题:Discord的普通消息内容最多只能有2000字符,当A开头的角色太多时,自然会超限。虽然你已经用了split:true,但可以优化拆分逻辑,或者手动拆分来避免角色名被截断,下面给你两种靠谱的解决方案:
方案一:优化自动拆分配置
Discord.js的split选项支持自定义拆分规则,我们可以指定在换行符处拆分,这样就能保证每个角色名都是完整的,不会被拆成两半。修改后的代码如下:
module.exports = { name: 'rolelist', description: 'Sends A List Of Roles Available In The Server', execute(message, args, client) { if (!message.content.startsWith(prefix) || message.author.bot) return; const roles = message.guild.roles.cache.filter(c => c.name.startsWith('A')); if (roles.size < 1) { return message.channel.send('There are no roles starting with the letter A'); } // 用带配置的split选项,在换行处拆分消息 message.channel.send({ content: roles.map(role => role.name).join('\n'), split: { char: '\n', // 指定拆分的分隔符为换行 maxLength: 2000, // 单条消息最大长度(Discord限制) prepend: '', append: '' } }); }, };
这里我把roles.array().join( \n)改成了roles.map(role => role.name).join('\n'),这样会直接输出角色名称;如果你想显示可点击的角色标签(比如<@&123456>),可以换成roles.map(role => role.toString()).join('\n')。
方案二:手动拆分角色数组
如果你想更精准控制每条消息的内容数量,可以手动把角色数组分成多组,然后依次发送。这种方法需要把execute函数改成异步(因为要等待每条消息发送完成):
module.exports = { name: 'rolelist', description: 'Sends A List Of Roles Available In The Server', async execute(message, args, client) { if (!message.content.startsWith(prefix) || message.author.bot) return; const roles = message.guild.roles.cache.filter(c => c.name.startsWith('A')); if (roles.size < 1) { return message.channel.send('There are no roles starting with the letter A'); } const roleNames = roles.map(role => role.name); const chunkSize = 50; // 可根据角色名长度调整,比如角色名很长就设小一点 // 循环拆分并发送每组角色 for (let i = 0; i < roleNames.length; i += chunkSize) { const chunk = roleNames.slice(i, i + chunkSize); await message.channel.send(chunk.join('\n')); } }, };
手动拆分的好处是你可以自由控制每条消息显示多少个角色,避免自动拆分可能出现的不规则分段。
额外建议:用Embed展示(可选)
如果角色数量特别多,还可以用Discord的Embed消息来展示——Embed的描述字段支持最多4096字符,比普通消息容量大一倍。甚至可以用分页Embed(结合按钮或反应)来做更友好的浏览体验,但如果只是解决长度问题,前面两种方法已经足够啦。
内容的提问来源于stack exchange,提问作者TalentYT

