Add panic recovery, switch some fatal raises to panic

I don't know what I am doing really
This commit is contained in:
2024-02-16 17:28:32 -06:00
parent 595228df15
commit 069b77aebe
4 changed files with 26 additions and 15 deletions

12
api.go
View File

@@ -100,19 +100,19 @@ func SelectTerm(term string) {
res, err := DoRequest(req) res, err := DoRequest(req)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Msg("Failed to select term") log.Panic().Stack().Err(err).Msg("Failed to select term")
} }
// Assert that the response is JSON // Assert that the response is JSON
if !ContentTypeMatch(res, "application/json") { if !ContentTypeMatch(res, "application/json") {
log.Fatal().Stack().Str("content-type", res.Header.Get("Content-Type")).Msg("Response was not JSON") log.Panic().Stack().Str("content-type", res.Header.Get("Content-Type")).Msg("Response was not JSON")
} }
// Acquire fwdUrl // Acquire fwdUrl
defer res.Body.Close() defer res.Body.Close()
body, err := io.ReadAll(res.Body) body, err := io.ReadAll(res.Body)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Msg("Failed to read response body") log.Panic().Stack().Err(err).Msg("Failed to read response body")
} }
var redirectResponse struct { var redirectResponse struct {
@@ -124,12 +124,12 @@ func SelectTerm(term string) {
req = BuildRequest("GET", redirectResponse.FwdUrl, nil) req = BuildRequest("GET", redirectResponse.FwdUrl, nil)
res, err = DoRequest(req) res, err = DoRequest(req)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Msg("Redirect request failed") log.Panic().Stack().Err(err).Msg("Redirect request failed")
} }
// Assert that the response is OK (200) // Assert that the response is OK (200)
if res.StatusCode != 200 { if res.StatusCode != 200 {
log.Fatal().Stack().Int("status", res.StatusCode).Msg("Unexpected status code from redirect request") log.Panic().Stack().Int("status", res.StatusCode).Msg("Unexpected status code from redirect request")
} }
} }
@@ -157,7 +157,7 @@ func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm,
// Assert that the response is JSON // Assert that the response is JSON
if !ContentTypeMatch(res, "application/json") { if !ContentTypeMatch(res, "application/json") {
log.Fatal().Stack().Str("content-type", res.Header.Get("Content-Type")).Msg("Response was not JSON") log.Panic().Stack().Str("content-type", res.Header.Get("Content-Type")).Msg("Response was not JSON")
} }
defer res.Body.Close() defer res.Body.Close()

View File

@@ -138,10 +138,8 @@ func SearchCommandHandler(session *discordgo.Session, interaction *discordgo.Int
if err != nil { if err != nil {
return errors.Wrap(err, "error parsing implied course code (high)") return errors.Wrap(err, "error parsing implied course code (high)")
} }
} } else if len(valueRaw) == 4 {
// 4 digit code
// 4 digit code
if len(valueRaw) == 4 {
low, err = strconv.Atoi(valueRaw) low, err = strconv.Atoi(valueRaw)
if err != nil { if err != nil {
return errors.Wrap(err, "error parsing course code") return errors.Wrap(err, "error parsing course code")

13
main.go
View File

@@ -223,6 +223,19 @@ func main() {
// Log command invocation // Log command invocation
event.Msg("Command Invoked") event.Msg("Command Invoked")
// Prepare to recover
defer func() {
if err := recover(); err != nil {
log.Error().Stack().Str("commandName", name).Interface("detail", err).Msg("Command Handler Panic")
// Respond with error
err := RespondError(internalSession, interaction.Interaction, "Unexpected Error: command handler panic", nil)
if err != nil {
log.Error().Stack().Str("commandName", name).Err(err).Msg("Failed to respond with panic error feedback")
}
}
}()
// Call handler // Call handler
err := handler(internalSession, interaction) err := handler(internalSession, interaction)

View File

@@ -177,7 +177,7 @@ const layout = "01/02/2006"
func (m *MeetingTimeResponse) StartDay() time.Time { func (m *MeetingTimeResponse) StartDay() time.Time {
t, err := time.Parse(layout, m.MeetingTime.StartDate) t, err := time.Parse(layout, m.MeetingTime.StartDate)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Str("raw", m.MeetingTime.StartDate).Msg("Cannot parse start date") log.Panic().Stack().Err(err).Str("raw", m.MeetingTime.StartDate).Msg("Cannot parse start date")
} }
return t return t
} }
@@ -187,7 +187,7 @@ func (m *MeetingTimeResponse) StartDay() time.Time {
func (m *MeetingTimeResponse) EndDay() time.Time { func (m *MeetingTimeResponse) EndDay() time.Time {
t, err := time.Parse(layout, m.MeetingTime.EndDate) t, err := time.Parse(layout, m.MeetingTime.EndDate)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Str("raw", m.MeetingTime.EndDate).Msg("Cannot parse end date") log.Panic().Stack().Err(err).Str("raw", m.MeetingTime.EndDate).Msg("Cannot parse end date")
} }
return t return t
} }
@@ -197,12 +197,12 @@ func (m *MeetingTimeResponse) EndDay() time.Time {
func (m *MeetingTimeResponse) StartTime() *NaiveTime { func (m *MeetingTimeResponse) StartTime() *NaiveTime {
raw := m.MeetingTime.BeginTime raw := m.MeetingTime.BeginTime
if raw == "" { if raw == "" {
log.Fatal().Stack().Msg("Start time is empty") log.Panic().Stack().Msg("Start time is empty")
} }
value, err := strconv.ParseUint(raw, 10, 32) value, err := strconv.ParseUint(raw, 10, 32)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Str("raw", raw).Msg("Cannot parse start time integer") log.Panic().Stack().Err(err).Str("raw", raw).Msg("Cannot parse start time integer")
} }
return ParseNaiveTime(value) return ParseNaiveTime(value)
@@ -218,7 +218,7 @@ func (m *MeetingTimeResponse) EndTime() *NaiveTime {
value, err := strconv.ParseUint(raw, 10, 32) value, err := strconv.ParseUint(raw, 10, 32)
if err != nil { if err != nil {
log.Fatal().Stack().Err(err).Str("raw", raw).Msg("Cannot parse end time integer") log.Panic().Stack().Err(err).Str("raw", raw).Msg("Cannot parse end time integer")
} }
return ParseNaiveTime(value) return ParseNaiveTime(value)