Browse Source

Lecture régulière des flux, génération des pushs à envoyer, suivant une date de dernière génération (pour pas générer plusieurs fois les mêmes choses), et lancement des envois en masse.

master
RastaPopoulos 2 months ago
parent
commit
9e4e75ebee
  1. 1
      action/tester_pushsubscriber.php
  2. 33
      base/pushsubscribers.php
  3. 141
      genie/pushsubscribers_bulksend.php
  4. 202
      inc/pushsubscribers.php
  5. 3
      lang/push_fr.php
  6. 2
      prive/objets/liste/pushs.html
  7. 11
      pushs/articles.php
  8. 8
      pushsubscribers_pipelines.php

1
action/tester_pushsubscriber.php

@ -50,6 +50,7 @@ function action_tester_pushsubscriber_dist($arg=null) {
// Erreur
if ($retour) {
include_spip('inc/minipres');
echo minipres(
'Erreur durant l’envoi de la notification de test',
$retour

33
base/pushsubscribers.php

@ -136,17 +136,29 @@ function pushsubscribers_declarer_tables_objets_sql($tables) {
'rechercher_champs' => array("titre" => 10, "texte" => 5, "topic" => 10),
'tables_jointures' => array(),
'statut_textes_instituer' => array(
'prepa' => 'texte_statut_en_cours_redaction',
'prop' => 'texte_statut_propose_evaluation',
'publie' => 'texte_statut_publie',
'refuse' => 'texte_statut_refuse',
'prepa' => 'texte_statut_en_cours_redaction',
'prop' => 'texte_statut_propose_evaluation',
//~ 'publie' => 'texte_statut_publie',
'refuse' => 'texte_statut_refuse',
'init' => 'push:texte_statut_init',
// 'pause' => 'push:texte_statut_pause',
'pause' => 'push:texte_statut_pause',
'processing' => 'push:texte_statut_processing',
'end' => 'push:texte_statut_end',
// 'cancel' => 'push:texte_statut_cancel',
// 'poubelle' => 'texte_statut_poubelle',
// 'archive' => 'push:texte_statut_archive',
'cancel' => 'push:texte_statut_cancel',
'poubelle' => 'texte_statut_poubelle',
'archive' => 'push:texte_statut_archive',
),
'statut_images' => array(
'prepa' => 'puce-preparer-8.png',
'prop' => 'puce-proposer-8.png',
'refuse' => 'puce-refuser-8.png',
'init' => 'puce-planifier-8.png',
'pause' => 'puce-preparer-8.png',
'processing' => 'puce-proposer-8.png',
'end' => 'puce-publier-8.png',
'cancel' => 'puce-refuser-8.png',
'poubelle' => 'puce-supprimer-8.png',
'archive' => 'puce-archiver-8.png',
),
'statut'=> array(
array(
@ -188,10 +200,13 @@ function pushsubscribers_declarer_tables_auxiliaires($tables) {
'field' => array(
"id_push" => "bigint(21) DEFAULT '0' NOT NULL",
"id_pushsubscriber" => "bigint(21) DEFAULT '0' NOT NULL",
// recopier ici tous les champs permettant d'envoyer sans refaire une requête sur spip_pushsubscribers ?
"date" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'",
"statut" => "char(4) DEFAULT 'todo' NOT NULL", // todo, sent, fail
"try" => "tinyint NOT NULL DEFAULT 0", // nombre d'essais
// tous les champs permettant d'envoyer sans refaire une requête sur spip_pushsubscribers
'endpoint' => 'varchar(512) NOT NULL DEFAULT ""',
'p256dh' => 'varchar(512) NOT NULL DEFAULT ""',
'auth' => 'varchar(512) NOT NULL DEFAULT ""',
),
'key' => array(
"PRIMARY KEY" => "id_push,id_pushsubscriber",

141
genie/pushsubscribers_bulksend.php

@ -12,17 +12,9 @@ function genie_pushsubscribers_bulksend_dist($t) {
spip_log("pushbulksend:meta_processing:".$GLOBALS['meta']['pushsubscribers_processing'], "pushsubscribers");
// S'il y a un push programmé dans le futur dont la date de début est dépassé
if ($id_push = sql_getfetsel('id_push', 'spip_pushs', 'statut='.sql_quote('init').' AND date_start<'.sql_quote(date('Y-m-d H:i:s')),'','','0,1')){
if ($id_push = sql_getfetsel('id_push', 'spip_pushs', 'statut='.sql_quote('init').' AND date_debut < '.sql_quote(date('Y-m-d H:i:s')),'','','0,1')){
// Passer en processing l'id_push concerné
sql_updateq('spip_pushs', array('statut'=>'processing'),'id_push = '.intval($id_push));
//~ // initialiser le mailer si necessaire
//~ // On cree l'objet Mailer (PHPMailer) pour le manipuler ensuite
//~ if ($mailer = lire_config("mailshot/mailer")
//~ AND charger_fonction($mailer,'bulkmailer',true)
//~ AND $init = charger_fonction($mailer."_init",'bulkmailer',true)){
//~ $init($id_mailshot);
//~ }
sql_updateq('spip_pushs', array('statut'=>'processing'), 'id_push = '.intval($id_push));
}
// Ne pas se fier à la meta ici pour des raisons de concurrence au démarrage d'un envoi
@ -32,89 +24,90 @@ function genie_pushsubscribers_bulksend_dist($t) {
// sera effacée si envoi fini
$GLOBALS['meta']['pushsubscribers_processing'] = 'oui';
//~ include_spip('inc/mailshot');
include_spip('inc/pushsubscribers');
//~ include_spip('inc/config');
//~ $boost = (lire_config("mailshot/boost_send")=='oui'?true:false);
//Toujours en mode boost
$boost = true;
// On charge pour les classes
pushsubscribers_loader();
pushsubscribers_envoyer_lot();
$nb = 0;
$f_relance = _DIR_TMP."bulksend_relance.txt";
$f_last = _DIR_TMP."bulksend_last.txt";
$f_relance = _DIR_TMP."pushsubscribers_bulksend_relance.txt";
$f_last = _DIR_TMP."pushsubscribers_bulksend_last.txt";
$relance = true;
if (!$boost){
lire_fichier($f_relance,$nb);
lire_fichier($f_relance, $nb);
}
if (!$nb=intval($nb)){
$relance = false;
list($periode,$nb) = mailshot_cadence();
list($periode, $nb) = pushsubscribers_cadence();
// corriger par le nombre que l'on envoi
// par le ratio de delta de time effectif depuis le dernier cron
// sur la periode visee
$now = time();
if (!$boost){
lire_fichier($f_last,$last);
if ($last=intval($last)
AND ($dt = $now-$last)>0){
$c = min(2,$dt/$periode);
$nb = intval(round($nb*$c,0));
spip_log("Correction sur nb : $c ($dt au lieu de $periode) => $nb","mailshot");
lire_fichier($f_last, $last);
if ($last = intval($last) and ($dt = $now-$last) > 0) {
$c = min(2, $dt/$periode);
$nb = intval(round($nb*$c, 0));
spip_log("Correction sur nb : $c ($dt au lieu de $periode) => $nb", 'pushsubscribers');
}
}
ecrire_fichier($f_last,$now);
ecrire_fichier($f_last, $now);
}
// si mode boost est qu'on a *beaucoup* de destinataires, lancer des actions concourantes
// si on est sur de pas ecrouler le serveur
if ($boost
and function_exists('sys_getloadavg')
and $load = sys_getloadavg()
and is_array($load)
and $load = array_shift($load)
) {
if (!defined('_ECRAN_SECURITE_LOAD')) {
define('_ECRAN_SECURITE_LOAD', 4);
}
if ($load < _ECRAN_SECURITE_LOAD) {
$next = sql_fetsel("*", "spip_mailshots", "statut=" . sql_quote('processing'), '', 'id_mailshot', '0,1');
if (!defined('_MAILSHOT_SEND_PER_PROCESS')) {
define('_MAILSHOT_SEND_PER_PROCESS', 10000);
}
// si le total est superieur au seuil configure, ET que la liste des destinataires est initialisee
if (($total = $next['total']) > _MAILSHOT_SEND_PER_PROCESS
and sql_countsel('spip_mailshots_destinataires','id_mailshot='.intval($next['id_mailshot'])) >= $total) {
$nb_process = floor($total / _MAILSHOT_SEND_PER_PROCESS);
$nb_process = max($nb_process, 0);
$nb_process = min($nb_process, defined('_MAILSHOT_MAX_PROCESS') ? _MAILSHOT_MAX_PROCESS : 10);
$decalage = 5 * $nb;
$restant = $next['total'] - $next['current'];
$nb_process = min($nb_process, floor(($restant - $nb) / $decalage));
spip_log("BOOST : $total destinataires, lancement de $nb_process processus supplementaires", "mailshot");
if ($nb_process > 0) {
include_spip('inc/actions');
while ($nb_process) {
$offset = $nb_process * $decalage;
$arg = $next['id_mailshot'] . "-$nb-" . $offset;
$url = generer_action_auteur("mailshot_boost_send", $arg, "", true, 0);
mailshot_call_url_async($url);
$nb_process--;
}
}
}
}
}
$restant = mailshot_envoyer_lot($nb);
if ($restant>0 AND !$boost){
ecrire_fichier($f_relance,$restant);
//~ if ($boost
//~ and function_exists('sys_getloadavg')
//~ and $load = sys_getloadavg()
//~ and is_array($load)
//~ and $load = array_shift($load)
//~ ) {
//~ if (!defined('_ECRAN_SECURITE_LOAD')) {
//~ define('_ECRAN_SECURITE_LOAD', 4);
//~ }
//~ if ($load < _ECRAN_SECURITE_LOAD) {
//~ $next = sql_fetsel("*", "spip_mailshots", "statut=" . sql_quote('processing'), '', 'id_mailshot', '0,1');
//~ if (!defined('_MAILSHOT_SEND_PER_PROCESS')) {
//~ define('_MAILSHOT_SEND_PER_PROCESS', 10000);
//~ }
//~ // si le total est superieur au seuil configure, ET que la liste des destinataires est initialisee
//~ if (($total = $next['total']) > _MAILSHOT_SEND_PER_PROCESS
//~ and sql_countsel('spip_mailshots_destinataires','id_mailshot='.intval($next['id_mailshot'])) >= $total) {
//~ $nb_process = floor($total / _MAILSHOT_SEND_PER_PROCESS);
//~ $nb_process = max($nb_process, 0);
//~ $nb_process = min($nb_process, defined('_MAILSHOT_MAX_PROCESS') ? _MAILSHOT_MAX_PROCESS : 10);
//~ $decalage = 5 * $nb;
//~ $restant = $next['total'] - $next['current'];
//~ $nb_process = min($nb_process, floor(($restant - $nb) / $decalage));
//~ spip_log("BOOST : $total destinataires, lancement de $nb_process processus supplementaires", "mailshot");
//~ if ($nb_process > 0) {
//~ include_spip('inc/actions');
//~ while ($nb_process) {
//~ $offset = $nb_process * $decalage;
//~ $arg = $next['id_mailshot'] . "-$nb-" . $offset;
//~ $url = generer_action_auteur("mailshot_boost_send", $arg, "", true, 0);
//~ mailshot_call_url_async($url);
//~ $nb_process--;
//~ }
//~ }
//~ }
//~ }
//~ }
// C'est la lib qui s'occupe de gérer le batch si yen a vraiment beaucoup d'un coup
$restant = pushsubscribers_envoyer_lot($nb);
if ($restant>0 and !$boost){
ecrire_fichier($f_relance, $restant);
$boost = true;
}
elseif($relance){
@ -122,18 +115,18 @@ function genie_pushsubscribers_bulksend_dist($t) {
// regarder si par hasard on a pas deja depasse le temps prevu par la cadence normale
// dans ce cas on redemande la main aussitot
// concerne les cas ou le smtp fait tellement attendre qu'on peine a respecter le rythme
list($periode,$nb) = mailshot_cadence();
list($periode, $nb) = mailshot_cadence();
$now = time();
lire_fichier($f_last,$last);
if ($last=intval($last)
AND ($dt = $now-$last)>$periode){
lire_fichier($f_last, $last);
if ($last=intval($last) and ($dt = $now-$last) > $periode) {
$boost = true;
}
}
// dire qu'on a pas fini si mode boost pour se relancer aussi vite que possible
if ($boost)
if ($boost) {
return -($t-$periode);
}
}
// On met à jour la meta pour savoir s'il faudra encore envoyer des choses
else {
@ -147,7 +140,7 @@ function genie_pushsubscribers_bulksend_dist($t) {
}
function mailshot_call_url_async($url){
function pushsubscribers_call_url_async($url){
spip_log("Call URL async $url","mailshot");
$parts = parse_url($url);

202
inc/pushsubscribers.php

@ -110,7 +110,7 @@ function pushsubscribers_loader() {
}
/**
* Transformer notre objet SPIP en tableau suivant la norme attendue
* Transformer notre objet SPIP en tableau suivant la norme attendue puis en JSON
*/
function pushsubscribers_preparer_payload($id_ou_push) {
$payload = null;
@ -126,13 +126,20 @@ function pushsubscribers_preparer_payload($id_ou_push) {
// TODO
$payload = array(
'title' => $push['titre'],
'message' => $push['texte'],
'icon' => 'URL image',
'data' => array('url' => 'http://rastapopoulos.artizanal.info',),
'body' => $push['texte'],
//'icon' => 'URL image',
'data' => array(
'url' => $push['url'] ? $push['url'] : $GLOBALS['meta']['adresse_site'],
),
'actions' => array(
array('action' => 'close', 'title' => 'Fermer'),
)
);
// Dans la norme du Protocole l'id unique qui permet de ne pas doublonner s'appelle "topic" alors que dans la norme JS Notifications, c'est "tag"
if ($push['topic']) {
$payload['tag'] = $push['topic'];
}
}
return $payload;
@ -216,6 +223,18 @@ function pushsubscribers_envoyer_notification($pushsubscriber, $payload) {
return $retour;
}
/**
* Definir la combinaison (période, nb envois) pour respecter la cadence maxi configurée
*
* Pour l'instant toujours au max, car pas de limite connue
*
* @return array
* (période du cron, nb envois à chaque appel)
*/
function pushsubscribers_cadence() {
return array(30, 100); // toutes les 30s
}
/**
* Envoyer le maximum possible de notifications par lot
*/
@ -224,8 +243,8 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
$nb_restant = $nb_max;
$now = $_SERVER['REQUEST_TIME'] ?? time();
define('_PUSHSUBSCRIBERS_MAX_TIME', $now+25); // 25s maxi
define('_PUSHSUBSCRIBERS_MAX_TRY', 5); // 5 essais maxis par destinataires
define('PUSHSUBSCRIBERS_MAX_TIME', $now+25); // 25s maxi
define('PUSHSUBSCRIBERS_MAX_TRY', 5); // 5 essais maxis par destinataires
// On traite au maximum 2 séries d'envois dans un appel
if ($pushs = sql_allfetsel('*', 'spip_pushs', 'statut = '.sql_quote('processing'), '', 'id_push','0,2')) {
@ -243,7 +262,7 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
foreach ($pushs as $push) {
// On s'arrête si on n'a déjà plus le temps
if (time() > _PUSHSUBSCRIBERS_MAX_TIME) {
if (time() > PUSHSUBSCRIBERS_MAX_TIME) {
return $nb_restant;
}
@ -259,9 +278,9 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
'try',
"0,$nb_max"
)) {
// On remlit les choses envoyer
// On remplit les choses envoyer
foreach ($destinataires as $cle=>$destinataire) {
$webPush->queueNotification(
$webpush->queueNotification(
Minishlink\WebPush\Subscription::create(array(
'endpoint' => $destinataire['endpoint'],
'keys' => array(
@ -269,7 +288,13 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
'p256dh' => $destinataire['p256dh'],
),
)),
$payload
// String en JSON
json_encode($payload),
// Options
array(
// Le topic/tag si défini
'topic' => isset($payload['tag']) ? $payload['tag'] : null,
)
);
// On change la clé pour le endpoint
@ -278,7 +303,7 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
}
// Puis on envoie et on vérifie chaque envoi
foreach ($webPush->flush() as $report) {
foreach ($webpush->flush() as $report) {
$endpoint = $report->getEndpoint();
$try = $destinataires[$endpoint]['try'] + 1;
@ -294,7 +319,7 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
$expire = $report->isSubscriptionExpired();
// Cas où ça a vraiment trop merdé
if ($expire or $try >= _PUSHSUBSCRIBERS_MAX_TRY) {
if ($expire or $try >= PUSHSUBSCRIBERS_MAX_TRY) {
$maj = array(
'statut' => 'fail',
'try' => $try,
@ -325,23 +350,24 @@ function pushsubscribers_envoyer_lot($nb_max=5) {
// si $nb_max non nul verifier qu'il n'y a plus de dests sur cette envoi pour maj le statut juste en dessous
if ($nb_max) {
$nb_destinataires = sql_countsel('spip_pushs_destinataires', 'id_push = '.intval($push['id_push']).' AND statut='.sql_quote('todo'), '', 'try', "0,$nb_max");
//~ $nb_destinataires = sql_countsel('spip_pushs_destinataires', 'id_push = '.intval($push['id_push']).' AND statut='.sql_quote('todo'), '', 'try', "0,$nb_max");
$dests = sql_allfetsel("*","spip_pushs_destinataires","id_push=".intval($push['id_push'])." AND statut=".sql_quote('todo'),'','try',"0,$nb_max");
}
}
// Plus de destinataires ? on a fini, on met à jour compteur et statut
if ($nb_max and !$nb_destinataires) {
if ($nb_max and !count($dests)) {
$set = array(
'statut' => 'end',
'date' => date('Y-m-d H:i:s'),
);
sql_updateq('spip_pushs', $set, 'id_push = '.intval($push['id_push']));
// mailshot_compter_envois($shoot['id_mailshot']);
//~ pushsubscribers_compter_envois($push['id_push']);
pushsubscribers_update_meta_processing();
}
if (!$nb_max or time() > _PUSHSUBSCRIBERS_MAX_TIME) {
if (!$nb_max or time() > PUSHSUBSCRIBERS_MAX_TIME) {
return $nb_restant;
}
}
@ -396,3 +422,147 @@ function pushsubscribers_update_meta_processing($force = false) {
return $new;
}
/**
* Lit le contenu d'un flux d'une pushlist, et programme les envois de chaque push
*
* Si pas de pushlist fournie, choisit la liste ayant un flux, la plus proche à mettre à jour
*
* @return int
* Retourne 0 si rien à faire
*/
function pushsubscribers_pushlist_programmer_feed($id_pushlist = null) {
$id_pushlist = intval($id_pushlist);
// On ne vérifie pas plus que toutes les 2h par défaut
define('PUSHSUBSCRIBERS_FEED_PERIODE', 2*60); // en minutes
// Chercher la liste à mettre à jour
if (!$id_pushlist) {
$jourdhui = date('Y-m-d H:i:s');
$pushlist = sql_fetsel(
'id_pushlist, contexte, date_feed',
'spip_pushlists',
array(
// seulement les flux auto
'type = "feed"',
// qui n'ont pas déjà été mis à jour récemment
array('not', sql_date_proche('date_feed', (0 - PUSHSUBSCRIBERS_FEED_PERIODE), "MINUTE"))
),
'',
'date_feed ASC'
);
}
else {
$pushlist = sql_fetsel(
'id_pushlist, contexte, date_feed',
'spip_pushlists',
'id_pushlist = '.$id_pushlist
);
}
// Si on a bien une liste à travailler
if ($pushlist) {
$id_pushlist = intval($pushlist['id_pushlist']);
$contexte = $pushlist['contexte'];
$date_feed = $pushlist['date_feed'];
// Si ya une dernière date, on l'ajoute au contexte
if ($date_feed != '0000-00-00 00:00:00') {
$contexte = parametre_url($contexte, 'date_feed', $date_feed);
}
$fonction_pushlist = charger_fonction('pushlist', 'pushs');
// Si on a bien un flux
if ($feed = $fonction_pushlist($contexte) and isset($feed['pushs']) and is_array($feed['pushs'])) {
include_spip('action/editer_objet');
include_spip('inc/autoriser');
foreach ($feed['pushs'] as $push) {
// Ce nouveau push sera forcément à envoyer direct, pas en brouillon
$push['statut'] = 'init';
// Par défaut on n'insère pas deux fois le même topic, on cherche si ça existe déjà
if (isset($push['topic']) and $push['topic'] and (!defined('PUSHSUBSCRIBERS_TOPIC_UNIQUE') or PUSHSUBSCRIBERS_TOPIC_UNIQUE)) {
$id_push = sql_getfetsel('id_push', 'spip_pushs', 'topic = '.sql_quote($push['topic']));
}
// Si pas trouvé on en crée un nouveau
if (!$id_push) {
$id_push = objet_inserer('push');
}
// Dans tous les cas, la dernière version du contenu de ce push prend la place
autoriser_exception('modifier', 'push', $id_push, true);
autoriser_exception('instituer', 'push', $id_push, true);
objet_modifier('push', $id_push, $push);
autoriser_exception('instituer', 'push', $id_push, false);
autoriser_exception('modifier', 'push', $id_push, false);
// Si on a bien un push au final, il faut maintenant programmer son envoi à la liste
if ($id_push) {
job_queue_add(
'pushsubscribers_pushlist_programmer_push',
"Programmer l’envoi du push $id_push à la liste $id_pushlist",
array($id_pushlist, $id_push),
'inc/pushsubscribers',
true
);
// On vérifie s'il y a des envois à faire
pushsubscribers_update_meta_processing();
}
}
// On met à jour la date de dernière génération du flux auto
sql_updateq(
'spip_pushlists',
array('date_feed' => $jourdhui),
'id_pushlist = '.$id_pushlist
);
}
}
return 1;
}
/**
* Programme l'envoi d'un push précis à une liste précise
*
* Initialise tous les destinataires dans la table dédiée
*
* TODO URGENT Pour l'instant on insère tout en bourrin d'un coup, mais il va falloir découper ensuite, car il peut y avoir beaucoup d'inscrits
*/
function pushsubscribers_pushlist_programmer_push($id_pushlist, $id_push) {
// On va chercher tous les inscrits à cette liste, qui n'ont PAS déjà ce push programmé
$destinataires = sql_allfetsel(
'S.id_pushsubscriber, endpoint, auth, p256dh',
'spip_pushsubscribers as P join spip_pushsubscriptions as S on S.id_pushsubscriber=P.id_pushsubscriber',
array(
'id_pushlist = '.intval($id_pushlist),
'S.id_pushsubscriber not in (select id_pushsubscriber from spip_pushs_destinataires where id_push = '.intval($id_push).')',
),
'S.id_pushsubscriber',
'S.maj ASC'
);
$now = date('Y-m-d H:i:s');
$inserer = array();
foreach ($destinataires as $destinataire) {
$inserer[] = array(
'id_push' => $id_push,
'id_pushsubscriber' => $destinataire['id_pushsubscriber'],
'endpoint' => $destinataire['endpoint'],
'p256dh' => $destinataire['p256dh'],
'auth' => $destinataire['auth'],
'date' => $now,
'statut' => 'todo',
);
}
if (!sql_insertq_multi('spip_pushs_destinataires', $inserer)) {
foreach ($inserer as $i) {
sql_insertq('spip_pushs_destinataires', $i);
if (time() > PUSHSUBSCRIBERS_MAX_TIME) return;
}
}
}

3
lang/push_fr.php

@ -39,8 +39,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'texte_changer_statut_push' => 'Cette notification push est :',
'texte_creer_associer_push' => 'Créer et associer une notification push',
'texte_definir_comme_traduction_push' => 'Cette notification push est une traduction de la notification push numéro :',
'texte_statut_archive' => 'archivé',
'texte_statut_cancel' => 'annulé',
'texte_statut_end' => 'envoi terminé',
'texte_statut_init' => 'planifié',
'texte_statut_pause' => 'en pause',
'texte_statut_processing' => 'en cours d’envoi',
'titre_langue_push' => 'Langue de cette notification push',
'titre_logo_push' => 'Logo de cette notification push',

2
prive/objets/liste/pushs.html

@ -10,7 +10,6 @@
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{push:info_1_push,push:info_nb_pushs}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="picto" scope="col"></th>
<th class="statut" scope="col">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:/>">#</span>,ajax})]</th>
<th class="titre" scope="col">[(#TRI{titre,<:push:champ_titre_label:/>,ajax})]</th>
<th class="date" scope="col">[(#TRI{date,<:date:/>,ajax})]</th>
@ -20,7 +19,6 @@
<tbody>
<BOUCLE_liste_pushs(PUSHS){id_mot?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,num titre},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="picto">[(#CHEMIN_IMAGE{push-16.png}|balise_img)]</td>
<td class="statut">[(#STATUT|puce_statut{push,#ID_PUSH})]</td>
<td class="titre principale">[(#LOGO_PUSH|image_reduire{20,26})]<a href="[(#ID_PUSH|generer_url_entite{push})]" title="<:info_numero_abbreviation|attribut_html:/> #ID_PUSH">[(#RANG). ]#TITRE</a></td>
<td class="date secondaire">[(#DATE|affdate_jourcourt)]</td>

11
pushs/articles.php

@ -7,6 +7,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function pushs_articles_dist($contexte=array()) {
include_spip('base/abstract_sql');
include_spip('inc/filtres');
include_spip('inc/texte');
$flux = array(
'titre' => _T('info_articles'),
@ -18,6 +19,10 @@ function pushs_articles_dist($contexte=array()) {
'statut = "publie"',
);
// S'il y a une date de dernière génération, on
$date_feed = isset($contexte['date_feed']) ? $contexte['date_feed'] : '0000-00-00 00:00:00';
$where[] = 'date > '.sql_quote($date_feed);
if (isset($contexte['id_rubrique'])) {
$id_rubrique = intval($contexte['id_rubrique']);
$flux['titre'] .= ' - ' . _T('rubrique') . ' ' . generer_info_entite($id_rubrique, 'rubrique', 'titre');
@ -29,10 +34,10 @@ function pushs_articles_dist($contexte=array()) {
foreach ($articles as $article) {
$push = array(
'titre' => $article['titre'],
'texte' => $article['texte'],
'url' => url_absolue(generer_url_entite($article['id_article'], 'article')),
'texte' => couper($article['texte'], 80, '…'),
'url' => url_absolue(generer_url_entite($article['id_article'], 'article', '', '', true)),
'date' => $article['date'],
'topic' => "article$id_article", // ne pas notifier plusieurs fois les gens pour un même article, même si ça vient de listes différentes
'topic' => 'article'.$article['id_article'], // ne pas notifier plusieurs fois les gens pour un même article, même si ça vient de listes différentes
);
$flux['pushs'][] = $push;

8
pushsubscribers_pipelines.php

@ -101,12 +101,14 @@ function pushsubscribers_taches_generales_cron($taches_generales){
or $GLOBALS['meta']['pushsubscribers_processing'] < $_SERVER['REQUEST_TIME']
)
) {
include_spip('inc/mailshot');
include_spip('inc/pushsubscribers');
//~ list($periode, $nb) = pushsubscribers_cadence();
$periode = 30;
list($periode, $nb) = pushsubscribers_cadence();
$taches_generales['pushsubscribers_bulksend'] = max(60, $periode - 15);
}
// Comme la syndic toutes les 1m30, on raffraichit UN flux seulement
$taches_generales['pushsubscribers_pushlist'] = 90;
return $taches_generales;
}
Loading…
Cancel
Save