Skip to content

Commit 3bcb62e

Browse files
committed
Support unstar in 'star' command.
* also update cache when succeed. Signed-off-by: Eric Wang <[email protected]>
1 parent b1a2866 commit 3bcb62e

File tree

6 files changed

+63
-27
lines changed

6 files changed

+63
-27
lines changed

lib/commands/list.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var cmd = {
1818
alias: 'q',
1919
type: 'string',
2020
describe: 'Filter problems by conditions:\n' +
21-
'e(easy),m(medium),h(hard),d(done),l(locked),f(favor)\n' +
21+
'e(easy),m(medium),h(hard),d(done),l(locked),s(starred)\n' +
2222
'Uppercase means negative, e.g. D(not done)'
2323
},
2424
stat: {
@@ -41,8 +41,8 @@ function byLocked(x, q) {
4141
return x.locked;
4242
}
4343

44-
function byFavor(x, q) {
45-
return x.favor;
44+
function byStarred(x, q) {
45+
return x.starred;
4646
}
4747

4848
var QUERY_HANDLERS = {
@@ -56,8 +56,8 @@ var QUERY_HANDLERS = {
5656
L: _.negate(byLocked),
5757
d: byStateAC,
5858
D: _.negate(byStateAC),
59-
f: byFavor,
60-
F: _.negate(byFavor)
59+
s: byStarred,
60+
S: _.negate(byStarred)
6161
};
6262

6363
cmd.handler = function(argv) {
@@ -81,15 +81,15 @@ cmd.handler = function(argv) {
8181
});
8282
}
8383

84-
var stat = {locked: 0, favor: 0};
84+
var stat = {locked: 0, starred: 0};
8585
problems.forEach(function(problem) {
8686
stat[problem.level] = (stat[problem.level] || 0) + 1;
8787
stat[problem.state] = (stat[problem.state] || 0) + 1;
8888
if (problem.locked) ++stat.locked;
89-
if (problem.favor) ++stat.favor;
89+
if (problem.starred) ++stat.starred;
9090

9191
log.info(sprintf('%s %s %s [%3d] %-60s %-6s (%.2f %%)',
92-
(problem.favor ? chalk.yellow('★') : ' '),
92+
(problem.starred ? chalk.yellow('★') : ' '),
9393
(problem.locked ? '🔒' : ' '),
9494
h.prettyState(problem.state),
9595
problem.id,
@@ -100,11 +100,11 @@ cmd.handler = function(argv) {
100100

101101
if (argv.stat) {
102102
log.info();
103-
log.info(sprintf(' All: %-9d Listed: %-9d', all, problems.length));
104-
log.info(sprintf(' Lock: %-9d Favor: %-9d', stat.locked, stat.favor));
105-
log.info(sprintf(' AC: %-9d Not-AC: %-9d New: %-9d',
103+
log.info(sprintf(' All: %-9d Listed: %-9d', all, problems.length));
104+
log.info(sprintf(' Locked: %-9d Starred: %-9d', stat.locked, stat.starred));
105+
log.info(sprintf(' Accept: %-9d Not-AC: %-9d New: %-9d',
106106
(stat.ac || 0), (stat.notac || 0), (stat.None || 0)));
107-
log.info(sprintf(' Easy: %-9d Medium: %-9d Hard: %-9d',
107+
log.info(sprintf(' Easy: %-9d Medium: %-9d Hard: %-9d',
108108
(stat.Easy || 0), (stat.Medium || 0), (stat.Hard || 0)));
109109
}
110110
});

lib/commands/show.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ cmd.handler = function(argv) {
4949
log.info(sprintf('[%d] %s %s\t%s\n',
5050
problem.id,
5151
problem.name,
52-
(problem.favor ? chalk.yellow('★') : ' '),
52+
(problem.starred ? chalk.yellow('★') : ' '),
5353
msg));
5454
log.info(sprintf('%s\n', chalk.underline(problem.link)));
5555
log.info(sprintf('* %s (%.2f%%)', problem.level, problem.percent));

lib/commands/star.js

+21-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,35 @@
1+
var chalk = require('chalk');
12
var log = require('loglevel');
3+
var sprintf = require('sprintf-js').sprintf;
4+
25
var core = require('../core');
3-
var h = require('../helper');
46

57
var cmd = {
68
command: 'star <keyword>',
7-
desc: 'star problem by name or index'
9+
desc: 'Star problem by name or index',
10+
builder: {
11+
delete: {
12+
alias: 'd',
13+
type: 'boolean',
14+
describe: 'Unstar the problem',
15+
default: false
16+
}
17+
}
818
};
919

1020
cmd.handler = function(argv) {
1121
core.getProblem(argv.keyword, function(e, problem) {
1222
if (e) return log.fail(e);
13-
core.starProblem(problem, function(e) {
23+
24+
core.starProblem(problem, !argv.delete, function(e, starred) {
1425
if (e) return log.fail(e);
15-
log.info(h.prettyText(' Starred', true));
26+
27+
log.info(sprintf('[%d] %s %s',
28+
problem.id,
29+
problem.name,
30+
chalk.yellow(starred ? '★' : '☆')));
31+
32+
core.updateProblem(problem, {starred: starred});
1633
});
1734
});
1835
};

lib/core.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var _ = require('underscore');
2+
var log = require('loglevel');
23

34
var cache = require('./cache');
45
var config = require('./config');
@@ -8,7 +9,10 @@ var core = {};
89

910
core.getProblems = function(cb) {
1011
var cached = cache.get('all');
11-
if (cached) return cb(null, cached);
12+
if (cached) {
13+
log.debug('loading from all.json');
14+
return cb(null, cached);
15+
}
1216

1317
client.getProblems(function(e, problems) {
1418
if (e) return cb(e);
@@ -31,7 +35,10 @@ core.getProblem = function(keyword, cb) {
3135
return cb('Problem not found!');
3236

3337
var cached = cache.get(problem.key);
34-
if (cached) return cb(null, cached);
38+
if (cached) {
39+
log.debug('loading from ' + problem.key + '.json');
40+
return cb(null, cached);
41+
}
3542

3643
client.getProblem(problem, function(e, problem) {
3744
if (e) return cb(e);
@@ -68,11 +75,20 @@ core.updateProblem = function(problem, kv) {
6875
if (!oldProblem) return false;
6976

7077
_.extend(oldProblem, kv);
71-
return cache.set('all', problems);
78+
_.extend(problem, kv);
79+
80+
var singleUpdated = cache.set(problem.key, problem);
81+
var allUpdated = cache.set('all', problems);
82+
return singleUpdated && allUpdated;
7283
};
7384

74-
core.starProblem = function(problem, cb) {
75-
client.starProblem(problem, cb);
85+
core.starProblem = function(problem, starred, cb) {
86+
if (problem.starred === starred) {
87+
log.debug('problem is already ' + (starred ? 'starred' : 'unstarred'));
88+
return cb(null, starred);
89+
}
90+
91+
client.starProblem(problem, starred, cb);
7692
};
7793

7894
core.login = function(user, cb) {

lib/leetcode_client.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ leetcodeClient.getProblems = function(cb) {
100100
locked: p.paid_only,
101101
percent: p.stat.total_acs * 100 / p.stat.total_submitted,
102102
level: h.levelToName(p.difficulty.level),
103-
favor: p.is_favor
103+
starred: p.is_favor
104104
};
105105
});
106106

@@ -315,9 +315,9 @@ leetcodeClient.submitProblem = function(problem, cb) {
315315
});
316316
};
317317

318-
leetcodeClient.starProblem = function(problem, cb) {
318+
leetcodeClient.starProblem = function(problem, starred, cb) {
319319
var opts = makeOpts(config.URL_STAR);
320-
opts.method = 'POST';
320+
opts.method = (starred ? 'POST' : 'DELETE');
321321
opts.headers.Origin = config.URL_BASE;
322322
opts.headers.Referer = problem.link;
323323
opts.headers['X-Requested-With'] = 'XMLHttpRequest';
@@ -326,7 +326,9 @@ leetcodeClient.starProblem = function(problem, cb) {
326326

327327
requestWithReLogin(opts, function(e, resp, body) {
328328
e = checkError(e, resp, 200);
329-
cb(e);
329+
if (e) return cb(e);
330+
331+
cb(null, body.is_favor);
330332
});
331333
};
332334

test/test_leetcode_client.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,9 @@ describe('leetcode_client', function() {
268268
.post('/problems/favor/')
269269
.reply(200, '{"is_favor": true}');
270270

271-
client.starProblem(problem, function(e) {
271+
client.starProblem(problem, true, function(e, starred) {
272272
assert.equal(e, null);
273+
assert.equal(starred, true);
273274
done();
274275
});
275276
});

0 commit comments

Comments
 (0)