diff --git a/src/DiscordLogger/Converters/RichRecordConverter.php b/src/DiscordLogger/Converters/RichRecordConverter.php index 2f462bb..915b78e 100644 --- a/src/DiscordLogger/Converters/RichRecordConverter.php +++ b/src/DiscordLogger/Converters/RichRecordConverter.php @@ -3,6 +3,7 @@ namespace MarvinLabs\DiscordLogger\Converters; use Illuminate\Support\Arr; +use MarvinLabs\DiscordLogger\Contracts\DiscordWebHook; use MarvinLabs\DiscordLogger\Discord\Embed; use MarvinLabs\DiscordLogger\Discord\Exceptions\ConfigurationIssue; use MarvinLabs\DiscordLogger\Discord\Message; @@ -20,17 +21,17 @@ public function buildMessages(array $record): array $this->addMainEmbed($mainMessage, $record); $this->addContextEmbed($mainMessage, $record); $this->addExtrasEmbed($mainMessage, $record); - - $stackTraceMessage = null; + $fileMessage = null; $stacktrace = $this->getStacktrace($record); + if ($stacktrace !== null) { switch ($this->stackTraceMode($stacktrace)) { case 'file': // Discord webhooks do not support EMBED + FILE at the same time. Hence another message has to be sent - $stackTraceMessage = Message::make()->file($stacktrace, $this->getStacktraceFilename($record)); - $this->addGenericMessageFrom($stackTraceMessage); + $fileMessage = Message::make()->file($stacktrace, $this->getStacktraceFilename($record)); + $this->addGenericMessageFrom($fileMessage); break; case 'inline' : @@ -41,8 +42,13 @@ public function buildMessages(array $record): array throw new ConfigurationIssue('Invalid value for configuration `discord-logger.stacktrace`'); } } + elseif (strlen($record['message']) > DiscordWebHook::MAX_CONTENT_LENGTH) + { + $fileMessage = Message::make()->file($record['message'], $this->getStacktraceFilename($record)); + $this->addGenericMessageFrom($fileMessage); + } - return $stackTraceMessage !== null ? [$mainMessage, $stackTraceMessage] : [$mainMessage]; + return $fileMessage !== null ? [$mainMessage, $fileMessage] : [$mainMessage]; } protected function addMainEmbed(Message $message, array $record): void diff --git a/tests/Converters/RichLoggerMessagesTest.php b/tests/Converters/RichLoggerMessagesTest.php index f4b5958..4e03706 100644 --- a/tests/Converters/RichLoggerMessagesTest.php +++ b/tests/Converters/RichLoggerMessagesTest.php @@ -84,4 +84,45 @@ public function includes_stacktrace_as_file_when_attachment_enabled() ], $messages[1]); $this->assertStringContainsString($exception->getTraceAsString(), $messages[1]->file['contents']); } + + /** @test */ + public function includes_message_as_file_when_longer_than_2000_characters() + { + $this->config->set('discord-logger.emojis.CRITICAL', null); + + $description = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin ut mi eu magna tempus auctor ac at ante. Quisque pulvinar, justo pretium ultricies auctor, risus eros mattis velit, quis rutrum tortor orci et urna. Sed suscipit nibh vel accumsan hendrerit. Etiam non elit nec diam auctor interdum. Morbi quam ligula, pharetra non felis sit amet, pulvinar venenatis ex. Sed suscipit, urna quis varius congue, urna lorem fermentum ipsum, in consectetur elit sapien non tortor. Nulla facilisi. Sed maximus metus quam, a venenatis sapien aliquet eu. Pellentesque lacinia urna non porta ornare. Donec elementum faucibus nibh at vulputate. Nulla consectetur facilisis ligula ut tempus. Mauris molestie risus in neque commodo, ac iaculis nibh lobortis. Nullam non condimentum dolor, ut tempus arcu. Duis eget lacus sit amet neque rutrum sagittis. Vestibulum suscipit aliquam ipsum ut accumsan. Phasellus dictum vulputate velit sit amet interdum. Nullam sed cursus dolor, eu bibendum ipsum. Sed facilisis, lectus non finibus porta, erat lorem ornare neque, nec pretium ipsum sem id risus. In consectetur auctor ullamcorper. Sed quis arcu vel metus mattis sollicitudin sit amet et risus. Sed metus felis, aliquam at consectetur ac, iaculis ut neque. Phasellus quis nisl justo. Nulla lorem velit, bibendum ornare urna ut, pulvinar tempus dui. Vestibulum non pellentesque arcu. Fusce pretium massa elit, at congue ante porttitor sed. Aliquam erat volutpat. Nulla quam lectus, volutpat quis felis non, pharetra porttitor erat. Aliquam nunc felis, mattis pulvinar varius eu, fermentum et ligula. Proin tempor purus tempus rhoncus bibendum.Vestibulum magna tortor, vehicula eget neque id, aliquet pretium eros. Nulla ut justo rutrum mauris aliquam accumsan. Vestibulum non fringilla purus, eu faucibus lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus blandit risus libero, non ornare massa consequat in. Curabitur nec lectus nec purus pretium placerat. Nam interdum, nibh eu faucibus elementum, tortor justo hendrerit ante, quis fermentum dolor nulla a dolor. Donec auctor ut tortor sed faucibus. Maecenas et tellus a ex malesuada commodo. Aliquam mi arcu, dictum mattis egestas et, ultricies ut eros. Pellentesque eu elit felis. Aenean ut vestibulum libero, ut consequat turpis.'; + $embedDescription = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin ut mi eu magna tempus auctor ac at ante. Quisque pulvinar, justo pretium ultricies auctor, risus eros mattis velit, quis rutrum tortor orci et urna. Sed suscipit nibh vel accumsan hendrerit. Etiam non elit nec diam auctor interdum. Morbi quam ligula, pharetra non felis sit amet, pulvinar venenatis ex. Sed suscipit, urna quis varius congue, urna lorem fermentum ipsum, in consectetur elit sapien non tortor. Nulla facilisi. Sed maximus metus quam, a venenatis sapien aliquet eu. Pellentesque lacinia urna non porta ornare. Donec elementum faucibus nibh at vulputate. Nulla consectetur facilisis ligula ut tempus. Mauris molestie risus in neque commodo, ac iaculis nibh lobortis. Nullam non condimentum dolor, ut tempus arcu. Duis eget lacus sit amet neque rutrum sagittis. Vestibulum suscipit aliquam ipsum ut accumsan. Phasellus dictum vulputate velit sit amet interdum. Nullam sed cursus dolor, eu bibendum ipsum. Sed facilisis, lectus non finibus porta, erat lorem ornare neque, nec pretium ipsum sem id risus. In consectetur auctor ullamcorper. Sed quis arcu vel metus mattis sollicitudin sit amet et risus. Sed metus felis, aliquam at consectetur ac, iaculis ut neque. Phasellus quis nisl justo. Nulla lorem velit, bibendum ornare urna ut, pulvinar tempus dui. Vestibulum non pellentesque arcu. Fusce pretium massa elit, at congue ante porttitor sed. Aliquam erat volutpat. Nulla quam lectus, volutpat quis felis non, pharetra porttitor erat. Aliquam nunc felis, mattis pulvinar varius eu, fermentum et ligula. Proin tempor purus tempus rhoncus bibendum.Vestibulum magna tortor, vehicula eget neque id, aliquet pretium eros. Nulla ut justo rutrum mauris aliquam accumsan. Vestibulum non fringilla purus, eu faucibus lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus blandit risus libero, non ornare massa consequat in. Curabitur nec lectus nec purus pretium placerat. Nam interdum,...'; + $messages = $this->warning($description); + + MessageAssertions::assertMessagePartialMatch([ + 'embeds' => [ + 0 => ['title' => ':flushed: `[2000-01-01 12:13:14] Laravel.WARNING`', + 'description' => ':black_small_square: `' . $embedDescription], + ], + ], $messages[0]); + + MessageAssertions::assertMessagePartialMatch([ + 'file' => ['filename' => '20000101121314_stacktrace.txt'], + ], $messages[1]); + + $this->assertStringContainsString($description, $messages[1]->file['contents']); + } + + /** @test */ + public function includes_only_message_when_less_than_2000_characters() + { + $this->config->set('discord-logger.emojis.CRITICAL', null); + + $description = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin ut mi eu magna tempus auctor ac at ante. Quisque pulvinar, justo pretium ultricies auctor, risus eros mattis velit, quis rutrum tortor orci et urna. Sed suscipit nibh vel accumsan hendrerit. Etiam non elit nec diam auctor interdum. Morbi quam ligula, pharetra non felis sit amet, pulvinar venenatis ex. Sed suscipit, urna quis varius congue, urna lorem fermentum ipsum, in consectetur elit sapien non tortor. Nulla facilisi. Sed maximus metus quam, a venenatis sapien aliquet eu. Pellentesque lacinia urna non porta ornare. Donec elementum faucibus nibh at vulputate. Nulla consectetur facilisis ligula ut tempus. Mauris molestie risus in neque commodo, ac iaculis nibh lobortis. Nullam non condimentum dolor, ut tempus arcu. Duis eget lacus sit amet neque rutrum sagittis. Vestibulum suscipit aliquam ipsum ut accumsan. Phasellus dictum vulputate velit sit amet interdum. Nullam sed cursus dolor, eu bibendum ipsum. Sed facilisis, lectus non finibus porta, erat lorem ornare neque, nec pretium ipsum sem id risus. In consectetur auctor ullamcorper. Sed quis arcu vel metus mattis sollicitudin sit amet et risus. Sed metus felis, aliquam at consectetur ac, iaculis ut neque. Phasellus quis nisl justo. Nulla lorem velit, bibendum ornare urna ut, pulvinar tempus dui. Vestibulum non pellentesque arcu. Fusce pretium massa elit, at congue ante porttitor sed. Aliquam erat volutpat. Nulla quam lectus, volutpat quis felis non, pharetra porttitor erat. Aliquam nunc felis, mattis pulvinar varius eu, fermentum et ligula. Proin tempor purus tempus rhoncus bibendum.Vestibulum magna tortor, vehicula eget neque id, aliquet pretium eros. Nulla ut justo rutrum mauris aliquam accumsan. Vestibulum non fringilla purus, eu faucibus lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus blandit risus libero, non ornare massa consequat in. Curabitur nec lectus nec purus pretium placerat.'; + $messages = $this->warning($description); + + MessageAssertions::assertMessagePartialMatch([ + 'embeds' => [ + 0 => ['title' => ':flushed: `[2000-01-01 12:13:14] Laravel.WARNING`', + 'description' => ':black_small_square: `' . $description . '`'], + ], + ], $messages[0]); + + $this->assertArrayNotHasKey(1, $messages); + } }