Skip to content

Commit 0639642

Browse files
committed
feat: zjooc
fix: wait forever
1 parent d43594f commit 0639642

File tree

5 files changed

+136
-13
lines changed

5 files changed

+136
-13
lines changed

cx.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"errors"
55
"fmt"
66
cx "github.com/hduLib/hdu/chaoxing"
7-
"github.com/hduLib/hdu/net"
7+
"github.com/hduLib/hdu/client"
88
"sync"
99
)
1010

@@ -38,9 +38,10 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
3838
course := course
3939
wg.Add(1)
4040
go func() {
41+
defer wg.Done()
4142
c, err := course.Detail()
4243
if err != nil {
43-
if err, ok := err.(*net.ErrNotOk); ok {
44+
if err, ok := err.(*client.ErrNotOk); ok {
4445
errCollector <- fmt.Errorf("fail to get course detail:status code %d: %s", err.StatusCode, err.Body)
4546
return
4647
}
@@ -49,9 +50,10 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
4950
}
5051
wg.Add(1)
5152
go func() {
53+
defer wg.Done()
5254
workList, err := c.WorkList()
5355
if err != nil {
54-
if err, ok := err.(*net.ErrNotOk); ok {
56+
if err, ok := err.(*client.ErrNotOk); ok {
5557
errCollector <- fmt.Errorf("fail to get work list:status code %d: %s", err.StatusCode, err.Body)
5658
return
5759
}
@@ -65,10 +67,10 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
6567
}
6668
}
6769
}
68-
wg.Done()
6970
}()
7071
wg.Add(1)
7172
go func() {
73+
defer wg.Done()
7274
examList, err := c.ExamList()
7375
if err != nil {
7476
errCollector <- fmt.Errorf("fail to get exam list:%v", err)
@@ -81,9 +83,7 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
8183
}
8284
}
8385
}
84-
wg.Done()
8586
}()
86-
wg.Done()
8787
}()
8888
}
8989
// collector

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.19
44

55
require (
66
github.com/gin-gonic/gin v1.8.1
7-
github.com/hduLib/hdu v0.0.0-20221104115041-1fbd284df8eb
7+
github.com/hduLib/hdu v0.0.0-20221109082842-2f2a8910069d
88
)
99

1010
require (
@@ -21,6 +21,9 @@ require (
2121
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
2222
github.com/modern-go/reflect2 v1.0.2 // indirect
2323
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
24+
github.com/tidwall/gjson v1.14.2 // indirect
25+
github.com/tidwall/match v1.1.1 // indirect
26+
github.com/tidwall/pretty v1.2.0 // indirect
2427
github.com/ugorji/go/codec v1.2.7 // indirect
2528
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
2629
golang.org/x/net v0.1.0 // indirect

go.sum

+8-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
2424
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
2525
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2626
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
27-
github.com/hduLib/hdu v0.0.0-20221104115041-1fbd284df8eb h1:Ftt2ol6LSLh/eJivRaDG6VXm5Kx71bZ6c7F/vtFIMCs=
28-
github.com/hduLib/hdu v0.0.0-20221104115041-1fbd284df8eb/go.mod h1:ETz0Es+bQwkOUFOn01rjJovN57eDg8RQbKTuw34g4u4=
27+
github.com/hduLib/hdu v0.0.0-20221109082842-2f2a8910069d h1:SZMxATQehnCfMzXchC0qRB1PlHMk4UjCjqrKvCm+754=
28+
github.com/hduLib/hdu v0.0.0-20221109082842-2f2a8910069d/go.mod h1:m/fQPKtYdFhvvoeYaq2jgoZlJsdTRmHbwjjbTWENIeE=
2929
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
3030
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
3131
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -58,6 +58,12 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
5858
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5959
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
6060
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
61+
github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo=
62+
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
63+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
64+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
65+
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
66+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
6167
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
6268
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
6369
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=

main.go

+27-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package main
22

33
import (
4-
"ddl-api/client"
4+
rateClient "ddl-api/client"
55
"flag"
66
"github.com/gin-gonic/gin"
7-
"github.com/hduLib/hdu/net"
7+
"github.com/hduLib/hdu/client"
88
"net/http"
99
"strconv"
10+
"sync"
1011
)
1112

1213
const threads = 32
@@ -27,9 +28,31 @@ type RespForm struct {
2728
}
2829

2930
var port int
31+
var lock = new(sync.Mutex)
32+
var wg sync.WaitGroup
33+
34+
func getAndAppend(ddls *[]ddl, errs *[]error, f func() ([]ddl, []error)) {
35+
d, e := f()
36+
lock.Lock()
37+
defer func() {
38+
lock.Unlock()
39+
wg.Done()
40+
}()
41+
*ddls = append(*ddls, d...)
42+
*errs = append(*errs, e...)
43+
}
3044

3145
func handleRequest(c *gin.Context) {
32-
ddls, errs := GettingCxddl(c.Query("cx_account"), c.Query("cx_passwd"), c.Query("cx_loginType"))
46+
var ddls []ddl
47+
var errs []error
48+
wg.Add(2)
49+
go getAndAppend(&ddls, &errs, func() ([]ddl, []error) {
50+
return GettingCxddl(c.Query("cx_account"), c.Query("cx_passwd"), c.Query("cx_loginType"))
51+
})
52+
go getAndAppend(&ddls, &errs, func() ([]ddl, []error) {
53+
return GettingZjoocDdl(c.Query("zjooc_account"), c.Query("zjooc_passwd"))
54+
})
55+
wg.Wait()
3356
if errs != nil {
3457
c.JSON(http.StatusBadRequest, &RespForm{
3558
Code: -1,
@@ -48,7 +71,7 @@ func handleRequest(c *gin.Context) {
4871
func main() {
4972
flag.IntVar(&port, "p", 8080, "port")
5073
flag.Parse()
51-
net.DefaultClient = client.NewWaitingClient(threads)
74+
client.DefaultClient = rateClient.NewWaitingClient(threads)
5275
r := gin.Default()
5376
r.GET("/ddl/all", handleRequest)
5477
r.Run(":" + strconv.Itoa(port))

zjooc.go

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/hduLib/hdu/zjooc"
6+
"sync"
7+
"time"
8+
)
9+
10+
func GettingZjoocDdl(account, passwd string) ([]ddl, []error) {
11+
user, err := zjooc.Login(account, passwd)
12+
if err != nil {
13+
return nil, []error{fmt.Errorf("zjooc login fail:%v", err)}
14+
}
15+
list, err := user.CurrentCourses(zjooc.Published)
16+
if err != nil {
17+
return nil, []error{fmt.Errorf("get zjooc course list fail:%v", err)}
18+
}
19+
20+
var todo []ddl
21+
errCollector := make(chan error, 8)
22+
add := make(chan ddl, 8)
23+
wg := &sync.WaitGroup{}
24+
for _, course := range list {
25+
course := course
26+
find := func(Type int, typename string) {
27+
defer wg.Done()
28+
workList, err := user.PapersByCourse(course.Id, Type, course.BatchId)
29+
if err != nil {
30+
errCollector <- fmt.Errorf("fail to get zjooc assignment list:%v", err)
31+
return
32+
}
33+
for _, v := range workList {
34+
if v.ReviewStatus == 0 && v.ProcessStatus == 0 {
35+
t, err := time.Parse("2006-01-02T15:04:05.000-0700", v.EndTime)
36+
if err != nil {
37+
errCollector <- fmt.Errorf("fail to get zjooc assignment:%v", err)
38+
return
39+
}
40+
add <- ddl{
41+
v.CourseName, v.PaperName, t.Unix(), typename, "在浙学",
42+
}
43+
}
44+
}
45+
}
46+
wg.Add(1)
47+
go func() {
48+
defer wg.Done()
49+
wg.Add(1)
50+
find(zjooc.Assignment, "作业")
51+
wg.Add(1)
52+
find(zjooc.Test, "测验")
53+
wg.Add(1)
54+
find(zjooc.Exam, "考试")
55+
}()
56+
}
57+
// collector
58+
Done := make(chan struct{})
59+
go func() {
60+
for {
61+
select {
62+
case <-Done:
63+
return
64+
case a := <-add:
65+
todo = append(todo, a)
66+
}
67+
}
68+
}()
69+
// fmt.Println("tasks:", tasks)
70+
var errs []error
71+
go func() {
72+
for {
73+
select {
74+
case err := <-errCollector:
75+
if err != nil {
76+
errs = append(errs, err)
77+
}
78+
case <-Done:
79+
return
80+
}
81+
}
82+
}()
83+
wg.Wait()
84+
// close 2 goroutine
85+
Done <- struct{}{}
86+
Done <- struct{}{}
87+
if errs != nil {
88+
return nil, errs
89+
}
90+
return todo, nil
91+
}

0 commit comments

Comments
 (0)