You are here

class RocketChatChannelBlock in Rocket.Chat 8.2

Provides an example block.

Plugin annotation


@Block(
  id = "rocket_chat_channel_block_example",
  admin_label = @Translation("Rocket Chat Group Channel"),
  category = @Translation("Rocket Chat Channel Block")
)

Hierarchy

Expanded class hierarchy of RocketChatChannelBlock

File

modules/rocket_chat_group/src/Plugin/Block/RocketChatChannelBlock.php, line 39

Namespace

Drupal\rocket_chat_group\Plugin\Block
View source
class RocketChatChannelBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * The messenger.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;

  /**
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * @var \Drupal\Core\Path\CurrentPathStack
   */
  protected $currentPath;

  /**
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $account;

  /**
   * @var \Drupal\Core\Logger\LoggerChannelInterface
   */
  protected $Logger;

  /**
   * Constructs a new AjaxFormBlock.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin ID for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   Config Factory
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
   *   Module handler (what modules are installed).
   * @param \Drupal\Core\State\StateInterface $state
   *   State access.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   *   Entity Manager
   * @param \Drupal\Core\Path\CurrentPathStack $currentPath
   *   Current Path handler.
   * @param \Drupal\Core\Session\AccountInterface $account
   * @param \Drupal\Core\Logger\LoggerChannelFactory $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");
  }

  /**
   * Retrieves the current group based on the loaded path.
   * @throws InvalidPluginDefinitionException
   * @throws PluginNotFoundException
   * @return \Drupal\group\Entity\Group
   *
   */
  private function retrieveGroupFromPath() {
    $current_path = $this->currentPath
      ->getPath();
    $paths = explode("/", $current_path, 4);

    /** @var \Drupal\group\Entity\Group $groupEntity */
    $groupEntity = $this->entityTypeManager
      ->getStorage('group')
      ->load($paths[2]);
    return $groupEntity;
  }

  /**
   * {@inheritdoc}
   * @throws InvalidPluginDefinitionException
   * @throws PluginNotFoundException
   * @throws \Exception
   */
  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 {

        //Not a member.
        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 [];
    }
  }

  /**
   * @param \Drupal\group\Entity\Group $groupEntity
   * @param \Drupal\group\GroupMembership $groupMember
   *
   * @return bool canAccess directLinks.
   */
  private function canSeeDirectLinkButtons(Group $groupEntity, GroupMembership $groupMember) {
    return FALSE;

    //REMINDER this does not work as intended needs more work before deployement.

    /*
     * if($groupMember->hasPermission('use rocketchat direct links')){
     *   return TRUE;
     * }
     * if($groupEntity->hasPermission('use rocketchat direct links', $this->account)){
     *   return TRUE;
     * }
     * if($this->account->hasPermission('use rocketchat direct links')){
     *   return TRUE;
     * }
     *   return FALSE;
     */
  }

  /**
   * Creates an instance of the plugin.
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   The container to pull out services used in the plugin.
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin ID for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   *
   * @return static
   *   Returns an instance of this plugin.
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {

    /** @var ConfigFactoryInterface $configFactory */
    $configFactory = $container
      ->get('config.factory');

    /** @var ModuleHandlerInterface $modulehandler */
    $modulehandler = $container
      ->get('module_handler');

    /** @var StateInterface $stateInterface */
    $stateInterface = $container
      ->get('state');

    /** @var MessengerInterface $messenger */
    $messenger = $container
      ->get('messenger');

    /** @var EntityTypeManagerInterface $entityTypeManager */
    $entityTypeManager = $container
      ->get("entity_type.manager");

    /** @var \Drupal\Core\Path\CurrentPathStack $pathCurrent */
    $pathCurrent = $container
      ->get('path.current');

    /** @var AccountInterface $currentUser */
    $currentUser = $container
      ->get('current_user');

    /** @var LoggerChannelFactory $loggerFactory */
    $loggerFactory = $container
      ->get('logger.factory');
    return new static($configuration, $plugin_id, $plugin_definition, $messenger, $configFactory, $modulehandler, $stateInterface, $entityTypeManager, $pathCurrent, $currentUser, $loggerFactory);
  }

  /**
   * @inheritDoc
   */
  public function getCacheMaxAge() {

    //This block is always dynamic, do not cache it ever.
    return 0;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BlockPluginInterface::BLOCK_LABEL_VISIBLE constant Indicates the block label (title) should be displayed to end users.
BlockPluginTrait::$transliteration protected property The transliteration service.
BlockPluginTrait::access public function
BlockPluginTrait::baseConfigurationDefaults protected function Returns generic default configuration for block plugins.
BlockPluginTrait::blockAccess protected function Indicates whether the block should be shown. 16
BlockPluginTrait::blockForm public function 16
BlockPluginTrait::blockSubmit public function 13
BlockPluginTrait::blockValidate public function 3
BlockPluginTrait::buildConfigurationForm public function Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. 2
BlockPluginTrait::calculateDependencies public function
BlockPluginTrait::defaultConfiguration public function 19
BlockPluginTrait::getConfiguration public function 1
BlockPluginTrait::getMachineNameSuggestion public function 1
BlockPluginTrait::getPreviewFallbackString public function 3
BlockPluginTrait::label public function
BlockPluginTrait::setConfiguration public function
BlockPluginTrait::setConfigurationValue public function
BlockPluginTrait::setTransliteration public function Sets the transliteration service.
BlockPluginTrait::submitConfigurationForm public function Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit().
BlockPluginTrait::transliteration protected function Wraps the transliteration service.
BlockPluginTrait::validateConfigurationForm public function Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). 1
ContextAwarePluginAssignmentTrait::addContextAssignmentElement protected function Builds a form element for assigning a context to a given slot.
ContextAwarePluginAssignmentTrait::contextHandler protected function Wraps the context handler.
ContextAwarePluginBase::$context protected property The data objects representing the context of this plugin.
ContextAwarePluginBase::$contexts Deprecated private property Data objects representing the contexts passed in the plugin configuration.
ContextAwarePluginBase::createContextFromConfiguration protected function Overrides ContextAwarePluginBase::createContextFromConfiguration
ContextAwarePluginBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts 9
ContextAwarePluginBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags 4
ContextAwarePluginBase::getContext public function This code is identical to the Component in order to pick up a different Context class. Overrides ContextAwarePluginBase::getContext
ContextAwarePluginBase::getContextDefinition public function Overrides ContextAwarePluginBase::getContextDefinition
ContextAwarePluginBase::getContextDefinitions public function Overrides ContextAwarePluginBase::getContextDefinitions
ContextAwarePluginBase::getContextMapping public function Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::getContextMapping
ContextAwarePluginBase::getContexts public function Gets the defined contexts. Overrides ContextAwarePluginInterface::getContexts
ContextAwarePluginBase::getContextValue public function Gets the value for a defined context. Overrides ContextAwarePluginInterface::getContextValue
ContextAwarePluginBase::getContextValues public function Gets the values for all defined contexts. Overrides ContextAwarePluginInterface::getContextValues
ContextAwarePluginBase::setContext public function Set a context on this plugin. Overrides ContextAwarePluginBase::setContext
ContextAwarePluginBase::setContextMapping public function Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::setContextMapping
ContextAwarePluginBase::setContextValue public function Sets the value for a defined context. Overrides ContextAwarePluginBase::setContextValue
ContextAwarePluginBase::validateContexts public function Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface::validateContexts
ContextAwarePluginBase::__get public function Implements magic __get() method.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginWithFormsTrait::getFormClass public function
PluginWithFormsTrait::hasFormClass public function
RocketChatChannelBlock::$account protected property
RocketChatChannelBlock::$configFactory protected property
RocketChatChannelBlock::$currentPath protected property
RocketChatChannelBlock::$entityTypeManager protected property
RocketChatChannelBlock::$Logger protected property
RocketChatChannelBlock::$messenger protected property The messenger. Overrides MessengerTrait::$messenger
RocketChatChannelBlock::$moduleHandler protected property
RocketChatChannelBlock::$state protected property
RocketChatChannelBlock::build public function Overrides BlockPluginInterface::build
RocketChatChannelBlock::canSeeDirectLinkButtons private function
RocketChatChannelBlock::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
RocketChatChannelBlock::getCacheMaxAge public function @inheritDoc Overrides ContextAwarePluginBase::getCacheMaxAge
RocketChatChannelBlock::retrieveGroupFromPath private function Retrieves the current group based on the loaded path.
RocketChatChannelBlock::__construct public function Constructs a new AjaxFormBlock. Overrides BlockPluginTrait::__construct
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2