ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
AutoresponderServiceImpl.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use DateInterval;
26use DateTimeZone;
27use DateTimeImmutable;
28
30{
32 private $mail_action;
33 private readonly DateInterval $idle_time_interval;
34
36 protected array $auto_responder_data = [];
37
41 public function __construct(
42 int $global_idle_time_interval,
43 private bool $auto_responder_status,
44 private readonly AutoresponderRepository $auto_responder_repository,
45 private readonly ClockInterface $clock,
46 ?callable $mail_action = null
47 ) {
48 $this->mail_action = $mail_action;
49 $this->idle_time_interval = new DateInterval('P' . $global_idle_time_interval . 'D');
50 }
51
52 public function isAutoresponderEnabled(): bool
53 {
54 return $this->auto_responder_status;
55 }
56
57 public function enableAutoresponder(): void
58 {
59 $this->auto_responder_status = true;
60 }
61
62 public function disableAutoresponder(): void
63 {
64 $this->auto_responder_status = false;
65 }
66
67 public function handleAutoresponderMails(int $auto_responder_receiver_usr_id): void
68 {
69 if ($this->auto_responder_data === []) {
70 return;
71 }
72
73 foreach ($this->auto_responder_data as $auto_responder_sender_usr_id => $mail_options) {
74 if ($this->auto_responder_repository->exists(
75 $auto_responder_sender_usr_id,
76 $auto_responder_receiver_usr_id
77 )) {
78 $auto_responder = $this->auto_responder_repository->findBySenderIdAndReceiverId(
79 $auto_responder_sender_usr_id,
80 $auto_responder_receiver_usr_id
81 );
82 } else {
83 $auto_responder = new AutoresponderDto(
84 $auto_responder_sender_usr_id,
85 $auto_responder_receiver_usr_id,
86 $this->normalizeDateTimezone($this->clock->now())
87 ->sub($this->idle_time_interval)
88 ->modify('-1 second')
89 );
90 }
91
92 if ($this->shouldSendAutoresponder($auto_responder)) {
93 $auto_responder = $auto_responder->withSentTime($this->clock->now());
94
95 if ($this->mail_action !== null) {
97 $auto_responder_sender_usr_id,
98 $mail_options,
99 $auto_responder->getSentTime()->add($this->idle_time_interval)
100 );
101 } else {
102 $mail = new AutoresponderNotification(
103 $mail_options,
104 $auto_responder_receiver_usr_id,
105 $auto_responder->getSentTime()->add($this->idle_time_interval)
106 );
107 $mail->send();
108 }
109
110 $this->auto_responder_repository->store($auto_responder);
111 }
112 }
113 }
114
115 private function normalizeDateTimezone(DateTimeImmutable $date_time): DateTimeImmutable
116 {
117 return $date_time->setTimezone(new DateTimeZone('UTC'));
118 }
119
120 private function shouldSendAutoresponder(AutoresponderDto $auto_responder): bool
121 {
122 // Normalize timezones
123 $last_send_time_with_added_interval = $this
124 ->normalizeDateTimezone($auto_responder->getSentTime())
125 ->add($this->idle_time_interval);
126
127 $now = $this->normalizeDateTimezone($this->clock->now());
128
129 // Don't compare the objects because of microseconds
130 return $last_send_time_with_added_interval->format('Y-m-d H:i:s') <= $now->format('Y-m-d H:i:s');
131 }
132
134 int $sender_id,
135 ilMailOptions $mail_receiver_options,
136 ilMailOptions $mail_sender_options
137 ): void {
138 if ($this->auto_responder_status && $mail_receiver_options->isAbsent()) {
139 $this->auto_responder_data[$sender_id] = $mail_receiver_options;
140 }
141 }
142
143 public function emptyAutoresponderData(): void
144 {
145 $this->auto_responder_data = [];
146 }
147}
__construct(int $global_idle_time_interval, private bool $auto_responder_status, private readonly AutoresponderRepository $auto_responder_repository, private readonly ClockInterface $clock, ?callable $mail_action=null)
enqueueAutoresponderIfEnabled(int $sender_id, ilMailOptions $mail_receiver_options, ilMailOptions $mail_sender_options)
handleAutoresponderMails(int $auto_responder_receiver_usr_id)
if(!file_exists('../ilias.ini.php'))