所以我目前正在开发一个不协调的机器人,它应该扫描附件中的某些文件类型并将其过滤掉。播放一点点,它目前看起来像这样:
message.attachments.forEach(attachment => {
validateFunction(attachment, message)
function validateFunction(attachment, message) {
if (!attachment.contentType.includes('image/')) {
message.delete().catch((error) => {return});
虽然它现在已经完成了它的工作(在这种情况下,删除所有不是图像的东西(,但它并不是我想要的样子,而且比我需要的更不稳定…
我想做的是创建一个数组,例如,它包含所有不是图像文件的附件,这样我就可以制作一个";如果array.size>0=>message.delete";,删除for each,将所有内容保留在一个函数中,并为我提供了更大的灵活性来做一些事情,例如,一条包含数组中找到的附件数量的日志消息等等。
但我很难像这样通过文件类型过滤掉附件,所以…
有人知道怎么做吗?
谢谢!
您可以对集合进行分区。这样做将根据集合是否满足所提供的表达式,将集合拆分为2个唯一的数组。
const [images, nonImages] = message.attachments
.partition(a => a.contentType.includes('image/'));
集合-额外实用程序
正是因为我也在寻找答案,所以我实现了一个函数,我认为它也可以帮助其他人验证文件类型。
/**
@param files Collection
@param match Array|String
*/
const validateFiles = (files, match) => {
let [matched, notMatched] = files.partition(a => {
if (Array.isArray(match)) {
let found = [];
match.forEach(m => {
if (a.contentType !== null && a.contentType.includes(m)) {
found.push(m)
}
})
return found.length > 0;
} else {
return (a.contentType !== null && a.contentType.includes(match))
}
})
return {
found: matched,
ignore: notMatched
}
}
let validate = validateFiles(message.attachments, 'image/');
if (validate.ignore.size > 0) {
message.delete();
}
let validate = validateFiles(message.attachments, ['image/', 'audio/', 'video/']);
if (validate.ignore.size > 0) {
message.delete();
}
这个功能帮助了我很多,所以希望它能帮助其他人。