From f5390573cd9d303687fe01fe320d341d3a4508ff Mon Sep 17 00:00:00 2001 From: IcathianRain <2205794866@qq.com> Date: Sun, 27 Oct 2024 12:38:01 +0800 Subject: [PATCH 1/2] feat: add daily challenge problem pick (#919) * feat: add daily chanllenge problem pick, both work on us and cn endpoint --- package.json | 13 ++++++++- src/commands/show.ts | 11 ++++++++ src/extension.ts | 1 + src/request/query-daily-problem.ts | 14 ++++++++++ src/shared.ts | 45 ++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/request/query-daily-problem.ts diff --git a/package.json b/package.json index 53552b7..433e9d8 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "onCommand:leetcode.manageSessions", "onCommand:leetcode.refreshExplorer", "onCommand:leetcode.pickOne", + "onCommand:leetcode.pickDaily", "onCommand:leetcode.showProblem", "onCommand:leetcode.previewProblem", "onCommand:leetcode.searchProblem", @@ -82,6 +83,11 @@ "title": "Pick One", "category": "LeetCode" }, + { + "command": "leetcode.pickDaily", + "title": "Pick Daily Problem", + "category": "LeetCode" + }, { "command": "leetcode.showProblem", "title": "Show Problem", @@ -193,9 +199,14 @@ "group": "overflow@2" }, { - "command": "leetcode.problems.sort", + "command": "leetcode.pickDaily", "when": "view == leetCodeExplorer", "group": "overflow@3" + }, + { + "command": "leetcode.problems.sort", + "when": "view == leetCodeExplorer", + "group": "overflow@4" } ], "view/item/context": [ diff --git a/src/commands/show.ts b/src/commands/show.ts index eccf557..7e2c62c 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -30,6 +30,7 @@ import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider"; import * as list from "./list"; import { getLeetCodeEndpoint } from "./plugin"; import { globalState } from "../globalState"; +import { queryDailyProblem } from "../request/query-daily-problem"; export async function previewProblem(input: IProblem | vscode.Uri, isSideMode: boolean = false): Promise { let node: IProblem; @@ -70,6 +71,16 @@ export async function pickOne(): Promise { await showProblemInternal(randomProblem); } +export async function pickDaily(): Promise { + const dailyProblemID: string = await queryDailyProblem(); + const node: IProblem | undefined = explorerNodeManager.getNodeById(dailyProblemID); + if (!node) { + vscode.window.showErrorMessage(`Failed to resolve the problem with id: ${dailyProblemID}.`); + return; + } + await showProblemInternal(node); +} + export async function showProblem(node?: LeetCodeNode): Promise { if (!node) { return; diff --git a/src/extension.ts b/src/extension.ts index 439673f..7599418 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -71,6 +71,7 @@ export async function activate(context: vscode.ExtensionContext): Promise }), vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)), vscode.commands.registerCommand("leetcode.pickOne", () => show.pickOne()), + vscode.commands.registerCommand("leetcode.pickDaily", () => show.pickDaily()), vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()), vscode.commands.registerCommand("leetcode.showSolution", (input: LeetCodeNode | vscode.Uri) => show.showSolution(input)), vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()), diff --git a/src/request/query-daily-problem.ts b/src/request/query-daily-problem.ts new file mode 100644 index 0000000..da3cbb9 --- /dev/null +++ b/src/request/query-daily-problem.ts @@ -0,0 +1,14 @@ +import { getUrl, getDailyQueryStr, getDailyProblemID } from "../shared"; +import { LcAxios } from "../utils/httpUtils"; + + +export const queryDailyProblem = async (): Promise => { + return LcAxios(getUrl("graphql"), { + method: "POST", + data: { + query: getDailyQueryStr(), + variables: {}, + operationName: "questionOfToday" + }, + }).then((res) => getDailyProblemID(res)); +}; diff --git a/src/shared.ts b/src/shared.ts index e8b59d8..ddc459c 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as vscode from "vscode"; +import { AxiosResponse } from "axios"; export interface IQuickItemEx extends vscode.QuickPickItem { value: T; @@ -156,3 +157,47 @@ export const getUrl = (key: string) => { return urls[key]; } }; + +export const dailyQueryStr = ` + query questionOfToday { + activeDailyCodingChallengeQuestion { + question { + frontendQuestionId: questionFrontendId + } + } + } +`; + +export const dailyQueryStrCn = ` + query questionOfToday { + todayRecord { + question { + questionId + } + } + } +`; + +export const getDailyQueryStr = () => { + const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); + const point = leetCodeConfig.get("endpoint", Endpoint.LeetCode); + switch (point) { + case Endpoint.LeetCodeCN: + return dailyQueryStrCn; + case Endpoint.LeetCode: + default: + return dailyQueryStr; + } +}; + +export const getDailyProblemID = (res : AxiosResponse) => { + const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); + const point = leetCodeConfig.get("endpoint", Endpoint.LeetCode); + switch (point) { + case Endpoint.LeetCodeCN: + return res.data.data.todayRecord[0].question.questionId; + case Endpoint.LeetCode: + default: + return res.data.data.activeDailyCodingChallengeQuestion.question.frontendQuestionId; + } +} From 85bb11f602caab6caff353f09b7a9376f1bf47bc Mon Sep 17 00:00:00 2001 From: IcathianRain <2205794866@qq.com> Date: Tue, 29 Oct 2024 08:25:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9E=20fix(DailyPicak):=20Fix=20Pro?= =?UTF-8?q?blem=20ID=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Fix the daily question query string on leetcodeCN + Fix the daily question id field --- src/shared.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared.ts b/src/shared.ts index ddc459c..f8542e6 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -172,7 +172,7 @@ export const dailyQueryStrCn = ` query questionOfToday { todayRecord { question { - questionId + frontendQuestionId: questionFrontendId } } } @@ -195,7 +195,7 @@ export const getDailyProblemID = (res : AxiosResponse) => { const point = leetCodeConfig.get("endpoint", Endpoint.LeetCode); switch (point) { case Endpoint.LeetCodeCN: - return res.data.data.todayRecord[0].question.questionId; + return res.data.data.todayRecord[0].question.frontendQuestionId; case Endpoint.LeetCode: default: return res.data.data.activeDailyCodingChallengeQuestion.question.frontendQuestionId;