irongit

A Neovim plugin enabling you to solve LeetCode problems.

leetcode.nvim/lua/leetcode/api/statistics.lua
208 lines4.9 KBLua
1local utils = require("leetcode.api.utils")
2local config = require("leetcode.config")
3local log = require("leetcode.logger")
4local urls = require("leetcode.api.urls")
5local queries = require("leetcode.api.queries")
6
7---@class lc.api.statistics
8local statistics = {}
9
10function statistics.calendar(cb)
11 local variables = {
12 username = config.auth.name,
13 }
14
15 local query = queries.calendar
16
17 utils.query(query, variables, {
18 endpoint = urls.calendar,
19 callback = function(res, err)
20 if err then
21 return cb(nil, err)
22 end
23
24 local data = res.data
25 local calendar = data["matchedUser"]["calendar"]
26
27 calendar.submission_calendar =
28 select(2, pcall(utils.decode, calendar.submission_calendar))
29
30 cb({
31 calendar = calendar,
32 }, nil)
33 end,
34 })
35end
36
37---@param cb fun(res: lc.Stats.QuestionCount[], err: lc.err)
38function statistics.session_progress(cb)
39 local variables = {
40 username = config.auth.name,
41 }
42
43 local query = queries.session_progress
44
45 utils.query(query, variables, {
46 callback = function(res, err)
47 if err then
48 return cb(nil, err)
49 end
50
51 local data = res.data
52 local session_progress = data["matchedUser"]["submitStats"]["acSubmissionNum"]
53 cb(session_progress)
54 end,
55 })
56end
57
58---@param cb fun(res: lc.Stats.Res, err: lc.err)
59function statistics.solved(cb)
60 local variables = {
61 username = config.auth.name,
62 }
63
64 local query = queries.solved
65
66 utils.query(query, variables, {
67 endpoint = urls.solved,
68 callback = function(res, err)
69 if err then
70 return cb(nil, err)
71 end
72
73 local data = res.data
74 local questions_count = data["allQuestionsCount"]
75 local submit_stats = data["matchedUser"]["submit_stats"]
76
77 cb({
78 questions_count = questions_count,
79 submit_stats = submit_stats,
80 })
81 end,
82 })
83end
84
85---@param cb fun(res: lc.Skills.Res, err: lc.err)
86function statistics.skills(cb)
87 local variables = {
88 username = config.auth.name,
89 }
90
91 local query = queries.skills
92
93 utils.query(query, variables, {
94 endpoint = urls.skills,
95 callback = function(res, err)
96 if err then
97 return cb(nil, err)
98 end
99 local data = res.data
100 local tag_problems_counts = data["matchedUser"]["tag_problems_counts"]
101 cb(tag_problems_counts)
102 end,
103 })
104end
105
106---@param cb fun(res: lc.Languages.Res, err: lc.err)
107function statistics.languages(cb)
108 local variables = {
109 username = config.auth.name,
110 }
111
112 local query = queries.languages
113
114 utils.query(query, variables, {
115 endpoint = urls.languages,
116 callback = function(res, err)
117 if err then
118 return cb(nil, err)
119 end
120 local data = res.data
121 local lang_prob_count = data["matchedUser"]["languageProblemCount"]
122 cb(lang_prob_count)
123 end,
124 })
125end
126
127function statistics.streak(cb)
128 local variables = vim.empty_dict()
129
130 local query = queries.streak
131
132 utils.query(query, variables, {
133 endpoint = urls.streak_counter,
134 callback = function(res, err)
135 if err then
136 return cb(nil, err)
137 end
138
139 local data = res.data
140 local streak = data["streakCounter"]
141
142 if streak == vim.NIL then
143 err = { msg = "Failed to load streak counter" }
144 cb(nil, err)
145 else
146 cb(streak)
147 end
148 end,
149 })
150end
151
152---@param cb fun(res: lc.res.session[], err: lc.err)
153function statistics.sessions(cb)
154 local url = urls.session
155
156 utils.post(url, {
157 body = vim.empty_dict(),
158 callback = function(res, err)
159 if err then
160 return cb(nil, err)
161 end
162 config.sessions.update(res.sessions)
163 cb(res.sessions)
164 end,
165 })
166end
167
168function statistics.change_session(id, cb)
169 local body = {
170 func = "activate",
171 target = id,
172 }
173
174 local url = urls.session
175
176 utils.put(url, {
177 body = body,
178 callback = function(res, err)
179 if err then
180 return cb(nil, err)
181 end
182 config.sessions.update(res.sessions)
183 cb(res.sessions)
184 end,
185 })
186end
187
188function statistics.create_session(name, cb)
189 local body = {
190 func = "create",
191 name = name,
192 }
193
194 local url = urls.session
195
196 utils.put(url, {
197 body = body,
198 callback = function(res, err)
199 if err then
200 return cb(nil, err)
201 end
202 config.sessions.update(res.sessions)
203 cb(res.sessions)
204 end,
205 })
206end
207
208return statistics