added recv_nick and P10_User
[PHP-P10.git] / Uplink / Uplink.class.php
index 2dee4da2f213caf4d93bc98d9c50bc7f1ba2f0d6..e7b8e9c9bc88fc9bf74a305169407fa01eac33f6 100644 (file)
@@ -50,6 +50,9 @@
 require_once("Client.class.php");
 require_once("Numerics.class.php");
 require_once("P10Formatter.class.php");
+require_once("P10_Server.class.php");
+require_once("P10_User.class.php");
+require_once("P10_ModeSets.class.php");
 
 class Uplink {
        private $client = new Client();
@@ -59,6 +62,7 @@ class Uplink {
        const FLAG_P10SESSION      = 0x0001; //connection is in P10 mode (server is connected)
        const FLAG_SECURITY_QUIT   = 0x0002; //local connection abort because of security issues
        const FLAG_NOT_CONNECTABLE = 0x0004; //remote server is not connectable
+       const FLAG_BURST_PENDING   = 0x0008; //we still have to burst
        private $flags = 0;
        
        public function __construct() {
@@ -185,6 +189,12 @@ class Uplink {
                        case "G":
                                $this->recv_ping($from, $arguments);
                                break;
+                       case "N":
+                               $this->recv_nick($from, $arguments);
+                               break;
+                       case "EB":
+                               $this->recv_end_of_burst($from, $arguments);
+                               break;
                //default
                        default:
                                //unknown cmd
@@ -234,7 +244,7 @@ class Uplink {
                        }
                        $new_server = new P10_Server($args[0], substr($args[5],0,2), $this->server, $args[2], $args[3], $args[7]);
                        $this->server->add_server($new_server);
-                       $this->flags |= self::FLAG_P10SESSION;
+                       $this->flags |= self::FLAG_P10SESSION | self::FLAG_BURST_PENDING;
                } else {
                        //another server got a new slave server ^^
                        $server = P10_Server::getServerByNum($from);
@@ -251,6 +261,57 @@ class Uplink {
                $this->send("Z", $args[0]); //simply PONG
        }
        
+       private function recv_nick($from, $args) {
+               //[recv] AM N Zer0n|IRPG 2 1292194168 ~Zer0n c04D8C5.localIP +oiwgrftx Zer0n Zer0n.admin.WebGamesNet AKBNjF AMAAj :Zer0n IRPG - Will never answer here.
+               if(count($args) == 2) {
+                       //Nick change
+                       $user = P10_User::getUserByNum($from);
+                       if($user == null) {
+                               trigger_error("Server tries to change the nick of an user that does not exist or was not found on recv_nick.", E_USER_ERROR);
+                               return;
+                       }
+                       $nick->setNick($args[0]);
+               } else {
+                       //New User
+                       $numeric = $args[count($args)-2];
+                       $nick = $args[0];
+                       $server = P10_Server::getServerByNum($from);
+                       if($server == null) {
+                               trigger_error("Server (".$from.") the User (".$nick.") is coming from does not exist or was not found on recv_nick.", E_USER_ERROR);
+                               return;
+                       }
+                       if(substr($numeric,0,2) != $from) {
+                               trigger_error("A Server (".$from.") tries to connect a User with an invalid User numeric ('".$numeric."' does not belong to the Server)", E_USER_WARNING);
+                       }
+                       $connect_time = $args[2];
+                       $ident = $args[3];
+                       $host = $args[4];
+                       $modes = implode(" ",array_slice($args, 5, count($args)-8));
+                       $modes = new UserModeSet($modes);
+                       $ip = Numerics::parseIP($args[count($args)-3]);
+                       $realname = $args[count($args)-1];
+                       new P10_User($nick, $numeric, $server, $connect_time, $ident, $host, $ip, $realname, $modes);
+               }
+       }
+       
+       private function recv_end_of_burst($from, $args) {
+               if(($this->flags & self::FLAG_BURST_PENDING)) {
+                       $this->burst();
+                       $this->send("EA");
+                       $this->flags &= ~self::FLAG_BURST_PENDING;
+               }
+       }
+       
+       
+       
+       /********************************************************************************************
+        *                                     SERVER FUNCTIONS                                     *
+        ********************************************************************************************/
+       
+       private function burst() {
+               $this->send("EB");
+       }
+       
 }
 
 ?>
\ No newline at end of file