diff --git a/lib/Listener/BotInvokeListener.php b/lib/Listener/BotInvokeListener.php index 45e7a16..e418f45 100644 --- a/lib/Listener/BotInvokeListener.php +++ b/lib/Listener/BotInvokeListener.php @@ -55,13 +55,20 @@ public function handle(Event $event): void { public function receiveWebhook(string $lang, BotInvokeEvent $event): void { $data = $event->getMessage(); - if ($data['type'] === 'Create' && $data['object']['name'] === 'message') { + if (($data['type'] === 'Create' && $data['object']['name'] === 'message') + // Nextcloud 33 and newer + || ($data['type'] === 'Activity' && $data['object']['name'] === 'message') + // Nextcloud 32 and older + || ($data['type'] === 'Activity' && $data['object']['name'] === '')) { + $messageData = json_decode($data['object']['content'], true); $message = $messageData['message']; + $hasAttachment = isset($messageData['parameters']['file']); + if (!$this->logEntryMapper->hasActiveCall($data['target']['id'])) { $displayName = $this->getAuthorDisplayName($data['actor']['name'], $data['actor']['id'], $lang); - $agendaDetected = $this->summaryService->readAgendaFromMessage($message, $messageData, $data, $displayName); + $agendaDetected = $this->summaryService->readAgendaFromMessage($message, $messageData, $data, $displayName, $hasAttachment, $lang); if ($agendaDetected) { // React with thumbs up as we detected an agenda item @@ -70,7 +77,7 @@ public function receiveWebhook(string $lang, BotInvokeEvent $event): void { return; } - $taskDetected = $this->summaryService->readTasksFromMessage($message, $messageData, $data); + $taskDetected = $this->summaryService->readTasksFromMessage($message, $messageData, $data, $hasAttachment, $lang); if ($taskDetected) { // React with thumbs up as we detected a task diff --git a/lib/Service/SummaryService.php b/lib/Service/SummaryService.php index f470b4b..7addade 100644 --- a/lib/Service/SummaryService.php +++ b/lib/Service/SummaryService.php @@ -42,7 +42,7 @@ public function __construct( ) { } - public function readTasksFromMessage(string $message, array $messageData, array $data): bool { + public function readTasksFromMessage(string $message, array $messageData, array $data, bool $hasAttachment, string $lang): bool { $endOfFirstLine = strpos($message, "\n") ?: -1; $firstLowerLine = strtolower(substr($message, 0, $endOfFirstLine)); @@ -73,6 +73,12 @@ public function readTasksFromMessage(string $message, array $messageData, array $parsedMessage = preg_replace(self::TODO_SOLVED_PATTERN, '- solved: ', $parsedMessage); $parsedMessage = preg_replace(self::TODO_UNSOLVED_PATTERN, '- todo: ', $parsedMessage); + $hasAttachmentText = ''; + if ($hasAttachment) { + $l = $this->l10nFactory->get('call_summary_bot', $lang); + $hasAttachmentText = ' *📎 ' . $l->t('with attachment') . '*'; + } + if (preg_match(self::SUMMARY_PATTERN, $parsedMessage)) { $todos = preg_split(self::SUMMARY_PATTERN, $parsedMessage, flags: PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $nextEntry = null; @@ -91,6 +97,8 @@ public function readTasksFromMessage(string $message, array $messageData, array $nextEntry = LogEntry::TYPE_DECISION; } elseif ($nextEntry !== null) { $todoText = trim($todo); + $todoText .= $hasAttachmentText; + if ($todoText) { // Only store when not empty $this->saveTask($data['target']['id'], $todoText, $nextEntry); @@ -106,7 +114,7 @@ public function readTasksFromMessage(string $message, array $messageData, array return false; } - public function readAgendaFromMessage(string $message, array $messageData, array $data, ?string $displayName): bool { + public function readAgendaFromMessage(string $message, array $messageData, array $data, ?string $displayName, bool $hasAttachment, string $lang): bool { $endOfFirstLine = strpos($message, "\n") ?: -1; $firstLowerLine = strtolower(substr($message, 0, $endOfFirstLine)); @@ -139,6 +147,12 @@ public function readAgendaFromMessage(string $message, array $messageData, array } } + $hasAttachmentText = ''; + if ($hasAttachment) { + $l = $this->l10nFactory->get('call_summary_bot', $lang); + $hasAttachmentText = ' *📎 ' . $l->t('with attachment') . '*'; + } + $parsedMessage = str_replace($placeholders, $replacements, $message); $agendas = preg_split($agendaPattern, $parsedMessage, flags: PREG_SPLIT_NO_EMPTY); foreach ($agendas as $agenda) { @@ -148,6 +162,7 @@ public function readAgendaFromMessage(string $message, array $messageData, array if ($displayName !== null && trim($displayName) !== '') { $agendaText .= ' (' . $displayName . ')'; } + $agendaText .= $hasAttachmentText; $this->saveTask($data['target']['id'], $agendaText, LogEntry::TYPE_AGENDA); } } diff --git a/tests/Service/SummaryServiceTest.php b/tests/Service/SummaryServiceTest.php index ddedd3f..ed628f2 100644 --- a/tests/Service/SummaryServiceTest.php +++ b/tests/Service/SummaryServiceTest.php @@ -149,7 +149,7 @@ public function testReadTasksFromMessage(string $message, array $tasks, array $t ->method('saveTask'); } - self::assertEquals(!empty($tasks), $service->readTasksFromMessage($message, ['parameters' => []], ['target' => ['id' => 't0k3n']])); + self::assertEquals(!empty($tasks), $service->readTasksFromMessage($message, ['parameters' => []], ['target' => ['id' => 't0k3n']], false, 'en')); } public static function dataGetTitle(): array {