diff --git a/package.json b/package.json index 5184a77..ad43255 100644 --- a/package.json +++ b/package.json @@ -343,7 +343,7 @@ "eslint-plugin-prettier": "^3.4.0", "glob": "^7.1.6", "husky": "^6.0.0", - "mocha": "^7.1.2", + "mocha": "^10.4.0", "prettier": "^2.3.0", "typescript": "^4.3.2", "vscode-test": "^1.3.0" @@ -358,12 +358,12 @@ "acorn": "^8.0.4", "algm": "^0.1.6", "ast-types": "^0.14.2", - "axios": "^0.21.1", + "axios": "^1.7.2", "cheerio": "^1.0.0-rc.3", "compressing": "^1.5.1", "fs-extra": "^9.1.0", "highlight.js": "^11.0.0", - "markdown-it": "^10.0.0", + "markdown-it": "^14.1.0", "pretty-object-string": "2.0.0-beta.3", "pretty-tag": "^0.1.1", "recast": "^0.20.4", diff --git a/src/api/api.cn.ts b/src/api/api.cn.ts index 22849ec..652e563 100644 --- a/src/api/api.cn.ts +++ b/src/api/api.cn.ts @@ -1,4 +1,4 @@ -import axios, { AxiosError, AxiosRequestConfig } from 'axios' +import axios, { AxiosError, AxiosRequestConfig, all } from 'axios' import { cache } from '../cache' import { ConciseQuestion, @@ -9,6 +9,7 @@ import { CheckResponse, SubmitOptions, SubmitResponse, + ContestStatus, TagData, QuestionTranslationData, TodayRecordData, @@ -120,7 +121,7 @@ async function graphql(data: GraphqlRequestData): Promise { method: 'POST', headers: { origin: DomainCN, - referer: `${DomainCN}/problemset/all/`, + referer: `${DomainCN}/contest/`, ...headers, }, }).then((res) => { @@ -195,6 +196,12 @@ const config = { method: 'GET', } }, + getContestStatus(titleSlug: string): AxiosRequestConfig { + return { + url: `${DomainCN}/contest/api/myranking/${titleSlug}/?region=local`, + method: 'GET', + } + }, getQuestionDetail(titleSlug: string) { return { operationName: 'questionData', @@ -311,6 +318,22 @@ const config = { }, } +function filterContest(allContests) { + // 过滤title相同的竞赛 + const times = new Set() + const N = allContests.length + const ans: any[] = [] + for (let i = 0; i < N; i++) { + const startTime = allContests[i].startTime + if (times.has(startTime)) { + continue + } + times.add(startTime) + ans.push(allContests[i]) + } + return ans +} + export const api = { refreshQuestions, getAllQuestions, @@ -321,7 +344,7 @@ export const api = { return request(config.getQuestionsByCategory(categorie)) }, fetchContests() { - return graphql(config.contests).then((data) => data.allContests) + return graphql(config.contests).then((data) => filterContest(data.allContests)) }, fetchTags(): Promise { return request(config.tags) @@ -329,6 +352,9 @@ export const api = { fetchContest(titleSlug: string) { return request(config.getContest(titleSlug)) }, + fetchContestStatus(titleSlug: string) { + return request(config.getContestStatus(titleSlug)) + }, fetchTodayRecord(): Promise { return graphql(config.todayRecord).then((data) => data.todayRecord) }, @@ -352,7 +378,13 @@ export const api = { return request(config.getQuestionContest(titleSlug, weekname)) }, submit(options: SubmitOptions): Promise { - return request(config.getSubmit(options)) + return request(config.getSubmit(options)).then((data) => { + if (data && data.submission_id) { + + // window.showInformationMessage(`提交通过,id: ${data.submission_id}`) + } + return data + }) }, submitContest(options: SubmitContestOptions): Promise { return request(config.getSubmitContest(options)) diff --git a/src/common/website.ts b/src/common/website.ts index a500c51..5f323ee 100644 --- a/src/common/website.ts +++ b/src/common/website.ts @@ -1,5 +1,5 @@ import { Lang } from '../model/common' -import { config, DomainCN, DomainEN } from '../config' +import { config } from '../config' export enum Website { Leetcode = 'https://leetcode.com', LeetcodeCn = 'https://leetcode.cn', diff --git a/src/model/common.ts b/src/model/common.ts index eab4085..70df888 100644 --- a/src/model/common.ts +++ b/src/model/common.ts @@ -171,7 +171,7 @@ export function checkParams(obj: T, attrs: R[]): asserts o const verify = attrs.every((attr) => !!obj[attr]) if (!verify) { const attr = attrs.find((attr) => !obj[attr])! - throw new Error(`options error, ${attr} is ${obj[attr]}`) + throw new Error(`options error, ${String(attr)} is ${obj[attr]}`) } } diff --git a/src/model/question.cn.ts b/src/model/question.cn.ts index f4a6311..85631e3 100644 --- a/src/model/question.cn.ts +++ b/src/model/question.cn.ts @@ -161,6 +161,11 @@ export interface SubmitContestOptions extends SubmitOptions { } export interface SubmitResponse { submission_id: number + +} +export interface ContestStatus { + my_solved: string[] + registered: boolean } export interface CheckResponse { status_code: number diff --git a/src/provider/resolver.cn.ts b/src/provider/resolver.cn.ts index 8b51001..c8dea59 100644 --- a/src/provider/resolver.cn.ts +++ b/src/provider/resolver.cn.ts @@ -10,6 +10,7 @@ import { import { ResolverType } from './resolver' import { normalizeQuestions } from '../common/util' + export const resolverCn: ResolverType = { Query() { //'Company', 'Favorite', @@ -143,6 +144,12 @@ export const resolverCn: ResolverType = { } const data = await api.fetchContest(titleSlug) const questions = data.questions + + const data2 = await api.fetchContestStatus(titleSlug) + const keys = new Set() + for (let i = 0; i < data2.my_solved.length; i++) { + keys.add(data2.my_solved[i]) + } return questions.map((question) => ({ type: 'QuestionContest', label: question.title, @@ -152,6 +159,7 @@ export const resolverCn: ResolverType = { titleSlug: question.title_slug, weekname: titleSlug, }, + isAC: keys.has(question.question_id), })) }, }, diff --git a/src/webview/questionPreview.ts b/src/webview/questionPreview.ts index 66f57bb..fbba672 100644 --- a/src/webview/questionPreview.ts +++ b/src/webview/questionPreview.ts @@ -1,7 +1,7 @@ import * as path from 'path' import * as vscode from 'vscode' import { api } from '../api/index' -import { config } from '../config' +import { DomainCN, DomainEN, config } from '../config' import { writeFile, parseHtml } from '../common/util' import { preprocessCode, shouldAskForImport, askForImport } from '../util' import { CodeLang, enNameLangs, isAlgorithm, langMap } from '../common/langConfig' @@ -265,9 +265,11 @@ export async function createQuestionPanelCommand(extensionPath: string, param: P const { codeSnippets, questionFrontendId, title, content, translatedContent, translatedTitle, titleSlug } = question //preview - let previewText = `# ${title}\n` + content + let previewText = '' if (config.lang === 'cn') { - previewText = `# ${translatedTitle}\n` + translatedContent + previewText = `# [${translatedTitle}](${DomainCN}/problems/${titleSlug}/description)\n` + translatedContent + } else { + previewText = `# [${title}](${DomainEN}/problems/${titleSlug}/description)\n` + content } const codeSnippet = getCodeSnippet(codeSnippets)