给xmpphp添加了几个常用的方法

给xmpphp添加给了以下的常用方法:


registerNewUser            //注册一个新用户
addRosterContact           //发送添加好友的请求
accept friend request      //接受好友请求
deleteRosterContact        //删除某个好友
roomMessage                //发送群聊消息
createChatRoom             //创建群聊
kickUserOutToChatRoom      //把某个人剔除群聊

	/**
	  * Register a new user.
	  *
	  * @param $entity
	  * Entity we want information about
	  */
	  public function registerNewUser($user_name, $password = NULL, $email, $name=NULL){
	        
	    $id = 'reg_' . $this->getID();
	    $xml = "<iq type='set' id='$id'>
	                <query xmlns='jabber:iq:register'>
	                    <username>" . $user_name . "</username>
	                    <password>" . $password . "</password>
	                    <email>" . $email . "</email>
	                    <name>" . $name . "</name>
	                </query>
	            </iq>";
	    $this->send($xml);
	    
	  }


	
	  /**
	   * Add contact to your roster
	   */
	  public function addRosterContact($jid, $name, $nickName="",$groups=array("Friends")){
	      // return if there is no jid specified
	      if(!$jid) return;
	      // set name to the jid if none is specified
	      if (!$name) { $name = $jid; }
	      $id = $this->getID();
	      $xml = "<iq type='set' id='$id'>";
	      $xml .= "<query xmlns='jabber:iq:roster'>";
	      $xml .= "<item jid='$jid' name='$name'>";
	      foreach ($groups as $group) {
	              $xml .= "<group>$group</group>";
	      }
	      $xml .= "</item>";
	      $xml .= "</query>";
	      $xml .= "</iq>";
	      
		$xml= <<<EOF
<presence to='{$jid}' type='subscribe'>
	<nick xmlns='http://jabber.org/protocol/nick'>{$nickName}</nick>
</presence>
EOF;
	      
	      $this->send($xml);
	  }
	
	  
	  /**
	   * accept friend request
	   * @param unknown_type $send_jid
	   * @param unknown_type $received_jid
	   */
	  public function acceptRosterRequest( $send_jid, $receive_jid,$send_name="",$receive_name="" ){
	  	 	
		$xml= <<<EOF
<presence from="{$send_jid}" to="{$receive_jid}" type="subscribed">
	<nick xmlns='http://jabber.org/protocol/nick'>{$send_name}</nick>
</presence> 
<presence from="{$receive_jid}" to="{$send_jid}" type="subscribed">
	<nick xmlns='http://jabber.org/protocol/nick'>{$receive_name}</nick>
</presence> 
EOF;
		$this->send($xml);
	  	
	  }
	
	  /**
	  * Contact you wish to remove
	  * @param $jid
	  * 
	  */
	  public function deleteRosterContact($jid) {
	    $id = $this->getID();
	    $xml = "<iq type='set' id='$id'>";
	    $xml .= "<query xmlns='jabber:iq:roster'>";
	    $xml .= "<item jid='" . $jid . "' subscription='remove' />";
	    $xml .= "</query>";
	    $xml .= "</iq>";
	    $this->send($xml);
	  }

	/**
	 * send group message
	 * @param unknown_type $to
	 * @param unknown_type $body
	 * @param unknown_type $type
	 * @param unknown_type $subject
	 * @param unknown_type $payload
	 */
	public function roomMessage($jid,$room_jid, $body, $subject = null, $payload = null, $user_name=null) {

		if( $user_name ){
//			$present_roomId=$room_jid."/".$user_name;
			$present_roomId=$room_jid."/".$user_name."_";  //加“_”是因为防止同一个帐号在两个地方用同样的nickname登录房间,会有一个地方会退出登录的
		}
		else{
			$present_roomId=$room_jid;
		}
		
$id=$this->getID();	

		$out= <<<EOF
<presence 
    from='{$jid}'
    to='{$present_roomId}'>
  <x xmlns='http://jabber.org/protocol/muc'/>  
</presence>

EOF;

		$jid	  = htmlspecialchars($jid);
		$body	= htmlspecialchars($body);
		$subject = htmlspecialchars($subject);
		
		$out .= "<message from=\"{$jid}\" to=\"{$room_jid}\" type='groupchat'>";
		if($subject) $out .= "<subject>$subject</subject>";
		$out .= "<body>$body</body>";
		if($payload) $out .= $payload;
		$out .= "</message>";
		
		
		$this->send($out);		
		
		
	}	  
	  
	  
	  
	  /**
	   * create chat group
	   * @param unknown_type $jid, creater's jid
	   * @param unknown_type $room_jid chatroom's jid
	   * 
	   * take example
	   * in a class, how to use this methodd
	   * 		
	    	//modify room default setting
			$room_setting=array('muc#roomconfig_roomname'=>$testName,'muc#roomconfig_roomdesc'=>$testDesc,'muc#roomconfig_changesubject'=>1);
			
            //create chatroom , save chatroom settting			
			$this->_conn->createChatRoom($jid,$test_id,$real_name,$room_setting,$this);
			
			//set chatroom setting to xmpp server, in this class, need a public $room_xml
			$this->_conn->sendChatroom_setting($jid,$test_id,$real_name,$this->room_xml);
	   * 
	   */
	  public function createChatRoom($jid, $room_jid,$real_name,$room_setting=array(),$ref_obj){
	  	
	  	$this->refObj=$ref_obj;
	    $this->room_setting=$room_setting;
	    $id=$this->getID();
	    
	    $this->from=$jid;
	    $this->to=$room_jid;
	  	

		$xml= <<<EOF
<presence 
    from='{$jid}'
    to='{$room_jid}/{$real_name}'>
  <x xmlns='http://jabber.org/protocol/muc'/>  
</presence>
<iq from='{$jid}'
    id="{$id}"
    to='{$room_jid}'
    type='get'>
  <query xmlns='http://jabber.org/protocol/muc#owner'/>
</iq>
EOF;

	    		
		$this->addIdHandler($id, 'setChatroom');	
		$this->send($xml);	
	  }
	  
	/**
	 * set chatroom setting
	 * @param unknown_type $xml
	 */
	public function setChatroom($xml){
		
		$xml->attrs['type']="set";
		$xml->attrs['from']=$this->from;
		$xml->attrs['to']=$this->to;
		$xml->subs[0]->subs[0]->attrs['type']='submit';
		foreach( $xml->subs[0]->subs[0]->subs as &$node ){
			if( isset($node->attrs['var']) && isset( $this->room_setting[$node->attrs['var']] ) ){
				$node->subs[0]->data=$this->room_setting[$node->attrs['var']];
			}
		}
		
		$this->refObj->room_xml=$xml->toString();
	}
	
	/**
	 * please call setChatroom() before call this method 
	 */
	public function sendChatroomSetting($jid, $room_jid,$real_name,$room_xml){
		
		$xml= <<<EOF
<presence 
    from='{$jid}'
    to='{$room_jid}/{$real_name}'>
  <x xmlns='http://jabber.org/protocol/muc'/>  
</presence>
EOF;
		
		$xml.=$room_xml;
		$this->send($xml);
		
	}
	
	  
	  /**
	   * kick user out to chat room
	   * @param unknown_type $jid, create's jid
	   * @param unknown_type $room_jid,chatroom's jid
	   * @param unknown_type $real_name,kickout user's jid
	   * @param unknown_type $room_jid,chatroom's jid
	   */
	  public function kickUserOutToChatRoom($jid, $room_jid,$real_name,$kick_names=array()){
	  	

		$xml= <<<EOF
<presence 
    from='{$jid}'
    to='{$room_jid}/{$real_name}'>
  <x xmlns='http://jabber.org/protocol/muc'/>  
</presence>
EOF;

		foreach( $kick_names as $kick_name ){
		
			$id=$this->getID();	
			
		$xml.= <<<EOF
<iq from='{$jid}'
    id='{$id}'
    to='{$room_jid}'
    type='set'>
  <query xmlns='http://jabber.org/protocol/muc#admin'>
    <item nick='{$kick_name}' role='none'>
      <reason>manger kick you out of room</reason>
    </item>
  </query>
</iq>
EOF;
			
		}
	    		
		$this->send($xml);	
	  }	  
	  
	  
	  /**
	  *
	  * @param XML Object $xml
	  */
	  protected function delete_roster_contact_handler($xml) {
	    // do any handling you wish here
	    $this->event('contact_removed');
	  }		
		
      public function getJid(){
        return $this->jid;
      }

代码已开源,地址:

https://github.com/newjueqi/xmpp


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2014.06.25更新

关于创建群组的例子,请看XMPPHP/test.php 文件中的 createEventChatRoom()




[文章作者]曾健生

[作者邮箱]h6k65@126.com

[作者QQ]190678908

[新浪微博] @newjueqi

[博客] http://blog.csdn.net/newjueqi

http://blog.sina.com.cn/h6k65


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2013-11-15 15:59  dingxiaoyue  阅读(216)  评论(0编辑  收藏  举报