/**
  * Processes !-command
  * @param RequestDto $dto
  */
 public function processCommand(RequestDto $dto)
 {
     $words = preg_split('/\\s+/is', $dto->getText());
     $command = Ar::get($words, 0);
     if (null === $command || '!' !== substr($command, 0, 1)) {
         return;
     }
     $command = substr($command, 1);
     Logger::get()->info("id: %s, %s is executing command \"%s\" at %s", $dto->getId(), $dto->getUser(), $dto->getText(), $dto->getChannel());
     /** @var BaseCommandHandler $commandHandler */
     foreach ($this->commandHandlers as $commandHandler) {
         $commandName = $commandHandler->getName();
         if (is_array($commandName)) {
             if (!in_array($command, $commandName)) {
                 continue;
             }
         } else {
             if ($commandName !== $command) {
                 continue;
             }
         }
         $allowed = $this->checkAccess($dto, $commandHandler);
         if (!$allowed) {
             $this->slackFacade->multiSendMessage([$dto->getChannel()], sprintf('SYSTEM: access to command !%s denied', $commandHandler->getName()));
             Logger::get()->warning("id: %s, access denied for %s trying to run \"%s\" at %s", $dto->getId(), $dto->getUser(), $dto->getText(), $dto->getChannel());
             return;
         }
         unset($words[0]);
         if ($commandHandler->canProcessCommand($words, $dto->getChannel())) {
             /** @var SlackFacade $slackFacade */
             $slackFacade = Registry::get('container')['slack_facade'];
             $commandHandler->setCallerId($dto->getUser());
             $commandHandler->setCallerName($slackFacade->getUserNameById($dto->getUser()));
             Logger::get()->debug("id: %s, starting %s command handler", $dto->getId(), $commandHandler->getName());
             $commandHandler->processCommand($words, $dto->getChannel());
             Logger::get()->debug("id: %s, finished %s command handler", $dto->getId(), $commandHandler->getName());
         }
     }
 }