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/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 5220209..e0f6b6d 100644 --- a/src/Room/ChatRoomAclDataAccessor.php +++ b/src/Room/ChatRoomAclDataAccessor.php @@ -9,6 +9,8 @@ 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,8 +64,7 @@ public function getRoomAccess(Room $room): Promise return \Amp\resolve(function() use($url) { /** @var HttpResponse $response */ $response = yield $this->httpClient->request($url); - - $doc = \Room11\DOMUtils\domdocument_load_html($response->getBody()); + $doc = domdocument_load_html($response->getBody()); $result = []; @@ -76,6 +77,35 @@ public function getRoomAccess(Room $room): Promise }); } + public function getMainSiteModerators(Room $room): Promise + { + $url = $this->urlResolver->getEndpointURL($room, Endpoint::MAINSITE_MODERATOR_LIST); + + $promise = $this->httpClient->request($url); + return \Amp\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'; }