diff --git a/cmd/gochan/editpost.go b/cmd/gochan/editpost.go index 96da92f4..a4656169 100644 --- a/cmd/gochan/editpost.go +++ b/cmd/gochan/editpost.go @@ -9,6 +9,7 @@ import ( "github.com/gochan-org/gochan/pkg/building" "github.com/gochan-org/gochan/pkg/config" + "github.com/gochan-org/gochan/pkg/events" "github.com/gochan-org/gochan/pkg/gcsql" "github.com/gochan-org/gochan/pkg/gctemplates" "github.com/gochan-org/gochan/pkg/gcutil" @@ -193,6 +194,26 @@ func editPost(checkedPosts []int, editBtn string, doEdit string, writer http.Res } } } else { + var recovered bool + _, err, recovered = events.TriggerEvent("message-pre-format", post) + if recovered { + errEv.Caller(). + Str("triggeredEvent", "message-pre-format"). + Msg("Recovered from a panic in event handler") + server.ServeError(writer, "Recovered from a panic in an event handler (message-pre-format)", wantsJSON, map[string]interface{}{ + "postid": post.ID, + }) + return + } + if err != nil { + errEv.Err(err).Caller(). + Str("triggeredEvent", "message-pre-format"). + Send() + server.ServeError(writer, err.Error(), wantsJSON, map[string]interface{}{ + "postid": post.ID, + }) + return + } if err = post.UpdateContents( request.FormValue("editemail"), request.FormValue("editsubject"), diff --git a/events_triggered.md b/events_triggered.md index f28c89a8..548599b1 100644 --- a/events_triggered.md +++ b/events_triggered.md @@ -10,6 +10,9 @@ This is a list of events that gochan may trigger at some point, that can be used - **incoming-upload** - Triggered by the `gcsql` package when an upload is attached to a post. It is triggered before the upload is entered in the database +- **message-pre-format** + - Triggered when an incoming post or post edit is about to be formatted + - **shutdown** - Triggered when gochan is about to shut down, in `main()` as a deferred call diff --git a/pkg/posting/post.go b/pkg/posting/post.go index 2f9fda47..6875880f 100644 --- a/pkg/posting/post.go +++ b/pkg/posting/post.go @@ -13,6 +13,7 @@ import ( "github.com/gochan-org/gochan/pkg/building" "github.com/gochan-org/gochan/pkg/config" + "github.com/gochan-org/gochan/pkg/events" "github.com/gochan-org/gochan/pkg/gcsql" "github.com/gochan-org/gochan/pkg/gcutil" "github.com/gochan-org/gochan/pkg/server" @@ -160,6 +161,22 @@ func MakePost(writer http.ResponseWriter, request *http.Request) { return } + _, err, recovered := events.TriggerEvent("message-pre-format", post) + if recovered { + errEv.Caller(). + Str("triggeredEvent", "message-pre-format"). + Msg("Recovered from a panic in event handler") + server.ServeError(writer, "Recovered from a panic in an event handler (message-pre-format)", wantsJSON, nil) + return + } + if err != nil { + errEv.Err(err).Caller(). + Str("triggeredEvent", "message-pre-format"). + Send() + server.ServeError(writer, err.Error(), wantsJSON, nil) + return + } + post.Message = FormatMessage(post.MessageRaw, postBoard.Dir) password := request.FormValue("postpassword") if password == "" {