完全理解!据我了解,该过程将是:
- 检查文件是否有附件(您已经这样做了)。
- 将文件发送到其他频道。
- 从原始频道中删除文件。
但是,这不适用于大小超过 8 MB 的文件,因为机器人仅限于 8 MB 文件(与最多可以上传 100 MB 的 Nitro 用户不同)。所以你在这里有两个选择:(A) 要么从消息中获取链接(但是你将无法删除该消息),要么 (B) 处理超过 8 MB 的消息(忽略它们或仅删除它们,无需重新上传)。
我提供的两种解决方案也适用于图像和视频。如果您不想这样,只需检查附件是否有宽度(例如attachments[0].width == null)。如果有宽度,则文件是图像或视频。否则,它就是一个文件。
选项 A
您首先必须从消息中提取链接,然后将该链接发布到新频道中。这很简单。
// The incoming message is `message`.
if (message.channel.id === 'CHANNEL ID 1') {
// No need for a size check since this will be run 0 times if
// there are no attachments.
message.attachments.each(attachment => {
client.channels.cache.get('CHANNEL ID 2').send(attachment.url);
});
}
但是在这种情况下,您不能删除该消息,否则该文件也会从 Discord 的服务器中删除。
选项 B
这会将原始邮件的附件发送到另一个频道。
// The incoming message is `message`.
if (message.channel.id === 'CHANNEL ID 1') {
if (message.attachments.size > 0) {
// Size check (8000000 bytes is 8 MB)
if (attachment.size > 8000000) { /* Pick an option below. */ }
client.channels.cache.get('CHANNEL ID 2')
.send({
"files": message.attachments.map(attachment => attachment.url)
});
}
}
在这种情况下,message.attachments.map(...) 是包含已发送附件的 URL 数组。这些将被下载并发送回 Discord。如果文件超过 8 MB 会发生什么取决于您,但两者都以根本不发送消息而告终。
选项 B.1
您可以选择不转发消息,而是完全不做任何事情。原始消息被保留,没有任何东西被发送到另一个频道。
if (attachment.size > 8000000) { return; /* Ends the entire function. */ }
如果您打算在这部分代码之后执行其他操作,您可以简单地否定表达式(即 attachment.size < 8000000)并将发送语句 (client.channels.cache...) 包含在该 if 语句中。
选项 B.2
您可以选择在不转发消息的情况下删除消息,并发送友好的错误消息或类似消息。如果要发送的文件是机密文件或类似文件,建议使用此选项。
if (attachment.size > 8000000) {
message.delete();
message.channel.send("Sorry, but your file was too large!");
return;
}
您可以将message.delete 之后的语句替换为您想要的任何内容。请注意,此消息还带有return,只是为了确保机器人不会尝试上传文件(它肯定会失败)。