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<void> {
     let node: IProblem;
@@ -70,6 +71,16 @@ export async function pickOne(): Promise<void> {
     await showProblemInternal(randomProblem);
 }
 
+export async function pickDaily(): Promise<void> {
+    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<void> {
     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<void>
             }),
             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<string> => {
+    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<T> 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<string>("endpoint", Endpoint.LeetCode);
+    switch (point) {
+        case Endpoint.LeetCodeCN:
+            return dailyQueryStrCn;
+        case Endpoint.LeetCode:
+        default:
+            return dailyQueryStr;
+    }
+};
+
+export const getDailyProblemID = (res : AxiosResponse<any, any>) => {
+    const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode");
+    const point = leetCodeConfig.get<string>("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<any, any>) => {
     const point = leetCodeConfig.get<string>("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;