|
1 | 1 | // ==UserScript== |
2 | 2 | // @name LeetCodeRating|显示力扣周赛难度分 |
3 | 3 | // @namespace https://github.com/zhang-wangz |
4 | | -// @version 3.0.6 |
| 4 | +// @version 3.0.7 |
5 | 5 | // @license MIT |
6 | 6 | // @description LeetCodeRating 力扣周赛分数显现和相关力扣小功能,目前浏览器更新规则,使用该插件前请手动打开浏览器开发者模式再食用~ |
7 | 7 | // @author 小东是个阳光蛋(力扣名) |
|
34 | 34 | function userScript() { |
35 | 35 | 'use strict'; |
36 | 36 |
|
37 | | - const version = '3.0.6'; |
38 | | - let pbstatusVersion = 'version16'; |
| 37 | + const version = '3.0.7'; |
| 38 | + let pbstatusVersion = 'version19'; |
39 | 39 | // xhr劫持时使用,保留原始 |
40 | 40 | const dummySend = XMLHttpRequest.prototype.send; |
41 | 41 | const originalOpen = XMLHttpRequest.prototype.open; |
|
723 | 723 |
|
724 | 724 | function allPbPostData(skip, limit) { |
725 | 725 | let reqs = { |
726 | | - query: `query problemsetQuestionList($categorySlug: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput) { |
727 | | - problemsetQuestionList( |
728 | | - categorySlug: $categorySlug |
729 | | - limit: $limit |
730 | | - skip: $skip |
731 | | - filters: $filters |
732 | | - ) { |
733 | | - hasMore |
734 | | - total |
735 | | - questions { |
736 | | - acRate |
737 | | - difficulty |
738 | | - freqBar |
739 | | - frontendQuestionId |
740 | | - isFavor |
741 | | - paidOnly |
742 | | - solutionNum |
743 | | - status |
744 | | - title |
745 | | - titleCn |
746 | | - titleSlug |
747 | | - topicTags { |
748 | | - name |
749 | | - nameTranslated |
750 | | - id |
751 | | - slug |
752 | | - } |
753 | | - extra { |
754 | | - hasVideoSolution |
755 | | - topCompanyTags { |
756 | | - imgUrl |
757 | | - slug |
758 | | - numSubscribed |
759 | | - } |
760 | | - } |
761 | | - } |
762 | | - } |
763 | | - }`, |
| 726 | + query: ` |
| 727 | + query problemsetQuestionListV2($filters: QuestionFilterInput, $limit: Int, $searchKeyword: String, $skip: Int, $sortBy: QuestionSortByInput, $categorySlug: String) { |
| 728 | + problemsetQuestionListV2( |
| 729 | + filters: $filters |
| 730 | + limit: $limit |
| 731 | + searchKeyword: $searchKeyword |
| 732 | + skip: $skip |
| 733 | + sortBy: $sortBy |
| 734 | + categorySlug: $categorySlug |
| 735 | + ) { |
| 736 | + questions { |
| 737 | + id |
| 738 | + titleSlug |
| 739 | + title |
| 740 | + translatedTitle |
| 741 | + questionFrontendId |
| 742 | + paidOnly |
| 743 | + difficulty |
| 744 | + topicTags { |
| 745 | + name |
| 746 | + slug |
| 747 | + nameTranslated |
| 748 | + } |
| 749 | + status |
| 750 | + isInMyFavorites |
| 751 | + frequency |
| 752 | + acRate |
| 753 | + contestPoint |
| 754 | + } |
| 755 | + totalLength |
| 756 | + finishedLength |
| 757 | + hasMore |
| 758 | + } |
| 759 | +} |
| 760 | + `, |
764 | 761 | variables: { |
765 | 762 | categorySlug: 'all-code-essentials', |
| 763 | + searchKeyword: "", |
766 | 764 | skip: skip, |
767 | 765 | limit: limit, |
768 | | - filters: {} |
769 | | - } |
| 766 | + filters: { |
| 767 | + "filterCombineType": "ALL", |
| 768 | + "statusFilter": { |
| 769 | + "questionStatuses": [], |
| 770 | + "operator": "IS" |
| 771 | + }, |
| 772 | + "difficultyFilter": { |
| 773 | + "difficulties": [], |
| 774 | + "operator": "IS" |
| 775 | + }, |
| 776 | + "languageFilter": { |
| 777 | + "languageSlugs": [], |
| 778 | + "operator": "IS" |
| 779 | + }, |
| 780 | + "topicFilter": { |
| 781 | + "topicSlugs": [], |
| 782 | + "operator": "IS" |
| 783 | + }, |
| 784 | + "acceptanceFilter": {}, |
| 785 | + "frequencyFilter": {}, |
| 786 | + "frontendIdFilter": {}, |
| 787 | + "lastSubmittedFilter": {}, |
| 788 | + "publishedFilter": {}, |
| 789 | + "companyFilter": { |
| 790 | + "companySlugs": [], |
| 791 | + "operator": "IS" |
| 792 | + }, |
| 793 | + "positionFilter": { |
| 794 | + "positionSlugs": [], |
| 795 | + "operator": "IS" |
| 796 | + }, |
| 797 | + "contestPointFilter": { |
| 798 | + "contestPoints": [], |
| 799 | + "operator": "IS" |
| 800 | + }, |
| 801 | + "premiumFilter": { |
| 802 | + "premiumStatus": [], |
| 803 | + "operator": "IS" |
| 804 | + } |
| 805 | +}, |
| 806 | + sortBy: { |
| 807 | + "sortField": "CUSTOM", |
| 808 | + "sortOrder": "ASCENDING" |
| 809 | + } |
| 810 | + }, |
| 811 | + operationName: 'problemsetQuestionListV2' |
770 | 812 | }; |
771 | 813 | reqs.key = 'LeetcodeRating'; |
772 | 814 | return reqs; |
|
778 | 820 | 'Content-Type': 'application/json' |
779 | 821 | }; |
780 | 822 | ajaxReq('POST', lcgraphql, headers, allPbPostData(0, 0), res => { |
781 | | - total = res.data.problemsetQuestionList.total; |
| 823 | + total = res.data.problemsetQuestionListV2.totalLength; |
782 | 824 | }); |
783 | 825 | return total; |
784 | 826 | } |
|
798 | 840 | let pbstatus = JSON.parse(GM_getValue('pbstatus', '{}').toString()); |
799 | 841 | let titleSlug = getSlug(pburl); |
800 | 842 | if (!titleSlug) return [null, null, null]; |
801 | | - let status = pbstatus[titleSlug] == null ? 'NOT_STARTED' : pbstatus[titleSlug]['status']; |
| 843 | + let status = pbstatus[titleSlug] == null ? 'TO_DO' : pbstatus[titleSlug]['status']; |
802 | 844 | // 获取分数 |
803 | 845 | let score; |
804 | 846 | let idExist = pbstatus[titleSlug] != null && t2rate[pbstatus[titleSlug]['id']] != null; |
|
867 | 909 | return; |
868 | 910 | } |
869 | 911 | // console.log(status); |
870 | | - // 1 ac 2 tried 3 not_started |
871 | | - let code = status == 'NOT_STARTED' ? 3 : status == 'AC' ? 1 : 2; |
| 912 | + // 1 SOLVED 2 ATTEMPTED 3 TO_DO |
| 913 | + let code = status == 'TO_DO' ? 3 : status == 'SOLVED' ? 1 : 2; |
872 | 914 | // console.log(code); |
873 | 915 | let iconStr = getPbstatusIcon(code, score, paid); |
874 | 916 | let iconEle = document.createElement('span'); |
|
1159 | 1201 | let pbstatus = JSON.parse(GM_getValue('pbstatus', '{}').toString()); |
1160 | 1202 | let slug = getSlug(location.href); |
1161 | 1203 | if (!pbstatus[slug]) pbstatus[slug] = {}; |
1162 | | - pbstatus[slug]['status'] = 'AC'; |
| 1204 | + pbstatus[slug]['status'] = 'SOLVED'; |
1163 | 1205 | GM_setValue('pbstatus', JSON.stringify(pbstatus)); |
1164 | 1206 | console.log('提交成功,当前题目状态已更新'); |
1165 | 1207 | } else if (resp?.status_msg && !resp.status_msg.includes('Accepted')) { |
|
1180 | 1222 | }; |
1181 | 1223 | let status; |
1182 | 1224 | ajaxReq('POST', lcgraphql, headers, postdata, response => { |
| 1225 | + console.log("用户题目状态: ", response.data.question.status) |
1183 | 1226 | status = response.data.question.status; |
1184 | 1227 | }); |
1185 | 1228 | // 如果之前为ac状态,那么停止更新,直接返回 |
1186 | 1229 | if (status && status == 'ac') { |
1187 | 1230 | if (!pbstatus[slug]) pbstatus[slug] = {}; |
1188 | | - pbstatus[slug]['status'] = 'AC'; |
| 1231 | + pbstatus[slug]['status'] = 'SOLVED'; |
1189 | 1232 | GM_setValue('pbstatus', JSON.stringify(pbstatus)); |
1190 | 1233 | console.log('提交失败,但是之前已经ac过该题,所以状态为ac'); |
1191 | 1234 | } else { |
1192 | 1235 | // 之前没有提交过或者提交过但是没有ac的状态,那么仍然更新为提交失败状态 |
1193 | 1236 | if (!pbstatus[slug]) pbstatus[slug] = {}; |
1194 | | - pbstatus[slug]['status'] = 'TRIED'; |
| 1237 | + pbstatus[slug]['status'] = 'ATTEMPTED'; |
1195 | 1238 | GM_setValue('pbstatus', JSON.stringify(pbstatus)); |
1196 | 1239 | console.log('提交失败, 当前题目状态已更新'); |
1197 | 1240 | } |
|
2069 | 2112 | headers, |
2070 | 2113 | allPbPostData(i * 100, 100), |
2071 | 2114 | async res => { |
2072 | | - const questions = res.data.problemsetQuestionList.questions; |
| 2115 | + const questions = res.data.problemsetQuestionListV2.questions; |
2073 | 2116 | for (const pb of questions) { |
2074 | 2117 | pbstatus[pb.titleSlug] = { |
2075 | 2118 | titleSlug: pb.titleSlug, |
2076 | | - id: pb.frontendQuestionId, |
| 2119 | + id: pb.questionFrontendId, |
2077 | 2120 | status: pb.status, |
2078 | 2121 | title: pb.title, |
2079 | | - titleCn: pb.titleCn, |
| 2122 | + titleCn: pb.translatedTitle, |
2080 | 2123 | difficulty: pb.difficulty, |
2081 | 2124 | paidOnly: pb.paidOnly |
2082 | 2125 | }; |
|
2097 | 2140 | layer.msg('同步所有题目状态完成!'); |
2098 | 2141 | await sleep(1000); |
2099 | 2142 | layer.closeAll(); |
| 2143 | + layer.msg('重新加载页面中!'); |
| 2144 | + await sleep(1000); |
| 2145 | + location.reload(); |
2100 | 2146 | }); |
2101 | 2147 | } |
2102 | 2148 | }); |
|
2148 | 2194 | initIdx += 1; |
2149 | 2195 | break; |
2150 | 2196 | } |
2151 | | - if (pbstatus[titleSlug] && !pbstatus[titleSlug]['status'].includes('NOT_STARTED')) { |
2152 | | - pbstatus[titleSlug]['status'] = 'NOT_STARTED'; |
| 2197 | + if (pbstatus[titleSlug] && !pbstatus[titleSlug]['status'].includes('TO_DO')) { |
| 2198 | + pbstatus[titleSlug]['status'] = 'TO_DO'; |
2153 | 2199 | } |
2154 | 2200 | // console.log(titleSlug) |
2155 | 2201 | initIdx += 1; |
|
2252 | 2298 | let tipsChildone = tipsPa.childNodes[1]; |
2253 | 2299 | // 题目内容, 插入后变成原tips栏目 |
2254 | 2300 | let pbDescription = tipsPa.childNodes[2]; |
2255 | | - if (pbDescription?.childNodes[0]?.getAttribute('data-track-load') != null) { |
| 2301 | + if (pbDescription?.getAttribute('class') == null) { |
2256 | 2302 | let divTips = document.createElement('div'); |
2257 | 2303 | divTips.setAttribute('class', 'flex gap-1'); |
2258 | 2304 | let abody = document.createElement('a'); |
|
2560 | 2606 | pbName2Id = {}; |
2561 | 2607 | pbNamee2Id = {}; |
2562 | 2608 | let dataStr = res.response; |
2563 | | - let json = eval(dataStr); |
| 2609 | + let json = JSON.parse(dataStr); |
2564 | 2610 | for (const element of json) { |
2565 | 2611 | t2rate[element.ID] = element; |
2566 | 2612 | t2rate[element.ID]['Rating'] = Number.parseInt( |
|
2606 | 2652 | levelTc2Id = {}; |
2607 | 2653 | levelTe2Id = {}; |
2608 | 2654 | let dataStr = res.response; |
2609 | | - let json = eval(dataStr); |
| 2655 | + let json = JSON.parse(dataStr); |
2610 | 2656 | for (const element of json) { |
2611 | 2657 | if (typeof element.TitleCn == 'string') { |
2612 | 2658 | let titlec = element.TitleCn; |
|
2632 | 2678 | let checkVersionLayer = GM_getValue('switchupdate') |
2633 | 2679 | ? preDate1 == '' || preDate1 != now |
2634 | 2680 | : true; |
| 2681 | + console.log("checkVersionLayer: ", checkVersionLayer) |
2635 | 2682 | GM_xmlhttpRequest({ |
2636 | 2683 | method: 'get', |
2637 | 2684 | url: versionUrl + '?timeStamp=' + new Date().getTime(), |
|
2640 | 2687 | }, |
2641 | 2688 | onload: function (res) { |
2642 | 2689 | if (res.status === 200) { |
2643 | | - // console.log('check version success...'); |
| 2690 | + console.log('check version success...'); |
2644 | 2691 | const dataStr = res.response; |
2645 | 2692 | const json = JSON.parse(dataStr); |
2646 | 2693 | const remoteVersion = json['version']; |
|
2649 | 2696 | papermanpic = json['papermanpic']; |
2650 | 2697 | // 通过更新 CSS 变量来更新纸片人 |
2651 | 2698 | document.documentElement.style.setProperty('--mumu-img', `url(${papermanpic})`); |
2652 | | - console.log(papermanpic); |
2653 | | - if (remoteVersion > version) { |
| 2699 | + // console.log(papermanpic); |
| 2700 | + if (remoteVersion != version) { |
2654 | 2701 | if (checkVersionLayer) { |
2655 | | - // console.log('弹窗更新栏一次..'); |
| 2702 | + console.log('弹窗更新栏一次..'); |
2656 | 2703 | layer.open({ |
2657 | 2704 | area: ['500px', '300px'], |
2658 | 2705 | content: |
|
2672 | 2719 | } |
2673 | 2720 | }); |
2674 | 2721 | } else { |
2675 | | - // console.log('有新的版本,但是已经弹窗过且开启了最多只更新一次功能,等待明天弹窗..'); |
| 2722 | + console.log('有新的版本,但是已经弹窗过且开启了最多只更新一次功能,等待明天弹窗..'); |
2676 | 2723 | } |
2677 | 2724 | } else { |
2678 | | - // console.log('leetcodeRating难度分插件当前已经是最新版本~'); |
| 2725 | + console.log('leetcodeRating难度分插件当前已经是最新版本~'); |
2679 | 2726 | } |
2680 | 2727 | } |
2681 | 2728 | }, |
|
2721 | 2768 | } |
2722 | 2769 | `); |
2723 | 2770 |
|
2724 | | - // TODO 分割 |
| 2771 | + // TODO 分割计划 |
2725 | 2772 | // spig js 纸片人相关 |
2726 | 2773 | if (GM_getValue('switchperson')) { |
2727 | 2774 | const isindex = true; |
|
3098 | 3145 | echokoto(res); |
3099 | 3146 | }) |
3100 | 3147 | .catch(xhr => xhr); |
3101 | | - setTimeout(getkoto, 6000); |
| 3148 | + setTimeout(getkoto, 8000); |
3102 | 3149 | } |
3103 | 3150 | function echokoto(result) { |
3104 | | - let hc = eval(result); |
| 3151 | + console.log(result) |
| 3152 | + let hc = result; |
3105 | 3153 | document.getElementById('hitokoto').textContent = hc.hitokoto; |
3106 | | - // console.log(hc.content) |
| 3154 | + console.log(hc.hitokoto) |
3107 | 3155 | } |
3108 | | - setTimeout(getkoto, 5000); |
| 3156 | + setTimeout(getkoto, 8000); |
3109 | 3157 | } |
3110 | 3158 | } |
3111 | 3159 | userScript(); |
|
0 commit comments