Skip to content

Commit e41491b

Browse files
committed
fix: zjooc and cx can be chosen now
1 parent 0639642 commit e41491b

File tree

4 files changed

+81
-107
lines changed

4 files changed

+81
-107
lines changed

collector/collector.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package collector
2+
3+
type collector[T any] struct {
4+
Add chan T
5+
todo []T
6+
errs []error
7+
ErrCollector chan error
8+
done chan struct{}
9+
}
10+
11+
func New[T any]() *collector[T] {
12+
c := collector[T]{
13+
Add: make(chan T, 8),
14+
todo: make([]T, 0, 4),
15+
ErrCollector: make(chan error, 8),
16+
done: make(chan struct{}),
17+
}
18+
go func() {
19+
for {
20+
select {
21+
case <-c.done:
22+
return
23+
case a := <-c.Add:
24+
c.todo = append(c.todo, a)
25+
}
26+
}
27+
}()
28+
go func() {
29+
for {
30+
select {
31+
case err := <-c.ErrCollector:
32+
if err != nil {
33+
c.errs = append(c.errs, err)
34+
}
35+
case <-c.done:
36+
return
37+
}
38+
}
39+
}()
40+
return &c
41+
}
42+
43+
func (c *collector[T]) Done() ([]T, []error) {
44+
c.done <- struct{}{}
45+
c.done <- struct{}{}
46+
return c.todo, c.errs
47+
}

cx.go

+9-52
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package main
22

33
import (
4+
"ddl-api/collector"
45
"errors"
56
"fmt"
67
cx "github.com/hduLib/hdu/chaoxing"
7-
"github.com/hduLib/hdu/client"
88
"sync"
99
)
1010

11-
func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
11+
func GettingCxddl(account, passwd, Type string) ([]DDL, []error) {
1212
var user *cx.Cx
1313
var err error
1414
if Type == "cx" {
@@ -29,10 +29,7 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
2929
if err != nil {
3030
return nil, []error{fmt.Errorf("get course list fail:%v", err)}
3131
}
32-
33-
var todo []ddl
34-
errCollector := make(chan error, 8)
35-
add := make(chan ddl, 8)
32+
collect := collector.New[DDL]()
3633
wg := &sync.WaitGroup{}
3734
for _, course := range list.Courses {
3835
course := course
@@ -41,28 +38,20 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
4138
defer wg.Done()
4239
c, err := course.Detail()
4340
if err != nil {
44-
if err, ok := err.(*client.ErrNotOk); ok {
45-
errCollector <- fmt.Errorf("fail to get course detail:status code %d: %s", err.StatusCode, err.Body)
46-
return
47-
}
48-
errCollector <- fmt.Errorf("fail to get course detail:%v", err)
41+
collect.ErrCollector <- fmt.Errorf("fail to get course detail:%v", err)
4942
return
5043
}
5144
wg.Add(1)
5245
go func() {
5346
defer wg.Done()
5447
workList, err := c.WorkList()
5548
if err != nil {
56-
if err, ok := err.(*client.ErrNotOk); ok {
57-
errCollector <- fmt.Errorf("fail to get work list:status code %d: %s", err.StatusCode, err.Body)
58-
return
59-
}
60-
errCollector <- fmt.Errorf("fail to get work list:%v", err)
49+
collect.ErrCollector <- fmt.Errorf("fail to get work list:%v", err)
6150
return
6251
}
6352
for _, v := range workList.Works {
6453
if v.Status == "未交" && v.Time.Unix() != 0 {
65-
add <- ddl{
54+
collect.Add <- DDL{
6655
course.Title, v.Title, v.Time.Unix(), "作业", "超星",
6756
}
6857
}
@@ -73,51 +62,19 @@ func GettingCxddl(account, passwd, Type string) ([]ddl, []error) {
7362
defer wg.Done()
7463
examList, err := c.ExamList()
7564
if err != nil {
76-
errCollector <- fmt.Errorf("fail to get exam list:%v", err)
65+
collect.ErrCollector <- fmt.Errorf("fail to get exam list:%v", err)
7766
return
7867
}
7968
for _, v := range examList.Exams {
8069
if v.Status == "待做" {
81-
add <- ddl{
70+
collect.Add <- DDL{
8271
course.Title, v.Title, v.Time.Unix(), "考试", "超星",
8372
}
8473
}
8574
}
8675
}()
8776
}()
8877
}
89-
// collector
90-
Done := make(chan struct{})
91-
go func() {
92-
for {
93-
select {
94-
case <-Done:
95-
return
96-
case a := <-add:
97-
todo = append(todo, a)
98-
}
99-
}
100-
}()
101-
// fmt.Println("tasks:", tasks)
102-
var errs []error
103-
go func() {
104-
for {
105-
select {
106-
case err := <-errCollector:
107-
if err != nil {
108-
errs = append(errs, err)
109-
}
110-
case <-Done:
111-
return
112-
}
113-
}
114-
}()
11578
wg.Wait()
116-
// close 2 goroutine
117-
Done <- struct{}{}
118-
Done <- struct{}{}
119-
if errs != nil {
120-
return nil, errs
121-
}
122-
return todo, nil
79+
return collect.Done()
12380
}

main.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"sync"
1111
)
1212

13-
const threads = 32
13+
const threads = 64
1414

15-
type ddl struct {
15+
type DDL struct {
1616
Course string `json:"course"`
1717
Title string `json:"title"`
1818
Time int64 `json:"time"`
@@ -31,7 +31,7 @@ var port int
3131
var lock = new(sync.Mutex)
3232
var wg sync.WaitGroup
3333

34-
func getAndAppend(ddls *[]ddl, errs *[]error, f func() ([]ddl, []error)) {
34+
func getAndAppend(ddls *[]DDL, errs *[]error, f func() ([]DDL, []error)) {
3535
d, e := f()
3636
lock.Lock()
3737
defer func() {
@@ -43,20 +43,25 @@ func getAndAppend(ddls *[]ddl, errs *[]error, f func() ([]ddl, []error)) {
4343
}
4444

4545
func handleRequest(c *gin.Context) {
46-
var ddls []ddl
46+
var ddls []DDL
4747
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-
})
48+
if c.Query("cx_account") != "" {
49+
wg.Add(1)
50+
go getAndAppend(&ddls, &errs, func() ([]DDL, []error) {
51+
return GettingCxddl(c.Query("cx_account"), c.Query("cx_passwd"), c.Query("cx_loginType"))
52+
})
53+
}
54+
if c.Query("zjooc_account") != "" {
55+
wg.Add(1)
56+
go getAndAppend(&ddls, &errs, func() ([]DDL, []error) {
57+
return GettingZjoocDdl(c.Query("zjooc_account"), c.Query("zjooc_passwd"))
58+
})
59+
}
5560
wg.Wait()
5661
if errs != nil {
5762
c.JSON(http.StatusBadRequest, &RespForm{
5863
Code: -1,
59-
Data: nil,
64+
Data: ddls,
6065
Errors: errs2strs(errs),
6166
})
6267
return

zjooc.go

+8-43
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package main
22

33
import (
4+
"ddl-api/collector"
45
"fmt"
56
"github.com/hduLib/hdu/zjooc"
67
"sync"
78
"time"
89
)
910

10-
func GettingZjoocDdl(account, passwd string) ([]ddl, []error) {
11+
func GettingZjoocDdl(account, passwd string) ([]DDL, []error) {
1112
user, err := zjooc.Login(account, passwd)
1213
if err != nil {
1314
return nil, []error{fmt.Errorf("zjooc login fail:%v", err)}
@@ -17,27 +18,25 @@ func GettingZjoocDdl(account, passwd string) ([]ddl, []error) {
1718
return nil, []error{fmt.Errorf("get zjooc course list fail:%v", err)}
1819
}
1920

20-
var todo []ddl
21-
errCollector := make(chan error, 8)
22-
add := make(chan ddl, 8)
21+
collect := collector.New[DDL]()
2322
wg := &sync.WaitGroup{}
2423
for _, course := range list {
2524
course := course
2625
find := func(Type int, typename string) {
2726
defer wg.Done()
2827
workList, err := user.PapersByCourse(course.Id, Type, course.BatchId)
2928
if err != nil {
30-
errCollector <- fmt.Errorf("fail to get zjooc assignment list:%v", err)
29+
collect.ErrCollector <- fmt.Errorf("fail to get zjooc assignment list:%v", err)
3130
return
3231
}
3332
for _, v := range workList {
3433
if v.ReviewStatus == 0 && v.ProcessStatus == 0 {
3534
t, err := time.Parse("2006-01-02T15:04:05.000-0700", v.EndTime)
3635
if err != nil {
37-
errCollector <- fmt.Errorf("fail to get zjooc assignment:%v", err)
36+
collect.ErrCollector <- fmt.Errorf("fail to get zjooc assignment:%v", err)
3837
return
3938
}
40-
add <- ddl{
39+
collect.Add <- DDL{
4140
v.CourseName, v.PaperName, t.Unix(), typename, "在浙学",
4241
}
4342
}
@@ -46,46 +45,12 @@ func GettingZjoocDdl(account, passwd string) ([]ddl, []error) {
4645
wg.Add(1)
4746
go func() {
4847
defer wg.Done()
49-
wg.Add(1)
48+
wg.Add(3)
5049
find(zjooc.Assignment, "作业")
51-
wg.Add(1)
5250
find(zjooc.Test, "测验")
53-
wg.Add(1)
5451
find(zjooc.Exam, "考试")
5552
}()
5653
}
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-
}()
8354
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
55+
return collect.Done()
9156
}

0 commit comments

Comments
 (0)