|
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