diff --git a/README.md b/README.md index 57ed6f9..b0a4ee1 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,8 @@ image_support = false, - `update` updates cache +- `top_interview` opens top interview 150 questions + #### Some commands can take optional arguments. To stack argument values separate them by a `,` - `Leet list` diff --git a/lua/leetcode/api/problems.lua b/lua/leetcode/api/problems.lua index 9049bb8..1d1a8cf 100644 --- a/lua/leetcode/api/problems.lua +++ b/lua/leetcode/api/problems.lua @@ -131,4 +131,23 @@ function Problems.translated_titles(cb) end end +function Problems.top_interview_150(cb) + local query = queries.study_plan_detail + + utils.query(query, { slug = "top-interview-150"}, { + callback = function(res, err) + if err then + return cb(nil, err) + end + local title_slugs = {} + for _, v in ipairs(res.data["studyPlanV2Detail"]["planSubGroups"]) do + for _, q in ipairs(v["questions"]) do + table.insert(title_slugs, q.title_slug) + end + end + return cb(title_slugs) + end + }) +end + return Problems diff --git a/lua/leetcode/api/queries.lua b/lua/leetcode/api/queries.lua index b835620..ef7ba11 100644 --- a/lua/leetcode/api/queries.lua +++ b/lua/leetcode/api/queries.lua @@ -179,4 +179,16 @@ queries.session_progress = [[ } ]] +queries.study_plan_detail = [[ + query studyPlanDetail($slug: String!) { + studyPlanV2Detail(planSlug: $slug) { + planSubGroups { + questions { + title_slug: titleSlug + } + } + } + } + ]] + return queries diff --git a/lua/leetcode/cache/problemlist.lua b/lua/leetcode/cache/problemlist.lua index 13cbf0d..d1b42d0 100644 --- a/lua/leetcode/cache/problemlist.lua +++ b/lua/leetcode/cache/problemlist.lua @@ -83,6 +83,14 @@ function Problemlist.update() end, true) end +---@return lc.cache.Question +function Problemlist.get_by_title_slugs(title_slugs) + local problems = Problemlist.get() + return vim.tbl_filter(function(e) + return vim.tbl_contains(title_slugs, e.title_slug) + end, problems) +end + ---@return lc.cache.Question function Problemlist.get_by_title_slug(title_slug) local problems = Problemlist.get() diff --git a/lua/leetcode/command/init.lua b/lua/leetcode/command/init.lua index a04d172..501ae7f 100644 --- a/lua/leetcode/command/init.lua +++ b/lua/leetcode/command/init.lua @@ -141,6 +141,21 @@ function cmd.qot() end) end +function cmd.top_interview_150() + require("leetcode.utils").auth_guard() + + local problems = require("leetcode.api.problems") + + problems.top_interview_150(function(slugs, err) + if err then + return log.err(err) + end + local p = require("leetcode.cache.problemlist").get_by_title_slugs(slugs) + local picker = require("leetcode.picker") + picker.question(p) + end) +end + function cmd.random_question(opts) require("leetcode.utils").auth_guard() @@ -651,6 +666,9 @@ cmd.commands = { cmd.random_question, _args = arguments.random, }, + top_iterview = { + cmd.top_interview_150, + }, desc = { cmd.desc_toggle,