Changeset 10107 in spip-zone


Ignore:
Timestamp:
Mar 4, 2007, 12:08:19 AM (13 years ago)
Author:
cedric@…
Message:

"gerer la file d'envoi et envoyer ! (attention, il y a un flag simu=true dans le code)"

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/_dev_/spip-sms-listes/inc/smslist_envoyer.php

    r10098 r10107  
    1010 */
    1111
     12
     13function inc_smslist_envoyer(){
     14        include_spip("base/forms_base_api");
     15
     16        // chercher les envois en attente (statut=prepa)
     17        smslist_demon_boite_envoi();
     18        // envoyer un lot
     19        smslist_spool(10);
     20       
     21        // clore les lots finis
     22        smslist_nettoie_boite_envoi();
     23}
     24
    1225function smslist_log($texte){
    1326        echo $texte."<br/>";
     27}
     28
     29
     30function smslist_spool($nombre){
     31        # reperer les lots plus valides (en attente de suppression ? ou en pause aussi)
     32        spip_query("SELECT s.lot_envoi FROM spip_smslist_spool AS s JOIN spip_forms_donnees AS d ON d.id_donnee=s.lot_envoi WHERE d.statut<>'prepa'");
     33        $bad = "0";
     34        while ($row = spip_fetch_array($res)) $bad.=",".$row['lot_envoi'];
     35        $inbad = calcul_mysql_in('lot_envoi',$bad,'NOT');
     36        //smslist_log("bad : $inbad");
     37       
     38        # preparer un lot d'envois
     39        $id_process = substr(creer_uniqid(),0,5);
     40        # marquer le lot avec un tampo id_process
     41        spip_query("UPDATE spip_smslist_spool SET statut="._q($id_process)." WHERE $inbad AND statut='' ORDER BY compte,maj LIMIT ".intval($nombre));
     42
     43        $res = spip_query("SELECT id_spool,compte,tel_from,tel_to,message,essais FROM spip_smslist_spool WHERE statut="._q($id_process));
     44        // si moins que possible, on retente des envois echoues il y a plus d'une heure
     45        if (($n = spip_num_rows($res))<$nombre){
     46                spip_query("UPDATE spip_smslist_spool SET statut="._q($id_process)." WHERE $inbad AND statut<>'envoye' AND maj<NOW()-1 ORDER BY compte,maj LIMIT ".intval($nombre-$n));
     47        }
     48        $res = spip_query("SELECT id_spool,compte,tel_from,tel_to,message,essais FROM spip_smslist_spool WHERE statut="._q($id_process));
     49        while($row = spip_fetch_array($res)){
     50                $ok = smslist_envoi_unitaire($row['compte'],$row['tel_from'],$row['tel_to'],$row['message']);
     51                if ($ok===true) $ok = "envoye";
     52                smslist_log("envoi $id_spool: $ok");
     53                spip_query("UPDATE spip_smslist_spool SET statut="._q($ok).",date_envoi=NOW(),essais="._q($row['essais']+1)." WHERE id_spool="._q($row['id_spool']));
     54        }
     55}       
     56
     57function smslist_envoi_unitaire($compte,$from,$to,$texte, $simuler=true){
     58        static $connexion = array();
     59        if (!isset($connexion[$compte])){
     60                $res = spip_query("SELECT id_form FROM spip_forms_donnees WHERE id_donnee="._q($compte));
     61                if ($row = spip_fetch_array($res)){
     62                        $connexion[$compte] = array(
     63                                'prestataire'=>Forms_les_valeurs($row['id_form'], $compte, "select_1", " ",false),
     64                                'user'=>Forms_les_valeurs($row['id_form'], $compte, "ligne_1", " ",true),
     65                                'password'=>Forms_les_valeurs($row['id_form'], $compte, "password_1", " ",true),
     66                                'api_id'=>Forms_les_valeurs($row['id_form'], $compte, "ligne_2", " ",true),
     67                                'client_id' =>Forms_les_valeurs($row['id_form'], $compte, "ligne_3", " ",true)
     68                        );
     69                }
     70        }
     71        if (!isset($connexion[$compte])) return "Compte SMS $compte introuvable";
     72       
     73        $envoyer_sms = charger_fonction('envoyer_sms','inc');
     74        $message = array('to'=>$to,'from'=>$from,'text'=>$texte,'id'=>$connexion[$compte]['client_id']);
     75        if (!$simuler)
     76                return $envoyer_sms($connexion[$compte],$message);
     77        else {
     78                smslist_log("SIMU : envoyer_sms(".serialize($connexion[$compte]).",".serialize($message).")");
     79                return true;
     80        }
    1481}
    1582
     
    50117        }
    51118        else{
     119                smslist_log("Envoi du lot $lot aux listes $in");
     120                // prendre le premier compte actif
     121                $tables = Forms_liste_tables('smslist_compte');
     122                $in = calcul_mysql_in("id_form",implode(',',$tables));
     123                $res = spip_query("SELECT id_donnee,id_form FROM spip_forms_donnees WHERE $in AND statut='publie' LIMIT 0,1");
     124                if (!$row = spip_fetch_array($res)){
     125                        smslist_log("Envoi du lot $lot impossible : pas de compte SMS actif dans les tables $in");
     126                        return;
     127                }
     128                $compte = $row['id_donnee'];
     129               
    52130                $in = calcul_mysql_in('id_donnee',$listes);
    53                 smslist_log("Envoi du $lot aux listes $in");
    54131                // selectionner les listes
     132                $res = spip_query("SELECT id_donnee,id_form FROM spip_forms_donnees WHERE $in AND statut='publie'");
     133                if (!spip_num_rows($res)){
     134                        smslist_log("Envoi du lot $lot impossible : pas de listes de diffusions $in actives trouvees");
     135                        return;
     136                }
     137                while ($row = spip_fetch_array($res)){
     138                        $tel_from = Forms_les_valeurs($row['id_form'],$row['id_donnee'],'telephone_1',",",true);
     139                        $abonnes = Forms_les_valeurs($row['id_form'],$row['id_donnee'],'joint_1',",",true);
     140                        smslist_log($abonnes);
     141                        $in_abonnes = calcul_mysql_in("id_donnee",$abonnes);
     142                        $res2 = spip_query("SELECT valeur AS tel_to FROM spip_forms_donnees_champs WHERE champ='telephone_1' AND $in_abonnes");
     143                        smslist_log("SELECT valeur AS tel_to FROM spip_forms_donnees_champs WHERE champ='telephone_1' AND $in_abonnes");
     144                        while ($row2 = spip_fetch_array($res2)){
     145                                $tel_to = $row2['tel_to'];
     146                                $values = implode(',',array_map('_q',array($lot,$tel_to,$message,$tel_from,$compte)));
     147                                spip_query("REPLACE INTO spip_smslist_spool (lot_envoi,tel_to,message,tel_from,compte) VALUES ($values)");
     148                                smslist_log("spool : REPLACE INTO spip_smslist_spool (lot_envoi,tel_to,message,tel_from,compte) VALUES ($values)");
     149                        }
     150                }
    55151        }
    56152        // on peut changer le statut du lot a 'en cours d'envoi'
     
    59155}
    60156
    61 function smslist_etat_boite_envoi(){
     157function smslist_demon_boite_envoi(){
    62158        $now = time();
     159        # scanner les boites d'envoi a la recherche d'envois a declencher
    63160        $liste = Forms_liste_tables("smslist_boiteenvoi");
    64         foreach($liste as $id_form){
    65                 smslist_log("scan $id_form");
    66                 $res = spip_query("SELECT * FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND statut='prepa'");
    67                 while ($row = spip_fetch_array($res)){
    68                         $id_donnee = $row['id_donnee'];
    69                         $date = Forms_les_valeurs($id_form, $id_donnee, "date_1", " ",true);
    70                         $heure = Forms_les_valeurs($id_form, $id_donnee, "heure_1", " ",true);
    71                         $message = Forms_les_valeurs($id_form, $id_donnee, "joint_1", ",",true);
    72                         $listes = Forms_les_valeurs($id_form, $id_donnee, "joint_2", ",",true);
    73                         $log = "#$id_donnee:$date:$heure:$message:$listes";
    74                         if (strtotime("$date $heure")<$now){
    75                                 $log .= " Top depart";
    76                                 smslist_log($log);
    77                                 smslist_declencher_envoi($id_donnee,$message,$listes);
    78                         }
    79                         else smslist_log($log);
     161        $in = calcul_mysql_in('id_form',implode(',',$liste));
     162        smslist_log("scan $in");
     163        $res = spip_query("SELECT id_form,id_donnee FROM spip_forms_donnees WHERE $in AND statut='prepa'");
     164        while ($row = spip_fetch_array($res)){
     165                $id_donnee = $row['id_donnee'];
     166                $date = Forms_les_valeurs($row['id_form'], $id_donnee, "date_1", " ",true);
     167                $heure = Forms_les_valeurs($row['id_form'], $id_donnee, "heure_1", " ",true);
     168                $message = Forms_les_valeurs($row['id_form'], $id_donnee, "joint_1", ",",true);
     169                $listes = Forms_les_valeurs($row['id_form'], $id_donnee, "joint_2", ",",true);
     170                $log = "#$id_donnee:$date:$heure:$message:$listes";
     171                if (strtotime("$date $heure")<$now){
     172                        $log .= " Top depart";
     173                        smslist_log($log);
     174                        smslist_declencher_envoi($id_donnee,$message,$listes);
     175                }
     176                else smslist_log($log);
     177        }
     178}
     179function smslist_nettoie_boite_envoi(){
     180        # scanner les boites d'envoi a la recherche d'envois finis
     181        $liste = Forms_liste_tables("smslist_boiteenvoi");
     182        $in = calcul_mysql_in('id_form',implode(',',$liste));
     183        smslist_log("scan $in");
     184        $res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE $in AND statut='prop'");
     185        while ($row = spip_fetch_array($res)){
     186                $row2 = spip_query("SELECT id_spool FROM spip_smslist_spool WHERE lot_envoi="._q($row['id_donnee'])." AND statut<>'envoye' LIMIT 0,1");
     187                if (!spip_num_rows($row2)){
     188                        spip_query("UPDATE spip_forms_donnees SET statut='publie' WHERE id_donnee="._q($row['id_donnee']));
     189                        smslist_log("envoi du lot ".$row['id_donnee']." fini");
    80190                }
    81191        }
    82192}
    83193
    84 
    85 function inc_smslist_envoyer(){
    86         include_spip("base/forms_base_api");
    87 
    88         // chercher les envois en attente (statut=prepa)
    89         smslist_etat_boite_envoi();
    90 }
    91 
    92194?>
Note: See TracChangeset for help on using the changeset viewer.