7

少数のグループ (部門) に分割された多数のクライアント (spark) を含む XMPP サーバー (openfire) があります。それらを会議室に保管できる機能を探しています。スカイプが持つ同様の機能を意味します。ユーザーがグループ会話でウィンドウを閉じると、クライアントはその部屋のアクティビティを追跡し続け、新しいメッセージが表示されると、ユーザーはその会議に再び自動的に参加します。自動参加を備えた素晴らしいグループ チャット ブックマーク機能がありますが、spark+openfire にはそのような機能がないことは既にわかっています。この機能が実装されている XMPP クライアントがあるかどうかを尋ねたいと思います。私は、各部屋に座る管理者権限を持つ独自のボットをセットアップし、おそらく、ユーザーが会議を離れてセッションを終了していないときに、強制的にキック/再接続するようにすることができると考えました (たとえば、HTTP 機能を介した Openfire の管理を通じて)。 、したがって、接続時に自動参加すると、彼が戻ってきます。ただし、別の方法がある場合は、クライアント アプリケーションを変更するだけの方が簡単で便利だと思います。

更新: Spark で「グループ チャットへの招待を自動的に受け入れる」オプションを見つけたので、知らないうちにすべてのクライアントを再構成し、このボットを設定して、その人がチャネルを離れた場合に招待を送信するだけでうまくいくはずです。他のアイデアはありますか?

更新 2:

OK、皆さん、「Spark->設定->グループチャット->グループチャットの招待を自動的に受け入れる」オプションのテストに成功しました。機能しています。私のスパークは、私が招待されたすべての会議に自動的に参加します。そこで、JAXL 3.0 ベースのボットで会議の視聴 -> 自動再招待機能を実装しました。唯一の問題は、jaxl で送信された招待状が機能しないことです。ソースコードは次のとおりです。

<?php
###  JAXL message bot composed by ewilded
require 'JAXL-3.x/jaxl.php';
$jabber_conf=array('jid' => 'messagebot@localhost','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('tech@conference.localhost');
$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();
?>

会議室には「占有者に他の人を招待することを許可する」オプションがあり、両方のアカウント (友人が機能していたときに招待を送ってくれたアカウントとメッセージボットで使用されているアカウント) は Tech グループのメンバーですが、いずれも持っていません。管理者権限なので、これは設定/権限に関連する問題ではないと確信しています。

ここで、私が会議室を出ると、ボットがそれを検出して招待状を送信します。出力には次のように表示されます。 ... プレゼンス スタンザ。招待状を送信しています。ewilded@localhost tech@conference.localhost 招待 (ewilded@localhost/Spark 2.6.3 から tech@conference.localhost/Ewil Ded へ) が送信されました。プレゼンススタンザの後。... 残念ながら、この招待は有効になりません。私はその xep 呼び出し、またはむしろそのパラメーターで何か間違ったことをしていると思います: $client->xeps['0249']->invite($jid,$from_room);

誰かが Jaxl で作業中の招待状を持っている場合は、助けてください。これが機能するために残された唯一のことです。

4

1 に答える 1

2

ログに送信されている招待パケットが表示されますか?

次のレベルのデバッグでは、直接呼び出すことができます$invite_pkt = $client->xeps['0249']->get_invite_pkt($to_bare_jid, $room_jid)。との両方$to_bare_jid$room_jid文字列として渡す必要があります。直接 MUC 招待 xmpp 拡張get_invite_pktに従って送信する必要がある必要なスタンザが返されます。返されたスタンザに問題がないことがわかった場合は、 を呼び出して送信します。$client->send($invite_pkt)

うまくいけば、これがより良いデバッグを行い、問題を解決するのに役立つはずです.

于 2012-12-07T12:42:42.037 に答える