friendship ended with social-app. php is my new best friend
1<?php declare(strict_types = 1);
2
3namespace Contributte\Logging;
4
5use Contributte\Logging\Mailer\IMailer;
6use Nette\InvalidArgumentException;
7
8class SendMailLogger extends AbstractLogger
9{
10
11 /** @var string */
12 private $emailSnooze = '2 days';
13
14 /** @var IMailer */
15 private $mailer;
16
17 /** @var string[] */
18 private $allowedPriority = [ILogger::ERROR, ILogger::EXCEPTION, ILogger::CRITICAL];
19
20 public function __construct(IMailer $mailer, string $directory)
21 {
22 parent::__construct($directory);
23 $this->mailer = $mailer;
24 }
25
26 /**
27 * @param string[] $allowedPriority
28 */
29 public function setAllowedPriority(array $allowedPriority): void
30 {
31 $this->allowedPriority = $allowedPriority;
32 }
33
34 public function setEmailSnooze(string $emailSnooze): void
35 {
36 $this->emailSnooze = $emailSnooze;
37 }
38
39 public function setMailer(IMailer $mailer): void
40 {
41 $this->mailer = $mailer;
42 }
43
44 /**
45 * @param mixed $message
46 */
47 public function log($message, string $priority = ILogger::INFO): void
48 {
49 if (!in_array($priority, $this->allowedPriority, true)) {
50 return;
51 }
52
53 if (is_numeric($this->emailSnooze)) {
54 $snooze = (int) $this->emailSnooze;
55 } else {
56 $strtotime = @strtotime($this->emailSnooze);
57
58 if ($strtotime === false) {
59 throw new InvalidArgumentException('Email snooze was not parsed');
60 }
61
62 $snooze = $strtotime - time();
63 }
64
65 $filemtime = @filemtime($this->directory . '/email-sent');
66
67 if ($filemtime === false) {
68 $filemtime = 0;
69 }
70
71 if ($filemtime + $snooze < time() && (bool) @file_put_contents($this->directory . '/email-sent', 'sent')
72 ) {
73 $this->mailer->send($message);
74 }
75 }
76
77}