Ejemplo n.º 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();
 }
Ejemplo n.º 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();
     }
 }
Ejemplo n.º 3
0
 public function __construct($token, $channel)
 {
     $loop = \React\EventLoop\Factory::create();
     $logger = new \Zend\Log\Logger();
     $writer = new Zend\Log\Writer\Stream("php://output");
     $logger->addWriter($writer);
     $this->client = new \Devristo\Phpws\Client\WebSocket($url, $loop, $logger);
     $this->client->on("request", function ($headers) use($logger) {
         $logger->notice("Request object created!");
     });
     $this->client->on("handshake", function () use($logger) {
         $logger->notice("Handshake received!");
     });
     $this->client->on("connect", function ($headers) use($logger, $client) {
         $logger->notice("Connected!");
     });
     $this->client->on("message", function ($message) use($client, $logger) {
         $logger->notice("Got message: " . $message->getData());
     });
 }
Ejemplo n.º 4
0
use Devristo\Phpws\Server\WebSocketServer;
$loop = \React\EventLoop\Factory::create();
// Create a logger which writes everything to the STDOUT
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);
// Create a WebSocket server and create a router which sends all user requesting /echo to the DemoEchoHandler above
$server = new WebSocketServer("tcp://0.0.0.0:12345", $loop, $logger);
$handler = new \Devristo\Phpws\RemoteEvent\RemoteEvents($logger);
$server->on("connect", function (TransportInterface $transport) use($loop, $logger, $handler) {
    $stack = StackTransport::create($transport, array(function (TransportInterface $transport) use($loop, $logger) {
        return new RemoteEventTransport($transport, $loop, $logger);
    }));
    $handler->listenTo($stack);
});
$handler->room("time")->on("subscribe", function (StackTransport $transport) use($logger, $handler) {
    $logger->notice("Someone joined our room full of time enthousiasts!!");
});
// Each 0.5 seconds sent the time to all connected clients
$loop->addPeriodicTimer(0.5, function () use($server, $handler, $logger) {
    $time = new DateTime();
    $string = $time->format("Y-m-d H:i:s");
    if (count($handler->room("time")->getMembers())) {
        $logger->notice("Broadcasting time to time room: {$string}");
    }
    $handler->room("time")->remoteEmit("time", $string);
});
// Bind the server
$server->bind();
// Start the event loop
$loop->run();
Ejemplo n.º 5
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();
 }
Ejemplo n.º 6
0
#!/php -q
<?php 
require_once "../vendor/autoload.php";
use Devristo\Phpws\Messaging\WebSocketMessageInterface;
use Devristo\Phpws\Protocol\WebSocketTransportInterface;
use Devristo\Phpws\Server\WebSocketServer;
$loop = \React\EventLoop\Factory::create();
// Create a logger which writes everything to the STDOUT
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);
// Create a WebSocket server using SSL
$server = new WebSocketServer("ssl://0.0.0.0:12345", $loop, $logger);
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', "democert.pem");
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
$server->setStreamContext($context);
// Sent a welcome message when a client connects
$server->on("connect", function (WebSocketTransportInterface $user) {
    $user->sendString("Hey! I am the echo robot. I will repeat all your input!");
});
// Echo back any message the user sends
$server->on("message", function (WebSocketTransportInterface $user, WebSocketMessageInterface $message) use($logger) {
    $logger->notice(sprintf("We have got '%s' from client %s", $message->getData(), $user->getId()));
    $user->sendString($message->getData());
});
// Bind the server
$server->bind();
// Start the event loop
$loop->run();
Ejemplo n.º 7
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();
Ejemplo n.º 8
0
#!/php -q
<?php 
require_once "../vendor/autoload.php";
use Devristo\Phpws\Server\WebSocketServer;
$loop = \React\EventLoop\Factory::create();
// Create a logger which writes everything to the STDOUT
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);
// Create a WebSocket server using SSL
$server = new WebSocketServer("tcp://0.0.0.0:12345", $loop, $logger);
// Each 0.5 seconds sent the time to all connected clients
$loop->addPeriodicTimer(0.5, function () use($server, $logger) {
    $time = new DateTime();
    $string = $time->format("Y-m-d H:i:s");
    $logger->notice("Broadcasting time to all clients: {$string}");
    foreach ($server->getConnections() as $client) {
        $client->sendString($string);
    }
});
// Bind the server
$server->bind();
// Start the event loop
$loop->run();
Ejemplo n.º 9
0
<?php

require_once '../vendor/autoload.php';
if (!file_exists('config.php')) {
    die('Please create a config.php file that creates a properly defined Pusher object called $pusher and places it in the global scope.  <?php $pusher = new Pusher("123123", "12312, "123123"); ?>.  You can probably just copy it from your Pusher PHP example source page.');
}
require_once 'config.php';
$adapter = new Eschrade\PusherLogger\PusherAdapter();
$adapter->setPusher($pusher);
$logger = new Zend\Log\Logger();
$logger->addWriter($adapter);
$logger->debug('This is a test debug');
$logger->crit('This is a test crit');
$logger->err('This is a test error');
$logger->notice('This is a test notice');
$logger->warn('This is a test warn');
$logger->info('This is a test info');