diff --git a/img/actions/meeting-ended.png b/img/actions/meeting-ended.png new file mode 100644 index 0000000..9b412a7 Binary files /dev/null and b/img/actions/meeting-ended.png differ diff --git a/img/actions/meeting-ended.svg b/img/actions/meeting-ended.svg new file mode 100644 index 0000000..44e3184 --- /dev/null +++ b/img/actions/meeting-ended.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/img/actions/meeting-started.png b/img/actions/meeting-started.png new file mode 100644 index 0000000..a4276ea Binary files /dev/null and b/img/actions/meeting-started.png differ diff --git a/img/actions/meeting-started.svg b/img/actions/meeting-started.svg new file mode 100644 index 0000000..0ca3d14 --- /dev/null +++ b/img/actions/meeting-started.svg @@ -0,0 +1,69 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/img/actions/recording-ready.png b/img/actions/recording-ready.png new file mode 100644 index 0000000..477caf7 Binary files /dev/null and b/img/actions/recording-ready.png differ diff --git a/img/actions/recording-ready.svg b/img/actions/recording-ready.svg new file mode 100644 index 0000000..d1015e8 --- /dev/null +++ b/img/actions/recording-ready.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/lib/Activity/MeetingListener.php b/lib/Activity/MeetingListener.php new file mode 100644 index 0000000..c76e758 --- /dev/null +++ b/lib/Activity/MeetingListener.php @@ -0,0 +1,63 @@ +activityManager = $activityManager; + $this->userSession = $userSession; + } + + public function handle(Event $event): void { + if ($event instanceof MeetingStartedEvent) { + $subject = Provider::MEETING_STARTED; + } elseif ($event instanceof MeetingEndedEvent) { + $subject = Provider::MEETING_ENDED; + } elseif ($event instanceof RecordingReadyEvent) { + $subject = Provider::RECORDING_READY; + } else { + return; + } + + $room = $event->getRoom(); + $activityEvent = $this->activityManager->generateEvent(); + + if (!$this->userSession->isLoggedIn()) { + $activityEvent->setAuthor($room->getUserId()); + } + + $subjectData = [ + 'id' => $room->getId(), + 'name' => $room->getName(), + ]; + + if ($event instanceof MeetingEndedEvent) { + $subjectData['recordingMarks'] = $event->hasRecordingMarks(); + } + + $activityEvent->setApp(Application::ID); + $activityEvent->setType(Setting::Identifier); + $activityEvent->setAffectedUser($room->getUserId()); + $activityEvent->setSubject($subject, $subjectData); + + $this->activityManager->publish($activityEvent); + } +} diff --git a/lib/Activity/Provider.php b/lib/Activity/Provider.php index 39a8195..267c192 100644 --- a/lib/Activity/Provider.php +++ b/lib/Activity/Provider.php @@ -28,6 +28,15 @@ class Provider implements IProvider { /** @var string */ public const SHARE_DELETED = 'share_deleted'; + /** @var string */ + public const MEETING_STARTED = 'meeting_started'; + + /** @var string */ + public const MEETING_ENDED = 'meeting_ended'; + + /** @var string */ + public const RECORDING_READY = 'recording_ready'; + /** @var IL10N */ protected $l; @@ -77,6 +86,12 @@ class Provider implements IProvider { $this->parseShareCreated($event); } elseif ($subject === self::SHARE_DELETED) { $this->parseShareDeleted($event); + } elseif ($subject === self::MEETING_STARTED) { + $this->parseMeetingStarted($event); + } elseif ($subject === self::MEETING_ENDED) { + $this->parseMeetingEnded($event); + } elseif ($subject === self::RECORDING_READY) { + $this->parseRecordingReady($event); } return $event; @@ -140,6 +155,38 @@ class Provider implements IProvider { $this->setIcon($event, 'share-deleted'); } + private function parseMeetingStarted(IEvent $event) { + $params = $event->getSubjectParameters(); + + if ($this->activityManager->getCurrentUserId() === $event->getAuthor()) { + $subject = $this->l->t('You started a meeting in the "%s" room.', [$params['name']]); + } else { + $subject = $this->l->t('{user} started a meeting in the "%s" room.', [$params['name']]); + } + + $this->setSubjects($event, $subject, [ + 'user' => $this->getUser($event->getAuthor()), + ]); + + $this->setIcon($event, 'meeting-started'); + } + + private function parseMeetingEnded(IEvent $event) { + $params = $event->getSubjectParameters(); + + $event->setParsedSubject($this->l->t('The meeting in room "%s" has ended.', [$params['name']])); + + $this->setIcon($event, 'meeting-ended'); + } + + private function parseRecordingReady(IEvent $event) { + $params = $event->getSubjectParameters(); + + $event->setParsedSubject($this->l->t('Recording for room "%s" is ready.', [$params['name']])); + + $this->setIcon($event, 'recording-ready'); + } + private function setIcon(IEvent $event, string $baseName) { if ($this->activityManager->getRequirePNG()) { $imagePath = $this->url->imagePath(Application::ID, 'actions/'.$baseName.'.png'); diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 71ce5aa..9944908 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -14,6 +14,10 @@ use \OCA\BigBlueButton\Activity\RoomListener; use \OCA\BigBlueButton\Event\RoomShareCreatedEvent; use \OCA\BigBlueButton\Event\RoomShareDeletedEvent; use \OCA\BigBlueButton\Activity\RoomShareListener; +use \OCA\BigBlueButton\Event\MeetingStartedEvent; +use \OCA\BigBlueButton\Event\MeetingEndedEvent; +use \OCA\BigBlueButton\Event\RecordingReadyEvent; +use \OCA\BigBlueButton\Activity\MeetingListener; if ((@include_once __DIR__ . '/../../vendor/autoload.php') === false) { throw new \Exception('Cannot include autoload. Did you run install dependencies using composer?'); @@ -35,6 +39,10 @@ class Application extends App { $dispatcher->addServiceListener(RoomShareCreatedEvent::class, RoomShareListener::class); $dispatcher->addServiceListener(RoomShareDeletedEvent::class, RoomShareListener::class); + $dispatcher->addServiceListener(MeetingStartedEvent::class, MeetingListener::class); + $dispatcher->addServiceListener(MeetingEndedEvent::class, MeetingListener::class); + $dispatcher->addServiceListener(RecordingReadyEvent::class, MeetingListener::class); + $container->registerMiddleWare(JoinMiddleware::class); $container->registerMiddleWare(HookMiddleware::class); diff --git a/lib/Event/MeetingEndedEvent.php b/lib/Event/MeetingEndedEvent.php index 0c8a9ad..a2b2e0e 100644 --- a/lib/Event/MeetingEndedEvent.php +++ b/lib/Event/MeetingEndedEvent.php @@ -4,7 +4,7 @@ namespace OCA\BigBlueButton\Event; use OCA\BigBlueButton\Db\Room; -abstract class MeetingEndedEvent extends RoomEvent { +class MeetingEndedEvent extends RoomEvent { private $recordingMarks = false; public function __construct(Room $room, bool $recordingMarks) {