e01a181eda
Use hookgen for simple_forum_check_pre_perms. Optimise panelUserCheck()'s addPreScript() Reduce allocs slightly for PreRoute() host IP setting. Reorder error check in NoSessionMismatch() for faster failure. Reorder error check in NoUploadSessionMismatch() for faster failure. Reduce boilerplate.
116 lines
3.6 KiB
Go
116 lines
3.6 KiB
Go
package hookgen
|
|
|
|
import (
|
|
"bytes"
|
|
"log"
|
|
"os"
|
|
"text/template"
|
|
)
|
|
|
|
type HookVars struct {
|
|
Imports []string
|
|
Hooks []Hook
|
|
}
|
|
|
|
type Hook struct {
|
|
Name string
|
|
Params string
|
|
Params2 string
|
|
Ret string
|
|
Type string
|
|
Any bool
|
|
MultiHook bool
|
|
Skip bool
|
|
DefaultRet string
|
|
Pure string
|
|
}
|
|
|
|
func AddHooks(add func(name, params, ret, htype string, multiHook, skip bool, defaultRet, pure string)) {
|
|
vhookskip := func(name, params string) {
|
|
add(name, params, "(bool,RouteError)", "VhookSkippable_", false, true, "false,nil", "")
|
|
}
|
|
vhookskip("simple_forum_check_pre_perms", "w http.ResponseWriter,r *http.Request,u *User,fid *int,h *HeaderLite")
|
|
vhookskip("forum_check_pre_perms", "w http.ResponseWriter,r *http.Request,u *User,fid *int,h *Header")
|
|
vhookskip("router_after_filters", "w http.ResponseWriter,r *http.Request,prefix string")
|
|
vhookskip("router_pre_route", "w http.ResponseWriter,r *http.Request,u *User,prefix string")
|
|
vhookskip("route_forum_list_start", "w http.ResponseWriter,r *http.Request,u *User,h *Header")
|
|
vhookskip("route_topic_list_start", "w http.ResponseWriter,r *http.Request,u *User,h *Header")
|
|
vhookskip("route_attach_start", "w http.ResponseWriter,r *http.Request,u *User,fname string")
|
|
vhookskip("route_attach_post_get", "w http.ResponseWriter,r *http.Request,u *User,a *Attachment")
|
|
|
|
vhooknoret := func(name, params string) {
|
|
add(name, params, "", "Vhooks", false, false, "false,nil", "")
|
|
}
|
|
vhooknoret("router_end", "w http.ResponseWriter,r *http.Request,u *User,prefix string,extraData string")
|
|
vhooknoret("topic_reply_row_assign", "r *ReplyUser")
|
|
vhooknoret("counters_perf_tick_row", "low int64,high int64,avg int64")
|
|
//forums_frow_assign
|
|
//Hook(name string, data interface{}) interface{}
|
|
/*hook := func(name, params, ret, pure string) {
|
|
add(name,params,ret,"Hooks",true,false,ret,pure)
|
|
}*/
|
|
|
|
hooknoret := func(name, params string) {
|
|
add(name, params, "", "HooksNoRet", true, false, "", "")
|
|
}
|
|
hooknoret("forums_frow_assign", "f *Forum")
|
|
|
|
hookskip := func(name, params string) {
|
|
add(name, params, "(skip bool)", "HooksSkip", true, true, "", "")
|
|
}
|
|
//hookskip("forums_frow_assign","f *Forum")
|
|
hookskip("topic_create_frow_assign", "f *Forum")
|
|
|
|
hookss := func(name string) {
|
|
add(name, "d string", "string", "Sshooks", true, false, "", "d")
|
|
}
|
|
hookss("topic_ogdesc_assign")
|
|
}
|
|
|
|
func Write(hookVars HookVars) {
|
|
fileData := `// Code generated by Gosora's Hook Generator. DO NOT EDIT.
|
|
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
|
|
package common
|
|
import ({{range .Imports}}
|
|
"{{.}}"{{end}}
|
|
)
|
|
{{range .Hooks}}
|
|
func H_{{.Name}}_hook(t *HookTable,{{.Params}}) {{.Ret}} { {{if .Any}}
|
|
{{if .MultiHook}}for _, hook := range t.{{.Type}}["{{.Name}}"] {
|
|
{{if .Skip}}if skip = hook({{.Params2}}); skip {
|
|
break
|
|
}{{else}}{{if .Pure}}{{.Pure}} = {{else if .Ret}}return {{end}}hook({{.Params2}}){{end}}
|
|
}{{else}}hook := t.{{.Type}}["{{.Name}}"]
|
|
if hook != nil {
|
|
{{if .Ret}}return {{end}}hook({{.Params2}})
|
|
} {{end}}{{end}}{{if .Pure}}
|
|
return {{.Pure}}{{else if .Ret}}
|
|
return {{.DefaultRet}}{{end}}
|
|
}{{end}}
|
|
`
|
|
tmpl := template.Must(template.New("hooks").Parse(fileData))
|
|
var b bytes.Buffer
|
|
if e := tmpl.Execute(&b, hookVars); e != nil {
|
|
log.Fatal(e)
|
|
}
|
|
|
|
err := writeFile("./common/gen_extend.go", b.String())
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func writeFile(name, body string) error {
|
|
f, e := os.Create(name)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
if _, e = f.WriteString(body); e != nil {
|
|
return e
|
|
}
|
|
if e = f.Sync(); e != nil {
|
|
return e
|
|
}
|
|
return f.Close()
|
|
}
|