From 069b77aebe8470a5f921ffc0c805dccd4e602ad0 Mon Sep 17 00:00:00 2001 From: Xevion Date: Fri, 16 Feb 2024 17:28:32 -0600 Subject: [PATCH] Add panic recovery, switch some fatal raises to panic I don't know what I am doing really --- api.go | 12 ++++++------ commands.go | 6 ++---- main.go | 13 +++++++++++++ types.go | 10 +++++----- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/api.go b/api.go index 1780a7c..b059fd4 100644 --- a/api.go +++ b/api.go @@ -100,19 +100,19 @@ func SelectTerm(term string) { res, err := DoRequest(req) 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 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 defer res.Body.Close() body, err := io.ReadAll(res.Body) 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 { @@ -124,12 +124,12 @@ func SelectTerm(term string) { req = BuildRequest("GET", redirectResponse.FwdUrl, nil) res, err = DoRequest(req) 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) 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 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() diff --git a/commands.go b/commands.go index e6dc625..d61c324 100644 --- a/commands.go +++ b/commands.go @@ -138,10 +138,8 @@ func SearchCommandHandler(session *discordgo.Session, interaction *discordgo.Int if err != nil { return errors.Wrap(err, "error parsing implied course code (high)") } - } - - // 4 digit code - if len(valueRaw) == 4 { + } else if len(valueRaw) == 4 { + // 4 digit code low, err = strconv.Atoi(valueRaw) if err != nil { return errors.Wrap(err, "error parsing course code") diff --git a/main.go b/main.go index 380d418..883cdbb 100644 --- a/main.go +++ b/main.go @@ -223,6 +223,19 @@ func main() { // Log command invocation 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 err := handler(internalSession, interaction) diff --git a/types.go b/types.go index 19ec960..cdc741c 100644 --- a/types.go +++ b/types.go @@ -177,7 +177,7 @@ const layout = "01/02/2006" func (m *MeetingTimeResponse) StartDay() time.Time { t, err := time.Parse(layout, m.MeetingTime.StartDate) 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 } @@ -187,7 +187,7 @@ func (m *MeetingTimeResponse) StartDay() time.Time { func (m *MeetingTimeResponse) EndDay() time.Time { t, err := time.Parse(layout, m.MeetingTime.EndDate) 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 } @@ -197,12 +197,12 @@ func (m *MeetingTimeResponse) EndDay() time.Time { func (m *MeetingTimeResponse) StartTime() *NaiveTime { raw := m.MeetingTime.BeginTime 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) 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) @@ -218,7 +218,7 @@ func (m *MeetingTimeResponse) EndTime() *NaiveTime { value, err := strconv.ParseUint(raw, 10, 32) 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)