Skip to content

Commit 8c387fe

Browse files
committed
🐍 3.0.7 update: 修复题目区按钮和周赛数据显示, 更新同步题目状态使用的接口api,同步更新所有相关状态更新,此次更新需要更新本地同步数据~
1 parent 9b060c8 commit 8c387fe

File tree

2 files changed

+119
-71
lines changed

2 files changed

+119
-71
lines changed

leetcodeRating_greasyfork.user.js

Lines changed: 117 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// ==UserScript==
22
// @name LeetCodeRating|显示力扣周赛难度分
33
// @namespace https://github.com/zhang-wangz
4-
// @version 3.0.6
4+
// @version 3.0.7
55
// @license MIT
66
// @description LeetCodeRating 力扣周赛分数显现和相关力扣小功能,目前浏览器更新规则,使用该插件前请手动打开浏览器开发者模式再食用~
77
// @author 小东是个阳光蛋(力扣名)
@@ -34,8 +34,8 @@
3434
function userScript() {
3535
'use strict';
3636

37-
const version = '3.0.6';
38-
let pbstatusVersion = 'version16';
37+
const version = '3.0.7';
38+
let pbstatusVersion = 'version19';
3939
// xhr劫持时使用,保留原始
4040
const dummySend = XMLHttpRequest.prototype.send;
4141
const originalOpen = XMLHttpRequest.prototype.open;
@@ -723,50 +723,92 @@
723723

724724
function allPbPostData(skip, limit) {
725725
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+
`,
764761
variables: {
765762
categorySlug: 'all-code-essentials',
763+
searchKeyword: "",
766764
skip: skip,
767765
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'
770812
};
771813
reqs.key = 'LeetcodeRating';
772814
return reqs;
@@ -778,7 +820,7 @@
778820
'Content-Type': 'application/json'
779821
};
780822
ajaxReq('POST', lcgraphql, headers, allPbPostData(0, 0), res => {
781-
total = res.data.problemsetQuestionList.total;
823+
total = res.data.problemsetQuestionListV2.totalLength;
782824
});
783825
return total;
784826
}
@@ -798,7 +840,7 @@
798840
let pbstatus = JSON.parse(GM_getValue('pbstatus', '{}').toString());
799841
let titleSlug = getSlug(pburl);
800842
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'];
802844
// 获取分数
803845
let score;
804846
let idExist = pbstatus[titleSlug] != null && t2rate[pbstatus[titleSlug]['id']] != null;
@@ -867,8 +909,8 @@
867909
return;
868910
}
869911
// 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;
872914
// console.log(code);
873915
let iconStr = getPbstatusIcon(code, score, paid);
874916
let iconEle = document.createElement('span');
@@ -1159,7 +1201,7 @@
11591201
let pbstatus = JSON.parse(GM_getValue('pbstatus', '{}').toString());
11601202
let slug = getSlug(location.href);
11611203
if (!pbstatus[slug]) pbstatus[slug] = {};
1162-
pbstatus[slug]['status'] = 'AC';
1204+
pbstatus[slug]['status'] = 'SOLVED';
11631205
GM_setValue('pbstatus', JSON.stringify(pbstatus));
11641206
console.log('提交成功,当前题目状态已更新');
11651207
} else if (resp?.status_msg && !resp.status_msg.includes('Accepted')) {
@@ -1180,18 +1222,19 @@
11801222
};
11811223
let status;
11821224
ajaxReq('POST', lcgraphql, headers, postdata, response => {
1225+
console.log("用户题目状态: ", response.data.question.status)
11831226
status = response.data.question.status;
11841227
});
11851228
// 如果之前为ac状态,那么停止更新,直接返回
11861229
if (status && status == 'ac') {
11871230
if (!pbstatus[slug]) pbstatus[slug] = {};
1188-
pbstatus[slug]['status'] = 'AC';
1231+
pbstatus[slug]['status'] = 'SOLVED';
11891232
GM_setValue('pbstatus', JSON.stringify(pbstatus));
11901233
console.log('提交失败,但是之前已经ac过该题,所以状态为ac');
11911234
} else {
11921235
// 之前没有提交过或者提交过但是没有ac的状态,那么仍然更新为提交失败状态
11931236
if (!pbstatus[slug]) pbstatus[slug] = {};
1194-
pbstatus[slug]['status'] = 'TRIED';
1237+
pbstatus[slug]['status'] = 'ATTEMPTED';
11951238
GM_setValue('pbstatus', JSON.stringify(pbstatus));
11961239
console.log('提交失败, 当前题目状态已更新');
11971240
}
@@ -2069,14 +2112,14 @@
20692112
headers,
20702113
allPbPostData(i * 100, 100),
20712114
async res => {
2072-
const questions = res.data.problemsetQuestionList.questions;
2115+
const questions = res.data.problemsetQuestionListV2.questions;
20732116
for (const pb of questions) {
20742117
pbstatus[pb.titleSlug] = {
20752118
titleSlug: pb.titleSlug,
2076-
id: pb.frontendQuestionId,
2119+
id: pb.questionFrontendId,
20772120
status: pb.status,
20782121
title: pb.title,
2079-
titleCn: pb.titleCn,
2122+
titleCn: pb.translatedTitle,
20802123
difficulty: pb.difficulty,
20812124
paidOnly: pb.paidOnly
20822125
};
@@ -2097,6 +2140,9 @@
20972140
layer.msg('同步所有题目状态完成!');
20982141
await sleep(1000);
20992142
layer.closeAll();
2143+
layer.msg('重新加载页面中!');
2144+
await sleep(1000);
2145+
location.reload();
21002146
});
21012147
}
21022148
});
@@ -2148,8 +2194,8 @@
21482194
initIdx += 1;
21492195
break;
21502196
}
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';
21532199
}
21542200
// console.log(titleSlug)
21552201
initIdx += 1;
@@ -2252,7 +2298,7 @@
22522298
let tipsChildone = tipsPa.childNodes[1];
22532299
// 题目内容, 插入后变成原tips栏目
22542300
let pbDescription = tipsPa.childNodes[2];
2255-
if (pbDescription?.childNodes[0]?.getAttribute('data-track-load') != null) {
2301+
if (pbDescription?.getAttribute('class') == null) {
22562302
let divTips = document.createElement('div');
22572303
divTips.setAttribute('class', 'flex gap-1');
22582304
let abody = document.createElement('a');
@@ -2560,7 +2606,7 @@
25602606
pbName2Id = {};
25612607
pbNamee2Id = {};
25622608
let dataStr = res.response;
2563-
let json = eval(dataStr);
2609+
let json = JSON.parse(dataStr);
25642610
for (const element of json) {
25652611
t2rate[element.ID] = element;
25662612
t2rate[element.ID]['Rating'] = Number.parseInt(
@@ -2606,7 +2652,7 @@
26062652
levelTc2Id = {};
26072653
levelTe2Id = {};
26082654
let dataStr = res.response;
2609-
let json = eval(dataStr);
2655+
let json = JSON.parse(dataStr);
26102656
for (const element of json) {
26112657
if (typeof element.TitleCn == 'string') {
26122658
let titlec = element.TitleCn;
@@ -2632,6 +2678,7 @@
26322678
let checkVersionLayer = GM_getValue('switchupdate')
26332679
? preDate1 == '' || preDate1 != now
26342680
: true;
2681+
console.log("checkVersionLayer: ", checkVersionLayer)
26352682
GM_xmlhttpRequest({
26362683
method: 'get',
26372684
url: versionUrl + '?timeStamp=' + new Date().getTime(),
@@ -2640,7 +2687,7 @@
26402687
},
26412688
onload: function (res) {
26422689
if (res.status === 200) {
2643-
// console.log('check version success...');
2690+
console.log('check version success...');
26442691
const dataStr = res.response;
26452692
const json = JSON.parse(dataStr);
26462693
const remoteVersion = json['version'];
@@ -2649,10 +2696,10 @@
26492696
papermanpic = json['papermanpic'];
26502697
// 通过更新 CSS 变量来更新纸片人
26512698
document.documentElement.style.setProperty('--mumu-img', `url(${papermanpic})`);
2652-
console.log(papermanpic);
2653-
if (remoteVersion > version) {
2699+
// console.log(papermanpic);
2700+
if (remoteVersion != version) {
26542701
if (checkVersionLayer) {
2655-
// console.log('弹窗更新栏一次..');
2702+
console.log('弹窗更新栏一次..');
26562703
layer.open({
26572704
area: ['500px', '300px'],
26582705
content:
@@ -2672,10 +2719,10 @@
26722719
}
26732720
});
26742721
} else {
2675-
// console.log('有新的版本,但是已经弹窗过且开启了最多只更新一次功能,等待明天弹窗..');
2722+
console.log('有新的版本,但是已经弹窗过且开启了最多只更新一次功能,等待明天弹窗..');
26762723
}
26772724
} else {
2678-
// console.log('leetcodeRating难度分插件当前已经是最新版本~');
2725+
console.log('leetcodeRating难度分插件当前已经是最新版本~');
26792726
}
26802727
}
26812728
},
@@ -2721,7 +2768,7 @@
27212768
}
27222769
`);
27232770

2724-
// TODO 分割
2771+
// TODO 分割计划
27252772
// spig js 纸片人相关
27262773
if (GM_getValue('switchperson')) {
27272774
const isindex = true;
@@ -3098,14 +3145,15 @@
30983145
echokoto(res);
30993146
})
31003147
.catch(xhr => xhr);
3101-
setTimeout(getkoto, 6000);
3148+
setTimeout(getkoto, 8000);
31023149
}
31033150
function echokoto(result) {
3104-
let hc = eval(result);
3151+
console.log(result)
3152+
let hc = result;
31053153
document.getElementById('hitokoto').textContent = hc.hitokoto;
3106-
// console.log(hc.content)
3154+
console.log(hc.hitokoto)
31073155
}
3108-
setTimeout(getkoto, 5000);
3156+
setTimeout(getkoto, 8000);
31093157
}
31103158
}
31113159
userScript();

version.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"version": "3.0.6",
3-
"content": "讨论区新增重置当前页面下题目状态的按钮,具体查看使用文档",
2+
"version": "3.0.7",
3+
"content": "修复题目区按钮和周赛数据显示, 更新同步题目状态使用的接口api,同步更新所有相关状态更新,此次更新需要更新本地同步数据",
44
"papermanpic": "https://i.mij.rip/2025/04/29/1e40225e739fba34536e4ad18aa7d718.png"
55
}
66

0 commit comments

Comments
 (0)