Added ten new plugin hooks and split topic_unknown out of the user_unknown phrase.

Added the user parameter to the action hooks to give plugins more contextual information.

Added the action_end_edit_topic plugin hook.
Added the action_end_delete_topic plugin hook.
Added the action_end_lock_topic plugin hook.
Added the action_end_unlock_topic plugin hook.
Added the action_end_stick_topic plugin hook.
Added the action_end_unstick_topic plugin hook.
Added the action_end_move_topic plugin hook.
Added the action_end_like_topic plugin hook.

Added the action_end_like_reply plugin hook.

Added the tasks_tick_topic_list plugin hook.
This commit is contained in:
Azareal 2019-04-19 11:02:33 +10:00
parent 9179eb9711
commit 29d14a4a4a
6 changed files with 81 additions and 27 deletions

View File

@ -1,7 +1,7 @@
/*
*
* Gosora Plugin System
* Copyright Azareal 2016 - 2019
* Copyright Azareal 2016 - 2020
*
*/
package common
@ -84,14 +84,27 @@ var hookTable = &HookTable{
"forum_check_pre_perms": nil,
"action_end_create_topic": nil,
"action_end_edit_topic":nil,
"action_end_delete_topic":nil,
"action_end_lock_topic":nil,
"action_end_unlock_topic": nil,
"action_end_stick_topic": nil,
"action_end_unstick_topic": nil,
"action_end_move_topic": nil,
"action_end_like_topic":nil,
"action_end_create_reply": nil,
"action_end_edit_reply": nil,
"action_end_delete_reply": nil,
"action_end_add_attach_to_reply": nil,
"action_end_remove_attach_from_reply": nil,
"action_end_like_reply":nil,
"router_after_filters": nil,
"router_pre_route": nil,
"tasks_tick_topic_list": nil,
},
map[string][]func(string) string{
"preparse_preassign": nil,

View File

@ -112,6 +112,9 @@ func (tList *DefaultTopicList) Tick() error {
tList.evenGroups = evenLists
tList.evenLock.Unlock()
hTbl := GetHookTable()
_, _ = hTbl.VhookSkippable("tasks_tick_topic_list", tList)
return nil
}

View File

@ -920,6 +920,7 @@
"panel_logs_moderation_action_unknown":"Unknown action '%s' on elementType '%s' by <a href='%s'>%s</a>",
"user_unknown":"Unknown",
"topic_unknown":"Unknown",
"panel_logs_administration_head":"Admin Action Logs",

View File

@ -47,7 +47,7 @@ func handleUnknownUser(user *common.User, err error) *common.User {
}
func handleUnknownTopic(topic *common.Topic, err error) *common.Topic {
if err != nil {
return &common.Topic{Title: phrases.GetTmplPhrase("user_unknown"), Link: common.BuildTopicURL("unknown", 0)}
return &common.Topic{Title: phrases.GetTmplPhrase("topic_unknown"), Link: common.BuildTopicURL("unknown", 0)}
}
return topic
}

View File

@ -189,7 +189,7 @@ func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user common.User)
}
counters.PostCounter.Bump()
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_reply", reply.ID)
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -261,7 +261,7 @@ func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
return common.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_reply", reply.ID)
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -316,7 +316,7 @@ func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user common.User,
return common.InternalErrorJSQ(err, w, r, isJs)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_reply", reply.ID)
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -389,7 +389,7 @@ func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, user common.
return common.InternalErrorJS(errors.New("no paths for attachment add"), w, r)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_add_attach_to_reply", reply.ID)
skip, rerr := lite.Hooks.VhookSkippable("action_end_add_attach_to_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -452,7 +452,7 @@ func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, user co
}
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_remove_attach_from_reply", reply.ID)
skip, rerr := lite.Hooks.VhookSkippable("action_end_remove_attach_from_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -597,7 +597,7 @@ func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -629,6 +629,11 @@ func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
return common.InternalErrorJSQ(err, w, r, isJs)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
if !isJs {
http.Redirect(w, r, "/topic/"+strconv.Itoa(reply.ParentID), http.StatusSeeOther)
} else {

View File

@ -651,7 +651,7 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -689,6 +689,11 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
return common.InternalErrorJSQ(err, w, r, isJs)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
if !isJs {
http.Redirect(w, r, "/topic/"+strconv.Itoa(tid), http.StatusSeeOther)
} else {
@ -736,7 +741,7 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User)
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -761,6 +766,12 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User)
return common.InternalErrorJSQ(err,w,r,isJs)
}*/
// TODO: Do a bulk delete action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
log.Printf("Topic #%d was deleted by UserID #%d", tid, user.ID)
}
http.Redirect(w, r, "/", http.StatusSeeOther)
@ -768,39 +779,39 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User)
}
func StickTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, stid string) common.RouteError {
topic, rerr := topicActionPre(stid, "pin", w, r, user)
topic, lite,rerr := topicActionPre(stid, "pin", w, r, user)
if rerr != nil {
return rerr
}
if !user.Perms.ViewTopic || !user.Perms.PinTopic {
return common.NoPermissions(w, r, user)
}
return topicActionPost(topic.Stick(), "stick", w, r, topic, user)
return topicActionPost(topic.Stick(), "stick", w, r, lite,topic, user)
}
func topicActionPre(stid string, action string, w http.ResponseWriter, r *http.Request, user common.User) (*common.Topic, common.RouteError) {
func topicActionPre(stid string, action string, w http.ResponseWriter, r *http.Request, user common.User) (*common.Topic, *common.HeaderLite, common.RouteError) {
tid, err := strconv.Atoi(stid)
if err != nil {
return nil, common.PreError(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
return nil, nil,common.PreError(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
}
topic, err := common.Topics.Get(tid)
if err == sql.ErrNoRows {
return nil, common.PreError("The topic you tried to "+action+" doesn't exist.", w, r)
return nil, nil,common.PreError("The topic you tried to "+action+" doesn't exist.", w, r)
} else if err != nil {
return nil, common.InternalError(err, w, r)
return nil, nil,common.InternalError(err, w, r)
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return nil, ferr
return nil, nil,ferr
}
return topic, nil
return topic, lite, nil
}
func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Request, topic *common.Topic, user common.User) common.RouteError {
func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Request, lite *common.HeaderLite, topic *common.Topic, user common.User) common.RouteError {
if err != nil {
return common.InternalError(err, w, r)
}
@ -808,19 +819,23 @@ func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Re
if err != nil {
return common.InternalError(err, w, r)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_"+action+"_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
http.Redirect(w, r, "/topic/"+strconv.Itoa(topic.ID), http.StatusSeeOther)
return nil
}
func UnstickTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, stid string) common.RouteError {
topic, rerr := topicActionPre(stid, "unpin", w, r, user)
topic, lite, rerr := topicActionPre(stid, "unpin", w, r, user)
if rerr != nil {
return rerr
}
if !user.Perms.ViewTopic || !user.Perms.PinTopic {
return common.NoPermissions(w, r, user)
}
return topicActionPost(topic.Unstick(), "unstick", w, r, topic, user)
return topicActionPost(topic.Unstick(), "unstick", w, r, lite,topic, user)
}
func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
@ -856,7 +871,7 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) c
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -873,6 +888,12 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) c
if err != nil {
return common.InternalErrorJSQ(err, w, r, isJs)
}
// TODO: Do a bulk lock action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_lock_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
}
if len(tids) == 1 {
@ -882,14 +903,14 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) c
}
func UnlockTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, stid string) common.RouteError {
topic, rerr := topicActionPre(stid, "unlock", w, r, user)
topic, lite,rerr := topicActionPre(stid, "unlock", w, r, user)
if rerr != nil {
return rerr
}
if !user.Perms.ViewTopic || !user.Perms.CloseTopic {
return common.NoPermissions(w, r, user)
}
return topicActionPost(topic.Unlock(), "unlock", w, r, topic, user)
return topicActionPost(topic.Unlock(), "unlock", w, r, lite,topic, user)
}
// ! JS only route
@ -929,7 +950,7 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
if !user.Perms.ViewTopic || !user.Perms.MoveTopic {
return common.NoPermissionsJS(w, r, user)
}
_, ferr = common.SimpleForumUserCheck(w, r, &user, fid)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, fid)
if ferr != nil {
return ferr
}
@ -947,6 +968,12 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
if err != nil {
return common.InternalErrorJS(err, w, r)
}
// TODO: Do a bulk move action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_move_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
}
if len(tids) == 1 {
@ -979,7 +1006,7 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
}
// TODO: Add hooks to make use of headerLite
_, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
lite, ferr := common.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -1012,6 +1039,11 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User, s
return common.InternalErrorJSQ(err, w, r, isJs)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
if !isJs {
http.Redirect(w, r, "/topic/"+strconv.Itoa(tid), http.StatusSeeOther)
} else {