From 3c4ae295fd56d5a1e78801c2029901d7c02e00f7 Mon Sep 17 00:00:00 2001 From: shuzijun Date: Mon, 23 Aug 2021 12:46:42 +0800 Subject: [PATCH 1/6] change api --- .../plugin/actions/toolbar/FindTagAction.java | 2 +- .../plugin/manager/QuestionManager.java | 167 +++++++++++------- .../leetcode/plugin/manager/ViewManager.java | 9 +- .../leetcode/plugin/model/Question.java | 20 ++- .../shuzijun/leetcode/plugin/model/Tag.java | 12 +- .../leetcode/plugin/window/HttpLogin.java | 2 +- 6 files changed, 140 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java index 36eff362..076850df 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java @@ -51,7 +51,7 @@ public void setSelected(AnActionEvent anActionEvent, boolean b) { @Override public void run(@NotNull ProgressIndicator progressIndicator) { if (b) { - ViewManager.loadServiceData(tree, anActionEvent.getProject(), tag.getType()); + ViewManager.loadServiceData(tree, anActionEvent.getProject(), tag.getSlug()); } else { ViewManager.loadServiceData(tree, anActionEvent.getProject()); } diff --git a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java index f9bbfbfa..4f794e31 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java @@ -32,21 +32,67 @@ public class QuestionManager { private final static String TRANSLATIONNAME = "translation.json"; - public static List getQuestionService(Project project, String url) { - List questionList = null; + public static List getQuestionService(Project project, String categorySlug) { + Boolean isPremium = false; + if (HttpRequestUtils.isLogin()) { + HttpRequest httpRequest = HttpRequest.post(URLUtils.getLeetcodeGraphql(), "application/json"); + httpRequest.setBody("{\"query\":\"\\n query globalData {\\n userStatus {\\n isSignedIn\\n isPremium\\n username\\n realName\\n avatar\\n userSlug\\n isAdmin\\n useTranslation\\n premiumExpiredAt\\n isTranslator\\n isSuperuser\\n isPhoneVerified\\n }\\n jobsMyCompany {\\n nameSlug\\n }\\n commonNojPermissionTypes\\n}\\n \",\"variables\":{},\"operationName\":\"globalData\"}"); + httpRequest.addHeader("Accept", "application/json"); + HttpResponse response = HttpRequestUtils.executePost(httpRequest); + if (response != null && response.getStatusCode() == 200) { + JSONObject user = JSONObject.parseObject(response.getBody()).getJSONObject("data").getJSONObject("userStatus"); + isPremium = user.getBoolean("isPremium"); + ApplicationManager.getApplication().invokeAndWait(() -> { + WindowFactory.updateTitle(project, user.getString("username")); + }); + } else { + LogUtils.LOG.error("Request userStatus failed, status:" + response == null ? "" : response.getStatusCode()); + } + } + List questionList = new ArrayList<>(); + int skip = 0; + int limit = 100; + int total = -1; + while(true) { + try { + Map page = getQuestionPage(categorySlug, skip, limit, isPremium); + if (total < 0) { + total = (int) page.get("total"); + } + questionList.addAll((List) page.get("questionList")); + skip = skip + limit; + if(total <= skip){ + break; + } + } catch (Exception e) { + return null; + } - HttpRequest httpRequest = HttpRequest.get(url); - HttpResponse response = HttpRequestUtils.executeGet(httpRequest); - if (response != null && response.getStatusCode() == 200) { - questionList = parseQuestion(response.getBody()); - JSONObject jsonObject = JSONObject.parseObject(response.getBody()); - ApplicationManager.getApplication().invokeAndWait(() -> { - WindowFactory.updateTitle(project, jsonObject.getString("user_name")); - }); - } else { - LogUtils.LOG.error("Request question list failed, status:" + response == null ? "" : response.getStatusCode()); } + String dayQuestion = questionOfToday(); + Collections.sort(questionList, new Comparator() { + @Override + public int compare(Question arg0, Question arg1) { + String frontendId0 = arg0.getFrontendQuestionId(); + String frontendId1 = arg1.getFrontendQuestionId(); + if (frontendId0.equals(dayQuestion)) { + return -1; + } else if (frontendId1.equals(dayQuestion)) { + return 1; + } else if (StringUtils.isNumeric(frontendId0) && StringUtils.isNumeric(frontendId1)) { + return Integer.valueOf(frontendId0).compareTo(Integer.valueOf(frontendId1)); + } else if (StringUtils.isNumeric(frontendId0)) { + return -1; + } else if (StringUtils.isNumeric(frontendId1)) { + return 1; + } else { + return frontendId0.compareTo(frontendId1); + } + + } + }); + if (questionList != null && !questionList.isEmpty()) { String filePath = PersistentConfig.getInstance().getTempFilePath() + ALLNAME; FileUtils.saveFile(filePath, JSON.toJSONString(questionList)); @@ -56,6 +102,28 @@ public static List getQuestionService(Project project, String url) { } + private static Map getQuestionPage(String categorySlug, int skip, int limit, Boolean isPremium) throws Exception { + HttpRequest httpRequest = HttpRequest.post(URLUtils.getLeetcodeGraphql(), "application/json"); + if (URLUtils.isCn()) { + httpRequest.setBody("{\"query\":\"\\n query problemsetQuestionList($categorySlug: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput) {\\n problemsetQuestionList(\\n categorySlug: $categorySlug\\n limit: $limit\\n skip: $skip\\n filters: $filters\\n ) {\\n hasMore\\n total\\n questions {\\n acRate\\n difficulty\\n freqBar\\n frontendQuestionId\\n isFavor\\n paidOnly\\n solutionNum\\n status\\n title\\n titleCn\\n titleSlug\\n topicTags {\\n name\\n nameTranslated\\n id\\n slug\\n }\\n extra {\\n hasVideoSolution\\n topCompanyTags {\\n imgUrl\\n slug\\n numSubscribed\\n }\\n }\\n }\\n }\\n}\\n \",\"variables\":{\"categorySlug\":\""+categorySlug+"\",\"skip\":" + skip + ",\"limit\":" + limit + ",\"filters\":{}},\"operationName\":\"problemsetQuestionList\"}"); + } else { + httpRequest.setBody("{\"query\":\"\\n query problemsetQuestionList($categorySlug: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput) {\\n problemsetQuestionList: questionList(\\n categorySlug: $categorySlug\\n limit: $limit\\n skip: $skip\\n filters: $filters\\n ) {\\n total: totalNum\\n questions: data {\\n acRate\\n difficulty\\n freqBar\\n frontendQuestionId: questionFrontendId\\n isFavor\\n paidOnly: isPaidOnly\\n status\\n title\\n titleSlug\\n topicTags {\\n name\\n id\\n slug\\n }\\n hasSolution\\n hasVideoSolution\\n }\\n }\\n}\\n \",\"variables\":{\"categorySlug\":\"" + categorySlug + "\",\"skip\":" + skip + ",\"limit\":" + limit + ",\"filters\":{}},\"operationName\":\"problemsetQuestionList\"}"); + } + httpRequest.addHeader("Accept", "application/json"); + HttpResponse response = HttpRequestUtils.executePost(httpRequest); + if (response != null && response.getStatusCode() == 200) { + List questionList = parseQuestion(response.getBody(), isPremium); + Integer total = JSONObject.parseObject(response.getBody()).getJSONObject("data").getJSONObject("problemsetQuestionList").getInteger("total"); + Map page = new HashMap<>(); + page.put("total", total); + page.put("questionList", questionList); + return page; + } else { + LogUtils.LOG.error("Request question list failed, status:" + response == null ? "" : response.getStatusCode()); + throw new RuntimeException("Request question list failed"); + } + } + public static List getQuestionCache() { if (QUESTIONLIST != null) { return QUESTIONLIST; @@ -175,7 +243,7 @@ public static List getLists() { return tags; } - public static List getCategory(String url) { + public static List getCategory(String categorySlug) { List tags = new ArrayList<>(); HttpRequest httpRequest = HttpRequest.get(URLUtils.getLeetcodeCardInfo()); @@ -183,7 +251,7 @@ public static List getCategory(String url) { if (response != null && response.getStatusCode() == 200) { try { String body = response.getBody(); - tags = parseCategory(body, url); + tags = parseCategory(body, categorySlug); } catch (Exception e1) { LogUtils.LOG.error("Request CardInfo exception", e1); } @@ -194,42 +262,45 @@ public static List getCategory(String url) { } - private static List parseQuestion(String str) { + private static List parseQuestion(String str, Boolean isPremium) { List questionList = new ArrayList(); if (StringUtils.isNotBlank(str)) { - JSONObject jsonObject = JSONObject.parseObject(str); - Boolean isPremium = new Integer("0").equals(jsonObject.getInteger("frequency_high")); //Premium users display frequency - JSONArray jsonArray = jsonObject.getJSONArray("stat_status_pairs"); + JSONObject jsonObject = JSONObject.parseObject(str).getJSONObject("data").getJSONObject("problemsetQuestionList"); + JSONArray jsonArray = jsonObject.getJSONArray("questions"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject object = jsonArray.getJSONObject(i); - Question question = new Question(object.getJSONObject("stat").getString("question__title")); + Question question = new Question(object.getString("title")); + if (URLUtils.isCn() && !PersistentConfig.getInstance().getConfig().getEnglishContent()) { + question.setTitle(object.getString("titleCn")); + } question.setLeaf(Boolean.TRUE); - question.setQuestionId(object.getJSONObject("stat").getString("question_id")); - question.setFrontendQuestionId(object.getJSONObject("stat").getString("frontend_question_id")); + question.setQuestionId(object.getString("frontendQuestionId")); + question.setFrontendQuestionId(object.getString("frontendQuestionId")); try { - if (object.getBoolean("paid_only") && isPremium) { - question.setStatus(object.getBoolean("paid_only") ? "lock" : null); + if (object.getBoolean("paidOnly") && !isPremium) { + question.setStatus("lock"); } else { - question.setStatus(object.get("status") == null ? "" : object.getString("status")); + question.setStatus(object.get("status") == null ? "" : object.getString("status").toLowerCase()); } } catch (Exception ee) { question.setStatus(""); } - question.setTitleSlug(object.getJSONObject("stat").getString("question__title_slug")); - question.setLevel(object.getJSONObject("difficulty").getInteger("level")); + question.setTitleSlug(object.getString("titleSlug")); + question.setLevel(object.getString("difficulty")); try { - if (object.getJSONObject("stat").containsKey("question__article__live")) { - if (object.getJSONObject("stat").get("question__article__live") == null - || !object.getJSONObject("stat").getBoolean("question__article__live")) { - question.setArticleLive(Constant.ARTICLE_LIVE_NONE); - } else { + if (object.containsKey("hasSolution")) { + if (object.getBoolean("hasSolution")) { question.setArticleLive(Constant.ARTICLE_LIVE_ONE); - question.setArticleSlug(object.getJSONObject("stat").getString("question__title_slug")); + question.setArticleSlug(object.getString("titleSlug")); + } else { + question.setArticleLive(Constant.ARTICLE_LIVE_NONE); } - } else { + } else if (object.containsKey("solutionNum")) { question.setArticleLive(Constant.ARTICLE_LIVE_LIST); + } else { + question.setArticleLive(Constant.ARTICLE_LIVE_NONE); } } catch (Exception e) { LogUtils.LOG.error("Identify abnormal article", e); @@ -237,32 +308,6 @@ private static List parseQuestion(String str) { } questionList.add(question); } - - translation(questionList); - - String dayQuestion = questionOfToday(); - - Collections.sort(questionList, new Comparator() { - @Override - public int compare(Question arg0, Question arg1) { - String frontendId0 = arg0.getFrontendQuestionId(); - String frontendId1 = arg1.getFrontendQuestionId(); - if (frontendId0.equals(dayQuestion)) { - return -1; - } else if (frontendId1.equals(dayQuestion)) { - return 1; - } else if (StringUtils.isNumeric(frontendId0) && StringUtils.isNumeric(frontendId1)) { - return Integer.valueOf(frontendId0).compareTo(Integer.valueOf(frontendId1)); - } else if (StringUtils.isNumeric(frontendId0)) { - return -1; - } else if (StringUtils.isNumeric(frontendId1)) { - return 1; - } else { - return frontendId0.compareTo(frontendId1); - } - - } - }); } return questionList; @@ -354,7 +399,7 @@ private static List parseTag(String str) { return tags; } - private static List parseCategory(String str, String url) { + private static List parseCategory(String str, String categorySlug) { List tags = new ArrayList(); if (StringUtils.isNotBlank(str)) { @@ -366,7 +411,7 @@ private static List parseCategory(String str, String url) { tag.setSlug(object.getString("slug")); tag.setType(URLUtils.getLeetcodeUrl() + "/api" + object.getString("url").replace("problemset", "problems")); tag.setName(object.getString("title")); - if (url.contains(tag.getType())) { + if (categorySlug.contains(tag.getSlug())) { tag.setSelect(true); } tags.add(tag); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java b/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java index 164afdf2..e9019fd5 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java @@ -11,7 +11,6 @@ import com.shuzijun.leetcode.plugin.model.Tag; import com.shuzijun.leetcode.plugin.utils.MessageUtils; import com.shuzijun.leetcode.plugin.utils.PropertiesUtils; -import com.shuzijun.leetcode.plugin.utils.URLUtils; import com.shuzijun.leetcode.plugin.window.WindowFactory; import javax.swing.*; @@ -36,11 +35,11 @@ public class ViewManager { private static boolean intersection = Boolean.FALSE; public static void loadServiceData(JTree tree, Project project) { - loadServiceData(tree, project, URLUtils.getLeetcodeAll()); + loadServiceData(tree, project, ""); } - public static void loadServiceData(JTree tree, Project project, String url) { - List questionList = QuestionManager.getQuestionService(project, url); + public static void loadServiceData(JTree tree, Project project, String categorySlug) { + List questionList = QuestionManager.getQuestionService(project, categorySlug); if (questionList == null || questionList.isEmpty()) { MessageUtils.getInstance(project).showWarnMsg("warning", PropertiesUtils.getInfo("response.cache")); questionList = QuestionManager.getQuestionCache(); @@ -61,7 +60,7 @@ public String apply(Question question) { filter.put(Constant.FIND_TYPE_STATUS, QuestionManager.getStatus()); filter.put(Constant.FIND_TYPE_LISTS, QuestionManager.getLists()); filter.put(Constant.FIND_TYPE_TAGS, QuestionManager.getTags()); - filter.put(Constant.FIND_TYPE_CATEGORY, QuestionManager.getCategory(url)); + filter.put(Constant.FIND_TYPE_CATEGORY, QuestionManager.getCategory(categorySlug)); DefaultTreeModel treeMode = (DefaultTreeModel) tree.getModel(); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java b/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java index 240f13ec..80bedb11 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java @@ -104,6 +104,20 @@ public void setLevel(Integer level) { this.level = level; } + public void setLevel(String difficulty) { + if(difficulty == null){ + this.level = 0; + }else if("easy".equalsIgnoreCase(difficulty)){ + this.level = 1; + }else if("medium".equalsIgnoreCase(difficulty)){ + this.level = 2; + }else if("hard".equalsIgnoreCase(difficulty)){ + this.level = 3; + }else { + this.level = 0; + } + } + public String getStatus() { return status; } @@ -197,11 +211,11 @@ public String toString() { StringBuffer sb = new StringBuffer(); - if ("notac".equals(status)) { + if ("notac".equalsIgnoreCase(status)) { sb.append("❓"); - } else if ("ac".equals(status)) { + } else if ("ac".equalsIgnoreCase(status)) { sb.append("✔"); - } else if ("lock".equals(status)) { + } else if ("lock".equalsIgnoreCase(status)) { sb.append(" $ "); } else if (leaf && level != null) { sb.append(" "); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java b/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java index 6ccfca21..43445495 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java @@ -1,5 +1,7 @@ package com.shuzijun.leetcode.plugin.model; +import org.apache.commons.lang3.StringUtils; + import java.util.Comparator; import java.util.TreeSet; @@ -15,7 +17,15 @@ public class Tag { private TreeSet questions = new TreeSet(new Comparator() { @Override public int compare(String arg0, String arg1) { - return Integer.valueOf(arg0).compareTo(Integer.valueOf(arg1)); + if (StringUtils.isNumeric(arg0) && StringUtils.isNumeric(arg1)) { + return Integer.valueOf(arg0).compareTo(Integer.valueOf(arg1)); + } else if (StringUtils.isNumeric(arg0)) { + return -1; + } else if (StringUtils.isNumeric(arg1)) { + return 1; + } else { + return arg0.compareTo(arg1); + } } }); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/window/HttpLogin.java b/src/main/java/com/shuzijun/leetcode/plugin/window/HttpLogin.java index af92e6e6..1acda977 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/window/HttpLogin.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/window/HttpLogin.java @@ -38,7 +38,7 @@ public static boolean ajaxLogin(Config config, JTree tree, Project project) { try { HttpEntity ent = MultipartEntityBuilder.create() - .addTextBody("csrfmiddlewaretoken", HttpRequestUtils.getToken()) + .addTextBody("csrfmiddlewaretoken", HttpRequestUtils.getToken() == null ? "": HttpRequestUtils.getToken()) .addTextBody("login", config.getLoginName()) .addTextBody("password", PersistentConfig.getInstance().getPassword()) .addTextBody("next", "/problems") From 2ff0ec6530e870d1752b7c38ea562d738befc741 Mon Sep 17 00:00:00 2001 From: shuzijun Date: Mon, 23 Aug 2021 12:51:24 +0800 Subject: [PATCH 2/6] actions --- .github/workflows/release.yml | 123 ++++++++++++++++++---------------- build.gradle | 2 +- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 48402586..75bf92f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,67 +1,76 @@ -name: Release +name: Release6.x on: + workflow_dispatch: + inputs: + version: + description: 'Release version' + required: true push: tags: - - 'v*.*' + - 'v6.*' jobs: greet: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Set LD_VERSION - run: echo ::set-env name=LD_VERSION::${GITHUB_REF#refs/*/v} - - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Build the plugin - run: ./gradlew buildPlugin - env: - LD_VERSION: ${{ env.LD_VERSION }} - - - name: Verify plugin - id: verify - uses: ChrisCarini/intellij-platform-plugin-verifier-action@latest - with: - ide-versions: | - ideaIC:2019.3 - ideaIC:2020.1 - ideaIC:2020.2 - ideaIC:LATEST-EAP-SNAPSHOT - - - name: Print verify contents - run: | - echo "The log file path is: ${{steps.verify.outputs.verification-output-log-filename}}" ; - cat ${{steps.verify.outputs.verification-output-log-filename}} - - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} - draft: true - prerelease: false - - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: ./build/distributions/leetcode-editor-${{ env.LD_VERSION }}.zip - asset_name: leetcode-editor-${{ env.LD_VERSION }}.zip - asset_content_type: application/zip + - name: Checkout + uses: actions/checkout@v2 + + - name: Set LD_VERSION + if: ${{ github.event_name == 'push'}} + run: echo "LD_VERSION=${GITHUB_REF#refs/*/v}" >> $GITHUB_ENV + - name: Set LD_VERSION + if: ${{ github.event_name == 'workflow_dispatch'}} + run: echo "LD_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build the plugin + run: ./gradlew buildPlugin + env: + LD_VERSION: ${{ env.LD_VERSION }} + + - name: Verify plugin + id: verify + uses: ChrisCarini/intellij-platform-plugin-verifier-action@v1.0.5 + with: + failure-levels: | + INVALID_PLUGIN + ide-versions: | + ideaIC:2021.1 + ideaIC:LATEST-EAP-SNAPSHOT + + - name: Print verify contents + run: | + echo "The log file path is: ${{steps.verify.outputs.verification-output-log-filename}}" ; + cat ${{steps.verify.outputs.verification-output-log-filename}} + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ env.LD_VERSION }} + release_name: v${{ env.LD_VERSION }} + draft: true + prerelease: false + + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps + asset_path: ./build/distributions/leetcode-editor-${{ env.LD_VERSION }}.zip + asset_name: leetcode-editor-${{ env.LD_VERSION }}.zip + asset_content_type: application/zip \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5735e127..67907b2b 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ dependencies { // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { pluginName 'leetcode-editor' - version '2020.2' + version '2021.1' type 'IU' downloadSources false updateSinceUntilBuild false From a2a5678e1e272ab79cb8042593b3021c07250603 Mon Sep 17 00:00:00 2001 From: shuzijun Date: Mon, 23 Aug 2021 12:54:53 +0800 Subject: [PATCH 3/6] Update build.gradle --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 67907b2b..e4ae2cdf 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.shuzijun.leetcode' -version (System.getenv('LD_VERSION')==null ? "6.9":System.getenv('LD_VERSION')) + (project.build_env.isEmpty() ? "" : "-") + project.build_env +version (System.getenv('LD_VERSION')==null ? "6.10":System.getenv('LD_VERSION')) + (project.build_env.isEmpty() ? "" : "-") + project.build_env sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -29,7 +29,7 @@ dependencies { // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { pluginName 'leetcode-editor' - version '2021.1' + version '2020.2' type 'IU' downloadSources false updateSinceUntilBuild false From 1b46197d116dda5c17d6728a8f1a8cbcd5395352 Mon Sep 17 00:00:00 2001 From: shuzijun Date: Mon, 23 Aug 2021 12:55:23 +0800 Subject: [PATCH 4/6] Update release.yml --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 75bf92f7..a42781da 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release6.x +name: Release on: workflow_dispatch: @@ -73,4 +73,4 @@ jobs: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./build/distributions/leetcode-editor-${{ env.LD_VERSION }}.zip asset_name: leetcode-editor-${{ env.LD_VERSION }}.zip - asset_content_type: application/zip \ No newline at end of file + asset_content_type: application/zip From da53ca2008d21ef49aca17ee7379a499c62ad715 Mon Sep 17 00:00:00 2001 From: shuzijun Date: Wed, 11 May 2022 15:49:07 +0800 Subject: [PATCH 5/6] domain name change --- build.gradle | 2 +- .../plugin/actions/toolbar/DonateAction.java | 16 ++ .../plugin/actions/toolbar/FindTagAction.java | 2 +- .../plugin/manager/QuestionManager.java | 167 +++++++----------- .../leetcode/plugin/manager/ViewManager.java | 9 +- .../leetcode/plugin/model/Question.java | 14 -- .../shuzijun/leetcode/plugin/model/Tag.java | 12 +- .../leetcode/plugin/utils/MTAUtils.java | 56 +++--- .../leetcode/plugin/utils/URLUtils.java | 2 +- src/main/java/icons/LeetCodeEditorIcons.java | 1 + src/main/resources/META-INF/plugin.xml | 9 + src/main/resources/icons/donate.png | Bin 0 -> 409 bytes src/main/resources/icons/donate.svg | 7 + src/main/resources/icons/donate_dark.png | Bin 0 -> 413 bytes src/main/resources/icons/donate_dark.svg | 7 + 15 files changed, 140 insertions(+), 164 deletions(-) create mode 100644 src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/DonateAction.java create mode 100644 src/main/resources/icons/donate.png create mode 100644 src/main/resources/icons/donate.svg create mode 100644 src/main/resources/icons/donate_dark.png create mode 100644 src/main/resources/icons/donate_dark.svg diff --git a/build.gradle b/build.gradle index e4ae2cdf..5d03b9f0 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.shuzijun.leetcode' -version (System.getenv('LD_VERSION')==null ? "6.10":System.getenv('LD_VERSION')) + (project.build_env.isEmpty() ? "" : "-") + project.build_env +version (System.getenv('LD_VERSION')==null ? "6.11":System.getenv('LD_VERSION')) + (project.build_env.isEmpty() ? "" : "-") + project.build_env sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/DonateAction.java b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/DonateAction.java new file mode 100644 index 00000000..08f7c9df --- /dev/null +++ b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/DonateAction.java @@ -0,0 +1,16 @@ +package com.shuzijun.leetcode.plugin.actions.toolbar; + +import com.intellij.ide.BrowserUtil; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author shuzijun + */ +public class DonateAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + BrowserUtil.browse("https://shuzijun.cn/donate.html"); + } + +} diff --git a/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java index 076850df..36eff362 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/actions/toolbar/FindTagAction.java @@ -51,7 +51,7 @@ public void setSelected(AnActionEvent anActionEvent, boolean b) { @Override public void run(@NotNull ProgressIndicator progressIndicator) { if (b) { - ViewManager.loadServiceData(tree, anActionEvent.getProject(), tag.getSlug()); + ViewManager.loadServiceData(tree, anActionEvent.getProject(), tag.getType()); } else { ViewManager.loadServiceData(tree, anActionEvent.getProject()); } diff --git a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java index 4f794e31..f9bbfbfa 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java @@ -32,67 +32,21 @@ public class QuestionManager { private final static String TRANSLATIONNAME = "translation.json"; - public static List getQuestionService(Project project, String categorySlug) { - Boolean isPremium = false; - if (HttpRequestUtils.isLogin()) { - HttpRequest httpRequest = HttpRequest.post(URLUtils.getLeetcodeGraphql(), "application/json"); - httpRequest.setBody("{\"query\":\"\\n query globalData {\\n userStatus {\\n isSignedIn\\n isPremium\\n username\\n realName\\n avatar\\n userSlug\\n isAdmin\\n useTranslation\\n premiumExpiredAt\\n isTranslator\\n isSuperuser\\n isPhoneVerified\\n }\\n jobsMyCompany {\\n nameSlug\\n }\\n commonNojPermissionTypes\\n}\\n \",\"variables\":{},\"operationName\":\"globalData\"}"); - httpRequest.addHeader("Accept", "application/json"); - HttpResponse response = HttpRequestUtils.executePost(httpRequest); - if (response != null && response.getStatusCode() == 200) { - JSONObject user = JSONObject.parseObject(response.getBody()).getJSONObject("data").getJSONObject("userStatus"); - isPremium = user.getBoolean("isPremium"); - ApplicationManager.getApplication().invokeAndWait(() -> { - WindowFactory.updateTitle(project, user.getString("username")); - }); - } else { - LogUtils.LOG.error("Request userStatus failed, status:" + response == null ? "" : response.getStatusCode()); - } - } - List questionList = new ArrayList<>(); - int skip = 0; - int limit = 100; - int total = -1; - while(true) { - try { - Map page = getQuestionPage(categorySlug, skip, limit, isPremium); - if (total < 0) { - total = (int) page.get("total"); - } - questionList.addAll((List) page.get("questionList")); - skip = skip + limit; - if(total <= skip){ - break; - } - } catch (Exception e) { - return null; - } + public static List getQuestionService(Project project, String url) { + List questionList = null; + HttpRequest httpRequest = HttpRequest.get(url); + HttpResponse response = HttpRequestUtils.executeGet(httpRequest); + if (response != null && response.getStatusCode() == 200) { + questionList = parseQuestion(response.getBody()); + JSONObject jsonObject = JSONObject.parseObject(response.getBody()); + ApplicationManager.getApplication().invokeAndWait(() -> { + WindowFactory.updateTitle(project, jsonObject.getString("user_name")); + }); + } else { + LogUtils.LOG.error("Request question list failed, status:" + response == null ? "" : response.getStatusCode()); } - String dayQuestion = questionOfToday(); - Collections.sort(questionList, new Comparator() { - @Override - public int compare(Question arg0, Question arg1) { - String frontendId0 = arg0.getFrontendQuestionId(); - String frontendId1 = arg1.getFrontendQuestionId(); - if (frontendId0.equals(dayQuestion)) { - return -1; - } else if (frontendId1.equals(dayQuestion)) { - return 1; - } else if (StringUtils.isNumeric(frontendId0) && StringUtils.isNumeric(frontendId1)) { - return Integer.valueOf(frontendId0).compareTo(Integer.valueOf(frontendId1)); - } else if (StringUtils.isNumeric(frontendId0)) { - return -1; - } else if (StringUtils.isNumeric(frontendId1)) { - return 1; - } else { - return frontendId0.compareTo(frontendId1); - } - - } - }); - if (questionList != null && !questionList.isEmpty()) { String filePath = PersistentConfig.getInstance().getTempFilePath() + ALLNAME; FileUtils.saveFile(filePath, JSON.toJSONString(questionList)); @@ -102,28 +56,6 @@ public int compare(Question arg0, Question arg1) { } - private static Map getQuestionPage(String categorySlug, int skip, int limit, Boolean isPremium) throws Exception { - HttpRequest httpRequest = HttpRequest.post(URLUtils.getLeetcodeGraphql(), "application/json"); - if (URLUtils.isCn()) { - httpRequest.setBody("{\"query\":\"\\n query problemsetQuestionList($categorySlug: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput) {\\n problemsetQuestionList(\\n categorySlug: $categorySlug\\n limit: $limit\\n skip: $skip\\n filters: $filters\\n ) {\\n hasMore\\n total\\n questions {\\n acRate\\n difficulty\\n freqBar\\n frontendQuestionId\\n isFavor\\n paidOnly\\n solutionNum\\n status\\n title\\n titleCn\\n titleSlug\\n topicTags {\\n name\\n nameTranslated\\n id\\n slug\\n }\\n extra {\\n hasVideoSolution\\n topCompanyTags {\\n imgUrl\\n slug\\n numSubscribed\\n }\\n }\\n }\\n }\\n}\\n \",\"variables\":{\"categorySlug\":\""+categorySlug+"\",\"skip\":" + skip + ",\"limit\":" + limit + ",\"filters\":{}},\"operationName\":\"problemsetQuestionList\"}"); - } else { - httpRequest.setBody("{\"query\":\"\\n query problemsetQuestionList($categorySlug: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput) {\\n problemsetQuestionList: questionList(\\n categorySlug: $categorySlug\\n limit: $limit\\n skip: $skip\\n filters: $filters\\n ) {\\n total: totalNum\\n questions: data {\\n acRate\\n difficulty\\n freqBar\\n frontendQuestionId: questionFrontendId\\n isFavor\\n paidOnly: isPaidOnly\\n status\\n title\\n titleSlug\\n topicTags {\\n name\\n id\\n slug\\n }\\n hasSolution\\n hasVideoSolution\\n }\\n }\\n}\\n \",\"variables\":{\"categorySlug\":\"" + categorySlug + "\",\"skip\":" + skip + ",\"limit\":" + limit + ",\"filters\":{}},\"operationName\":\"problemsetQuestionList\"}"); - } - httpRequest.addHeader("Accept", "application/json"); - HttpResponse response = HttpRequestUtils.executePost(httpRequest); - if (response != null && response.getStatusCode() == 200) { - List questionList = parseQuestion(response.getBody(), isPremium); - Integer total = JSONObject.parseObject(response.getBody()).getJSONObject("data").getJSONObject("problemsetQuestionList").getInteger("total"); - Map page = new HashMap<>(); - page.put("total", total); - page.put("questionList", questionList); - return page; - } else { - LogUtils.LOG.error("Request question list failed, status:" + response == null ? "" : response.getStatusCode()); - throw new RuntimeException("Request question list failed"); - } - } - public static List getQuestionCache() { if (QUESTIONLIST != null) { return QUESTIONLIST; @@ -243,7 +175,7 @@ public static List getLists() { return tags; } - public static List getCategory(String categorySlug) { + public static List getCategory(String url) { List tags = new ArrayList<>(); HttpRequest httpRequest = HttpRequest.get(URLUtils.getLeetcodeCardInfo()); @@ -251,7 +183,7 @@ public static List getCategory(String categorySlug) { if (response != null && response.getStatusCode() == 200) { try { String body = response.getBody(); - tags = parseCategory(body, categorySlug); + tags = parseCategory(body, url); } catch (Exception e1) { LogUtils.LOG.error("Request CardInfo exception", e1); } @@ -262,45 +194,42 @@ public static List getCategory(String categorySlug) { } - private static List parseQuestion(String str, Boolean isPremium) { + private static List parseQuestion(String str) { List questionList = new ArrayList(); if (StringUtils.isNotBlank(str)) { - JSONObject jsonObject = JSONObject.parseObject(str).getJSONObject("data").getJSONObject("problemsetQuestionList"); - JSONArray jsonArray = jsonObject.getJSONArray("questions"); + JSONObject jsonObject = JSONObject.parseObject(str); + Boolean isPremium = new Integer("0").equals(jsonObject.getInteger("frequency_high")); //Premium users display frequency + JSONArray jsonArray = jsonObject.getJSONArray("stat_status_pairs"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject object = jsonArray.getJSONObject(i); - Question question = new Question(object.getString("title")); - if (URLUtils.isCn() && !PersistentConfig.getInstance().getConfig().getEnglishContent()) { - question.setTitle(object.getString("titleCn")); - } + Question question = new Question(object.getJSONObject("stat").getString("question__title")); question.setLeaf(Boolean.TRUE); - question.setQuestionId(object.getString("frontendQuestionId")); - question.setFrontendQuestionId(object.getString("frontendQuestionId")); + question.setQuestionId(object.getJSONObject("stat").getString("question_id")); + question.setFrontendQuestionId(object.getJSONObject("stat").getString("frontend_question_id")); try { - if (object.getBoolean("paidOnly") && !isPremium) { - question.setStatus("lock"); + if (object.getBoolean("paid_only") && isPremium) { + question.setStatus(object.getBoolean("paid_only") ? "lock" : null); } else { - question.setStatus(object.get("status") == null ? "" : object.getString("status").toLowerCase()); + question.setStatus(object.get("status") == null ? "" : object.getString("status")); } } catch (Exception ee) { question.setStatus(""); } - question.setTitleSlug(object.getString("titleSlug")); - question.setLevel(object.getString("difficulty")); + question.setTitleSlug(object.getJSONObject("stat").getString("question__title_slug")); + question.setLevel(object.getJSONObject("difficulty").getInteger("level")); try { - if (object.containsKey("hasSolution")) { - if (object.getBoolean("hasSolution")) { - question.setArticleLive(Constant.ARTICLE_LIVE_ONE); - question.setArticleSlug(object.getString("titleSlug")); - } else { + if (object.getJSONObject("stat").containsKey("question__article__live")) { + if (object.getJSONObject("stat").get("question__article__live") == null + || !object.getJSONObject("stat").getBoolean("question__article__live")) { question.setArticleLive(Constant.ARTICLE_LIVE_NONE); + } else { + question.setArticleLive(Constant.ARTICLE_LIVE_ONE); + question.setArticleSlug(object.getJSONObject("stat").getString("question__title_slug")); } - } else if (object.containsKey("solutionNum")) { - question.setArticleLive(Constant.ARTICLE_LIVE_LIST); } else { - question.setArticleLive(Constant.ARTICLE_LIVE_NONE); + question.setArticleLive(Constant.ARTICLE_LIVE_LIST); } } catch (Exception e) { LogUtils.LOG.error("Identify abnormal article", e); @@ -308,6 +237,32 @@ private static List parseQuestion(String str, Boolean isPremium) { } questionList.add(question); } + + translation(questionList); + + String dayQuestion = questionOfToday(); + + Collections.sort(questionList, new Comparator() { + @Override + public int compare(Question arg0, Question arg1) { + String frontendId0 = arg0.getFrontendQuestionId(); + String frontendId1 = arg1.getFrontendQuestionId(); + if (frontendId0.equals(dayQuestion)) { + return -1; + } else if (frontendId1.equals(dayQuestion)) { + return 1; + } else if (StringUtils.isNumeric(frontendId0) && StringUtils.isNumeric(frontendId1)) { + return Integer.valueOf(frontendId0).compareTo(Integer.valueOf(frontendId1)); + } else if (StringUtils.isNumeric(frontendId0)) { + return -1; + } else if (StringUtils.isNumeric(frontendId1)) { + return 1; + } else { + return frontendId0.compareTo(frontendId1); + } + + } + }); } return questionList; @@ -399,7 +354,7 @@ private static List parseTag(String str) { return tags; } - private static List parseCategory(String str, String categorySlug) { + private static List parseCategory(String str, String url) { List tags = new ArrayList(); if (StringUtils.isNotBlank(str)) { @@ -411,7 +366,7 @@ private static List parseCategory(String str, String categorySlug) { tag.setSlug(object.getString("slug")); tag.setType(URLUtils.getLeetcodeUrl() + "/api" + object.getString("url").replace("problemset", "problems")); tag.setName(object.getString("title")); - if (categorySlug.contains(tag.getSlug())) { + if (url.contains(tag.getType())) { tag.setSelect(true); } tags.add(tag); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java b/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java index e9019fd5..164afdf2 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/manager/ViewManager.java @@ -11,6 +11,7 @@ import com.shuzijun.leetcode.plugin.model.Tag; import com.shuzijun.leetcode.plugin.utils.MessageUtils; import com.shuzijun.leetcode.plugin.utils.PropertiesUtils; +import com.shuzijun.leetcode.plugin.utils.URLUtils; import com.shuzijun.leetcode.plugin.window.WindowFactory; import javax.swing.*; @@ -35,11 +36,11 @@ public class ViewManager { private static boolean intersection = Boolean.FALSE; public static void loadServiceData(JTree tree, Project project) { - loadServiceData(tree, project, ""); + loadServiceData(tree, project, URLUtils.getLeetcodeAll()); } - public static void loadServiceData(JTree tree, Project project, String categorySlug) { - List questionList = QuestionManager.getQuestionService(project, categorySlug); + public static void loadServiceData(JTree tree, Project project, String url) { + List questionList = QuestionManager.getQuestionService(project, url); if (questionList == null || questionList.isEmpty()) { MessageUtils.getInstance(project).showWarnMsg("warning", PropertiesUtils.getInfo("response.cache")); questionList = QuestionManager.getQuestionCache(); @@ -60,7 +61,7 @@ public String apply(Question question) { filter.put(Constant.FIND_TYPE_STATUS, QuestionManager.getStatus()); filter.put(Constant.FIND_TYPE_LISTS, QuestionManager.getLists()); filter.put(Constant.FIND_TYPE_TAGS, QuestionManager.getTags()); - filter.put(Constant.FIND_TYPE_CATEGORY, QuestionManager.getCategory(categorySlug)); + filter.put(Constant.FIND_TYPE_CATEGORY, QuestionManager.getCategory(url)); DefaultTreeModel treeMode = (DefaultTreeModel) tree.getModel(); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java b/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java index 80bedb11..ebc258fa 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/model/Question.java @@ -104,20 +104,6 @@ public void setLevel(Integer level) { this.level = level; } - public void setLevel(String difficulty) { - if(difficulty == null){ - this.level = 0; - }else if("easy".equalsIgnoreCase(difficulty)){ - this.level = 1; - }else if("medium".equalsIgnoreCase(difficulty)){ - this.level = 2; - }else if("hard".equalsIgnoreCase(difficulty)){ - this.level = 3; - }else { - this.level = 0; - } - } - public String getStatus() { return status; } diff --git a/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java b/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java index 43445495..6ccfca21 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/model/Tag.java @@ -1,7 +1,5 @@ package com.shuzijun.leetcode.plugin.model; -import org.apache.commons.lang3.StringUtils; - import java.util.Comparator; import java.util.TreeSet; @@ -17,15 +15,7 @@ public class Tag { private TreeSet questions = new TreeSet(new Comparator() { @Override public int compare(String arg0, String arg1) { - if (StringUtils.isNumeric(arg0) && StringUtils.isNumeric(arg1)) { - return Integer.valueOf(arg0).compareTo(Integer.valueOf(arg1)); - } else if (StringUtils.isNumeric(arg0)) { - return -1; - } else if (StringUtils.isNumeric(arg1)) { - return 1; - } else { - return arg0.compareTo(arg1); - } + return Integer.valueOf(arg0).compareTo(Integer.valueOf(arg1)); } }); diff --git a/src/main/java/com/shuzijun/leetcode/plugin/utils/MTAUtils.java b/src/main/java/com/shuzijun/leetcode/plugin/utils/MTAUtils.java index a4906516..e702810b 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/utils/MTAUtils.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/utils/MTAUtils.java @@ -1,11 +1,11 @@ package com.shuzijun.leetcode.plugin.utils; -import com.intellij.ide.plugins.PluginManager; +import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.util.SystemInfo; +import com.intellij.util.io.HttpRequests; import com.shuzijun.leetcode.plugin.model.Config; import com.shuzijun.leetcode.plugin.model.Constant; -import com.shuzijun.leetcode.plugin.utils.io.HttpRequests; import org.apache.http.client.utils.URIBuilder; import java.awt.*; @@ -20,9 +20,9 @@ */ public class MTAUtils { - private static String URL = "http://pingtcss.qq.com/pingd"; - private static String SID = "500676642"; - private static String SI = getI("s"); + private static String URL = "https://hm.baidu.com/hm.gif"; + private static String SID = "153b08575197a6f136f1fe02dd507c1e"; + private static String SI = String.valueOf(System.currentTimeMillis() / 1000); private static String version = null; private static String userAgent = null; @@ -61,8 +61,7 @@ public ClickTask(Config config, String actionsId) { public void run() { try { if (version == null) { - version = PluginManager.getPlugin(PluginId.getId(Constant.PLUGIN_ID)).getVersion() - .replace("v", "").replaceAll("-|_", "."); + version = PluginManagerCore.getPlugin(PluginId.getId(Constant.PLUGIN_ID)).getVersion(); } if (userAgent == null) { if (SystemInfo.OS_NAME.toUpperCase().contains("MAC")) { @@ -76,26 +75,31 @@ public void run() { Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); Calendar calendar = Calendar.getInstance(); URI uri = new URIBuilder(URL) - .setParameter("dm", "127.0.0.1") - .setParameter("pvi", config.getId()) - .setParameter("si", SI) - .setParameter("url", "/" + actionsId) - .setParameter("arg", "") - .setParameter("ty", "0") - .setParameter("rdm", "") - .setParameter("rurl", "") - .setParameter("rarg", "") - .setParameter("adt", version) - .setParameter("r2", SID) - .setParameter("scr", (int)screensize.getWidth() + "x" + (int)screensize.getHeight()) - .setParameter("scl", Toolkit.getDefaultToolkit().getScreenResolution() + "-bit") - .setParameter("lg", Locale.getDefault().toString().replace("_", "-").toLowerCase()) - .setParameter("tz", -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / 60000 / 60 + "") - .setParameter("ext", "version=2.0.14") - .setParameter("random", System.currentTimeMillis() + "") + .setParameter("hca", config.getId()) + .setParameter("cc", "1") + .setParameter("cf", version) + .setParameter("ck", "0") + .setParameter("cl", Toolkit.getDefaultToolkit().getScreenResolution() + "-bit") + .setParameter("ds", (int)screensize.getWidth() + "x" + (int)screensize.getHeight()) + .setParameter("vl", "") + .setParameter("ep", "3392,2371") + .setParameter("ep", "3") + .setParameter("ja", "0") + .setParameter("ln", Locale.getDefault().toString().replace("_", "-").toLowerCase()) + .setParameter("lo", "0") + .setParameter("lt", SI) + .setParameter("rnd", String.valueOf(System.currentTimeMillis() / 1000)) + .setParameter("si", SID) + .setParameter("v", "1.2.92") + .setParameter("lv", "2") + .setParameter("sn", "44949") + .setParameter("r", "0") + .setParameter("ww", String.valueOf((int)screensize.getWidth())) + .setParameter("u", "http://leetcode-editor.shuzijun.cn/" + actionsId ) .build(); - - HttpRequests.request(uri.toURL().toString()).userAgent(userAgent).tryConnect(); + HttpRequests.request(uri.toURL().toString()).userAgent(userAgent).tuner(connection -> { + connection.addRequestProperty("Cookie", "HMACCOUNT=" + config.getId() + ";" + "HMACCOUNT_BFESS" + config.getId()); + }).tryConnect(); } catch (Exception e) { } diff --git a/src/main/java/com/shuzijun/leetcode/plugin/utils/URLUtils.java b/src/main/java/com/shuzijun/leetcode/plugin/utils/URLUtils.java index 08112ca5..7b686450 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/utils/URLUtils.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/utils/URLUtils.java @@ -9,7 +9,7 @@ public class URLUtils { public static final String leetcode = "leetcode.com"; - public static final String leetcodecn = "leetcode-cn.com"; + public static final String leetcodecn = "leetcode.cn"; private static String leetcodeUrl = "https://"; private static String leetcodeLogin = "/accounts/login/"; diff --git a/src/main/java/icons/LeetCodeEditorIcons.java b/src/main/java/icons/LeetCodeEditorIcons.java index 5aeccb81..b1247813 100644 --- a/src/main/java/icons/LeetCodeEditorIcons.java +++ b/src/main/java/icons/LeetCodeEditorIcons.java @@ -34,5 +34,6 @@ public interface LeetCodeEditorIcons { Icon SOLUTION = IconLoader.getIcon("/icons/solution.png"); Icon SUBMIT = IconLoader.getIcon("/icons/submit.png"); Icon TIME = IconLoader.getIcon("/icons/time.png"); + Icon DONATE = IconLoader.getIcon("/icons/donate.png"); } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 573ad62a..ac8589ae 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -117,6 +117,12 @@ +
  • v6.11
    + 1.修改域名.
    +
  • +
  • v6.11
    + 1.domain name change.
    +
  • v6.9
    1.修复兼容性.
  • @@ -510,6 +516,9 @@ + + diff --git a/src/main/resources/icons/donate.png b/src/main/resources/icons/donate.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8cdbd43d2b4acce66eeb960aafecd8dc518c23 GIT binary patch literal 409 zcmV;K0cQS*P)UEeBZZOwI-TRK@g5)i-^H|00000NkvXXu0mjf DphBvM literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/donate.svg b/src/main/resources/icons/donate.svg new file mode 100644 index 00000000..12d7a55e --- /dev/null +++ b/src/main/resources/icons/donate.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/icons/donate_dark.png b/src/main/resources/icons/donate_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ec806aefd546d50072d3ddd6bf985e902814e541 GIT binary patch literal 413 zcmV;O0b>4%P)(EX0)_z%B!W2UVuwJ`MQ{`x927y9Du}zQn6~B|tQe~CUvIk~_dMLaywGDwvZ>W-rcfvh zgO!V8^WgilcK|^UyG50?a>?6x z@4G+Fw~}u7OF^3CD>zjE5QgDMtY#aLJQA<_#o}(-Y)|zHyZLwB$X6>`00000NkvXX Hu0mjfc5At; literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/donate_dark.svg b/src/main/resources/icons/donate_dark.svg new file mode 100644 index 00000000..94c63af4 --- /dev/null +++ b/src/main/resources/icons/donate_dark.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file From c907a31abb3175869089e3bcd3982c3152473c7f Mon Sep 17 00:00:00 2001 From: shuzijun Date: Thu, 9 Jun 2022 22:15:34 +0800 Subject: [PATCH 6/6] fix sort --- .../com/shuzijun/leetcode/plugin/manager/QuestionManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java index f9bbfbfa..ce928d31 100644 --- a/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java +++ b/src/main/java/com/shuzijun/leetcode/plugin/manager/QuestionManager.java @@ -251,6 +251,10 @@ public int compare(Question arg0, Question arg1) { return -1; } else if (frontendId1.equals(dayQuestion)) { return 1; + } else if (StringUtils.isBlank(frontendId0)) { + return 1; + } else if (StringUtils.isBlank(frontendId1)) { + return -1; } else if (StringUtils.isNumeric(frontendId0) && StringUtils.isNumeric(frontendId1)) { return Integer.valueOf(frontendId0).compareTo(Integer.valueOf(frontendId1)); } else if (StringUtils.isNumeric(frontendId0)) {