From d408524fd546cb161651700acb6a4a44a8a5bec1 Mon Sep 17 00:00:00 2001 From: cdle Date: Sun, 11 Jun 2023 14:09:34 +0800 Subject: [PATCH] x --- adapters/web/main.go | 43 +++++++++++++++++----------------- core/node_headers.go | 20 ++++++++++++++++ core/node_strings.go | 56 ++++++++++++++++++++++++++++++++++---------- core/plugin_utils.go | 1 + 4 files changed, 87 insertions(+), 33 deletions(-) diff --git a/adapters/web/main.go b/adapters/web/main.go index 3fd031f..f013c2c 100644 --- a/adapters/web/main.go +++ b/adapters/web/main.go @@ -76,28 +76,29 @@ var GetUserNumber = func() int { func init() { core.RegistFuncs["Broadcast2WebUser"] = Broadcast2WebUser - core.GinApi(core.GET, "/api/web_chat", func(ctx *gin.Context) { - if adapter == nil { - adapter = &core.Factory{} - adapter.Init("web", "default") - adapter.SetIsAdmin(func(s string) bool { - isAdmin, ok := webAdmins.Load(s) - if ok { - return isAdmin.(bool) - } - return false - }) - adapter.SetReplyHandler(func(msg map[string]string) string { - message := WebMessage{ - UserID: msg[core.USER_ID], - Images: []string{}, - Type: "chat", - Content: msg[core.CONETNT], - } - sendWebMessage(&message) - return "" - }) + adapter = &core.Factory{} + adapter.Init("web", "default") + adapter.SetIsAdmin(func(s string) bool { + isAdmin, ok := webAdmins.Load(s) + if ok { + return isAdmin.(bool) } + return false + }) + adapter.SetReplyHandler(func(msg map[string]string) string { + message := WebMessage{ + UserID: msg[core.USER_ID], + Images: []string{}, + Type: "chat", + Content: msg[core.CONETNT], + } + sendWebMessage(&message) + return "" + }) + core.GinApi(core.GET, "/api/web_chat", func(ctx *gin.Context) { + // if adapter == nil { + + // } rid := ctx.Query("rid") ctt := ctx.Query("ctt") token, _ := ctx.Cookie("token") diff --git a/core/node_headers.go b/core/node_headers.go index bb86721..7d5e959 100644 --- a/core/node_headers.go +++ b/core/node_headers.go @@ -1,7 +1,9 @@ package core import ( + "fmt" "net/http" + "regexp" "github.com/dop251/goja" ) @@ -12,6 +14,24 @@ func MakeHeadersObject(vm *goja.Runtime, header http.Header) *goja.Object { return header.Get(name) }) + obj.Set("gets", func(name string) []string { + return header.Values(name) + }) + + obj.Set("values", func(name string) []string { + return header.Values(name) + }) + + obj.Set("cookie", func(name string) string { + for _, v := range header.Values("Set-Cookie") { + res := regexp.MustCompile(fmt.Sprintf("%s=([^;]+)", name)).FindStringSubmatch(v) + if len(res) > 0 { + return res[1] + } + } + return "" + }) + obj.Set("has", func(name string) bool { return header.Get(name) != "" }) diff --git a/core/node_strings.go b/core/node_strings.go index 6778008..3e85fb6 100644 --- a/core/node_strings.go +++ b/core/node_strings.go @@ -36,6 +36,30 @@ func (sender *Strings) JoinFilepath(elem ...string) string { return filepath.Join(elem...) } +func ForeachObject(m map[string]interface{}, callback func(key, value interface{}) bool) bool { + for k, v := range m { + switch v := v.(type) { + case map[string]interface{}: + if ForeachObject(v, callback) { + return true + } + case []interface{}: + for _, u := range v { + if um, ok := u.(map[string]interface{}); ok { + if ForeachObject(um, callback) { + return true + } + } + } + case string: + if callback(k, v) { + return true + } + } + } + return false +} + func (sender *Strings) Trim(s, cutset string) string { return strings.Trim(s, cutset) } @@ -66,15 +90,21 @@ func (sender *Strings) Dir(path string) string { func (sender *Strings) Contains(s string, substr interface{}) bool { switch substr := substr.(type) { case string: - return strings.Contains(s, substr) + if strings.Contains(s, substr) { + return true + } case []string: for _, sub := range substr { - return strings.Contains(s, sub) + if strings.Contains(s, sub) { + return true + } } return false case []interface{}: for _, sub := range substr { - return strings.Contains(s, sub.(string)) + if strings.Contains(s, sub.(string)) { + return true + } } return false } @@ -141,21 +171,23 @@ func (sender *Strings) EncodeQueryString(params map[string]interface{}) string { } func (sender *Strings) DecodeQueryString(querystring string) map[string]interface{} { - values, err := url.ParseQuery(querystring) + u, err := url.Parse(querystring) + if err != nil { panic(err) } params := make(map[string]interface{}) - for key, values := range values { + for key, values := range u.Query() { if len(values) > 0 { value := values[0] - if intValue, err := strconv.Atoi(value); err == nil { - params[key] = intValue - } else if boolValue, err := strconv.ParseBool(value); err == nil { - params[key] = boolValue - } else { - params[key] = value - } + // if intValue, err := strconv.Atoi(value); err == nil { + // params[key] = intValue + // } else if boolValue, err := strconv.ParseBool(value); err == nil { + // params[key] = boolValue + // } else { + // params[key] = value + // } + params[key] = value } } return params diff --git a/core/plugin_utils.go b/core/plugin_utils.go index 8c56992..c21b13b 100644 --- a/core/plugin_utils.go +++ b/core/plugin_utils.go @@ -437,6 +437,7 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func( osjs := getJsOs(vm, running) vm.Set("os", osjs) vm.Set("fs", osjs) + vm.Set("forObject", ForeachObject) } func EncryptPlugin(script string) string {