diff --git a/core/api_storage.go b/core/api_bucket.go similarity index 95% rename from core/api_storage.go rename to core/api_bucket.go index ca2b796..04c6e3a 100644 --- a/core/api_storage.go +++ b/core/api_bucket.go @@ -136,12 +136,12 @@ func init() { if ar[0] == "plugins" && false { //todo data[bk] = halfDeEct(MakeBucket(ar[0]).GetString(ar[1])) } else { - data[bk] = MakeBucket(ar[0]).GetString(ar[1]) + data[bk] = TransformBucketKeyValue(MakeBucket(ar[0]).GetString(ar[1])) } } if len(ar) == 1 { MakeBucket(ar[0]).Foreach(func(b1, b2 []byte) error { - data[bk+"."+string(b1)] = string(b2) + data[bk+"."+string(b1)] = TransformBucketKeyValue(string(b2)) return nil }) } @@ -176,7 +176,7 @@ func init() { for bk, v := range updates { ar := strings.Split(bk, ".") if len(ar) == 2 { - msg, err := MakeBucket(ar[0]).Set(ar[1], v) + msg, err := SetBucketKeyValue(MakeBucket(ar[0]), ar[1], v) if msg != "" { messages[bk] = msg } diff --git a/core/node_os.go b/core/node_os.go new file mode 100644 index 0000000..c38620e --- /dev/null +++ b/core/node_os.go @@ -0,0 +1,45 @@ +package core + +import ( + "errors" + "os" + "path/filepath" + + "github.com/dop251/goja" +) + +func getJsOs(vm *goja.Runtime, running func() bool) *goja.Object { + var jsos = vm.NewObject() + jsos.Set("readFile", func(name string) []byte { + data, err := os.ReadFile(name) + if err != nil { + panic(Error(vm, err)) + } + return data + }) + jsos.Set("walkFilePath", func(root string, callback func(path string, info os.FileInfo) bool) { + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if !running() { + return errors.New("over") + } + if err != nil { + panic(Error(vm, err)) + } + if callback(path, info) { + return errors.New("over") + } + return nil + }) + if err != nil && err.Error() != "over" { + panic(Error(vm, err)) + } + }) + jsos.Set("userHomeDir", func() string { + dir, err := os.UserHomeDir() + if err != nil { + panic(Error(vm, err)) + } + return dir + }) + return jsos +} diff --git a/core/node_static.go b/core/node_static.go index 19124a8..ca4dceb 100644 --- a/core/node_static.go +++ b/core/node_static.go @@ -1,10 +1,14 @@ package core import ( + "encoding/base64" + "fmt" + "image" "io/ioutil" "net/http" "os" "path/filepath" + "strings" "sync" "github.com/gin-gonic/gin" @@ -50,3 +54,39 @@ func FindFile(c *gin.Context) { // 如果文件不存在,返回404错误 c.AbortWithStatus(http.StatusNotFound) } + +// Server.GET("/api/file/:filename", FindFile) +// Server.GET("/api/decode/:random", Base642Binary) + +func Base642Binary(c *gin.Context) { + random := c.Param("random") + s, ok := temp.Get("base64_" + random).(string) + if !ok { + c.String(http.StatusBadRequest, "Invalid input") + return + } + input := strings.TrimPrefix(s, "base64://") + data, err := base64.StdEncoding.DecodeString(input) + if err != nil { + c.String(http.StatusBadRequest, "Invalid input") + return + } + // 解析图片格式 + _, format, err := image.DecodeConfig(strings.NewReader(string(data))) + fmt.Println(format, err) + if err != nil { + c.Header("Content-Type", "application/octet-stream") + } else { + // 根据图片格式设置响应头 + switch format { + case "jpeg": + c.Header("Content-Type", "image/jpeg") + case "png": + c.Header("Content-Type", "image/png") + default: + c.Header("Content-Type", "application/octet-stream") + return + } + } + c.Data(http.StatusOK, "application/octet-stream", data) +} diff --git a/core/node_strings.go b/core/node_strings.go index a3bc96b..d3778f0 100644 --- a/core/node_strings.go +++ b/core/node_strings.go @@ -3,10 +3,13 @@ package core import ( "bytes" "fmt" + "math/rand" "net/url" + "path/filepath" "regexp" "strconv" "strings" + "time" "github.com/cdle/sillyplus/emoji" "github.com/cdle/sillyplus/utils" @@ -15,9 +18,33 @@ import ( type Strings struct { } +func (sender *Strings) Random(length int, substr string) string { + ws := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + if substr != "" { + ws = substr + } + rand.Seed(time.Now().UnixNano()) + letters := []rune(ws) + b := make([]rune, length) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} + +func (sender *Strings) JoinFilepath(elem ...string) string { + return filepath.Join(elem...) +} + func (sender *Strings) Contains(s, substr string) bool { return strings.Contains(s, substr) } +func (sender *Strings) HasPrefix(s, substr string) bool { + return strings.HasPrefix(s, substr) +} +func (sender *Strings) HasSuffix(s, substr string) bool { + return strings.HasSuffix(s, substr) +} func (sender *Strings) Replace(s string, old string, new string, n int) string { if n == 0 { diff --git a/core/plugin_core.go b/core/plugin_core.go index 15f247d..d9a7c8e 100644 --- a/core/plugin_core.go +++ b/core/plugin_core.go @@ -459,7 +459,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) { } loop := eventloop.NewEventLoop() loop.Run(func(vm *goja.Runtime) { - SetPluginMethod(vm, uuid, onStart) + SetPluginMethod(vm, uuid, onStart, running) ss := &SenderJsIplm{ Message: s, Vm: vm, diff --git a/core/plugin_utils.go b/core/plugin_utils.go index 70507c0..fefed76 100644 --- a/core/plugin_utils.go +++ b/core/plugin_utils.go @@ -109,7 +109,7 @@ func CancelPluginCrons(uuid string) { } } -func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool) { +func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func() bool) { vm.Set("Bucket", func(name string) interface{} { return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{ Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { @@ -433,6 +433,9 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool) { }, } }) + + osjs := getJsOs(vm, running) + vm.Set("os", osjs) } func EncryptPlugin(script string) string { diff --git a/core/web.go b/core/web.go index 8715729..fcd447e 100644 --- a/core/web.go +++ b/core/web.go @@ -49,6 +49,7 @@ func init() { Server.Use(Cors()) Server.Use(gzip.Gzip(gzip.DefaultCompression)) Server.GET("/api/file/:filename", FindFile) + Server.GET("/api/decode/:random", Base642Binary) Server.NoRoute(func(c *gin.Context) { if c.Request.URL.Path != "/api/web_chat" { logs.Debug(c.Request.URL.Path) @@ -317,7 +318,9 @@ func init() { // logs.Info("Http服务(%s)开始运行", port) logs.Info("管理员面板:") logs.Info(" > 本机: http://localhost:%s", port) - logs.Info(" > 局域网: http://%s:%s", getLocalIP(), port) + local_ip := getLocalIP() + sillyGirl.Set("local_ip", local_ip) + logs.Info(" > 局域网: http://%s:%s", local_ip, port) if err := srvs[0].ListenAndServe(); err != nil && err != http.ErrServerClosed { logs.Error("Http服务运行失败:%s", err.Error()) }