From d10d660038efdfa2d7f35de3f6b64d8abc0aa6e2 Mon Sep 17 00:00:00 2001 From: Sean Nessworthy Date: Wed, 3 Oct 2018 21:00:25 +0100 Subject: [PATCH 1/4] Supply site moderator information when calling AclDataAccessor::getRoomAccess --- src/Endpoint.php | 1 + src/EndpointURLResolver.php | 1 + src/Room/ChatRoomAclDataAccessor.php | 39 +++++++++++++++++++++++++--- src/Room/UserAccessType.php | 1 + 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/Endpoint.php b/src/Endpoint.php index 6022533..8039c3c 100644 --- a/src/Endpoint.php +++ b/src/Endpoint.php @@ -40,4 +40,5 @@ abstract class Endpoint // main site info const MAINSITE_URLS_START = 500; const MAINSITE_USER = 501; + const MAINSITE_MODERATOR_LIST = 502; } diff --git a/src/EndpointURLResolver.php b/src/EndpointURLResolver.php index 3ef61ad..b5a83c5 100644 --- a/src/EndpointURLResolver.php +++ b/src/EndpointURLResolver.php @@ -37,6 +37,7 @@ class EndpointURLResolver Endpoint::CHAT_USER_INFO_EXTRA => 'https://%1$s/users/thumbs/%3$d?showUsage=false', Endpoint::MAINSITE_USER => '%1$s/users/%2$d?tab=profile', + Endpoint::MAINSITE_MODERATOR_LIST => '%1$s/users?tab=moderators', ]; private $connectedRooms; diff --git a/src/Room/ChatRoomAclDataAccessor.php b/src/Room/ChatRoomAclDataAccessor.php index 5220209..574ea55 100644 --- a/src/Room/ChatRoomAclDataAccessor.php +++ b/src/Room/ChatRoomAclDataAccessor.php @@ -5,7 +5,10 @@ use Amp\Artax\HttpClient; use Amp\Artax\Response as HttpResponse; use Amp\Promise; +use function Amp\resolve; +use function Room11\DOMUtils\domdocument_load_html; use Room11\DOMUtils\ElementNotFoundException; +use function Room11\DOMUtils\xpath_get_elements; use Room11\StackChat\Auth\ActiveSessionTracker; use Room11\StackChat\Endpoint; use Room11\StackChat\EndpointURLResolver; @@ -59,11 +62,10 @@ public function getRoomAccess(Room $room): Promise { $url = $this->urlResolver->getEndpointURL($room, Endpoint::CHATROOM_INFO_ACCESS); - return \Amp\resolve(function() use($url) { + return resolve(function() use($url, $room) { /** @var HttpResponse $response */ $response = yield $this->httpClient->request($url); - - $doc = \Room11\DOMUtils\domdocument_load_html($response->getBody()); + $doc = domdocument_load_html($response->getBody()); $result = []; @@ -72,10 +74,41 @@ public function getRoomAccess(Room $room): Promise $result[$accessType] = $sectionEl !== null ? $this->parseRoomAccessSection($sectionEl) : []; } + $result[UserAccessType::SITE_MODERATOR] = yield $this->getMainSiteModerators($room); + return $result; }); } + private function getMainSiteModerators(Room $room): Promise + { + $url = $this->urlResolver->getEndpointURL($room, Endpoint::MAINSITE_MODERATOR_LIST); + + $promise = $this->httpClient->request($url); + return resolve(function() use ($promise) { + /** @var HttpResponse $response */ + $response = yield $promise; + + $doc = domdocument_load_html($response->getBody()); + try { + $userElements = xpath_get_elements($doc, "//div[@id='user-browser']//div[contains(concat(' ', normalize-space(@class), ' '), ' user-details ')]//a[1]"); + } catch (ElementNotFoundException $e) { + return []; + } + + $moderators = []; + + foreach ($userElements as $userElement) { + preg_match('#/users/(?\d+)/#', $userElement->getAttribute('href'), $urlParts); + $moderators[(int) $urlParts['id']] = trim($userElement->textContent); + } + + return $moderators; + + }); + + } + /** * {@inheritdoc} */ diff --git a/src/Room/UserAccessType.php b/src/Room/UserAccessType.php index 89c961a..54ac95c 100644 --- a/src/Room/UserAccessType.php +++ b/src/Room/UserAccessType.php @@ -7,4 +7,5 @@ class UserAccessType const READ_ONLY = 'read-only'; const READ_WRITE = 'read-write'; const OWNER = 'owner'; + const SITE_MODERATOR = 'site-moderator'; } From 2751146d6b2b5f0e8a7eeddbd2a41ccab8e7066d Mon Sep 17 00:00:00 2001 From: Sean Nessworthy Date: Wed, 3 Oct 2018 21:11:43 +0100 Subject: [PATCH 2/4] Move site moderators to be part of interface directly --- src/Room/AclDataAccessor.php | 6 ++++++ src/Room/ChatRoomAclDataAccessor.php | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Room/AclDataAccessor.php b/src/Room/AclDataAccessor.php index 5409168..ff53a10 100644 --- a/src/Room/AclDataAccessor.php +++ b/src/Room/AclDataAccessor.php @@ -18,6 +18,12 @@ function getRoomAccess(Room $room): Promise; */ function getRoomOwners(Room $room): Promise; + /** + * @param Room $room + * @return Promise + */ + function getMainSiteModerators(Room $room): Promise; + /** * @param Room $room * @param int $userId diff --git a/src/Room/ChatRoomAclDataAccessor.php b/src/Room/ChatRoomAclDataAccessor.php index 574ea55..ee8ff46 100644 --- a/src/Room/ChatRoomAclDataAccessor.php +++ b/src/Room/ChatRoomAclDataAccessor.php @@ -74,13 +74,11 @@ public function getRoomAccess(Room $room): Promise $result[$accessType] = $sectionEl !== null ? $this->parseRoomAccessSection($sectionEl) : []; } - $result[UserAccessType::SITE_MODERATOR] = yield $this->getMainSiteModerators($room); - return $result; }); } - private function getMainSiteModerators(Room $room): Promise + public function getMainSiteModerators(Room $room): Promise { $url = $this->urlResolver->getEndpointURL($room, Endpoint::MAINSITE_MODERATOR_LIST); From 858b41d99c635d1fd7d9c08797b66986288d1b55 Mon Sep 17 00:00:00 2001 From: Sean Nessworthy Date: Wed, 3 Oct 2018 21:15:09 +0100 Subject: [PATCH 3/4] Stop unused variable being passed through into resolve --- src/Room/ChatRoomAclDataAccessor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Room/ChatRoomAclDataAccessor.php b/src/Room/ChatRoomAclDataAccessor.php index ee8ff46..2a29856 100644 --- a/src/Room/ChatRoomAclDataAccessor.php +++ b/src/Room/ChatRoomAclDataAccessor.php @@ -62,7 +62,7 @@ public function getRoomAccess(Room $room): Promise { $url = $this->urlResolver->getEndpointURL($room, Endpoint::CHATROOM_INFO_ACCESS); - return resolve(function() use($url, $room) { + return resolve(function() use($url) { /** @var HttpResponse $response */ $response = yield $this->httpClient->request($url); $doc = domdocument_load_html($response->getBody()); From 8a78fcc2b607705021d29f2a46cae5fbca51829d Mon Sep 17 00:00:00 2001 From: Sean Nessworthy Date: Tue, 9 Oct 2018 19:57:24 +0100 Subject: [PATCH 4/4] Format imports in ChatRoomAclDataAccessor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .. Also remove \Amp\resolve from importing and use the FQN at runtime instead. Thanks @DaveRandom ♥ --- src/Room/ChatRoomAclDataAccessor.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Room/ChatRoomAclDataAccessor.php b/src/Room/ChatRoomAclDataAccessor.php index 2a29856..e0f6b6d 100644 --- a/src/Room/ChatRoomAclDataAccessor.php +++ b/src/Room/ChatRoomAclDataAccessor.php @@ -5,13 +5,12 @@ use Amp\Artax\HttpClient; use Amp\Artax\Response as HttpResponse; use Amp\Promise; -use function Amp\resolve; -use function Room11\DOMUtils\domdocument_load_html; use Room11\DOMUtils\ElementNotFoundException; -use function Room11\DOMUtils\xpath_get_elements; use Room11\StackChat\Auth\ActiveSessionTracker; use Room11\StackChat\Endpoint; use Room11\StackChat\EndpointURLResolver; +use function Room11\DOMUtils\domdocument_load_html; +use function Room11\DOMUtils\xpath_get_elements; class ChatRoomAclDataAccessor implements AclDataAccessor { @@ -62,7 +61,7 @@ public function getRoomAccess(Room $room): Promise { $url = $this->urlResolver->getEndpointURL($room, Endpoint::CHATROOM_INFO_ACCESS); - return resolve(function() use($url) { + return \Amp\resolve(function() use($url) { /** @var HttpResponse $response */ $response = yield $this->httpClient->request($url); $doc = domdocument_load_html($response->getBody()); @@ -83,7 +82,7 @@ public function getMainSiteModerators(Room $room): Promise $url = $this->urlResolver->getEndpointURL($room, Endpoint::MAINSITE_MODERATOR_LIST); $promise = $this->httpClient->request($url); - return resolve(function() use ($promise) { + return \Amp\resolve(function() use ($promise) { /** @var HttpResponse $response */ $response = yield $promise;