@@ -2,17 +2,15 @@ package main
2
2
3
3
import (
4
4
"bufio"
5
- "encoding/json"
6
5
"flag"
7
6
"fmt"
8
7
"os"
9
8
"os/exec"
10
9
"path/filepath"
11
- "strconv"
12
10
"strings"
11
+ "sync"
13
12
"time"
14
13
15
- "github.com/PuerkitoBio/goquery"
16
14
"github.com/briandowns/spinner"
17
15
)
18
16
@@ -38,29 +36,19 @@ type Session struct {
38
36
Cookie string `json:"cookie"`
39
37
Root string `json:"root"`
40
38
Editor string `json:"editor"`
41
- Lang string `json:"lang"`
39
+ Lang string `json:"lang"`
42
40
Github githubConfig `json:"github"`
43
41
}
44
42
45
- // var cpptemplate = `
46
- // #include<bits/stdc++.h>
47
- // using namespace std;
48
-
49
- // int main(){
50
-
51
- // return 0;
52
- // }
53
- // `
54
-
55
43
func initSess (sess * Session ) bool {
56
44
os .MkdirAll (sess .Root , os .ModePerm )
57
45
58
- out , ok := cacheGet ("config.json" , sess .Root )
46
+ ok := cacheGet ("config.json" , sess , sess .Root )
59
47
if ! ok {
60
48
return false
61
49
}
62
50
63
- json .Unmarshal (out , sess )
51
+ // json.Unmarshal(out, sess)
64
52
if sess .Csrf == "" || sess .User == "" || sess .Cookie == "" {
65
53
return false
66
54
}
@@ -78,64 +66,56 @@ func login(sess *Session, pass string) bool {
78
66
}
79
67
80
68
func promtLogin (sess * Session ) bool {
81
- scanner := bufio .NewScanner (os .Stdin )
82
69
70
+ var wg sync.WaitGroup
71
+ wg .Add (1 )
72
+ go func () {
73
+ sess .Cookie , sess .Csrf = newCookieCsrf ()
74
+ wg .Done ()
75
+ }()
76
+
77
+ scanner := bufio .NewScanner (os .Stdin )
83
78
updateIfNew (scanner , & sess .User , "Username" )
84
79
85
80
fmt .Print ("Password: " )
86
81
scanner .Scan ()
87
82
PASSWORD := scanner .Text ()
88
83
89
- sess .Cookie , sess .Csrf = newCookieCsrf ()
84
+ s := spinner .New (spinner .CharSets [36 ], 100 * time .Millisecond )
85
+ s .Prefix = "Logging "
86
+
87
+ s .Start ()
88
+ wg .Wait ()
90
89
ok := login (sess , PASSWORD )
90
+ s .Stop ()
91
91
92
92
if ! ok {
93
93
return false
94
94
}
95
95
96
- updateConfig (sess )
97
-
96
+ cacheSet ("config.json" , sess , sess .Root )
98
97
return true
99
98
}
100
99
101
- func list (sess * Session ) {
102
-
103
- doc , err := goquery .NewDocumentFromReader (listRequest (sess .Cookie ))
104
- check (err )
105
-
106
- doc .Find (".task" ).Each (func (i int , s * goquery.Selection ) {
107
-
108
- solved := "✘"
109
-
110
- a := s .Find ("a" )
111
- link , _ := a .Attr ("href" )
112
- taskNumber := link [17 :]
113
- title := a .Text ()
114
-
115
- hitRatio := strings .Split (s .Find ("span" ).Text (), "/" )
116
- n , err := strconv .ParseFloat (strings .TrimSpace (hitRatio [0 ]), 64 )
117
- check (err )
118
- d , err := strconv .ParseFloat (strings .TrimSpace (hitRatio [1 ]), 64 )
119
- check (err )
120
-
121
- percent := n * 100 / d
122
-
123
- s .Find (".task-score" ).Each (func (o int , k * goquery.Selection ) {
124
- st , _ := k .Attr ("class" )
125
- if strings .Contains (st , "full" ) {
126
- solved = "✔"
127
- } else if "task-score icon " == st {
128
- solved = "-"
129
- }
130
- })
100
+ func updateProblemListCache (sess * Session ) {
101
+ s := spinner .New (spinner .CharSets [14 ], 100 * time .Millisecond )
102
+ s .Prefix = "Updating Problem List "
103
+ s .Start ()
104
+ problems := listRequest (sess .Cookie )
105
+ cacheSet ("problemList.json" , problems , sess .Root )
106
+ s .Stop ()
107
+ }
131
108
132
- fmt .Printf ("\t %s [%s] %-25s (%.1f %%)\n " , solved , taskNumber , title , percent )
133
- })
109
+ func list (sess * Session ) {
110
+ var problems = []* Problem {}
111
+ cacheGet ("problemList.json" , & problems , sess .Root )
134
112
113
+ for _ , v := range problems {
114
+ fmt .Printf ("\t %s [%s] %-25s (%.1f %%)\n " , v .Solved , v .Task , v .Title , v .HitRatio )
115
+ }
135
116
}
136
117
137
118
func printResult (link string , sess * Session ) bool {
138
-
139
119
s := spinner .New (spinner .CharSets [14 ], 100 * time .Millisecond )
140
120
s .Prefix = "PENDING "
141
121
s .Start ()
@@ -171,17 +151,22 @@ func submit(sourceFile string, sess *Session) {
171
151
172
152
link := submitRequest (opts , sourceFile , sess .Cookie )
173
153
174
- if verdict := printResult (link , sess ); verdict && validGithubConfig (& sess .Github ) {
175
- s := spinner .New (spinner .CharSets [36 ], 100 * time .Millisecond )
176
- s .Prefix = "Committing to Github"
177
- s .Start ()
178
- if ok := updateFile (sourceFile , & sess .Github ); ok {
179
- s .Stop ()
180
- fmt .Println ("Github: " + sess .Github .SourceRepo + " ✔" )
181
- } else {
182
- s .Stop ()
183
- fmt .Println ("Github: ✘" )
154
+ if verdict := printResult (link , sess ); verdict {
155
+ go updateListByTask (opts ["task" ], "✔" , sess .Root )
156
+ if validGithubConfig (& sess .Github ) {
157
+ s := spinner .New (spinner .CharSets [36 ], 100 * time .Millisecond )
158
+ s .Prefix = "Committing to Github"
159
+ s .Start ()
160
+ if ok := updateFile (sourceFile , & sess .Github ); ok {
161
+ s .Stop ()
162
+ fmt .Println ("Github: " + sess .Github .SourceRepo + " ✔" )
163
+ } else {
164
+ s .Stop ()
165
+ fmt .Println ("Github: ✘" )
166
+ }
184
167
}
168
+ } else {
169
+ updateListByTask (opts ["task" ], "✘" , sess .Root )
185
170
}
186
171
}
187
172
@@ -194,16 +179,16 @@ func getTask(task string, sess *Session) (string, bool) {
194
179
if os .IsNotExist (err ) {
195
180
s := spinner .New (spinner .CharSets [14 ], 100 * time .Millisecond )
196
181
s .Prefix = "Downloading "
197
- s .Start ()
198
- defer s .Stop ()
199
182
183
+ s .Start ()
200
184
text := downloadTask (task )
185
+ s .Stop ()
186
+
201
187
if text == "" {
202
188
return "" , false
203
189
}
204
190
cacheSet (filename , text , sess .Root )
205
191
}
206
-
207
192
return getTaskFromCache (task , sess .Root ), true
208
193
}
209
194
@@ -237,7 +222,7 @@ func solve(task string, sess *Session) {
237
222
fmt .Println ("Editor still not configured" )
238
223
return
239
224
}
240
- updateConfig ( sess )
225
+ cacheSet ( "config.json" , sess , sess . Root )
241
226
}
242
227
exec .Command (sess .Editor , filename ).Output ()
243
228
}
@@ -250,18 +235,18 @@ func configureGithub(sess *Session) {
250
235
updateIfNew (scanner , & sess .Github .AuthorName , "Github Username" )
251
236
updateIfNew (scanner , & sess .Github .AuthorEmail , "Github Email" )
252
237
253
- updateConfig ( sess )
238
+ cacheSet ( "config.json" , sess , sess . Root )
254
239
}
255
240
256
- func showHelp (){
241
+ func showHelp () {
257
242
fmt .Println ("Usage:" )
258
243
259
244
fmt .Println ("\t cses-cli login" )
260
245
fmt .Println ("\t cses-cli list" )
261
246
fmt .Println ("\t cses-cli show 1068" )
262
247
fmt .Println ("\t cses-cli solve 1068" )
263
248
fmt .Println ("\t cses-cli submit 1068.task.cpp" )
264
-
249
+
265
250
fmt .Println ("Optional:" )
266
251
fmt .Println ("\t cses-cli github" )
267
252
}
@@ -292,6 +277,7 @@ func main() {
292
277
fmt .Println ("Login failed" )
293
278
} else {
294
279
fmt .Println ("Logged in successfully" )
280
+ updateProblemListCache (sess )
295
281
}
296
282
case "list" :
297
283
list (sess )
0 commit comments