2012-11-21 13 views
6

Ho un server XMPP (openfire) con un gruppo di client (spark) diviso in pochi gruppi (reparti). Sto cercando la possibilità di tenerli nelle sale conferenze. Intendo funzionalità simili a quelle di skype; quando l'utente chiude la finestra con una conversazione di gruppo, il suo cliente continua a tracciare l'attività di quella stanza e quando viene visualizzato un nuovo messaggio, l'utente automatico si unisce nuovamente alla conferenza. Ho già scoperto che non esiste tale abilità in spark + openfire, sebbene ci sia una buona funzione Segnalibri di Chat di gruppo con l'unione automatica, tuttavia non impedisce all'utente di lasciare semplicemente la stanza e di non essere in grado di farsi notare su altri eventi. Vorrei chiedere se esiste un client XMPP con questa funzionalità implementata. Ho capito che avrei potuto configurare il mio bot con privilegi amministrativi per sedermi in ogni stanza e probabilmente farlo per forzare il calcio/riconnettersi (ad esempio attraverso l'amministrazione di openfire tramite funzionalità HTTP) l'utente quando lascia la conferenza e non finisce il sessione, quindi l'auto join on connect lo riavrebbe indietro. Tuttavia penso che sarebbe più facile e più semplice cambiare semplicemente l'applicazione client, se esiste un'alternativa.Presenza di sala riunioni XMPP persistente

AGGIORNAMENTO: Ho appena trovato l'opzione "Accetta automaticamente l'invito alle chat di gruppo" in spark, quindi se riconfigura tutti i client a loro insaputa e configuro questo bot per inviare semplicemente un invito se la persona lascia il canale dovrebbe fare il trucco . Altre idee?

UPDATE2:

Ok, ragazzi, ho testato con successo "comandata> Preferenze> Gruppo Chat-> accettare automaticamente chat di gruppo invita" l'opzione, si sta lavorando; la mia scintilla si unisce a ogni conferenza a cui sono invitato automaticamente. Così ho implementato quella conferenza guardando -> la funzione di reinizializzazione automatica nel bot basato su JAXL 3.0. L'unico problema è che l'invito inviato da jaxl non funziona per me. Ecco il codice sorgente:

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

La sala conferenze è "Consenti occcupants di invitare altri" opzione, entrambi gli account (quello che il mio amico utilizzato per inviare mi invitano, quando ha funzionato e quello che viene utilizzato da messagebot) sono membri del gruppo Tech, nessuno di loro ha diritti amministrativi, quindi sono sicuro che questo non è un problema relativo alle impostazioni/permessi.

Ora, quando esco dalla sala conferenze, bot lo rileva e mi invia l'invito, ecco come appare nella sua uscita: ... Stanza di presenza. Invio di invito. ewilded @ localhost [email protected] Invito (ewilded @ localhost/Spark 2.6.3 a [email protected]/Ewil Ded) inviato. Dopo la stanza di presenza. ... Purtroppo questo invito non ha effetto. Suppongo che stia facendo qualcosa di sbagliato con quella chiamata xep, o meglio i suoi parametri: $ client-> xeps ['0249'] -> invite ($ jid, $ from_room);

Se qualcuno ha degli inviti di lavoro in Jaxl, PER FAVORE di aiuto, questa è l'unica cosa che rimane da fare perché funzioni.

+0

Credo che l'unico modo realistico con cui si costringerà fortemente qualcuno a partecipare a una conversazione è creare il proprio client che si unirebbe automaticamente e non consentirebbe la disconnessione da detta conversazione. Quindi modifica il tuo server in modo che accetti solo le connessioni dal tuo client. – Josh

risposta

2

Vedi i pacchetti di invito inviati nei log?

Per il prossimo livello di debug, è possibile chiamare direttamente $invite_pkt = $client->xeps['0249']->get_invite_pkt($to_bare_jid, $room_jid). Entrambi $to_bare_jid e $room_jid devono essere passati come stringa. get_invite_pkt restituirà la stanza necessaria che deve essere inviata come da direct MUC invitation xmpp extension. Se vedi che tutto va bene con la stanza restituita, è sufficiente inviarlo chiamando lo $client->send($invite_pkt).

Speriamo che questo dovrebbe aiutare a fare il debug migliore e superare i problemi.