mirror of
https://github.com/Xevion/banner.git
synced 2025-12-14 14:11:04 -06:00
fix: various lintings, simple improvements
This commit is contained in:
@@ -23,9 +23,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
latestSession string = ""
|
latestSession string
|
||||||
sessionTime time.Time
|
sessionTime time.Time
|
||||||
expiryTime time.Duration = 25 * time.Minute
|
expiryTime = 25 * time.Minute
|
||||||
)
|
)
|
||||||
|
|
||||||
// ResetSessionTimer resets the session timer to the current time.
|
// ResetSessionTimer resets the session timer to the current time.
|
||||||
@@ -175,7 +175,7 @@ func (term BannerTerm) Archived() bool {
|
|||||||
|
|
||||||
// GetTerms retrieves and parses the term information for a given search term.
|
// GetTerms retrieves and parses the term information for a given search term.
|
||||||
// Page number must be at least 1.
|
// Page number must be at least 1.
|
||||||
func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
|
func GetTerms(search string, page int, maxResults int) ([]BannerTerm, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if page <= 0 {
|
if page <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -185,7 +185,7 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
// Page vs Offset is not a mistake here, the API uses "offset" as the page number
|
// Page vs Offset is not a mistake here, the API uses "offset" as the page number
|
||||||
"offset": strconv.Itoa(page),
|
"offset": strconv.Itoa(page),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
terms := make([]BannerTerm, 0, 10)
|
terms := make([]BannerTerm, 0, 10)
|
||||||
json.Unmarshal(body, &terms)
|
err = json.Unmarshal(body, &terms)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse terms: %w", err)
|
return nil, fmt.Errorf("failed to parse terms: %w", err)
|
||||||
@@ -225,14 +225,14 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
|
|||||||
|
|
||||||
// SelectTerm selects the given term in the Banner system.
|
// SelectTerm selects the given term in the Banner system.
|
||||||
// This function completes the initial term selection process, which is required before any other API calls can be made with the session ID.
|
// This function completes the initial term selection process, which is required before any other API calls can be made with the session ID.
|
||||||
func SelectTerm(term string, sessionId string) error {
|
func SelectTerm(term string, sessionID string) error {
|
||||||
form := url.Values{
|
form := url.Values{
|
||||||
"term": {term},
|
"term": {term},
|
||||||
"studyPath": {""},
|
"studyPath": {""},
|
||||||
"studyPathText": {""},
|
"studyPathText": {""},
|
||||||
"startDatepicker": {""},
|
"startDatepicker": {""},
|
||||||
"endDatepicker": {""},
|
"endDatepicker": {""},
|
||||||
"uniqueSessionId": {sessionId},
|
"uniqueSessionId": {sessionID},
|
||||||
}
|
}
|
||||||
|
|
||||||
params := map[string]string{
|
params := map[string]string{
|
||||||
@@ -249,7 +249,7 @@ func SelectTerm(term string, sessionId string) error {
|
|||||||
|
|
||||||
// Assert that the response is JSON
|
// Assert that the response is JSON
|
||||||
if !utils.ContentTypeMatch(res, "application/json") {
|
if !utils.ContentTypeMatch(res, "application/json") {
|
||||||
return fmt.Errorf("response was not JSON: %w", res.Header.Get("Content-Type"))
|
return fmt.Errorf("response was not JSON: %s", res.Header.Get("Content-Type"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Acquire fwdUrl
|
// Acquire fwdUrl
|
||||||
@@ -260,12 +260,12 @@ func SelectTerm(term string, sessionId string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var redirectResponse struct {
|
var redirectResponse struct {
|
||||||
FwdUrl string `json:"fwdUrl"`
|
FwdURL string `json:"fwdUrl"`
|
||||||
}
|
}
|
||||||
json.Unmarshal(body, &redirectResponse)
|
json.Unmarshal(body, &redirectResponse)
|
||||||
|
|
||||||
// Make a GET request to the fwdUrl
|
// Make a GET request to the fwdUrl
|
||||||
req = utils.BuildRequest("GET", redirectResponse.FwdUrl, nil)
|
req = utils.BuildRequest("GET", redirectResponse.FwdURL, nil)
|
||||||
res, err = DoRequest(req)
|
res, err = DoRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to follow redirect: %w", err)
|
return fmt.Errorf("failed to follow redirect: %w", err)
|
||||||
@@ -273,7 +273,7 @@ func SelectTerm(term string, sessionId string) error {
|
|||||||
|
|
||||||
// Assert that the response is OK (200)
|
// Assert that the response is OK (200)
|
||||||
if res.StatusCode != 200 {
|
if res.StatusCode != 200 {
|
||||||
return fmt.Errorf("redirect response was not 200: %w", res.StatusCode)
|
return fmt.Errorf("redirect response was not 200: %d", res.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -281,7 +281,7 @@ func SelectTerm(term string, sessionId string) error {
|
|||||||
|
|
||||||
// GetPartOfTerms retrieves and parses the part of term information for a given term.
|
// GetPartOfTerms retrieves and parses the part of term information for a given term.
|
||||||
// Ensure that the offset is greater than 0.
|
// Ensure that the offset is greater than 0.
|
||||||
func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm, error) {
|
func GetPartOfTerms(search string, term int, offset int, maxResults int) ([]BannerTerm, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if offset <= 0 {
|
if offset <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -291,7 +291,7 @@ func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm,
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
"term": strconv.Itoa(term),
|
"term": strconv.Itoa(term),
|
||||||
"offset": strconv.Itoa(offset),
|
"offset": strconv.Itoa(offset),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"uniqueSessionId": GetSession(),
|
"uniqueSessionId": GetSession(),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
@@ -325,7 +325,7 @@ func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm,
|
|||||||
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
||||||
// This function is included for completeness, but probably isn't useful.
|
// This function is included for completeness, but probably isn't useful.
|
||||||
// Ensure that the offset is greater than 0.
|
// Ensure that the offset is greater than 0.
|
||||||
func GetInstructors(search string, term string, offset int, max int) ([]Instructor, error) {
|
func GetInstructors(search string, term string, offset int, maxResults int) ([]Instructor, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if offset <= 0 {
|
if offset <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -335,7 +335,7 @@ func GetInstructors(search string, term string, offset int, max int) ([]Instruct
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
"term": term,
|
"term": term,
|
||||||
"offset": strconv.Itoa(offset),
|
"offset": strconv.Itoa(offset),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"uniqueSessionId": GetSession(),
|
"uniqueSessionId": GetSession(),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
@@ -445,7 +445,7 @@ func Search(query *Query, sort string, sortDescending bool) (*models.SearchResul
|
|||||||
// GetSubjects retrieves and parses the subject information for a given search term.
|
// GetSubjects retrieves and parses the subject information for a given search term.
|
||||||
// The results of this response shouldn't change much, but technically could as new majors are developed, or old ones are removed.
|
// The results of this response shouldn't change much, but technically could as new majors are developed, or old ones are removed.
|
||||||
// Ensure that the offset is greater than 0.
|
// Ensure that the offset is greater than 0.
|
||||||
func GetSubjects(search string, term string, offset int, max int) ([]Pair, error) {
|
func GetSubjects(search string, term string, offset int, maxResults int) ([]Pair, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if offset <= 0 {
|
if offset <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -455,7 +455,7 @@ func GetSubjects(search string, term string, offset int, max int) ([]Pair, error
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
"term": term,
|
"term": term,
|
||||||
"offset": strconv.Itoa(offset),
|
"offset": strconv.Itoa(offset),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"uniqueSessionId": GetSession(),
|
"uniqueSessionId": GetSession(),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
@@ -489,7 +489,7 @@ func GetSubjects(search string, term string, offset int, max int) ([]Pair, error
|
|||||||
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
||||||
// This function is included for completeness, but probably isn't useful.
|
// This function is included for completeness, but probably isn't useful.
|
||||||
// Ensure that the offset is greater than 0.
|
// Ensure that the offset is greater than 0.
|
||||||
func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) {
|
func GetCampuses(search string, term int, offset int, maxResults int) ([]Pair, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if offset <= 0 {
|
if offset <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -499,7 +499,7 @@ func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) {
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
"term": strconv.Itoa(term),
|
"term": strconv.Itoa(term),
|
||||||
"offset": strconv.Itoa(offset),
|
"offset": strconv.Itoa(offset),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"uniqueSessionId": GetSession(),
|
"uniqueSessionId": GetSession(),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
@@ -533,7 +533,7 @@ func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) {
|
|||||||
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
|
||||||
// This function is included for completeness, but probably isn't useful.
|
// This function is included for completeness, but probably isn't useful.
|
||||||
// Ensure that the offset is greater than 0.
|
// Ensure that the offset is greater than 0.
|
||||||
func GetInstructionalMethods(search string, term string, offset int, max int) ([]Pair, error) {
|
func GetInstructionalMethods(search string, term string, offset int, maxResults int) ([]Pair, error) {
|
||||||
// Ensure offset is valid
|
// Ensure offset is valid
|
||||||
if offset <= 0 {
|
if offset <= 0 {
|
||||||
return nil, errors.New("offset must be greater than 0")
|
return nil, errors.New("offset must be greater than 0")
|
||||||
@@ -543,7 +543,7 @@ func GetInstructionalMethods(search string, term string, offset int, max int) ([
|
|||||||
"searchTerm": search,
|
"searchTerm": search,
|
||||||
"term": term,
|
"term": term,
|
||||||
"offset": strconv.Itoa(offset),
|
"offset": strconv.Itoa(offset),
|
||||||
"max": strconv.Itoa(max),
|
"max": strconv.Itoa(maxResults),
|
||||||
"uniqueSessionId": GetSession(),
|
"uniqueSessionId": GetSession(),
|
||||||
"_": utils.Nonce(),
|
"_": utils.Nonce(),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -140,11 +140,10 @@ func ScrapeMajor(subject string) error {
|
|||||||
log.Debug().Str("subject", subject).Int("nextOffset", offset).Msg("Sleeping before next page")
|
log.Debug().Str("subject", subject).Int("nextOffset", offset).Msg("Sleeping before next page")
|
||||||
time.Sleep(time.Second * 3)
|
time.Sleep(time.Second * 3)
|
||||||
continue
|
continue
|
||||||
} else {
|
|
||||||
// Log the number of classes scraped
|
|
||||||
log.Info().Str("subject", subject).Int("total", totalClassCount).Msgf("Subject %s Scraped", subject)
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
// Log the number of classes scraped
|
||||||
|
log.Info().Str("subject", subject).Int("total", totalClassCount).Msgf("Subject %s Scraped", subject)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
term := utils.Default(time.Now()).ToString()
|
term := utils.Default(time.Now()).ToString()
|
||||||
@@ -180,7 +179,7 @@ func CalculateExpiry(term string, count int, priority bool) time.Duration {
|
|||||||
// Subjects with less than 50 classes have a reversed expiry (less classes, longer interval)
|
// Subjects with less than 50 classes have a reversed expiry (less classes, longer interval)
|
||||||
// 1 class => 12 hours, 49 classes => 1 hour
|
// 1 class => 12 hours, 49 classes => 1 hour
|
||||||
if count < 50 {
|
if count < 50 {
|
||||||
hours := utils.Slope(utils.Point{1, 12}, utils.Point{49, 1}, float64(count)).Y
|
hours := utils.Slope(utils.Point{X: 1, Y: 12}, utils.Point{X: 49, Y: 1}, float64(count)).Y
|
||||||
baseExpiry = time.Duration(hours * float64(time.Hour))
|
baseExpiry = time.Duration(hours * float64(time.Hour))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,11 +95,13 @@ func (q *Query) TermPart(termPart []string) *Query {
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Campus sets the campuses for the query
|
||||||
func (q *Query) Campus(campus []string) *Query {
|
func (q *Query) Campus(campus []string) *Query {
|
||||||
q.campus = &campus
|
q.campus = &campus
|
||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InstructionalMethod sets the instructional methods for the query
|
||||||
func (q *Query) InstructionalMethod(instructionalMethod []string) *Query {
|
func (q *Query) InstructionalMethod(instructionalMethod []string) *Query {
|
||||||
q.instructionalMethod = &instructionalMethod
|
q.instructionalMethod = &instructionalMethod
|
||||||
return q
|
return q
|
||||||
|
|||||||
@@ -12,39 +12,39 @@ func Setup() {
|
|||||||
// Makes the initial requests that sets up the session cookies for the rest of the application
|
// Makes the initial requests that sets up the session cookies for the rest of the application
|
||||||
log.Info().Msg("Setting up session...")
|
log.Info().Msg("Setting up session...")
|
||||||
|
|
||||||
request_queue := []string{
|
requestQueue := []string{
|
||||||
"/registration/registration",
|
"/registration/registration",
|
||||||
"/selfServiceMenu/data",
|
"/selfServiceMenu/data",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, path := range request_queue {
|
for _, path := range requestQueue {
|
||||||
req := utils.BuildRequest("GET", path, nil)
|
req := utils.BuildRequest("GET", path, nil)
|
||||||
DoRequest(req)
|
DoRequest(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate that cookies were set
|
// Validate that cookies were set
|
||||||
baseUrlParsed, err := url.Parse(config.BaseURL)
|
baseURLParsed, err := url.Parse(config.BaseURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Stack().Str("baseURL", config.BaseURL).Err(err).Msg("Failed to parse baseURL")
|
log.Fatal().Stack().Str("baseURL", config.BaseURL).Err(err).Msg("Failed to parse baseURL")
|
||||||
}
|
}
|
||||||
|
|
||||||
current_cookies := config.Client.Jar.Cookies(baseUrlParsed)
|
currentCookies := config.Client.Jar.Cookies(baseURLParsed)
|
||||||
required_cookies := map[string]bool{
|
requiredCookies := map[string]bool{
|
||||||
"JSESSIONID": false,
|
"JSESSIONID": false,
|
||||||
"SSB_COOKIE": false,
|
"SSB_COOKIE": false,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cookie := range current_cookies {
|
for _, cookie := range currentCookies {
|
||||||
_, present := required_cookies[cookie.Name]
|
_, present := requiredCookies[cookie.Name]
|
||||||
// Check if this cookie is required
|
// Check if this cookie is required
|
||||||
if present {
|
if present {
|
||||||
required_cookies[cookie.Name] = true
|
requiredCookies[cookie.Name] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if all required cookies were set
|
// Check if all required cookies were set
|
||||||
for cookieName, cookie_set := range required_cookies {
|
for cookieName, cookieSet := range requiredCookies {
|
||||||
if !cookie_set {
|
if !cookieSet {
|
||||||
log.Warn().Str("cookieName", cookieName).Msg("Required cookie not set")
|
log.Warn().Str("cookieName", cookieName).Msg("Required cookie not set")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user