diff --git a/modules/database/database_struct.go b/modules/database/database_struct.go index 0345c10..9a5a2e5 100644 --- a/modules/database/database_struct.go +++ b/modules/database/database_struct.go @@ -15,8 +15,16 @@ type TgUser struct { type Group struct { GroupId int64 `xorm:"pk"` - groupName string - specName string + GroupName string + SpecName string +} + +type Teacher struct { + TeacherId int64 `xorm:"pk"` + LastName string + FirstName string + MidName string + SpecName string } type Lesson struct { diff --git a/modules/database/mysql.go b/modules/database/mysql.go index dd0611f..33e432e 100644 --- a/modules/database/mysql.go +++ b/modules/database/mysql.go @@ -17,7 +17,7 @@ func Connect(user, pass, db string) (*xorm.Engine, error) { engine.ShowSQL(true) engine.SetMapper(names.SameMapper{}) - err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}) + err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{}) if err != nil { return nil, err } diff --git a/modules/ssau_parser/database.go b/modules/ssau_parser/database.go index 55ec338..b0be390 100644 --- a/modules/ssau_parser/database.go +++ b/modules/ssau_parser/database.go @@ -1,11 +1,20 @@ package ssau_parser import ( + "log" + "strconv" + "strings" + "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "xorm.io/xorm" ) func uploadShedule(db *xorm.Engine, sh Shedule) error { + err := addGroupOrTeacher(db, sh) + if err != nil { + return err + } + var pairs []database.Lesson for _, line := range sh.Lessons { for _, lesson := range line { @@ -18,10 +27,48 @@ func uploadShedule(db *xorm.Engine, sh Shedule) error { Name: subLesson.Name, TeacherId: subLesson.TeacherId, } + + exists, err := isTeacherExists(db, subLesson.TeacherId) + if err != nil { + return err + } + + if !exists && subLesson.TeacherId != 0 { + uri := "/rasp?staffId=" + strconv.FormatInt(subLesson.TeacherId, 10) + doc, _, _, err := Connect(uri, sh.Week) + if err != nil { + return err + } + var gr Shedule + gr.IsGroup = false + gr.SheduleId = subLesson.TeacherId + GetSheduleInfo(doc, &gr) + addGroupOrTeacher(db, gr) + } + for _, groupId := range subLesson.GroupId { pair.GroupId = groupId + + exists, err := isGroupExists(db, groupId) + if err != nil { + return err + } + + if !exists { + uri := "/rasp?groupId=" + strconv.FormatInt(groupId, 10) + doc, _, _, err := Connect(uri, sh.Week) + if err != nil { + return err + } + var gr Shedule + gr.IsGroup = true + gr.SheduleId = groupId + GetSheduleInfo(doc, &gr) + addGroupOrTeacher(db, gr) + } + var existsLessons []database.Lesson - err := db.Find(&existsLessons, pair) + err = db.Find(&existsLessons, pair) if err != nil { return err } @@ -41,3 +88,61 @@ func uploadShedule(db *xorm.Engine, sh Shedule) error { } return nil } + +func isGroupExists(db *xorm.Engine, groupId int64) (bool, error) { + var exists []database.Group + err := db.Find(&exists, database.Group{GroupId: groupId}) + if err != nil { + return false, err + } + + return len(exists) == 1, nil +} + +func isTeacherExists(db *xorm.Engine, teacherId int64) (bool, error) { + var exists []database.Teacher + err := db.Find(&exists, database.Teacher{TeacherId: teacherId}) + if err != nil { + return false, err + } + + return len(exists) == 1, nil +} + +func addGroupOrTeacher(db *xorm.Engine, sh Shedule) error { + if sh.IsGroup { + exists, err := isGroupExists(db, sh.SheduleId) + if err != nil { + return err + } + + if !exists { + group := database.Group{ + GroupId: sh.SheduleId, + GroupName: sh.GroupName, + SpecName: sh.SpecName, + } + db.InsertOne(group) + } + } else { + exists, err := isTeacherExists(db, sh.SheduleId) + if err != nil { + return err + } + + if !exists { + name := strings.Split(sh.GroupName, " ") + log.Println(name) + teacher := database.Teacher{ + TeacherId: sh.SheduleId, + LastName: name[0], + FirstName: name[1], + MidName: name[2], + SpecName: sh.SpecName, + } + db.InsertOne(teacher) + } + + } + return nil +} diff --git a/modules/ssau_parser/shedule.go b/modules/ssau_parser/shedule.go index ce5497d..9102b9b 100644 --- a/modules/ssau_parser/shedule.go +++ b/modules/ssau_parser/shedule.go @@ -1,7 +1,6 @@ package ssau_parser import ( - "log" "strconv" "strings" "time" @@ -28,15 +27,21 @@ type SubLesson struct { type Shedule struct { IsGroup bool SheduleId int64 + GroupName string SpecName string Week int Lessons [][]Lesson } +func GetSheduleInfo(doc *goquery.Document, sh *Shedule) { + sh.SpecName = doc.Find(".info-block__description div").First().Text()[1:] + sh.GroupName = doc.Find(".info-block__title").First().Text()[1:] +} + // Parse goquery shedule site -func Parse(doc *goquery.Document, isGroup bool, sheduleId int64) (*Shedule, error) { - spec := doc.Find(".info-block__description div").First().Text()[1:] - log.Println(spec) +func Parse(doc *goquery.Document, isGroup bool, sheduleId int64, week int) (*Shedule, error) { + var sh Shedule + GetSheduleInfo(doc, &sh) var raw_dates []string doc.Find(".schedule__head-date").Each(func(i int, s *goquery.Selection) { @@ -81,7 +86,11 @@ func Parse(doc *goquery.Document, isGroup bool, sheduleId int64) (*Shedule, erro } shedule = append(shedule, time_line) } - return &Shedule{SpecName: spec, Lessons: shedule}, nil + sh.IsGroup = isGroup + sh.SheduleId = sheduleId + sh.Week = week + sh.Lessons = shedule + return &sh, nil } var types = [4]string{"lect", "lab", "pract", "other"} diff --git a/modules/ssau_parser/ssau_parser_test.go b/modules/ssau_parser/ssau_parser_test.go index e6d5e79..627fd85 100644 --- a/modules/ssau_parser/ssau_parser_test.go +++ b/modules/ssau_parser/ssau_parser_test.go @@ -30,16 +30,17 @@ func TestConnect(t *testing.T) { } func TestParse(t *testing.T) { - list, err := FindInRasp("2207") + list, err := FindInRasp("2305") if err != nil { t.Error(err) } + week := 5 uri := list[0].Url - doc, is, gr, err := Connect(uri, 5) + doc, is, gr, err := Connect(uri, week) if err != nil { t.Error(err) } - shedule, err := Parse(doc, is, gr) + shedule, err := Parse(doc, is, gr, week) if err != nil { t.Error(err) } @@ -49,6 +50,9 @@ func TestParse(t *testing.T) { } engine, err := database.Connect(os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASS"), os.Getenv("MYSQL_DB")) + if err != nil { + t.Error(err) + } err = uploadShedule(engine, *shedule) if err != nil { t.Error(err)