您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds more stats like std dev to the console
"use strict"; // ==UserScript== // @name More stats // @namespace Violentmonkey Scripts // @match https://app.planitpoker.com/room/* // @grant none // @version 0.1.1 // @author x-dune // @license MIT // @description Adds more stats like std dev to the console // ==/UserScript== let lastVotes = null; function getVoteCounts(votesDistribution) { const voteCountRegex = /(\d+)\s+votes?/; const voteCounts = {}; const children = votesDistribution.children; for (let i = 0; i < children.length; i++) { const item = children[i]; const voteOption = item.querySelector(".vote-option")?.textContent; const rawVoteCount = item.querySelector(".vote-stats")?.textContent; if (!voteOption || !rawVoteCount) { throw Error(); } const voteCountMatch = voteCountRegex.exec(rawVoteCount); if (!voteCountMatch) { throw Error(); } const voteCount = +voteCountMatch[1]; if (!Number.isNaN(+voteOption)) { // filter non-number like "?" (did not vote) voteCounts[voteOption] = voteCount; } } return voteCounts; } function voteCountToVotes(voteCount) { const votes = []; Object.entries(voteCount).forEach(([k, v]) => { for (let i = 0; i < v; i++) { votes.push(+k); } }); return votes; } function getStats(numbers) { const n = numbers.length; const mean = numbers.reduce((a, b) => a + b, 0) / n; const stdDev = Math.sqrt(numbers.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b, 0) / n); return { mean, stdDev }; } function isSameAsLastVotes(votes) { let isSame = false; if (lastVotes && lastVotes.length === votes.length) { isSame = lastVotes.every((x, i) => x === votes[i]); } if (!isSame) { lastVotes = votes; } return isSame; } function main() { const votesDistribution = document.querySelector(".votes-distribution"); if (votesDistribution) { const votes = voteCountToVotes(getVoteCounts(votesDistribution)); if (!isSameAsLastVotes(votes)) { const stats = getStats(votes); console.log("votes:", votes, ", mean:", stats.mean.toFixed(2), ", stdDev:", stats.stdDev.toFixed(2)); } } } setInterval(main, 100); console.log("planitpoker - more stats");