36 Membres vont expirer d'ici le 17 Décembre!

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

2 Likes

tu as un paquet de doublon :slight_smile:

soit 43 en realité

1 Like

merci je viens de modifier le script pour supprimer les doublons,
ça fait que 36 membres qui doivent se renouveller dans le mois finalement ^^

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)

mais c’est peut être normal :slight_smile:

Sans doute des gens qui ont fait leur renouvellemment entre temps ?

C’est aux logiciels client de notifier cette information.
Dans le cas de Sakia, il y a un bug.

Oui, Cesium a lui aussi un bug sur ce point. Certains se sont pleins de ne pas avoir le lien de renouvellement…

Je regardes cela en fin de semaine si tout va bien

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 ^^

Résultat avec d=15 :

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);
  }
}));

3 Likes

Excellent ! Tu es le 1er à publier ton exemple, qui est en plus particulièrement avancé !

Maintenant, il ne te reste plus qu’à héberger ce nœud pour offrir ce nouveau service à tous :slight_smile: Car honnêtement, il nous serait bien utile.

1 Like

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)

Ce qui est faux, tu es toujours dans la liste : http://cgeek.fr:9330/wot/members

{
    "pubkey": "F9m6KBE9qeNqL6rjQrWxbk9y7GwTuAzwvx6CUnczkFYR",
    "uid": "Paulart"
}

Mais en effet ça ne va pas tarder :slight_smile:

1 Like

Je ne sais pas comment faire du coup.
Dois-je essayer de faire une demande de renouvellement via Sakia?

Si ça ne fonctionne pas via Cesium, oui, je ne vois pas d’autre option.

edit : je viens de me renouveler avec Sakia sans soucis, tu peux y aller :thumbsup:

14 messages ont été intégrés dans un sujet existant : [ask for certifications] Carolef

Un message a été intégré dans un sujet existant : [ask for certifications] Carolef

chapeau bas