irongit

A Neovim plugin enabling you to solve LeetCode problems.

feat(menu): streak counter display

kawreauthored
parent 20e4baccommit c4a3f9ea3cba4d6ad59dd649d527a72443d406b6Browse files

12 files changed, +96 -2

+10-0lua/leetcode-plugins/cn/queries.lua
@@ -139,3 +139,13 @@ queries.skills = [[
139139 }
140140 }
141141 ]]
142+
143+queries.streak = [[
144+ query getStreakCounter {
145+ streakCounter: problemsetStreakCounter {
146+ streakCount
147+ daysSkipped
148+ todayCompleted
149+ }
150+ }
151+ ]]
+1-0lua/leetcode-plugins/cn/urls.lua
@@ -12,3 +12,4 @@ urls.interpret = "/problems/%s/interpret_solution/"
1212 urls.submit = "/problems/%s/submit/"
1313 urls.run = "/problems/%s/interpret_solution/"
1414 urls.check = "/submissions/detail/%s/check/"
15+urls.streak_counter = "/graphql/noj-go/"
+3-0lua/leetcode-ui/group/page/cache.lua
@@ -3,6 +3,7 @@ local Title = require("leetcode-ui.lines.title")
33 local Footer = require("leetcode-ui.lines.footer")
44 local Buttons = require("leetcode-ui.group.buttons.menu")
55 local Page = require("leetcode-ui.group.page")
6+local Stats = require("leetcode-ui.lines.stats")
67
78 local Button = require("leetcode-ui.lines.button.menu")
89 local BackButton = require("leetcode-ui.lines.button.menu.back")
@@ -30,4 +31,6 @@ page:insert(Buttons({
3031
3132 page:insert(Footer())
3233
34+page:insert(Stats)
35+
3336 return page
+3-0lua/leetcode-ui/group/page/cookie.lua
@@ -3,6 +3,7 @@ local Title = require("leetcode-ui.lines.title")
33 local Footer = require("leetcode-ui.lines.footer")
44 local Buttons = require("leetcode-ui.group.buttons.menu")
55 local Page = require("leetcode-ui.group.page")
6+local Stats = require("leetcode-ui.lines.stats")
67
78 local Button = require("leetcode-ui.lines.button.menu")
89 local BackButton = require("leetcode-ui.lines.button.menu.back")
@@ -37,4 +38,6 @@ page:insert(Buttons({
3738
3839 page:insert(Footer())
3940
41+page:insert(Stats)
42+
4043 return page
+3-0lua/leetcode-ui/group/page/menu.lua
@@ -3,6 +3,7 @@ local Title = require("leetcode-ui.lines.title")
33 local Buttons = require("leetcode-ui.group.buttons.menu")
44 local Header = require("leetcode-ui.lines.menu-header")
55 local Footer = require("leetcode-ui.lines.footer")
6+local Stats = require("leetcode-ui.lines.stats")
67
78 local Button = require("leetcode-ui.lines.button.menu")
89 local ExitButton = require("leetcode-ui.lines.button.menu.exit")
@@ -55,4 +56,6 @@ page:insert(Buttons({
5556
5657 page:insert(Footer())
5758
59+page:insert(Stats)
60+
5861 return page
+3-0lua/leetcode-ui/group/page/problems.lua
@@ -8,6 +8,7 @@ local Button = require("leetcode-ui.lines.button.menu")
88 local BackButton = require("leetcode-ui.lines.button.menu.back")
99 local Buttons = require("leetcode-ui.group.buttons.menu")
1010 local Page = require("leetcode-ui.group.page")
11+local Stats = require("leetcode-ui.lines.stats")
1112
1213 local page = Page()
1314
@@ -44,4 +45,6 @@ page:insert(Buttons({
4445
4546 page:insert(Footer())
4647
48+page:insert(Stats)
49+
4750 return page
+3-0lua/leetcode-ui/group/page/stats.lua
@@ -7,6 +7,7 @@ local Buttons = require("leetcode-ui.group.buttons.menu")
77 local Button = require("leetcode-ui.lines.button.menu")
88 local BackButton = require("leetcode-ui.lines.button.menu.back")
99 local Title = require("leetcode-ui.lines.title")
10+local Stats = require("leetcode-ui.lines.stats")
1011
1112 local cmd = require("leetcode.command")
1213 local config = require("leetcode.config")
@@ -63,4 +64,6 @@ page:insert(buttons)
6364
6465 page:insert(Footer())
6566
67+page:insert(Stats)
68+
6669 return page
+41-0lua/leetcode-ui/lines/stats.lua
@@ -0,0 +1,41 @@
1+local Lines = require("leetcode-ui.lines")
2+local t = require("leetcode.translator")
3+local log = require("leetcode.logger")
4+local stats_api = require("leetcode.api.statistics")
5+
6+---@class lc.ui.menu.Stats : lc.ui.Lines
7+---@field streak? integer
8+---@field today_completed? boolean
9+local Stats = Lines:extend("LeetMenuTitle")
10+
11+function Stats:contents()
12+ self:clear()
13+
14+ local hl = self.today_completed and "leetcode_hard" or "leetcode_alt"
15+ self:append("󰈸 ", hl)
16+ self:append(self.streak and tostring(self.streak) or "-")
17+
18+ return Stats.super.contents(self)
19+end
20+
21+function Stats:update()
22+ stats_api.streak(function(res, err)
23+ if err then return log.err(err) end
24+
25+ self.streak = res.streakCount
26+ self.today_completed = res.todayCompleted
27+
28+ if _Lc_Menu then _Lc_Menu:draw() end
29+ end)
30+end
31+
32+function Stats:init() --
33+ Stats.super.init(self, {}, {})
34+
35+ self:update()
36+end
37+
38+---@type fun(): lc.ui.menu.Stats
39+local LeetMenuStats = Stats
40+
41+return LeetMenuStats()
+1-1lua/leetcode/api/interpreter.lua
@@ -54,7 +54,7 @@ function interpreter.listener(id, callback)
5454 local function listen()
5555 interpreter.check(id, function(item, err)
5656 if err then
57- require("leetcode.runner"):stop()
57+ callback(false)
5858 return noti:stop(err.msg, false)
5959 end
6060
+10-0lua/leetcode/api/queries.lua
@@ -155,4 +155,14 @@ queries.languages = [[
155155 }
156156 ]]
157157
158+queries.streak = [[
159+ query getStreakCounter {
160+ streakCounter {
161+ streakCount
162+ daysSkipped
163+ todayCompleted: currentDayCompleted
164+ }
165+ }
166+ ]]
167+
158168 return queries
+17-1lua/leetcode/api/statistics.lua
@@ -4,7 +4,7 @@ local log = require("leetcode.logger")
44 local urls = require("leetcode.api.urls")
55 local queries = require("leetcode.api.queries")
66
7----@lc.api.statistics
7+---@class lc.api.statistics
88 local statistics = {}
99
1010 function statistics.calendar(cb)
@@ -95,4 +95,20 @@ function statistics.languages(cb)
9595 })
9696 end
9797
98+function statistics.streak(cb)
99+ local variables = vim.empty_dict()
100+
101+ local query = queries.streak
102+
103+ utils.query(query, variables, {
104+ endpoint = urls.streak_counter,
105+ callback = function(res, err)
106+ if err then return cb(nil, err) end
107+ local data = res.data
108+ local streak = data["streakCounter"]
109+ cb(streak)
110+ end,
111+ })
112+end
113+
98114 return statistics
+1-0lua/leetcode/api/urls.lua
@@ -14,5 +14,6 @@ urls.submit = "/problems/%s/submit/"
1414 urls.run = "/problems/%s/interpret_solution/"
1515 urls.check = "/submissions/detail/%s/check/"
1616 urls.latest_submission = "/submissions/latest/?qid=%s&lang=%s"
17+urls.streak_counter = "/graphql/"
1718
1819 return urls