x
This commit is contained in:
+34
-6
@@ -83,10 +83,13 @@ func CancelPluginlistening(uuid string) {
|
|||||||
|
|
||||||
func initPlugins() {
|
func initPlugins() {
|
||||||
plugins.Foreach(func(key, data []byte) error {
|
plugins.Foreach(func(key, data []byte) error {
|
||||||
f, err := initPlugin(string(data), string(key))
|
f, cbs, err := initPlugin(string(data), string(key))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
console.Error("初始化插件%s错误: %v", key, err)
|
console.Error("初始化插件%s错误: %v", key, err)
|
||||||
}
|
}
|
||||||
|
for _, cb := range cbs {
|
||||||
|
cb()
|
||||||
|
}
|
||||||
AddCommand([]*common.Function{f})
|
AddCommand([]*common.Function{f})
|
||||||
// os.WriteFile(fmt.Sprintf("%s/%s.js", pluginPath, f.Title), data, 0600)
|
// os.WriteFile(fmt.Sprintf("%s/%s.js", pluginPath, f.Title), data, 0600)
|
||||||
return nil
|
return nil
|
||||||
@@ -101,7 +104,7 @@ func initPlugins() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
script := string(fetchScript(p.Address, key))
|
script := string(fetchScript(p.Address, key))
|
||||||
if f, _ := initPlugin(script, p.UUID); f.CreateAt != "" {
|
if f, _, _ := initPlugin(script, p.UUID); f.CreateAt != "" {
|
||||||
fin = &storage.Final{
|
fin = &storage.Final{
|
||||||
Now: script,
|
Now: script,
|
||||||
}
|
}
|
||||||
@@ -117,7 +120,11 @@ func initPlugins() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if new != "" {
|
if new != "" {
|
||||||
|
if new == "reload" {
|
||||||
|
new = old
|
||||||
|
}
|
||||||
fin = &storage.Final{}
|
fin = &storage.Final{}
|
||||||
su := &ScriptUtils{script: new}
|
su := &ScriptUtils{script: new}
|
||||||
if version := su.GetValue("version"); version == "" || regexp.MustCompile(`v\d+\.\d+\.\d`).FindString(version) != version {
|
if version := su.GetValue("version"); version == "" || regexp.MustCompile(`v\d+\.\d+\.\d`).FindString(version) != version {
|
||||||
@@ -190,7 +197,7 @@ func initPlugins() {
|
|||||||
}
|
}
|
||||||
new = su.script
|
new = su.script
|
||||||
}
|
}
|
||||||
f, err := initPlugin(new, key)
|
f, cbs, err := initPlugin(new, key)
|
||||||
if err != nil && new != "" {
|
if err != nil && new != "" {
|
||||||
console.Error(err)
|
console.Error(err)
|
||||||
}
|
}
|
||||||
@@ -219,13 +226,16 @@ func initPlugins() {
|
|||||||
console.Log("已重载 %s.js", f.Title)
|
console.Log("已重载 %s.js", f.Title)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
of, _ := initPlugin(old, key)
|
of, _, _ := initPlugin(old, key)
|
||||||
console.Log("已卸载 %s.js", of.Title)
|
console.Log("已卸载 %s.js", of.Title)
|
||||||
}
|
}
|
||||||
apd = true
|
apd = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, cb := range cbs {
|
||||||
|
cb()
|
||||||
|
}
|
||||||
if !apd {
|
if !apd {
|
||||||
AddCommand([]*common.Function{f})
|
AddCommand([]*common.Function{f})
|
||||||
}
|
}
|
||||||
@@ -239,7 +249,8 @@ func initPlugins() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func initPlugin(data string, uuid string) (*common.Function, error) {
|
func initPlugin(data string, uuid string) (*common.Function, []func(), error) {
|
||||||
|
var cbs = []func(){}
|
||||||
var err error
|
var err error
|
||||||
var rules []string
|
var rules []string
|
||||||
var imType *common.Filter
|
var imType *common.Filter
|
||||||
@@ -266,6 +277,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
|
|||||||
var FindAll bool
|
var FindAll bool
|
||||||
var hasForm bool
|
var hasForm bool
|
||||||
var carry bool
|
var carry bool
|
||||||
|
ks := map[string]bool{}
|
||||||
ress := regexp.MustCompile(
|
ress := regexp.MustCompile(
|
||||||
`\*\s?@([\d\w+-]+)\s+([^\n]+?)\n`,
|
`\*\s?@([\d\w+-]+)\s+([^\n]+?)\n`,
|
||||||
).FindAllStringSubmatch(data, -1)
|
).FindAllStringSubmatch(data, -1)
|
||||||
@@ -273,6 +285,21 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
|
|||||||
switch res[1] {
|
switch res[1] {
|
||||||
case "rule", "match", "regex", "pattern":
|
case "rule", "match", "regex", "pattern":
|
||||||
rule := strings.TrimSpace(res[2])
|
rule := strings.TrimSpace(res[2])
|
||||||
|
rule = parseReply3(rule, func(s1, s2 string) {
|
||||||
|
k := s1 + "." + s2
|
||||||
|
if _, ok := ks[k]; !ok {
|
||||||
|
cbs = append(cbs, func() {
|
||||||
|
storage.Watch(MakeBucket(s1), s2, func(old, new, key string) *storage.Final {
|
||||||
|
return &storage.Final{
|
||||||
|
EndFunc: func() {
|
||||||
|
plugins.Set(uuid, "reload")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}, uuid)
|
||||||
|
})
|
||||||
|
ks[k] = true
|
||||||
|
}
|
||||||
|
})
|
||||||
_rs := []string{}
|
_rs := []string{}
|
||||||
FR:
|
FR:
|
||||||
ress := regexp.MustCompile(`\[([^\s\[\]]+)\]`).FindAllStringSubmatch(rule, -1)
|
ress := regexp.MustCompile(`\[([^\s\[\]]+)\]`).FindAllStringSubmatch(rule, -1)
|
||||||
@@ -467,6 +494,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
|
|||||||
// icon = "https://joeschmoe.io/api/v1/random?t=" + fmt.Sprint(time.Now().Nanosecond())
|
// icon = "https://joeschmoe.io/api/v1/random?t=" + fmt.Sprint(time.Now().Nanosecond())
|
||||||
// }
|
// }
|
||||||
var running func() bool
|
var running func() bool
|
||||||
|
|
||||||
f := &common.Function{
|
f := &common.Function{
|
||||||
Handle: func(s common.Sender, set func(vm *goja.Runtime)) interface{} {
|
Handle: func(s common.Sender, set func(vm *goja.Runtime)) interface{} {
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -588,7 +616,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
|
|||||||
running = func() bool {
|
running = func() bool {
|
||||||
return f.Running
|
return f.Running
|
||||||
}
|
}
|
||||||
return f, err
|
return f, cbs, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func ChatID(p interface{}) string {
|
func ChatID(p interface{}) string {
|
||||||
|
|||||||
@@ -243,3 +243,35 @@ func parseReply2(str string) string {
|
|||||||
// return ""
|
// return ""
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseReply3(str string, f func(string, string)) string {
|
||||||
|
ks := map[string]bool{}
|
||||||
|
re := regexp.MustCompile(`\$\{\s*([^{}]+)\s*\}`)
|
||||||
|
return re.ReplaceAllStringFunc(str, func(match string) string {
|
||||||
|
script := match[2 : len(match)-1]
|
||||||
|
script = regexp.MustCompile(`(\w+)\.(\w+)`).ReplaceAllStringFunc(script, func(match string) string {
|
||||||
|
parts := strings.Split(match, ".")
|
||||||
|
k := fmt.Sprintf(`%s.%s`, parts[0], parts[1])
|
||||||
|
if _, ok := ks[k]; !ok {
|
||||||
|
ks[k] = true
|
||||||
|
f(parts[0], parts[1])
|
||||||
|
}
|
||||||
|
return fmt.Sprintf(`Bucket("%s")["%s"]`, parts[0], parts[1])
|
||||||
|
})
|
||||||
|
vm := goja.New()
|
||||||
|
vm.Set("Bucket", func(name string) interface{} {
|
||||||
|
return JsBucket(vm, name, "", false)
|
||||||
|
})
|
||||||
|
v, err := vm.RunString(script)
|
||||||
|
if err == nil {
|
||||||
|
return v.String()
|
||||||
|
}
|
||||||
|
return match
|
||||||
|
// b_k := strings.Split(bk, ".")
|
||||||
|
// if len(b_k) != 3 {
|
||||||
|
// return fmt.Sprintf("${%s}", bk)
|
||||||
|
// }
|
||||||
|
// return MakeBucket(b_k[1]).GetString(b_k[2])
|
||||||
|
// return ""
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
new = fmt.Sprint(value)
|
new = fmt.Sprint(value)
|
||||||
}
|
}
|
||||||
var handles []func(string, string, string) *storage.Final
|
var handles []func(string, string, string) *storage.Final
|
||||||
|
var endFuncs = []func(){}
|
||||||
for _, listen := range storage.Listens {
|
for _, listen := range storage.Listens {
|
||||||
if listen.Name == bucket.name && (listen.Key == key || listen.Key == "*") {
|
if listen.Name == bucket.name && (listen.Key == key || listen.Key == "*") {
|
||||||
handles = append(handles, listen.Handle)
|
handles = append(handles, listen.Handle)
|
||||||
@@ -165,6 +166,9 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
}
|
}
|
||||||
if len(handles) > 0 {
|
if len(handles) > 0 {
|
||||||
old := bucket.GetString(key)
|
old := bucket.GetString(key)
|
||||||
|
if old == new {
|
||||||
|
return msg, nil
|
||||||
|
}
|
||||||
for _, handle := range handles {
|
for _, handle := range handles {
|
||||||
fin := handle(old, new, k)
|
fin := handle(old, new, k)
|
||||||
if fin != nil {
|
if fin != nil {
|
||||||
@@ -177,10 +181,13 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
if fin.Now != "" {
|
if fin.Now != "" {
|
||||||
new = fin.Now
|
new = fin.Now
|
||||||
}
|
}
|
||||||
|
if fin.EndFunc != nil {
|
||||||
|
endFuncs = append(endFuncs, fin.EndFunc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return msg, db.Update(func(tx *bolt.Tx) error {
|
}
|
||||||
|
err := db.Update(func(tx *bolt.Tx) error {
|
||||||
b, err := tx.CreateBucketIfNotExists([]byte(bucket.name))
|
b, err := tx.CreateBucketIfNotExists([]byte(bucket.name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -196,6 +203,12 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err == nil {
|
||||||
|
for _, f := range endFuncs {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ type Final struct {
|
|||||||
Now string
|
Now string
|
||||||
Message string
|
Message string
|
||||||
Error error
|
Error error
|
||||||
|
EndFunc func()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Watch(bucket Bucket, key interface{}, handle func(old string, new string, key string) *Final, uuid ...string) {
|
func Watch(bucket Bucket, key interface{}, handle func(old string, new string, key string) *Final, uuid ...string) {
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
}
|
}
|
||||||
if !utils.SlaveMode {
|
if !utils.SlaveMode {
|
||||||
var handles []func(string, string, string) *storage.Final
|
var handles []func(string, string, string) *storage.Final
|
||||||
|
var endFuncs = []func(){}
|
||||||
for _, listen := range storage.Listens {
|
for _, listen := range storage.Listens {
|
||||||
if listen.Name == bucket.name && (listen.Key == key || listen.Key == "*") {
|
if listen.Name == bucket.name && (listen.Key == key || listen.Key == "*") {
|
||||||
handles = append(handles, listen.Handle)
|
handles = append(handles, listen.Handle)
|
||||||
@@ -239,14 +240,24 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
if fin.Now != "" {
|
if fin.Now != "" {
|
||||||
new = fin.Now
|
new = fin.Now
|
||||||
}
|
}
|
||||||
|
if fin.EndFunc != nil {
|
||||||
|
endFuncs = append(endFuncs, fin.EndFunc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
var err error
|
||||||
if new == "" {
|
if new == "" {
|
||||||
return msg, db.HDel(ctx, bucket.name, k).Err()
|
err = db.HDel(ctx, bucket.name, k).Err()
|
||||||
} else {
|
} else {
|
||||||
return msg, db.HSet(ctx, bucket.name, k, new).Err()
|
err = db.HSet(ctx, bucket.name, k, new).Err()
|
||||||
}
|
}
|
||||||
|
if err == nil {
|
||||||
|
for _, f := range endFuncs {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg, err
|
||||||
} else {
|
} else {
|
||||||
return toMaster(bucket.name, k, new)
|
return toMaster(bucket.name, k, new)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user