Example #1
0
 public function run()
 {
     if (!isset($this->params['token'])) {
         throw new \Exception('A token must be set. Please see https://my.slack.com/services/new/bot');
     }
     $this->loadInternalCommands();
     $this->init();
     $logger = new \Zend\Log\Logger();
     $writer = new \Zend\Log\Writer\Stream("php://output");
     $logger->addWriter($writer);
     $loop = \React\EventLoop\Factory::create();
     $client = new \Devristo\Phpws\Client\WebSocket($this->wsUrl, $loop, $logger);
     $client->on("request", function ($headers) use($logger) {
         $logger->notice("Request object created!");
     });
     $client->on("handshake", function () use($logger) {
         $logger->notice("Handshake received!");
     });
     $client->on("connect", function () use($logger, $client) {
         $logger->notice("Connected!");
     });
     $client->on("message", function ($message) use($client, $logger) {
         $data = $message->getData();
         $logger->notice("Got message: " . $data);
         $data = json_decode($data, true);
         $command = $this->getCommand($data);
         if ($command instanceof Command\BaseCommand) {
             $command->setClient($client);
             $command->setChannel($data['channel']);
             $command->setUser($data['user']);
             $command->setContext($this->context);
             $command->executeCommand($data, $this->context);
         }
     });
     $client->open();
     /* Webserver */
     if ($this->webserverPort !== false) {
         $logger->notice("Listening on port " . $this->webserverPort);
         $socket = new \React\Socket\Server($loop);
         $http = new \React\Http\Server($socket);
         $http->on('request', function ($request, $response) use($client) {
             $post = $request->getPost();
             if ($post['name'] == 'output') {
                 $hook = new \PhpSlackBot\Webhook\OutputWebhook();
                 $hook->setClient($client);
                 $hook->setContext($this->context);
                 $hook->executeWebhook(json_decode($post['payload'], true));
             }
             $response->writeHead(200, array('Content-Type' => 'text/plain'));
             $response->end("Ok\n");
         });
         $socket->listen(8080);
     }
     $loop->run();
 }
Example #2
0
 public function connect()
 {
     $restapi = new RestApi();
     $result = $restapi->request('https://slack.com/api/rtm.start', array('get' => array('token' => $this->oauth_token)));
     if (is_object($result) && !empty($result->url)) {
         $loop = \React\EventLoop\Factory::create();
         $logger = new \Zend\Log\Logger();
         if ($this->debug) {
             $writer = new \Zend\Log\Writer\Stream("php://output");
         } else {
             $writer = new \Zend\Log\Writer\Noop();
         }
         $logger->addWriter($writer);
         $this->client = $client = new \Devristo\Phpws\Client\WebSocket($result->url, $loop, $logger);
         $client->on("connect", function () use($logger, $client) {
             $logger->notice("Connected");
         });
         $client->on("message", function ($message) use($client, $logger) {
             $event = json_decode($message->getData());
             if (!is_object($event)) {
                 $logger->warning("Invalid JSON");
                 return;
             }
             $logger->notice("Received message:\n" . print_r($event, true));
             if (isset($event->type) && $event->type == 'message' && empty($event->subtype)) {
                 $user = $event->user;
                 // TODO: get username
                 $channel = $event->channel;
                 $message = $event->text;
                 $message = preg_replace('/<(http[^\\|]+)\\|[^>]+>/', '$1', $message);
                 $message = preg_replace('/<(http[^\\>]+)>/', '$1', $message);
                 $communication = array('user_name' => $user, 'text' => $message, 'bot_type' => 'slack');
                 if ($response = $this->respond($communication)) {
                     $responseEvent = array('id' => $this->id, 'type' => 'message', 'channel' => $channel, 'text' => $response);
                     $logger->notice("Sending message:\n" . print_r($responseEvent, true));
                     $client->send(json_encode($responseEvent));
                 }
             }
         });
         $loop->addPeriodicTimer(5, function () use($client, $logger) {
             $id = ++$this->id;
             $logger->info('Sending ping');
             $event = array('id' => $id, 'type' => 'ping');
             $client->send(json_encode($event));
         });
         $client->open();
         $loop->run();
     }
 }
Example #3
0
 public function run()
 {
     if (!isset($this->params['token'])) {
         throw new \Exception('A token must be set. Please see https://my.slack.com/services/new/bot');
     }
     $this->init();
     $logger = new \Zend\Log\Logger();
     $writer = new \Zend\Log\Writer\Stream("php://output");
     $logger->addWriter($writer);
     $loop = \React\EventLoop\Factory::create();
     $client = new \Devristo\Phpws\Client\WebSocket($this->wsUrl, $loop, $logger);
     $client->on("request", function ($headers) use($logger) {
         $logger->notice("Request object created!");
     });
     $client->on("handshake", function () use($logger) {
         $logger->notice("Handshake received!");
     });
     $client->on("connect", function () use($logger, $client) {
         $logger->notice("Connected!");
     });
     $client->on("message", function ($message) use($client, $logger) {
         $data = $message->getData();
         $logger->notice("Got message: " . $data);
         $data = json_decode($data, true);
         if (count($this->catchAllCommands)) {
             foreach ($this->catchAllCommands as $command) {
                 $command->setClient($client);
                 $command->setContext($this->context);
                 $command->executeCommand($data, $this->context);
             }
         }
         $command = $this->getCommand($data);
         if ($command instanceof Command\BaseCommand) {
             $command->setClient($client);
             $command->setChannel($data['channel']);
             $command->setUser($data['user']);
             $command->setContext($this->context);
             $command->executeCommand($data, $this->context);
         }
     });
     $client->open();
     /* Webserver */
     if (null !== $this->webserverPort) {
         $logger->notice("Listening on port " . $this->webserverPort);
         $socket = new \React\Socket\Server($loop);
         $http = new \React\Http\Server($socket);
         $http->on('request', function ($request, $response) use($client) {
             $request->on('data', function ($data) use($client, $request, $response) {
                 parse_str($data, $post);
                 if ($this->authentificationToken === null || $this->authentificationToken !== null && isset($post['auth']) && $post['auth'] === $this->authentificationToken) {
                     if (isset($post['name']) && is_string($post['name']) && isset($this->webhooks[$post['name']])) {
                         $hook = $this->webhooks[$post['name']];
                         $hook->setClient($client);
                         $hook->setContext($this->context);
                         $hook->executeWebhook(json_decode($post['payload'], true), $this->context);
                         $response->writeHead(200, array('Content-Type' => 'text/plain'));
                         $response->end("Ok\n");
                     } else {
                         $response->writeHead(404, array('Content-Type' => 'text/plain'));
                         $response->end("No webhook found\n");
                     }
                 } else {
                     $response->writeHead(403, array('Content-Type' => 'text/plain'));
                     $response->end("");
                 }
             });
         });
         $socket->listen($this->webserverPort);
     }
     $loop->run();
 }
Example #4
0
<?php

/**
 * Connect to the echo.websocket.org server and check whether our message is echoed back
 *
 * User: Chris
 * Date: 30-9-13
 * Time: 21:05
 */
require_once __DIR__ . "/../vendor/autoload.php";
$loop = \React\EventLoop\Factory::create();
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);
$client = new \Devristo\Phpws\Client\WebSocket("ws://echo.websocket.org/?encoding=text", $loop, $logger);
//$client = new \Devristo\Phpws\Client\WebSocket("ws://google.com", $loop, $logger);
$client->on("connect", function () use($logger, $client) {
    $logger->notice("Or we can use the connect event!");
    $client->send("Hello world!");
});
$client->on("message", function ($message) use($client, $logger) {
    $logger->notice("Got message: " . $message->getData());
    $client->close();
});
$client->open()->then(function () use($logger, $client) {
    $logger->notice("We can use a promise to determine when the socket has been connected!");
});
$loop->run();
Example #5
0
 public static function sendMessage($message)
 {
     try {
         $config = \SciActive\RequirePHP::_('NymphPubSubConfig');
         $loop = \React\EventLoop\Factory::create();
         $logger = new \Zend\Log\Logger();
         $writer = new \Zend\Log\Writer\Stream("php://stderr");
         $logger->addWriter($writer);
         foreach ($config['entries'] as $host) {
             $client = new \Devristo\Phpws\Client\WebSocket($host, $loop, $logger);
             $client->on("connect", function () use($message, $client) {
                 $client->send($message);
                 $client->close();
             });
             $client->open();
         }
         $loop->run();
     } catch (\React\SocketClient\ConnectionException $e) {
         // Ignore a failed connection.
     }
 }
Example #6
0
 /**
  * Extends listen()
  *
  * @param string  $url       Web Socket URL
  * @param array   $sockConf  Web Socket Configuration
  * @param closure $callback  Anonymous method to return frames to
  *
  * @return void
  */
 private function _listen($url, $sockConf, $callback)
 {
     // connecting to websocket server
     $client = new \Devristo\Phpws\Client\WebSocket($url . '&sid=' . $sockConf[1], $this->_loop, Logger::getInstance(), array('http' => array('header' => 'Cookie:' . $sockConf[0])));
     // request
     $client->on("request", function ($headers) {
         // object created
         Logger::notice("[SOCKET] Request object created!");
     });
     // handshake
     $client->on("handshake", function () {
         // handshake made with server
         Logger::notice("[SOCKET] Handshake received!");
     });
     // connect
     $client->on("connect", function () use($client) {
         // connected to websocket
         Logger::notice("[SOCKET] Connected to Websocket!");
         // request connection
         $client->send('2probe');
     });
     // message
     $client->on("message", function ($message) use($client, $url, $sockConf, $callback) {
         // store data in frame
         $frame = $message->getData();
         // if socket has died out
         $this->handleFrame($frame, $client, $callback);
     });
     // start client listener
     $client->open();
     // start looping requests
     $this->_loop->run();
 }
 /**
  * Relay publish data to other servers.
  *
  * @param string $message The publish data to relay.
  */
 private function relay($message)
 {
     $config = \SciActive\RequirePHP::_('NymphPubSubConfig');
     if (!$config['relays']) {
         return;
     }
     $loop = \React\EventLoop\Factory::create();
     $logger = new \Zend\Log\Logger();
     $writer = new \Zend\Log\Writer\Stream("php://stderr");
     $logger->addWriter($writer);
     foreach ($config['relays'] as $host) {
         $client = new \Devristo\Phpws\Client\WebSocket($host, $loop, $logger);
         $client->on("connect", function () use($message, $client) {
             $client->send($message);
             $client->close();
         });
         $client->open();
     }
     $loop->run();
 }