From ece86b2fd65eed469357bae19fc790f0f841d954 Mon Sep 17 00:00:00 2001 From: sualko Date: Fri, 18 Sep 2020 17:13:46 +0200 Subject: [PATCH] feat: add room share activities --- img/actions/room-created.png | Bin 554 -> 695 bytes img/actions/room-created.svg | 36 ++++++------ img/actions/room-deleted.png | Bin 666 -> 704 bytes img/actions/room-deleted.svg | 11 ++-- img/actions/share-created.png | Bin 0 -> 611 bytes img/actions/share-created.svg | 65 +++++++++++++++++++++ img/actions/share-deleted.png | Bin 0 -> 596 bytes img/actions/share-deleted.svg | 65 +++++++++++++++++++++ lib/Activity/Provider.php | 71 +++++++++++++++++++++- lib/Activity/RoomListener.php | 4 +- lib/Activity/RoomShareListener.php | 91 +++++++++++++++++++++++++++++ lib/AppInfo/Application.php | 6 ++ lib/Event/RoomShareEvent.php | 2 +- 13 files changed, 323 insertions(+), 28 deletions(-) create mode 100644 img/actions/share-created.png create mode 100644 img/actions/share-created.svg create mode 100644 img/actions/share-deleted.png create mode 100644 img/actions/share-deleted.svg create mode 100644 lib/Activity/RoomShareListener.php diff --git a/img/actions/room-created.png b/img/actions/room-created.png index 08339a8fa9518243f59d65ad7638f4c834ab6efc..996743130bbd09f094ab62f2f7149cf000c55821 100644 GIT binary patch delta 597 zcmV-b0;>J01h)l{ZGQqZNklYFUdVo2M| z9ti3C{q;O~e>C5~KD-zK?gCXnrhHXZ?OYgn4%lh~vH#ivhJRgBp$WJJTv5LlfR`#E z4G7>gFr&tEz%_r+7e)9WCDI@)Dvr;t!P1Qq-R@gYXa1~3gA zaSev%beAL6w4a;jzHRdrhYiPMec~PmW2CvYTT5?*1nvm|y+EHD4$BOelhjEpzz-=n z*;N6+v2F|K>3_C>M6mV>$d?#6WOG~^-dHIa@*S7#M3Gbed;#xP3Vi!-0cW3JSruMT zW9(17dCEIb4zO49B~Cn>;zv+YXle61Szs&{bu@+sd-xsZ3>6?6jHEygP+p#-7Um3H zg2x43j~D6BK-P2^Gz|t^pOo}T!3uc({mMdc699)D2Y+nSWP5dn%_wz|oA7x78?ez{ z9xl!oF+B#sn@6+EN7V~LvSTO_K*nba++=MLaABEVyuAbhK6XriUE{zmqhP0F0;tpQ zn;e;}drBnWX@Q?KJE(t!B-{TND`8%u=5deE@AZq&K4Hp?eO z?CFo}x=!4tG|`j9#FFA@Etft6CEzN}rg4GhizUsr{0uOqaqYrUI`d)j9<3|(BM008 jDs3RH0JqhH?xTgjxx?NMbcWhR00000NkvXXu0mjf3{(+N delta 455 zcmV;&0XY7*1*!y)ZGQo$Nkl%Tm#YGFoK^}t-UYyD zq_5-DRRmZI?b*n{-(3L2bS|{3c}MYW_yTuuNp>uM?LZId27Xoy`-S`AzJUw4Sjg(o xh`sq^@>$_j+^!ZL$+n~J;59r9U$m!fZ2?KZnU_n3Rqp@*002ovPDHLkV1gpB-i81G diff --git a/img/actions/room-created.svg b/img/actions/room-created.svg index 76906cc..ae7f982 100644 --- a/img/actions/room-created.svg +++ b/img/actions/room-created.svg @@ -12,8 +12,11 @@ version="1.0" viewBox="0 0 32 32" id="svg4" - sodipodi:docname="app-dark.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + sodipodi:docname="room-created.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + inkscape:export-filename="/home/klaus/Repos/cloud_bbb/img/actions/room-created.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -22,7 +25,7 @@ image/svg+xml - + @@ -41,11 +44,11 @@ inkscape:window-height="997" id="namedview6" showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="13.46269" - inkscape:cy="7.070207" - inkscape:window-x="2110" - inkscape:window-y="585" + inkscape:zoom="10.429825" + inkscape:cx="-15.100081" + inkscape:cy="6.5908126" + inkscape:window-x="1889" + inkscape:window-y="504" inkscape:window-maximized="0" inkscape:current-layer="svg4" /> + aria-label="+" + transform="matrix(1.5934936,0,0,1.2502401,-6.542738,-6.5950957)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.68428612px;line-height:125%;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue';letter-spacing:0px;word-spacing:0px;fill:#44aa00;fill-opacity:1;stroke:none;stroke-width:1.26880109px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text817"> - diff --git a/img/actions/room-deleted.png b/img/actions/room-deleted.png index 07ac1a965462d79d3228ba96a7524e672c006d92..d16feff47d958d24ee8f4d10e442a82a97cb064a 100644 GIT binary patch delta 605 zcmV-j0;2tz1;7Q6Zht*VL_t(oh3(hRi;Ynj2k_5pC=s*5j6~rNkRKZ*OGP3gOKM~x zWua_lFAG+p$giCR=_X-iGbx4CEG8RfHZqMwQkrHw7Vo*{y?4&&-g>W2NxnA#6%B>+s6dfG)aq!fPWhpO26;pb$X!=6xfc# zX?`82+MOm7;e(n;b9k6IJ~bB>RgA0B^KB0Wyh+d1IRVXd)V1w7G-Lls{h|dNb8jvU z_6AGqRMe4xU>`>D7%zfN8K1u3Y%ms_4_0<7rg=?uzFpy8{Y7;zGvs63+{!dnzE5$x|a zURMHw%^1P@jJXfjf-OA}5cDf^ybj+Ma2vp_+64s5(0@?w0OhG4Rp$L!n|pt-tyTfb z>$Th5{e7?e(w#W2bw@VhLbUc89U)tYf)&ARrO-5j6IFuXbf!R^%W!mGhzh;4FS z;vMc4t>yG8?pEeA=F;_7EbhdqDD&S4mSeUkg;ebkWq}%1)`3R_5dHXzZ3dUR ziAQS+=2mqpJ;1!Kt14hBJ-7ByK=XP|HW#WXXy7CcD%TSz+m}^oRIi~^t=8ws^ rN>|*DL1lrN>H+Z-Zl(|Yk3aYghz%ySS!TT<00000NkvXXu0mjf?}w(`L(i{ltOA2lMOQ)nPw76O&UKI=Y40+eeb!`eR*H2`PS*&_dL%z z&-a|?oNv!%39Z_`@ zUpx5p;Z_|4R-!4K0O2)^33-2(AiAq+0>jvE;rYB5c7M7TC$*l)R^gJywMJLyqyww* zGqN{vsu19;c1^gDi1AlC@J-PDQOx2U?rK%DtGE+=&sj* zH74l5LrhdjAjkJbY;%GXmqMI^wrZsYv{hX(f$6N@StEh`c~0d6aSEC^jUz%?{z|oF z`ECnEN-#6!)aU>FF_{om#YOZB0yAAh;Az~;hBO^2z`J002ovPDHLk FV1kL<7YYCX diff --git a/img/actions/room-deleted.svg b/img/actions/room-deleted.svg index 0361475..4e30049 100644 --- a/img/actions/room-deleted.svg +++ b/img/actions/room-deleted.svg @@ -13,7 +13,10 @@ viewBox="0 0 32 32" id="svg4" sodipodi:docname="room-deleted.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + inkscape:export-filename="/home/klaus/Repos/cloud_bbb/img/actions/room-deleted.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -42,7 +45,7 @@ id="namedview6" showgrid="false" inkscape:zoom="7.375" - inkscape:cx="-12.706802" + inkscape:cx="-39.011887" inkscape:cy="6.3922409" inkscape:window-x="2110" inkscape:window-y="585" @@ -57,11 +60,11 @@ diff --git a/img/actions/share-created.png b/img/actions/share-created.png new file mode 100644 index 0000000000000000000000000000000000000000..ced3f193e5d45acbd2bd04ed741026fd43186cff GIT binary patch literal 611 zcmV-p0-XJcP)cI-Ay$H|7BT3bU{Fvj z?8HZ|uST&D1wm1J@j;rPg^iVn%KinxbcRF_5etP~i#vB6H+R_^on0;R!DaTId3@hJ zbLPxh*6};G;vrVhN&KvYwVVCOn^+tIaqqK;Ed^;U5^xVk!|%s<7bc`Y4SR4nyx+yK z-a$)&@JS-lGCT_$9}7c0>f99C)({1}5AEhM0mXKta(fwywYyti?=x^@*pO_c%uabA zkK+YqWIm5dKn+i^ExaGWCmbI%G0hfSvM(YpFj-~l-+3T+`>eL9lHS*81zdDc$GEze z+G?1^l-&K_ + + + + + image/svg+xml + + + + + + + + + + diff --git a/img/actions/share-deleted.png b/img/actions/share-deleted.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0f0eb9346090032046e6b6a27002af6ed15f57 GIT binary patch literal 596 zcmV-a0;~OrP)8~xAEqpMIIPt_nmp?dG?** zop;&7pV)`TSVPF%*5caTQRH2$Oo6!GRPeQ$~aKE-}_lYnYFa)rGK)!Kut?~ItZX~-rZa5(TGupW3C z*xAN!TPE@XFR(wF&f^;{kMqqHffEUNg_$;v6A6f6U&Nb+;dgD;XuSo2(>RFN%8*~j znfUxunPz8j0IzT@n}EP=T#c{&NLmr!#m%BjWE;j<0f8O3l9)R9g$3OBTjF%Fe~PgJ z3clk`V(Mc%=CB;N6_VR+5>(ga{D{F*fw{n;>huTtfe`o+SO_eQNksDr&&C9daHtDO z+r2gdCOQKJy@GQ%*)Tl)M3mqymTR_Fi71PJq73OQ-eVn4 + + + + + image/svg+xml + + + + + + + + + + diff --git a/lib/Activity/Provider.php b/lib/Activity/Provider.php index 1f6aa84..39a8195 100644 --- a/lib/Activity/Provider.php +++ b/lib/Activity/Provider.php @@ -3,11 +3,13 @@ namespace OCA\BigBlueButton\Activity; use OCA\BigBlueButton\AppInfo\Application; +use OCA\BigBlueButton\Db\RoomShare; use OCP\Activity\IProvider; use OCP\Activity\IEvent; use OCP\Activity\IManager; use OCP\IL10N; use OCP\IUserManager; +use OCP\IGroupManager; use OCP\IURLGenerator; use OCP\L10N\IFactory; use OCP\IUser; @@ -20,6 +22,12 @@ class Provider implements IProvider { /** @var string */ public const ROOM_DELETED = 'room_deleted'; + /** @var string */ + public const SHARE_CREATED = 'share_created'; + + /** @var string */ + public const SHARE_DELETED = 'share_deleted'; + /** @var IL10N */ protected $l; @@ -29,6 +37,9 @@ class Provider implements IProvider { /** @var IUserManager */ protected $userManager; + /** @var IGroupManager */ + protected $groupManager; + /** @var IURLGenerator */ protected $url; @@ -38,11 +49,13 @@ class Provider implements IProvider { public function __construct( IManager $manager, IUserManager $userManager, + IGroupManager $groupManager, IURLGenerator $url, IFactory $languageFactory ) { $this->activityManager = $manager; $this->userManager = $userManager; + $this->groupManager = $groupManager; $this->url = $url; $this->languageFactory = $languageFactory; } @@ -60,8 +73,10 @@ class Provider implements IProvider { $this->parseRoomCreated($event); } elseif ($subject === self::ROOM_DELETED) { $this->parseRoomDeleted($event); - } else { - $event->setParsedSubject('Unknown subject: ' . $subject); + } elseif ($subject === self::SHARE_CREATED) { + $this->parseShareCreated($event); + } elseif ($subject === self::SHARE_DELETED) { + $this->parseShareDeleted($event); } return $event; @@ -91,6 +106,40 @@ class Provider implements IProvider { $this->setIcon($event, 'room-deleted'); } + private function parseShareCreated(IEvent $event) { + $params = $event->getSubjectParameters(); + + if ($this->activityManager->getCurrentUserId() === $event->getAuthor()) { + $subject = $this->l->t('You shared the room %s with {shareWith}.', [$params['name']]); + } else { + $subject = $this->l->t('{user} shared the room %s with you.', [$params['name']]); + } + + $this->setSubjects($event, $subject, [ + 'user' => $this->getUser($event->getAuthor()), + 'shareWith' => $params['shareType'] === RoomShare::SHARE_TYPE_USER ? $this->getUser($params['shareWith']) : $this->getGroup($params['shareWith']), + ]); + + $this->setIcon($event, 'share-created'); + } + + private function parseShareDeleted(IEvent $event) { + $params = $event->getSubjectParameters(); + + if ($this->activityManager->getCurrentUserId() === $event->getAuthor()) { + $subject = $this->l->t('You unshared the room %s with {shareWith}.', [$params['name']]); + } else { + $subject = $this->l->t('{user} unshared the room %s with you.', [$params['name']]); + } + + $this->setSubjects($event, $subject, [ + 'user' => $this->getUser($event->getAuthor()), + 'shareWith' => $params['shareType'] === RoomShare::SHARE_TYPE_USER ? $this->getUser($params['shareWith']) : $this->getGroup($params['shareWith']), + ]); + + $this->setIcon($event, 'share-deleted'); + } + private function setIcon(IEvent $event, string $baseName) { if ($this->activityManager->getRequirePNG()) { $imagePath = $this->url->imagePath(Application::ID, 'actions/'.$baseName.'.png'); @@ -134,4 +183,22 @@ class Provider implements IProvider { 'name' => $uid, ]; } + + protected function getGroup($uid) { + $group = $this->groupManager->get($uid); + + if ($group !== null) { + return [ + 'type' => 'user-group', + 'id' => $group->getGID(), + 'name' => $group->getDisplayName(), + ]; + } + + return [ + 'type' => 'user-group', + 'id' => $uid, + 'name' => $uid, + ]; + } } diff --git a/lib/Activity/RoomListener.php b/lib/Activity/RoomListener.php index 1f8884a..1c49187 100644 --- a/lib/Activity/RoomListener.php +++ b/lib/Activity/RoomListener.php @@ -20,9 +20,9 @@ class RoomListener implements IEventListener { public function handle(Event $event): void { if ($event instanceof RoomCreatedEvent) { - $subject = Provider::ROOM_CREATED; + $subject = Provider::SHARE_CREATED; } elseif ($event instanceof RoomDeletedEvent) { - $subject = Provider::ROOM_DELETED; + $subject = Provider::SHARE_DELETED; } else { return; } diff --git a/lib/Activity/RoomShareListener.php b/lib/Activity/RoomShareListener.php new file mode 100644 index 0000000..2cb891e --- /dev/null +++ b/lib/Activity/RoomShareListener.php @@ -0,0 +1,91 @@ +activityManager = $activityManager; + $this->roomService = $roomService; + $this->groupManager = $groupManager; + } + + public function handle(Event $event): void { + if ($event instanceof RoomShareCreatedEvent) { + $subject = Provider::SHARE_CREATED; + } elseif ($event instanceof RoomShareDeletedEvent) { + $subject = Provider::SHARE_DELETED; + } else { + return; + } + + $share = $event->getRoomShare(); + $shareType = $share->getShareType(); + $room = $this->roomService->find($share->getRoomId()); + + if ($shareType === RoomShare::SHARE_TYPE_USER) { + $this->shareWithUser($subject, $room, $share); + } elseif ($shareType === RoomShare::SHARE_TYPE_GROUP) { + $this->shareWithGroup($subject, $room, $share); + } + } + + private function shareWithUser(string $subject, Room $room, RoomShare $share) { + $this->createActivityEvent($subject, $room->getUserId(), $room, $share); + $this->createActivityEvent($subject, $share->getShareWith(), $room, $share); + } + + private function shareWithGroup(string $subject, Room $room, RoomShare $share) { + $this->createActivityEvent($subject, $room->getUserId(), $room, $share); + + $group = $this->groupManager->get($share->getShareWith()); + + if ($group === null) { + return; + } + + foreach ($group->getUsers() as $user) { + $this->createActivityEvent($subject, $user->getUID(), $room, $share); + } + } + + private function createActivityEvent(string $subject, string $affectedUser, Room $room, RoomShare $roomShare) { + $activityEvent = $this->activityManager->generateEvent(); + + $activityEvent->setApp(Application::ID); + $activityEvent->setType(Setting::Identifier); + $activityEvent->setAffectedUser($affectedUser); + $activityEvent->setSubject($subject, [ + 'id' => $room->getId(), + 'name' => $room->getName(), + 'shareType' => $roomShare->getShareType(), + 'shareWith' => $roomShare->getShareWith(), + 'permission' => $roomShare->getPermission(), + ]); + + $this->activityManager->publish($activityEvent); + } +} diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 47f1a69..6beb076 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -10,6 +10,9 @@ use \OCA\BigBlueButton\Middleware\JoinMiddleware; use \OCA\BigBlueButton\Event\RoomCreatedEvent; use \OCA\BigBlueButton\Event\RoomDeletedEvent; use \OCA\BigBlueButton\Activity\RoomListener; +use \OCA\BigBlueButton\Event\RoomShareCreatedEvent; +use \OCA\BigBlueButton\Event\RoomShareDeletedEvent; +use \OCA\BigBlueButton\Activity\RoomShareListener; if ((@include_once __DIR__ . '/../../vendor/autoload.php') === false) { throw new \Exception('Cannot include autoload. Did you run install dependencies using composer?'); @@ -28,6 +31,9 @@ class Application extends App { $dispatcher->addServiceListener(RoomCreatedEvent::class, RoomListener::class); $dispatcher->addServiceListener(RoomDeletedEvent::class, RoomListener::class); + $dispatcher->addServiceListener(RoomShareCreatedEvent::class, RoomShareListener::class); + $dispatcher->addServiceListener(RoomShareDeletedEvent::class, RoomShareListener::class); + $container->registerMiddleWare(JoinMiddleware::class); $config = $container->query(IConfig::class); diff --git a/lib/Event/RoomShareEvent.php b/lib/Event/RoomShareEvent.php index 94173b6..af9264a 100644 --- a/lib/Event/RoomShareEvent.php +++ b/lib/Event/RoomShareEvent.php @@ -11,7 +11,7 @@ abstract class RoomShareEvent extends Event { private $roomShare; public function __construct(RoomShare $roomShare) { - $this->roomId = $roomShare; + $this->roomShare = $roomShare; } public function getRoomShare(): RoomShare {