J’ai requêter la liste des membres qui vont expirer dans moins d’un mois !
Il y en a 36 :
Membre : cocolacoco (5297)
Membre : Gat (4387)
Membre : Chrisaiki (5402)
Membre : Karmak23 (5447)
Membre : yakamarcher (4762)
Membre : ZenKLP (6764)
Membre : william_test (10975)
Membre : fluidlog (10983)
Membre : mactov (10994)
Membre : cuckooland (10974)
Membre : fbuland (11036)
Membre : YlisYbah (11069)
Membre : Pierro (11147)
Membre : cdadou (11145)
Membre : cchaudier (11141)
Membre : paidge (11133)
Membre : Ariane (11749)
Membre : Reiidan (11750)
Membre : Papalagui (11754)
Membre : HeDog (11752)
Membre : Paulart (11750)
Membre : gege (11752)
Membre : Makoti (11752)
Membre : yannlefranco (11756)
Membre : bandits_and_sons (11766)
Membre : mireille (11765)
Membre : yoann (11765)
Membre : calimero53 (11815)
Membre : Romain (11752)
Membre : manu (11810)
Membre : AnAm (11753)
Membre : Donnie (11818)
Membre : charlyoleg (11904)
Membre : etoiledejoie (12162)
Membre : moul2 (12119)
Membre : paul (12315)
Le code source du script :
const blockLimit = 12612; // 5 mois
const membershipList = yield duniterServer.dal.peerDAL.query('SELECT `userid` FROM membership WHERE `blockNumber`<=\'+blockLimit+\'');
if (membershipList.length == 0) {
console.log('Aucun résultat trouvé en base de données.');
} else {
// On parcour tout les enregistrement membership
for (const membership of membershipList) {
const membershipsMenber = yield duniterServer.dal.peerDAL.query('SELECT `blockNumber` FROM membership WHERE `userid`=\''+membership.userid+'\' ORDER BY `blockNumber` DESC LIMIT 1');
if (membershipsMenber.length == 0)
{
console.log('Aucun résultat trouvé en base de données.');
}
else
{
if (membershipsMenber[0].blockNumber < blockLimit) {
var doublon = 0;
for (const membership2 of membershipList) {
if (membership.userid == membership2.userid) {
doublon++;
}
}
if (doublon < 2) {
console.log('Membre : %s (%s)', membership.userid, membershipsMenber[0].blockNumber); nbExpirMenbers++;
}
}
}
}
}
edit par cgeek : réindentation du code pour le forum
au passage de la suppression de tes doublon tu as perdu:
Membre : 1000i100 (10994)
Membre : Carole_Fabre (11186)
Membre : myckeul (11880)
Membre : oliviertrm (11142)
Membre : poka (10981)
Membre : superbouh (10982)
Membre : Thatoo (4780)
Oui je vois de temps en temps le décompte. Que fait le bouton “Renew Membership” sur Cesium? Faut-il se refaire certifier? Parce que les certifications étaient initialement valables 1an.
Mise à jours du script, il permet maintenant de requeter la liste des membres qui doivent effectuer leur renouvellement avant ‘d’ jours, d étant un paramètre GET dans l’url.
Merci à @cgeek de m’avoir montrer comment récupérer un paramètre GET en nodejs.
Ce nœud spécialisé n’est pas hyper utile en soi j’en convient, mais c’était pour plus pour m’entraîner et découvrir nodejs et la bdd sqlite de duniter ^^
37 membres doivent se renouveller dans moins de 15 jours ! Et 9 membres ne sont plus membres…
le script complet :
#!/usr/bin/env node
"use strict";
const co = require('co');
const duniter = require('duniter');
const http = require('http');
const express = require('express');
const HOME_DUNITER_DATA_FOLDER = 'rml8';
// Use netobs data folder
if (!process.argv.includes('--mdb')) {
process.argv.push('--mdb');
process.argv.push(HOME_DUNITER_DATA_FOLDER);
}
// Default action = start
if (process.argv.length === 4) process.argv.push('start');
// Disable Duniter logs
duniter.statics.logger.mute();
duniter.statics.cli((duniterServer) => co(function*() {
try {
/****************************************
* SPECIALISATION
***************************************/
const app = express();
const HOTE = 'localhost';
const PORT = 10500;
/**
* Sur appel de l'URL /bloc_courant
*/
app.get('/bloc_courant', (req, res) => co(function *() {
try {
// Allons chercher le bloc courant
const bloc = yield duniterServer.dal.blockDAL.getCurrent();
// Générons un contenu de page à afficher
const contenu = 'Hash du bloc courant : ' + bloc.hash;
// Envoyons la réponse
res.status(200).send('<pre>' + (contenu) + '</pre>');
} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));
/**
* Sur appel de l'URL /expire
*/
app.get('/expire/:abc', (req, res) => co(function *() {
try {
// Initaliser les variables
var contenu = "";
var nbExpirMembers = 0;
var membersTab = [];
var membershipsBlockNumberList = [];
var membershipsTimeList = [];
// Récupéré les paramètres
var days = 30;
if( typeof(req.query.d) == 'undefined' ) {
days = 30; // Valeur par défaut
} else {
days = req.query.d;
}
console.log("days = %s", days);
console.log("d = %s", req.query.d);
console.log(req.params);
console.log(req.query);
// Récupérer la liste des membres
const membersList = yield duniterServer.dal.peerDAL.query('SELECT `uid` FROM idty WHERE `wasMember`=1');
// Récupérer pour chaque membre, le membership le plus récent
for (const member of membersList) {
membershipsBlockNumberList.push(yield duniterServer.dal.peerDAL.query(
'SELECT `blockNumber` FROM membership WHERE `userid`=\''+member.uid+'\' ORDER BY `blockNumber` DESC LIMIT 1') );
}
// Convertir chaque blockNumber de membership en timestamp
for (const membershipBlockNumber of membershipsBlockNumberList) {
membershipsTimeList.push(yield duniterServer.dal.peerDAL.query(
'SELECT `time` FROM block WHERE `number`=\''+membershipBlockNumber[0].blockNumber+'\' LIMIT 1') );
}
// Afficher le formulaire
contenu += '<form action="expire" method="GET"><input type="text" name="d" value="'+days+'"/>jours</form><br><br>';
// Déterminer le timestamp d'il y a 6 mois
var currentTimestamp = Math.round(new Date().getTime() / 1000) ;
var _6monthPastTimestamp = currentTimestamp - (180*86400);
// On parcour tout les membres pour afficher ceux dont le dernier membership à plus de 6 mois
nbExpirMembers = 0;
contenu += '<b>Membres dont le statut de membre à déjà expirer :</b><br><table border=1>';
// console.log("_6monthPastTimestamp = %s", _6monthPastTimestamp);
for (var i=0;i<membersList.length;i++) {
if (membershipsTimeList[i][0].time < _6monthPastTimestamp) {
// Printer les nom des colonnes
if (nbExpirMembers == 0) {
contenu += "<tr><td align='center'>uid</td><td align='center'>date dernier renouvellement</td><td align='center'>blockNumber</td></tr>";
}
// Convertir timestamp en date
var tmpDate = new Date(membershipsTimeList[i][0].time*1000);
contenu += "<tr><td align='center'>"+membersList[i].uid+"</td><td align='center'>"+tmpDate.getDate()+"/"+tmpDate.getMonth()+"/"
+tmpDate.getFullYear()+"</td><td align='center'>"+membershipsBlockNumberList[i][0].blockNumber+"</td></tr>";
nbExpirMembers++;
}
}
contenu += "<tr><td align='center' colspan=3> total : <b>"+nbExpirMembers+"</b> membres.</td><t/tr></table><br><br>";
// Déterminer le timestamp d'il y a 6 mois - 'd' jours
var limitTimestamp = _6monthPastTimestamp + (days*86400);
// On parcour tout les membres pour afficher ceux dont le dernier membership à plus de 6 mois - 'd' jours
nbExpirMembers = 0;
contenu += '<b>Membres dont le statut de membre va expirer dans moins de '+days+' jours :</b><table border=1>';
// console.log("limitTimestamp = %s", limitTimestamp);
for (var i=0;i<membersList.length;i++) {
if (membershipsTimeList[i][0].time < limitTimestamp && membershipsTimeList[i][0].time > _6monthPastTimestamp) {
// Printer les nom des colonnes
if (nbExpirMembers == 0) {
contenu += "<tr><td align='center'>uid</td><td align='center'>date dernier renouvellement</td><td align='center'>blockNumber</td></tr>";
}
// Convertir timestamp en date
var tmpDate = new Date(membershipsTimeList[i][0].time*1000);
contenu += "<tr><td align='center'>"+membersList[i].uid+"</td><td align='center'>"
+tmpDate.getDate()+"/"+tmpDate.getMonth()+"/"+tmpDate.getFullYear()+"</td><td align='center'>"
+membershipsBlockNumberList[i][0].blockNumber+"</td></tr>";
nbExpirMembers++;
}
}
contenu += "<tr><td colspan=3> total : <b>"+nbExpirMembers+"</b> membres.</td><t/tr></table>";
// Déterminer la date correspondante
var dateLimitTimestamp = new Date();
dateLimitTimestamp.setTime(limitTimestamp);
// Envoyons la réponse
res.status(200).send('<pre>' + (contenu) + '</pre>');
} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));
const httpServer = http.createServer(app);
httpServer.listen(PORT, HOTE);
console.log("Serveur web disponible a l'adresse http://%s:%s", HOTE, PORT);
console.log("Page web 1 : http://%s:%s/bloc_courant", HOTE, PORT);
console.log("Page web 2 : http://%s:%s/expire/1", HOTE, PORT);
/****************************************/
} catch (e) {
console.error(e);
process.exit(1);
}
}));
Bon et bien Cesium me dit que je ne suis plus membre. J’ai fais plusieurs demande de renouvellement (toujours sur Cesium, car mon vieil ordi ne me permet pas d’installer Sakia)