2012-11-21 26 views
6

Bir grup istemciyle (kıvılcım) birkaç gruba (bölümler) bölünmüş XMPP sunucum (açık ateş) var. Onları konferans odalarında tutma yeteneğini arıyorum. Skype'ın sahip olduğu benzer işlevleri kastediyorum; Kullanıcı pencereyi grup sohbeti ile kapattığında, müşterisi odanın etkinliğini izlemeye devam eder ve yeni mesaj belirdiğinde, kullanıcı otomatik olarak o konferansa katılır. Otomatik birleştirme ile güzel Grup Sohbet Yer İmleri özelliği olsa da, kıvılcım + açık ateşinde böyle bir yetenek olmadığını öğrendim, ancak kullanıcının sadece odadan çıkmasını ve daha sonraki olaylar hakkında fark edilmemesini engelliyor. Bu özelliği uygulanmış herhangi bir XMPP istemcisi olup olmadığını sormak istiyorum. Her bir odaya oturmak için yönetimsel ayrıcalıklarla kendi botumu kurabildiğimi ve muhtemelen konferanstan çıktığı sırada kullanıcıyı terk etmediğini (örneğin, HTTP özelliği üzerinden openfire'ın yönetimiyle) tekmelemeyi veya yeniden bağlanmayı zorlayabileceğimi düşündüm. oturum, böylece bağlantıya otomatik katılma onu geri alır. Ancak, alternatif bir uygulama varsa, istemci uygulamasını değiştirmenin daha kolay ve daha güzel olacağını düşünüyorum.XMPP kalıcı konferans odası mevcudiyeti

GÜNCELLEME: 'Spark'larda grup sohbetleri için davet kabul et' seçeneğini buldum. Bu nedenle, tüm istemcilerin bilgilerini bilmeden yeniden yapılandırırsam ve bu botu, kullanıcı kanaldan ayrılırsa davet göndermek için ayarladıysa, hile yapması gerekir . Başka fikirlerin var mı?

Update2:

Tamam, çocuklar, başarıyla test ettik seçeneği, işe yarıyor "Spark-> Tercihler-> Grup Sohbeti-> Otomatik groupchat kabul davet"; kıvılcım otomatik olarak davet ettiğim her konferansa katılıyor. Bu yüzden JAXL 3.0 tabanlı bir botta -> auto reinvite özelliğini izledim. Tek sorun, jaxl-gönderilen davetin benim için çalışmadığıdır.

<?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(); 
?> 

konferans salonu "occcupants başkalarını davet edebilir" olmuştur üzerine seçeneği, her iki hesap (arkadaşım işe yaradı zaman bana davet göndermek için kullanılan bir ve kullandığı tek: İşte kaynak kodu var messagebot) Tech grubunun üyeleridir, bunların hiçbiri yönetici haklarına sahip değildir, bu yüzden ayarların/problemlerin ilgili bir problem olmadığından eminim.

Şimdi, konferans odasından ayrıldığımda, bot bunu algılar ve beni davet eder, işte çıktığında şu şekilde görünüyor: ... Presence stanza. Davet gönderme. ewilded @ linuxmachine [email protected] davet (ewilded @ linuxmachine/[email protected]/Ewil DED Kıvılcım 2.6.3) gönderilir. Varlığından sonra stanza. ... Ne yazık ki bu davet geçerli olmaz. Sanırım bu xep çağrısı ile yanlış bir şey yapıyorum ya da onun parametreleri: $ client-> xeps ['0249'] -> davet ($ jid, $ from_room);

kimsenin Jaxl içinde davetiye çalışma var ise yardımcı LÜTFEN, bu tek şey bunun işe yaraması için yapmak kaldı olduğunu.

+0

Konuşmaya katılmak için birini güçlü şekilde uygulayacağınız tek gerçekçi yöntemin, otomatik olarak katılacak ve sohbetten kopmaya izin vermeyecek kendi istemcinizi oluşturmak olduğuna inanıyorum. Ardından sunucunuzu yalnızca istemcinizden gelen bağlantıları kabul edecek şekilde değiştirin. – Josh

cevap

2

Kayıt paketlerinin günlüklere gönderilmediğini görüyor musunuz? doğrudan $invite_pkt = $client->xeps['0249']->get_invite_pkt($to_bare_jid, $room_jid) diyebilirsin ayıklama sonraki seviyeye için

. $to_bare_jid ve $room_jid öğelerinin her ikisi de dizgi olarak geçirilmelidir. get_invite_pkt, size direct MUC invitation xmpp extension uyarınca gönderilmesi gereken gerekli standayı döndürecektir. Her şey iyi görünüyorsa iade stanza ile iyi, $client->send($invite_pkt) arayarak gönderebilirsiniz.

Umarım bu daha iyi hata ayıklama yapmak ve sorunlara geçmesine yardımcı olmalıdır.