2012-11-21 8 views
6

私はXMPPサーバー(openfire)に数多くのクライアント(スパーク)をいくつかのグループ(部門)に分けています。私は彼らを会議室に置く能力を探しています。私はskypeと同様の機能を持っています。ユーザーがグループの会話でウィンドウを閉じると、クライアントはそのルームの活動を追跡し続け、新しいメッセージが表示されたときに、そのユーザーの会議に自動的に参加します。私はすでにspark + openfireにそのような能力がないことを知っていますが、グループ参加のチャットブックマーク機能は自動参加になっていますが、単に退室してもイベントを気にすることはできません。私は、この機能が実装されているXMPPクライアントがあるかどうか尋ねたいと思います。 私は、各部屋に座るために管理者特権を持つ自分のボットを設定でき、おそらく彼が会議を離れるときにキック/再接続(例えば、HTTP機能によるopenfireの管理を通して)をユーザーに強制するようにし、セッションでは、connectの自動結合が彼を元に戻すでしょう。しかし、代替案があれば、単にクライアントアプリケーションを変更するほうが簡単でいいと思います。XMPPの永続的な会議室の存在

更新:「グループチャットへの招待を自動招待する」オプションが見つかったので、知識のないすべてのクライアントを再設定して、その人がチャンネルを離れる場合は単に招待状を送信するように設定すると、 。他のアイデア?

アップデート2:

[OK]を、みんな、私がテストに成功してきた "火花防止> Preferences->グループchat->自動的にグループチャットの招待受諾" それは働いて、オプションを。私の火花は私が自動的に招待されたすべての会議に加わります。そこで私は、JAXL 3.0ベースのボットで会議録画 - >自動再招待機能を実装しました。唯一の問題は、jaxl-sented inviteが私にとってうまくいかないことです。

<?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は、他のユーザーを招待することを許可」しているのオプション、両方のアカウント(私の友人は、それが働いていたとき、私は招待を送信するために使用されるものとで使用されている1: は、ここにソースコードですmessagebot)はTechグループのメンバーですが、いずれも管理者権限がありませんので、これは設定/権限関連の問題ではないと確信しています。

ここで、会議室から退出すると、ボットがそれを検出し、招待状を送信します。出力に表示される内容は次のとおりです。 ... プレゼンススタンザ。 招待状を送信しています。 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)を呼び出して送信してください。

デバッグを改善し、問題を解決するのに役立ちます。

関連する問題