diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Chat/Parser/SystemMessage.php | 38 | ||||
-rw-r--r-- | lib/Chat/SystemMessage/Listener.php | 7 | ||||
-rw-r--r-- | lib/Federation/CloudFederationProviderTalk.php | 25 |
3 files changed, 69 insertions, 1 deletions
diff --git a/lib/Chat/Parser/SystemMessage.php b/lib/Chat/Parser/SystemMessage.php index 68a794406..fa10556de 100644 --- a/lib/Chat/Parser/SystemMessage.php +++ b/lib/Chat/Parser/SystemMessage.php @@ -34,6 +34,7 @@ use OCA\Talk\Participant; use OCA\Talk\Room; use OCA\Talk\Share\RoomShareProvider; use OCP\Comments\IComment; +use OCP\Federation\ICloudIdManager; use OCP\Files\InvalidPathException; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -57,6 +58,7 @@ class SystemMessage { protected RoomShareProvider $shareProvider; protected PhotoCache $photoCache; protected IRootFolder $rootFolder; + protected ICloudIdManager $cloudIdManager; protected IURLGenerator $url; protected ?IL10N $l = null; @@ -80,6 +82,7 @@ class SystemMessage { RoomShareProvider $shareProvider, PhotoCache $photoCache, IRootFolder $rootFolder, + ICloudIdManager $cloudIdManager, IURLGenerator $url) { $this->userManager = $userManager; $this->groupManager = $groupManager; @@ -88,6 +91,7 @@ class SystemMessage { $this->shareProvider = $shareProvider; $this->photoCache = $photoCache; $this->rootFolder = $rootFolder; + $this->cloudIdManager = $cloudIdManager; $this->url = $url; } @@ -285,6 +289,26 @@ class SystemMessage { $parsedMessage = $this->l->t('An administrator removed {user}'); } } + } elseif ($message === 'federated_user_added') { + $parsedParameters['federated_user'] = $this->getRemoteUser($parameters['federated_user']); + $parsedMessage = $this->l->t('{actor} invited {user}'); + if ($currentUserIsActor) { + $parsedMessage = $this->l->t('You invited {user}'); + } elseif ($cliIsActor) { + $parsedMessage = $this->l->t('An administrator invited {user}'); + } elseif ($parsedParameters['federated_user']['id'] === $parsedParameters['actor']['id']) { + $parsedMessage = $this->l->t('{federated_user} accepted the invitation'); + } + } elseif ($message === 'federated_user_removed') { + $parsedParameters['federated_user'] = $this->getRemoteUser($parameters['federated_user']); + $parsedMessage = $this->l->t('{actor} removed {federated_user}'); + if ($currentUserIsActor) { + $parsedMessage = $this->l->t('You removed {federated_user}'); + } elseif ($cliIsActor) { + $parsedMessage = $this->l->t('An administrator removed {federated_user}'); + } elseif ($parsedParameters['federated_user']['id'] === $parsedParameters['actor']['id']) { + $parsedMessage = $this->l->t('{federated_user} declined the invitation'); + } } elseif ($message === 'group_added') { $parsedParameters['group'] = $this->getGroup($parameters['group']); $parsedMessage = $this->l->t('{actor} added group {group}'); @@ -588,6 +612,9 @@ class SystemMessage { if ($actorType === Attendee::ACTOR_GUESTS) { return $this->getGuest($room, $actorId); } + if ($actorType === Attendee::ACTOR_FEDERATED_USERS) { + return $this->getRemoteUser($actorId); + } return $this->getUser($actorId); } @@ -616,6 +643,17 @@ class SystemMessage { ]; } + protected function getRemoteUser(string $federationId): array { + $cloudId = $this->cloudIdManager->resolveCloudId($federationId); + + return [ + 'type' => 'user', + 'id' => $cloudId->getUser(), + 'name' => $cloudId->getDisplayId(), + 'server' => $cloudId->getRemote(), + ]; + } + protected function getDisplayName(string $uid): string { $user = $this->userManager->get($uid); if ($user instanceof IUser) { diff --git a/lib/Chat/SystemMessage/Listener.php b/lib/Chat/SystemMessage/Listener.php index e0ceb60ac..b58b7d175 100644 --- a/lib/Chat/SystemMessage/Listener.php +++ b/lib/Chat/SystemMessage/Listener.php @@ -370,6 +370,8 @@ class Listener implements IEventListener { $this->sendSystemMessage($event->getRoom(), 'group_added', ['group' => $attendee->getActorId()]); } elseif ($attendee->getActorType() === Attendee::ACTOR_CIRCLES) { $this->sendSystemMessage($event->getRoom(), 'circle_added', ['circle' => $attendee->getActorId()]); + } elseif ($attendee->getActorType() === Attendee::ACTOR_FEDERATED_USERS) { + $this->sendSystemMessage($event->getRoom(), 'federated_user_added', ['federated_user' => $attendee->getActorId()]); } } } @@ -380,6 +382,8 @@ class Listener implements IEventListener { $this->sendSystemMessage($event->getRoom(), 'group_removed', ['group' => $attendee->getActorId()]); } elseif ($attendee->getActorType() === Attendee::ACTOR_CIRCLES) { $this->sendSystemMessage($event->getRoom(), 'circle_removed', ['circle' => $attendee->getActorId()]); + } elseif ($attendee->getActorType() === Attendee::ACTOR_FEDERATED_USERS) { + $this->sendSystemMessage($event->getRoom(), 'federated_user_removed', ['federated_user' => $attendee->getActorId()]); } } } @@ -399,6 +403,9 @@ class Listener implements IEventListener { } elseif ($this->session->exists('talk-overwrite-actor')) { $actorType = Attendee::ACTOR_USERS; $actorId = $this->session->get('talk-overwrite-actor'); + } elseif ($this->session->exists('talk-overwrite-actor-type')) { + $actorType = $this->session->get('talk-overwrite-actor-type'); + $actorId = $this->session->get('talk-overwrite-actor-id'); } else { $actorType = Attendee::ACTOR_GUESTS; $sessionId = $this->talkSession->getSessionForRoom($room->getToken()); diff --git a/lib/Federation/CloudFederationProviderTalk.php b/lib/Federation/CloudFederationProviderTalk.php index b46c0ea37..9c1c0dd38 100644 --- a/lib/Federation/CloudFederationProviderTalk.php +++ b/lib/Federation/CloudFederationProviderTalk.php @@ -29,6 +29,7 @@ use Exception; use OCA\FederatedFileSharing\AddressHandler; use OCA\Talk\AppInfo\Application; use OCA\Talk\Config; +use OCA\Talk\Events\AttendeesAddedEvent; use OCA\Talk\Manager; use OCA\Talk\Model\Attendee; use OCA\Talk\Model\AttendeeMapper; @@ -37,6 +38,7 @@ use OCA\Talk\Room; use OCA\Talk\Service\ParticipantService; use OCP\AppFramework\Http; use OCP\DB\Exception as DBException; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Federation\Exceptions\ActionNotSupportedException; use OCP\Federation\Exceptions\AuthenticationFailedException; use OCP\Federation\Exceptions\BadRequestException; @@ -44,6 +46,7 @@ use OCP\Federation\Exceptions\ProviderCouldNotAddShareException; use OCP\Federation\ICloudFederationProvider; use OCP\Federation\ICloudFederationShare; use OCP\HintException; +use OCP\ISession; use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserManager; @@ -69,6 +72,8 @@ class CloudFederationProviderTalk implements ICloudFederationProvider { private AttendeeMapper $attendeeMapper; private Manager $manager; + private ISession $session; + private IEventDispatcher $dispatcher; private LoggerInterface $logger; public function __construct( @@ -81,6 +86,8 @@ class CloudFederationProviderTalk implements ICloudFederationProvider { ParticipantService $participantService, AttendeeMapper $attendeeMapper, Manager $manager, + ISession $session, + IEventDispatcher $dispatcher, LoggerInterface $logger ) { $this->userManager = $userManager; @@ -92,6 +99,8 @@ class CloudFederationProviderTalk implements ICloudFederationProvider { $this->participantService = $participantService; $this->attendeeMapper = $attendeeMapper; $this->manager = $manager; + $this->session = $session; + $this->dispatcher = $dispatcher; $this->logger = $logger; } @@ -193,7 +202,15 @@ class CloudFederationProviderTalk implements ICloudFederationProvider { private function shareAccepted(int $id, array $notification): array { $attendee = $this->getAttendeeAndValidate($id, $notification['sharedSecret']); - // TODO: Add activity for share accepted + $this->session->set('talk-overwrite-actor-type', $attendee->getActorType()); + $this->session->set('talk-overwrite-actor-id', $attendee->getActorId()); + + $room = $this->manager->getRoomById($attendee->getRoomId()); + $event = new AttendeesAddedEvent($room, [$attendee]); + $this->dispatcher->dispatchTyped($event); + + $this->session->remove('talk-overwrite-actor-type'); + $this->session->remove('talk-overwrite-actor-id'); return []; } @@ -206,9 +223,15 @@ class CloudFederationProviderTalk implements ICloudFederationProvider { private function shareDeclined(int $id, array $notification): array { $attendee = $this->getAttendeeAndValidate($id, $notification['sharedSecret']); + $this->session->set('talk-overwrite-actor-type', $attendee->getActorType()); + $this->session->set('talk-overwrite-actor-id', $attendee->getActorId()); + $room = $this->manager->getRoomById($attendee->getRoomId()); $participant = new Participant($room, $attendee, null); $this->participantService->removeAttendee($room, $participant, Room::PARTICIPANT_LEFT); + + $this->session->remove('talk-overwrite-actor-type'); + $this->session->remove('talk-overwrite-actor-id'); return []; } |