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 @@
+
+
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 @@
+
+
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 @@
+
+
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) {