diff --git a/src/Discord/Builders/MessageBuilder.php b/src/Discord/Builders/MessageBuilder.php index 1b7321e25..ffa263c22 100644 --- a/src/Discord/Builders/MessageBuilder.php +++ b/src/Discord/Builders/MessageBuilder.php @@ -69,7 +69,7 @@ class MessageBuilder implements JsonSerializable /** * Attachments to send with this message. - * + * * @var Attachment[] */ private $attachments = []; diff --git a/src/Discord/Helpers/Collection.php b/src/Discord/Helpers/Collection.php index 50733ce61..5ed35c09a 100644 --- a/src/Discord/Helpers/Collection.php +++ b/src/Discord/Helpers/Collection.php @@ -228,6 +228,24 @@ public function first() return null; } + /** + * Returns the last element of the collection. + * + * @return mixed + */ + public function last() + { + $last = end($this->items); + + if ($last !== false) { + reset($this->items); + + return $last; + } + + return null; + } + /** * If the collection has an offset. * diff --git a/src/Discord/Parts/Channel/Channel.php b/src/Discord/Parts/Channel/Channel.php index 5bbb23179..b0b435ca5 100644 --- a/src/Discord/Parts/Channel/Channel.php +++ b/src/Discord/Parts/Channel/Channel.php @@ -38,6 +38,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver; use Traversable; +use function Discord\getSnowflakeTimestamp; use function React\Promise\all; use function React\Promise\reject; use function React\Promise\resolve; @@ -546,45 +547,35 @@ public function deleteMessages($messages, ?string $reason = null): ExtendedPromi return reject(new \UnexpectedValueException('$messages must be an array or implement Traversable.')); } - $count = count($messages); - - if ($count == 0) { - return resolve(); - } elseif ($count == 1 || $this->is_private) { - foreach ($messages as $message) { - if ($message instanceof Message || - $message = $this->messages->get('id', $message) - ) { - return $message->delete(); - } + $headers = $promises = $messagesBulk = $messagesSingle = []; + if (isset($reason)) { + $headers['X-Audit-Log-Reason'] = $reason; + } - return $this->http->delete(Endpoint::bind(Endpoint::CHANNEL_MESSAGE, $this->id, $message)); + foreach ($messages as $message) { + if ($message instanceof Message) { + $message = $message->id; } - } else { - $messageID = []; - foreach ($messages as $message) { - if ($message instanceof Message) { - $messageID[] = $message->id; - } else { - $messageID[] = $message; - } + if ($this->is_private || getSnowflakeTimestamp($message) < time() - 1209600) { + $messagesSingle[] = $message; + } else { + $messagesBulk[] = $message; } + } - $promises = []; - - $headers = []; - if (isset($reason)) { - $headers['X-Audit-Log-Reason'] = $reason; - } + while (count($messagesBulk) > 1) { + $promises[] = $this->http->post(Endpoint::bind(Endpoint::CHANNEL_MESSAGES_BULK_DELETE, $this->id), ['messages' => array_slice($messagesBulk, 0, 100)], $headers); + $messagesBulk = array_slice($messagesBulk, 100); + } - while (! empty($messageID)) { - $promises[] = $this->http->post(Endpoint::bind(Endpoint::CHANNEL_MESSAGES_BULK_DELETE, $this->id), ['messages' => array_slice($messageID, 0, 100)], $headers); - $messageID = array_slice($messageID, 100); - } + $messagesSingle = array_merge($messagesSingle, $messagesBulk); - return all($promises); + foreach ($messagesSingle as $message) { + $promises[] = $this->http->delete(Endpoint::bind(Endpoint::CHANNEL_MESSAGE, $this->id, $message)); } + + return all($promises); } /** diff --git a/src/Discord/Parts/Channel/Message.php b/src/Discord/Parts/Channel/Message.php index 904535129..f0a0b34f6 100644 --- a/src/Discord/Parts/Channel/Message.php +++ b/src/Discord/Parts/Channel/Message.php @@ -44,7 +44,7 @@ * @property string|null $guild_id The unique identifier of the guild that the channel the message was sent in belongs to. * @property Guild|null $guild The guild that the message was sent in. * @property User|null $author The author of the message. Will be a webhook if sent from one. - * @property string $user_id The user id of the author. + * @property string|null $user_id The user id of the author. * @property Member|null $member The member that sent this message, or null if it was in a private message. * @property string $content The content of the message if it is a normal message. * @property Carbon $timestamp A timestamp of when the message was sent. diff --git a/src/Discord/Voice/VoiceClient.php b/src/Discord/Voice/VoiceClient.php index 517ad9962..7a7e8d43a 100644 --- a/src/Discord/Voice/VoiceClient.php +++ b/src/Discord/Voice/VoiceClient.php @@ -319,7 +319,7 @@ class VoiceClient extends EventEmitter protected $version = 4; /** - * The Config for DNS Resolver + * The Config for DNS Resolver. * * @var string|\React\Dns\Config\Config */