您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
see monthly progress of leetcode points
// ==UserScript== // @name Leetcode Points // @license MIT // @namespace https://github.com/pk2sd // @version 0.3 // @description see monthly progress of leetcode points // @author https://leetcode.com/pK2015/ // @match https://leetcode.com/store/ // @icon https://www.google.com/s2/favicons?sz=64&domain=leetcode.com // @require https://code.jquery.com/jquery-3.6.0.min.js // @grant none // @run-at document-end // ==/UserScript== $('document').ready(() => { $.ajax({ url: 'https://leetcode.com/points/api/' }).done((response) => { parseDataAndAddSummary(response) }) let toTable = (map) => { let mapToTr = (totr) => { return Array.from(totr).sort((a, b) => { return parseInt(b[1]) - parseInt(a[1]) }).map((entry) => { let key = entry[0] let value = entry[1] return '<tr>' + '<td style="padding-right: 2px">' + key + '</td>' + '<td>' + value + '</td>' + '</tr>' }).reduce((prev, cur) => prev + cur, '') } return '<table>' + '<thead>' + '<tr>' + '<th>' + 'Activity' + '</th>' + '<th>' + 'Points' + '</th>' + '</tr>' + '</thead>' + '<tbody>' + mapToTr(map) + '</tbody>' + '</table>' } const curmonth = new Date().getMonth() const curyear = new Date().getFullYear() let points = null let construct = () => { const year = $('#years').find(":selected").attr('value') || curyear const month = $('#months').find(":selected").attr('value') || curmonth const npoints = points.scores.map(point => { return {...point, date: new Date(Date.parse(point.date))} }).filter(p => p.date.getMonth() == month && p.date.getFullYear() == year) const total = npoints.map(p => p.score).reduce((x,y) => x+y,0); const activityToPointsMap = npoints.reduce((map, curPoint) => { if(map.has(curPoint.description)){ map.set(curPoint.description, map.get(curPoint.description) + curPoint.score) } else { map.set(curPoint.description, curPoint.score) } return map }, new Map()) $('#points_p').html('<h4> Total points: ' + total + '</h4><br/>' + (activityToPointsMap.size > 0 ? toTable(activityToPointsMap): '')) } let parseDataAndAddSummary = (pointss) => { const months = [0,1,2,3,4,5,6,7,8,9,10,11] const years = Array.from(new Set(pointss.scores.map(point => new Date(Date.parse(point.date)).getFullYear()))) $('<p>', {id: 'points_p'}).prependTo('body') $('#points_p').css('display', 'flex') $('#points_p').css('align-items', 'center') $('#points_p').css('justify-content', 'center') $('body').prepend(`<div id = "options_div"> <label for="months"> Month </label> <select id="months"> </select> <label for="years"> Year </label> <select id="years"> </select> </div>`) months.forEach((m) => { let selected = m === curmonth $('#months').append(` <option value="${m}" ${selected ? "selected" : ""}> ${m + 1} </option> ` ) }) years.forEach((y) => { let selected = y === curyear $('#years').append(` <option value="${y}" ${selected ? "selected" : ""}> ${y} </option> ` ) }) $('#months').change(construct) $('#years').change(construct) points = pointss construct() } })