ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
AutoresponderServiceImpl.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\Mail\Autoresponder;
22 
23 use DateInterval;
24 use ilMailOptions;
26 use DateTimeZone;
28 
30 {
32  private $mail_action;
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 
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 }
enqueueAutoresponderIfEnabled(int $sender_id, ilMailOptions $mail_receiver_options, ilMailOptions $mail_sender_options)
add()
description: > Example for rendring an add glyph.
Definition: add.php:41
__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)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
sub()
description: > Example for rendering a submenu.
Definition: sub.php:32
withSentTime(DateTimeImmutable $sent_time)
handleAutoresponderMails(int $auto_responder_receiver_usr_id)