diff --git a/lg/members_en.txt b/lg/members_en.txt index 7867a3360314afccf9d69adb4a5c17a11e8218a1..84d2f38affce5880c8eaf082d95872f130c96fc6 100755 --- a/lg/members_en.txt +++ b/lg/members_en.txt @@ -65,4 +65,6 @@ CERT_AVAILABLE available MEMBERS members NEXT_YN Feign the following Y[n] landing MEMBER_FILTER search a member -EXPIRE_TIME expiration datetime \ No newline at end of file +EXPIRE_TIME expiration datetime +RANDOM_LIST Draw lots +MEMBERS members \ No newline at end of file diff --git a/lg/members_fr.txt b/lg/members_fr.txt index 0aaf6791553fdea23cb3dbe421402f035cdd245c..5a13228d6573952715dd1a83e33b72894b36d739 100755 --- a/lg/members_fr.txt +++ b/lg/members_fr.txt @@ -65,4 +65,6 @@ CERT_AVAILABLE disponible MEMBERS membres NEXT_YN Simuler le palier Y[n] suivant MEMBER_FILTER rechercher un membre -EXPIRE_TIME date et heure d'expiration \ No newline at end of file +EXPIRE_TIME date et heure d'expiration +RANDOM_LIST Tirer au sort +MEMBERS membres \ No newline at end of file diff --git a/lib/randomInt.js b/lib/randomInt.js new file mode 100644 index 0000000000000000000000000000000000000000..62d607c3d8c926bed68868dcdb8a7a43d14668d8 --- /dev/null +++ b/lib/randomInt.js @@ -0,0 +1,3 @@ +module.exports = function randomInt (low, high) { + return Math.floor(Math.random() * (high - low) + low); +} diff --git a/routes/members.js b/routes/members.js index 7148b063a2ca870d5473bfe3f51a3ed2d41cc8a5..4ce4ba19d30e9debbabf9ea7886465749eee289a 100755 --- a/routes/members.js +++ b/routes/members.js @@ -4,6 +4,7 @@ const co = require('co') const constants = require(__dirname + '/../lib/constants') +const randomInt = require(__dirname + '/../lib/randomInt') const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime') const membersQuality = require(__dirname + '/tools/membersQuality') @@ -68,6 +69,8 @@ module.exports = (req, res, next) => co(function *() { var centrality = req.query.centrality || "no"; // Valeur par défaut var format = req.query.format || 'HTML'; // Valeur par défaut const nextYn = (req.query.nextYn=="yes") ? "yes":"no"; + const randomList = (req.query.randomList=="yes") ? "yes":"no"; + const numberOfRandomMembers = req.query.randomCounts || 10 // Vérifier la valeur de nextYn dans le cache let lastUpgradeTimeDatas = membersQuality(-1); @@ -75,10 +78,10 @@ module.exports = (req, res, next) => co(function *() { if (lastUpgradeTimeDatas > 0 && dSenCache > dSen) { previousNextYn=="yes"; } // Alimenter wotb avec la toile actuelle - const wotbInstance = duniterServer.dal.wotb; + const wotbInstance = duniterServer.dal.wotb; - // Vérifier si le cache doit être Réinitialiser - let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + constants.MIN_MEMBERS_UPDATE_FREQ)); + // Vérifier si le cache doit être Réinitialiser + let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + constants.MIN_MEMBERS_UPDATE_FREQ)); // Si changement de conditions, alors forcer le rechargement du cache s'il n'est pas, vérouillé, sinon forcer les conditions à celles en mémoire if (previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn) @@ -153,6 +156,19 @@ module.exports = (req, res, next) => co(function *() { // Récupérer la liste des identités ayant actuellement le statut de membre membersList = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`pub`,`member`,`written_on`,`wotb_id` FROM i_index WHERE `member`=1'); + + if (randomList == "yes") { + // Tirer au sort randomCounts membres + const maxLengthRandomMembers = Math.min(numberOfRandomMembers,membersList.length) + let randomMembers = [] + while (randomMembers.length < maxLengthRandomMembers) { + const randomInt_ = randomInt(0, membersList.length) + if (randomMembers.indexOf(membersList[randomInt_].uid) == -1) { + randomMembers.push(membersList[randomInt_]) + } + } + membersList = randomMembers + } // Récupérer pour chaque identité, le numéro du block d'écriture du dernier membership // Ainsi que la première ou dernière certification @@ -560,6 +576,7 @@ module.exports = (req, res, next) => co(function *() { // get parameters days, mode, sort_by, order, pendingSigs, centrality, nextYn, + numberOfRandomMembers, randomList, // page data currentBlockchainTimestamp, diff --git a/views/members.html b/views/members.html index 53f9abc55f894a82e6310c6ec7c21f36d4c49403..de3c64ee2066d8dc646a2acb0c328ddadd0005e9 100755 --- a/views/members.html +++ b/views/members.html @@ -47,6 +47,8 @@ ${printMenu(MENU_LANG, help, "MEMBERS")} <input type="checkbox" name="pendingSigs" value="yes" ${pendingSigs == 'yes' ? 'checked' : ''}>${LANG["CHECKBOX_PENDING_SIGS"]}.<br> <input type="checkbox" name="mode" value="emitted" ${mode == 'emitted' ? 'checked' : ''}>${LANG["CHECKBOX_MODE_SIG"]}.<br> <input type="checkbox" name="nextYn" value="yes" ${nextYn == 'yes' ? 'checked' : ''}> ${LANG["NEXT_YN"]}<br> +<input type="checkbox" name="randomList" value="yes" ${randomList == 'yes' ? 'checked' : ''}> ${LANG["RANDOM_LIST"]} +<input type="number" name="randomCounts" value="${numberOfRandomMembers}"/> ${LANG["MEMBERS"]}.<br> <hr> <!-- Afficher la légende et l'aide -->