View source
<?php
namespace Drupal\rocket_chat_group\Plugin\Block;
use Drupal;
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Block\Annotation\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelFactory;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\State\StateInterface;
use Drupal\Core\Path\CurrentPathStack;
use Drupal\group\Entity\Group;
use Drupal\group\GroupMembership;
use Drupal\rocket_chat_api\RocketChat\ApiClient;
use Drupal\rocket_chat_api\RocketChat\Drupal8Config;
use Drupal\rocket_chat_api\RocketChat\Drupal8State;
use Drupal\rocket_chat_api\RocketChat\Element\Channel;
use Drupal\rocket_chat_api\RocketChat\Element\User as RocketchatUser;
use Drupal\rocket_chat_group\RocketChat\moduleHelper;
use Symfony\Component\DependencyInjection\ContainerInterface;
class RocketChatChannelBlock extends BlockBase implements ContainerFactoryPluginInterface {
protected $messenger;
protected $moduleHandler;
protected $state;
protected $configFactory;
protected $entityTypeManager;
protected $currentPath;
protected $account;
protected $Logger;
public function __construct(array $configuration, $plugin_id, $plugin_definition, MessengerInterface $messenger, ConfigFactoryInterface $config_factory, ModuleHandlerInterface $moduleHandler, StateInterface $state, EntityTypeManagerInterface $entityTypeManager, CurrentPathStack $currentPath, AccountInterface $account, LoggerChannelFactory $logger) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->messenger = $messenger;
$this->configFactory = $config_factory;
$this->moduleHandler = $moduleHandler;
$this->state = $state;
$this->entityTypeManager = $entityTypeManager;
$this->currentPath = $currentPath;
$this->account = $account;
$this->Logger = $logger
->get("Rocket Chat Group Channel Block");
}
private function retrieveGroupFromPath() {
$current_path = $this->currentPath
->getPath();
$paths = explode("/", $current_path, 4);
$groupEntity = $this->entityTypeManager
->getStorage('group')
->load($paths[2]);
return $groupEntity;
}
public function build() {
$apiConfig = new Drupal8Config($this->configFactory, $this->moduleHandler, $this->state, $this->messenger);
$apiClient = new ApiClient($apiConfig);
if ($apiConfig
->isReady() && $apiClient
->ping()) {
$groupEntity = $this
->retrieveGroupFromPath();
$member = FALSE;
if (!empty($groupEntity)) {
$newGroup = $groupEntity
->isNew();
$groupOwner = $groupEntity
->getOwner();
$channel = NULL;
$member = $groupEntity
->getMember($this->account);
$groupMembers = $groupEntity
->getMembers();
$groupUsers = [];
foreach ($groupMembers as $groupMember) {
$groupUsers[] = $groupMember
->getUser();
}
}
if ($member !== FALSE) {
if (!empty($groupEntity)) {
$fieldName = moduleHelper::extractChannelMachineName($groupEntity);
if (!empty($fieldName) && isset($groupEntity->{$fieldName})) {
foreach ($groupEntity->{$fieldName}
->getValue() as $channelDetails) {
foreach ($channelDetails as $channelName) {
$channel = new Channel(Channel::READ | Channel::WRITE, $channelName);
break;
}
break;
}
if (!empty($channel)) {
if ($groupEntity->type
->getValue()[0]['target_id'] === "closed_group") {
$channel
->setChannelType(Channel::READ | Channel::WRITE | Channel::PRIVATE_CHANNEL);
}
else {
$channel
->setChannelType(Channel::READ | Channel::WRITE | Channel::PUBLIC_CHANNEL);
}
}
}
if (!empty($channel) && $apiClient
->ping()) {
$chatUser = [];
$chatUserProxy = [];
foreach ($groupUsers as $groupUser) {
$rcUser = new RocketchatUser(new Drupal8State($this->state), $groupUser
->getAccountName(), $groupUser
->getEmail(), $groupUser
->getDisplayName());
$chatUser[] = $rcUser;
$chatUserProxy[] = $rcUser
->getUserProxy($apiClient);
}
$chatGroupOwner = new RocketchatUser(new Drupal8State($this->state), $groupOwner
->getAccountName(), $groupOwner
->getEmail(), $groupOwner
->getDisplayName());
$channelProxy = $channel
->getChannelProxy($apiClient);
if (is_null($channelProxy)) {
$this->Logger
->error("Channel/Group Creation / Retrieval Failed");
return [];
}
}
else {
if ($apiClient
->ping()) {
$this->messenger
->addError($this
->t("Channel not available., Contact the site admin."), TRUE);
}
else {
$this->messenger
->addError($this
->t("Rocket Chat not available., Contact the site admin."), FALSE);
}
}
}
if (!empty($channel)) {
$serverUrl = Drupal::configFactory()
->get('rocket_chat.settings')
->get('server');
$channelURL = $channel
->getChannelURI();
$targetURL = "{$serverUrl}{$channelURL}?layout=embedded";
}
$build = [];
$build['#cache']["max-age"] = 0;
$build['content']['#host'] = empty($serverUrl) ? "*" : $serverUrl;
$build['content']['#app'] = "rocketchat://" . parse_url($serverUrl, PHP_URL_HOST);
if ($this
->canSeeDirectLinkButtons($groupEntity, $groupMember)) {
$build['content']['#showDirectLink'] = TRUE;
}
else {
$build['content']['#showDirectLink'] = FALSE;
}
if (!empty($targetURL)) {
$build['content']['#height'] = "750px";
$build['content']['#width'] = "1334px";
$build['content']['#url'] = "{$targetURL}";
$build['content']['#theme'] = 'rocketChatChannelBlock';
$build['content']['#markup'] = $this
->t('channel');
return $build;
}
else {
$this->messenger
->addWarning($this
->t("Unable to locate channel, Contact the administrator"), TRUE);
return [];
}
}
else {
if ($this->moduleHandler
->moduleExists('devel')) {
$this->messenger
->addStatus($this->account
->getDisplayName() . " is not a Member.");
}
return [];
}
}
else {
if ($apiClient
->ping()) {
$this->messenger
->addWarning($this
->t("Unable to use Chat"), TRUE);
}
else {
$this->messenger
->addError($this
->t("Rocket Chat not available., Contact the site admin."), FALSE);
}
return [];
}
}
private function canSeeDirectLinkButtons(Group $groupEntity, GroupMembership $groupMember) {
return FALSE;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$configFactory = $container
->get('config.factory');
$modulehandler = $container
->get('module_handler');
$stateInterface = $container
->get('state');
$messenger = $container
->get('messenger');
$entityTypeManager = $container
->get("entity_type.manager");
$pathCurrent = $container
->get('path.current');
$currentUser = $container
->get('current_user');
$loggerFactory = $container
->get('logger.factory');
return new static($configuration, $plugin_id, $plugin_definition, $messenger, $configFactory, $modulehandler, $stateInterface, $entityTypeManager, $pathCurrent, $currentUser, $loggerFactory);
}
public function getCacheMaxAge() {
return 0;
}
}