diff --git a/lg/members_en.txt b/lg/members_en.txt index 84d2f38affce5880c8eaf082d95872f130c96fc6..57165ed491e34a300e22a40555233d0b87057e10 100755 --- a/lg/members_en.txt +++ b/lg/members_en.txt @@ -67,4 +67,7 @@ NEXT_YN Feign the following Y[n] landing MEMBER_FILTER search a member EXPIRE_TIME expiration datetime RANDOM_LIST Draw lots -MEMBERS members \ No newline at end of file +RANDOM_LIST_END membres (max. 100) +MEMBERS members +UID_OR_PUB_LIST Whose pseudo or key contains +UID_OR_PUB_LIST_END (3 chars. min.) diff --git a/lg/members_fr.txt b/lg/members_fr.txt index 5a13228d6573952715dd1a83e33b72894b36d739..3843d5a52dad7a2558fa09b7dbe0d0309b0aa7cc 100755 --- a/lg/members_fr.txt +++ b/lg/members_fr.txt @@ -67,4 +67,7 @@ NEXT_YN Simuler le palier Y[n] suivant MEMBER_FILTER rechercher un membre EXPIRE_TIME date et heure d'expiration RANDOM_LIST Tirer au sort -MEMBERS membres \ No newline at end of file +RANDOM_LIST_END membres (max. 100) +MEMBERS membres +UID_OR_PUB_LIST Dont le pseudo ou la clé contient +UID_OR_PUB_LIST_END (3 car. min.) diff --git a/lib/constants2.ts b/lib/constants2.ts index 80530f207c94cd82bcc138b4b859b3efb393b4af..32ddf69e2e45554303807dadf8a81821a2c45f31 100755 --- a/lib/constants2.ts +++ b/lib/constants2.ts @@ -13,5 +13,9 @@ export const MonitConstants = { INIT: 2, GET_SENTRIES_COUNT: 3, GET_D_SEN: 3 - } + }, + MEMBERS_VIEW: { + DEFAULT_MEMBERS_RANDOM_NUMBER: 10, + MEMBERS_DISPLAY_MAX: 100, + }, }; diff --git a/routes/members2.ts b/routes/members2.ts index aa761d5a556d0584001ba5bb87149b754452c3e3..84923a90cb422238c21d996f011e702842c3a937 100755 --- a/routes/members2.ts +++ b/routes/members2.ts @@ -69,15 +69,36 @@ module.exports = async (req: any, res: any, next: any) => { var pendingSigs = req.query.pendingSigs || "no"; // Valeur par défaut var centrality = req.query.centrality || "no"; // Valeur par défaut var format = req.query.format || 'HTML'; // Valeur par défaut + let uidOrPubList = req.query.uidOrPubList === 'yes'; + let uidOrPubValue = req.query.uidOrPubValue; let nextYn = (req.query.nextYn=="yes") ? "yes":"no"; - let randomList = (req.query.randomList=="yes") ? "yes":"no"; - let numberOfRandomMembers = req.query.randomCounts || 10 + let randomList = req.query.randomList === 'no' ? 'no' : 'yes'; + let numberOfRandomMembers = parseInt(req.query.randomCounts) || MonitConstants.MEMBERS_VIEW.DEFAULT_MEMBERS_RANDOM_NUMBER + + // Recherche aléatoire + if (randomList === 'yes') { + if (isNaN(numberOfRandomMembers)) { + numberOfRandomMembers = MonitConstants.MEMBERS_VIEW.DEFAULT_MEMBERS_RANDOM_NUMBER + } + numberOfRandomMembers = Math.min(numberOfRandomMembers, MonitConstants.MEMBERS_VIEW.MEMBERS_DISPLAY_MAX) + } + // Vérifier la valeur de nextYn dans le cache let lastUpgradeTimeDatas = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.INIT); let dSenCache = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.GET_D_SEN); if (lastUpgradeTimeDatas > 0 && dSenCache > dSen) { previousNextYn == "yes"; } - + + // Recherche par pseudo/pubkey + if (uidOrPubList) { + // UID/PUB > random + randomList = 'no' + if (!uidOrPubValue || uidOrPubValue.length < 3) { + // Recherche trop large + uidOrPubList = false + randomList = 'yes' // A la place + } + } // Alimenter wotb avec la toile actuelle const wotbInstance = duniterServer.dal.wotb; @@ -85,7 +106,8 @@ module.exports = async (req: any, res: any, next: any) => { let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + MonitConstants.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 || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts) + // Si recherche par UID ou pubkey => recharger systématiquement + if (uidOrPubList || previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts) { if (!lockMembers) { @@ -175,6 +197,12 @@ module.exports = async (req: any, res: any, next: any) => { } membersList = randomMembers } + else if (uidOrPubList) { + // Rerchercher les membres qui matchent par l'UID ou la pubkey + membersList = membersList.filter(m => { + return m.uid.toLocaleLowerCase().includes(uidOrPubValue) || m.pub.toLocaleLowerCase().includes(uidOrPubValue) + }) + } // 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 @@ -581,7 +609,9 @@ module.exports = async (req: any, res: any, next: any) => { // get parameters days, mode, sort_by, order, pendingSigs, centrality, nextYn, - numberOfRandomMembers, randomList, + numberOfRandomMembers: numberOfRandomMembers, randomList, + // Formulaire de recherche par UID ou PUB + uidOrPubList, uidOrPubValue, // page data currentBlockchainTimestamp, diff --git a/views/members.html b/views/members.html index 462045c5c590858926962919ed65c154f8b0655a..ace782a41130bdaa4eabc2074727052aef6e73dc 100755 --- a/views/members.html +++ b/views/members.html @@ -47,8 +47,10 @@ ${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> +<input type="checkbox" name="randomList" value="yes" ${randomList == 'yes' ? 'checked' : ''}> ${LANG["RANDOM_LIST"]} +<input type="number" name="randomCounts" value="${numberOfRandomMembers}"/> ${LANG["RANDOM_LIST_END"]}.<br> +<input type="checkbox" name="uidOrPubList" value="yes" ${uidOrPubList ? 'checked' : ''}> ${LANG["UID_OR_PUB_LIST"]} +<input type="search" name="uidOrPubValue" value="${uidOrPubValue || ''}"/> ${LANG["UID_OR_PUB_LIST_END"]}.<br> <hr> <!-- Afficher la légende et l'aide -->