Beispiel #1
0
 /**
  * Get the needed informations from xat by login the bot on xat website.
  *
  * @return void
  *
  * @throws \Mars\Network\Exception\SocketException When the socket is not connected.
  */
 public function startup()
 {
     $config = $this->config()['socket'];
     $config['port'] += floor(rand(0, 38));
     $socket = new Socket($config);
     $socket->connect();
     if ($socket->connected === false) {
         throw new SocketException('Can not connected to the socket ' . $config['host'] . ':' . $config['port'] . '.', E_WARNING);
     }
     //Send the login packet to xat.
     $socket->write($this->_buildLoginPacket());
     $response = $socket->read();
     if ($response === false) {
         throw new NetworkException('Can not read the socket while connecting to xat.', E_WARNING);
     }
     $result = Xml::toArray(Xml::build(Xml::repair($response)));
     //Send private informations to xat.
     $socket->write($this->_buildPrivatePacket());
     $response = $socket->read();
     if ($response === false) {
         throw new NetworkException('Can not read the socket while connecting to xat.', E_WARNING);
     }
     $result += Xml::toArray(Xml::build(Xml::repair($response)));
     $this->loginInfos = $result;
 }
Beispiel #2
0
 /**
  * Handle the response from the socket.
  *
  * @param bool|string $response The response from the socket.
  *
  * @return void
  */
 protected function _handleResponse($response)
 {
     if ($response != false) {
         $length = strlen($response);
         while ($response[$length - 1] != '>' && $response[$length - 1] != chr(0)) {
             $response .= $this->Socket->read();
             $length = strlen($response);
         }
         $packets = [];
         preg_match_all("/<([\\w]+)[^>]*>/", $response, $packets, PREG_SET_ORDER);
         foreach ($packets as $packet) {
             $packet[0] = Xml::toArray(Xml::build(Xml::repair($packet[0])));
             debug($packet);
             $this->PacketManager->{'on' . Inflector::camelize($packet[1])}($packet[0]);
         }
     }
 }
Beispiel #3
0
 /**
  * Join a room.
  *
  * @param array $network The packet information from the network.
  * @param int $room The room id to join.
  * @param string $host The host of the socket.
  * @param string $port The port of the socket.
  *
  * @return \Mars\Network\Socket
  *
  * @throws \Mars\Network\Exception\RoomException When the network variable is empty.
  * @throws \Mars\Network\Exception\SocketException When the socket has failed to connect.
  */
 public function join(array $network = [], $room = null, $host = null, $port = null)
 {
     $config = $this->config();
     if (empty($network)) {
         throw new RoomException('The network can not be empty.', E_WARNING);
     }
     if (!is_null($room)) {
         $config['room'] = $room['id'];
     }
     $socketPort = static::getPort($config['room']);
     $socketHost = static::getHost($config['room'], $config['ips']);
     if (!is_null($host)) {
         $socketHost = $host;
     }
     if (!is_null($port)) {
         $socketPort = $port;
     }
     $socket = new Socket(['host' => $socketHost, 'port' => $socketPort]);
     $socket->connect();
     if ($socket->connected === false) {
         throw new SocketException('Can not connect to the socket ' . $config['host'] . ':' . $config['port'] . '.', E_WARNING);
     }
     $socket->write($this->_bluidConnectionPacket($config['room']));
     $response = $socket->read();
     if ($response === false) {
         throw new RoomException('Can not read the socket while joining the room.', E_WARNING);
     }
     $result = Xml::toArray(Xml::build(Xml::repair($response)));
     $network = array_merge($network, $result);
     $this->loginInfos = $network;
     $socket->write($this->_buildJoinPacket($result, $network, $config['room']));
     return ['socket' => $socket, 'network' => $network];
 }