2012-11-21 61 views
6

我有XMPP服務器(openfire)與一羣客戶(火花)分成幾組(部門)。我正在尋找將他們留在會議室的能力。我的意思是Skype類似的功能;當用戶通過羣組對話關閉窗口時,他的客戶持續跟蹤該房間的活動,並且當出現新消息時,用戶自動再次加入該會議。我已經發現在spark + openfire中沒有這種能力,儘管有自動加入的很好的羣聊功能,但是它不會阻止用戶離開房間,也不會注意到進一步的事件。我想問問是否有任何實現此功能的XMPP客戶端。 我想我可以建立自己的具有管理權限的機器人坐在每個房間,並可能使其強制踢/重新連接(例如通過HTTP功能的openfire的管理)用戶,當他離開會議,他沒有結束會話,所以自動加入連接會讓他回來。不過,我認爲只要更改客戶端應用程序會更容易,更好。XMPP持續會議室存在

更新:我剛剛在spark中發現'自動接受邀請來分組聊天'選項,因此如果我在不知情的情況下重新配置所有客戶端,並且設置此機器人只是在邀請人離開頻道時發送邀請, 。任何其他想法?

UPDATE2:

好吧,夥計們,我已經成功測試了 「火花 - >首選項>組chat->自動接受羣聊邀請」 選項,它的工作;我的火花加入了我被邀請自動參加的每個會議。所以我實現了這個會議 - 在基於JAXL 3.0的機器人中使用自動重新加載功能。唯一的問題是,jaxl發送的邀請不適合我。 這裏的源代碼:

<?php 
### JAXL message bot composed by ewilded 
require 'JAXL-3.x/jaxl.php'; 
$jabber_conf=array('jid' => '[email protected]','host'=>'openfire','user'=>'messagebot','domain'=>'localhost','logLevel'=>4, 'strict'=>true, 'port'=>5222, 'pass'=>'somepass','log_level' => JAXL_INFO); 
error_reporting(E_ALL); 
$conference_rooms=array('[email protected]'); 
$client=null; 

## Creating the object 
$client = new JAXL($jabber_conf); 
$client->require_xep(array(
     '0045', // MUC 
     '0203', // Delayed Delivery 
     '0199', // XMPP Ping 
     '0249' // direct invite 
)); 
## connect up callbacks 
$client->add_cb('on_auth_success', function() use($client,$conference_rooms,$cron_interval) { 
     echo "Auth success.\n"; 
    echo "My full jid: ".$client->full_jid->to_string()."\n"; 
     $client->set_status("Mesasge bot - available!"); // set your status 
     $client->get_vcard();    // fetch your vcard 
     $client->get_roster();    // fetch your roster list 
     foreach($conference_rooms as $conference) 
     { 
      echo "Joining conference $conference.\n"; 
      $room_full_jid=new XMPPJid("$conference/messagebot"); 
      $client->xeps['0045']->join_room($room_full_jid); 
     } 
    }); 
$client->add_cb('on_chat_message', function($msg) use($client) { 
      $to=$msg->from; 
      echo "Sending answer to: ".$to."\n"; 
      $client->send_chat_msg($to,"I am just simple bot written in PHP with JAXL XMPP library."); 
     }); 
$client->add_cb('on_connect_error',function(){echo "Connection error :(\n";}); 
$client->add_cb('on_disconnect', function() { 
    echo "Got disconnected.\n"; 
    _debug("got on_disconnect cb"); 
}); 

$client->add_cb('on_error_stanza',function($msg) 
{  
    echo "Error stanza."; 
    #print_r($msg); 
}); 
$client->add_cb('on_presence_stanza',function($msg) use($client) 
{ 
    echo "Presence stanza.\n"; 
    ### joins and lefts are shown here, so here we simply send reinvite if we see that someone's left 
    if(isset($msg->attrs['type'])&&$msg->attrs['type']=='unavailable') 
    { 
     if(isset($msg->childrens[0])&&isset($msg->childrens[0]->childrens[0])&&isset($msg->childrens[0]->childrens[0]->attrs['jid'])) 
     { 
      echo "Sending invite.\n"; 
      $jid=$msg->childrens[0]->childrens[0]->attrs['jid']; 
      $bare_jid=explode("/",$jid); 
      $from_room=$msg->attrs['from']; 
      $bare_from_room=explode("/",$from_room); 
      echo $bare_jid[0]."\n"; 
      echo $bare_from_room[0]."\n"; 
      $client->xeps['0249']->invite($jid,$from_room); ### for some reason it does not work :(
      echo "Invite ($jid to $from_room) sent.\n"; 
     } 
     else 
     { 
      echo "Ignoring.\n"; 
     } 
    } 
    echo "After presence stanza.\n"; 
}); 
$client->add_cb('on_normal_stanza',function() 
{ 
    echo "Normal stanza.\n"; 
}); 
$client->add_cb('on_groupchat_message',function($msg) use ($client) { 
echo "Groupchat event received.\n"; 
}); 

echo "Start called.\n"; 
$client->start(); 
?> 

會議室已經「允許occcupants邀請其他人」的選項,這兩個帳戶(我的朋友來給我邀請的時候,它的工作的人;二是使用的一個messagebot)是Tech組的成員,他們都沒有管理權限,所以我相信這不是設置/權限相關的問題。

現在,當我離開會議室時,bot檢測到它並向我發送邀請,以下是其輸出中顯示的內容: ... Presence stanza。 正在發送邀請。 ewilded @ localhost [email protected] 邀請(ewilded @ localhost/Spark 2.6.3 to [email protected]/Ewil Ded)發送。 存在節之後。 ... 不幸的是,此邀請不生效。我想我做了錯誤的那個xep調用,或者更確切地說它的參數: $ client-> xeps ['0249'] - > invite($ jid,$ from_room);

如果任何人在Jaxl有工作邀請,請幫助,這是唯一能做的工作。

+0

我相信你要強制強制某人加入對話的唯一現實的方法是創建自己的客戶端,它將自動加入,並且不允許與所述對話斷開連接。然後修改您的服務器,使其僅接受來自客戶端的連接。 – Josh

回答

2

您是否看到邀請數據包在日誌中發出?

對於下一級調試,您可能需要直接撥打$invite_pkt = $client->xeps['0249']->get_invite_pkt($to_bare_jid, $room_jid)$to_bare_jid$room_jid必須作爲字符串傳遞。 get_invite_pkt會根據direct MUC invitation xmpp extension返回需要發送的必要節。如果您看到返回的節全部正確,只需致電$client->send($invite_pkt)即可發送。

希望這應該能幫助你做更好的調試並解決問題。