-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsubmit.go
120 lines (110 loc) · 2.6 KB
/
submit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/cookiejar"
"os"
"regexp"
"github.com/PuerkitoBio/goquery"
"github.com/akisatoon1/manaba"
)
func submit(args []string) error {
// handle args
var isResubmit bool
var kadaiLevel string
if l := len(args); l == 1 {
if !ReFile.MatchString(args[0]) {
return fmt.Errorf("引数が間違っています")
}
kadaiLevel = args[0]
isResubmit = false
} else if l == 2 {
if args[0] != "-r" {
return fmt.Errorf("引数が間違っています")
}
if !ReFile.MatchString(args[1]) {
return fmt.Errorf("第2引数は英小文字1文字のみです")
}
kadaiLevel = args[1]
isResubmit = true
} else {
return fmt.Errorf("引数の数は1つまたは2つです")
}
username, password, err := getUsernameAndPasswd()
if err != nil {
return err
}
// login
jar, _ := cookiejar.New(nil)
err = manaba.Login(jar, username, password)
if err != nil {
return err
}
// get url to submit
client := &http.Client{Jar: jar}
res, err := client.Get("https://room.chuo-u.ac.jp/ct/course_4932224_report") // URL of 'Cプロ演習'
if err != nil {
return err
}
defer res.Body.Close()
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil && err != io.EOF {
return err
}
kadaiNum := getKadaiNum() // ex. kadai[01]a
kadaiName := "kadai" + kadaiNum + kadaiLevel // 後で
reg := regexp.MustCompile(kadaiName)
var a *goquery.Selection
doc.Find("h3.report-title").Find("a").EachWithBreak(func(_ int, s *goquery.Selection) bool {
if reg.MatchString(s.Text()) {
a = s
return false
}
return true
})
if a == nil {
return fmt.Errorf(kadaiName)
}
url, _ := a.Attr("href")
url = "https://room.chuo-u.ac.jp/ct/" + url
if isResubmit {
err = manaba.CancelSubmittion(jar, url)
if err != nil {
return err
}
err = manaba.DeleteAllFiles(jar, url)
if err != nil {
return err
}
fmt.Printf("'%v'のレポートを提出取り消ししました\n", kadaiName)
}
// submit flow
fileName := kadaiName + ".c"
err = manaba.UploadFile(jar, url, fileName)
if err != nil {
return err
}
err = manaba.SubmitReports(jar, url)
if err != nil {
return err
}
fmt.Printf("'%v'を提出しました\n", fileName)
return nil
}
func getUsernameAndPasswd() (string, string, error) {
body, err := os.ReadFile(ExeDir + "/login.json")
if err != nil {
return "", "", err
}
userData := struct {
Username string `json:"username"`
Password string `json:"password"`
}{}
err = json.Unmarshal(body, &userData)
if err != nil {
return "", "", err
}
return userData.Username, userData.Password, nil
}