From 615e543845bb353c6ae55d780ed2c50841103151 Mon Sep 17 00:00:00 2001 From: 1-6 Date: Thu, 27 Jul 2023 00:24:47 +0800 Subject: [PATCH] x --- core/adapter.go | 23 ++- core/base_sender.go | 321 ++++++++++++++++++------------------------ core/function.go | 47 ++++--- core/grpc_asset.go | 2 +- core/grpc_plugins.go | 4 +- core/grpc_sender.go | 8 +- core/web.go | 6 +- core/websocket.go | 19 ++- proto3/note.sh | 4 +- proto3/sillygirl.d.ts | 2 +- proto3/sillygirl.js | 6 +- proto3/sillygirl.ts | 6 +- 12 files changed, 204 insertions(+), 244 deletions(-) diff --git a/core/adapter.go b/core/adapter.go index 8bb55b9..92deacf 100644 --- a/core/adapter.go +++ b/core/adapter.go @@ -692,8 +692,10 @@ func (sender *CustomSender) Action(options map[string]interface{}) (interface{}, one = any } if one != nil { - one.Handle(&Faker{ - Type: "action", + one.Handle(&CustomSender{ + F: &Factory{ + botplt: "action", + }, }, func(vm *goja.Runtime) { obj := vm.NewObject() for k, v := range options { @@ -798,8 +800,10 @@ func (sender *CustomSender) Reply(msgs ...interface{}) (string, error) { } if one != nil { message_id := "" - one.Handle(&Faker{ - Type: "message", + one.Handle(&CustomSender{ + F: &Factory{ + botplt: "message", + }, }, func(vm *goja.Runtime) { obj := vm.NewObject() for k, v := range msg { @@ -935,14 +939,3 @@ func (sender *CustomSender) IsAdmin() bool { } return sender.F.isAdmin(sender.GetUserID()) } - -func (sender *CustomSender) GetID() string { - return sender.id -} - -func (sender *CustomSender) SetID() string { - sender.id = utils.GenUUID() - sender.CreatedAt = time.Now() - senders.Store(sender.id, sender) - return sender.id -} diff --git a/core/base_sender.go b/core/base_sender.go index b79c110..f60f4a9 100644 --- a/core/base_sender.go +++ b/core/base_sender.go @@ -3,7 +3,6 @@ package core import ( "errors" "fmt" - "reflect" "regexp" "strings" "sync" @@ -26,127 +25,127 @@ type Faker struct { Admin bool } -func (sender *Faker) Listen() chan string { - return sender.Carry -} +//func (sender *Faker) Listen() chan string { +// return sender.Carry +// } -func (sender *Faker) GetContent() string { - if sender.Fsps.Content != "" { - return sender.Fsps.Content - } - return sender.Message -} +//func (sender *Faker) GetContent() string { +// if sender.Fsps.Content != "" { +// return sender.Fsps.Content +// } +// return sender.Message +// } -func (sender *Faker) GetUserID() string { - return sender.UserID -} +//func (sender *Faker) GetUserID() string { +// return sender.UserID +// } -func (sender *Faker) GetBotID() string { - return "" -} +//func (sender *Faker) GetBotID() string { +// return "" +// } -func (sender *Faker) GetChatID() string { - return sender.ChatID -} +//func (sender *Faker) GetChatID() string { +// return sender.ChatID +// } -func (sender *Faker) GetImType() string { - if sender.Type == "" { - return "fake" - } - return sender.Type -} +//func (sender *Faker) GetImType() string { +// if sender.Type == "" { +// return "fake" +// } +// return sender.Type +// } -func (sender *Faker) GetMessageID() string { - return "" -} +//func (sender *Faker) GetMessageID() string { +// return "" +// } -func (sender *Faker) GetUserName() string { - return "" -} +//func (sender *Faker) GetUserName() string { +// return "" +// } -func (sender *Faker) GetChatName() string { - return "" -} +//func (sender *Faker) GetChatName() string { +// return "" +// } -func (sender *Faker) IsReply() bool { - return false -} +//func (sender *Faker) IsReply() bool { +// return false +// } -func (sender *Faker) GetReplyUserID() int { - return 0 -} +// //func (sender *Faker) GetReplyUserID() int { +// return 0 +// } -func (sender *Faker) GetRawMessage() interface{} { - return sender.Message -} +// //func (sender *Faker) GetRawMessage() interface{} { +// return sender.Message +// } -func (sender *Faker) IsAdmin() bool { - return sender.Admin -} +// //func (sender *Faker) IsAdmin() bool { +// return sender.Admin +// } -func (sender *Faker) IsMedia() bool { - return false -} +// //func (sender *Faker) IsMedia() bool { +// return false +// } -func (sender *Faker) Reply(msgs ...interface{}) (string, error) { - rt := "" - for _, msg := range msgs { - switch msg := msg.(type) { - case []byte: - rt = (string(msg)) - case string: - rt = msg - } - } - { +//func (sender *Faker) Reply(msgs ...interface{}) (string, error) { +// rt := "" +// for _, msg := range msgs { +// switch msg := msg.(type) { +// case []byte: +// rt = (string(msg)) +// case string: +// rt = msg +// } +// } +// { - for _, v := range regexp.MustCompile(`\[CQ:image,file=([^\[\]]+)\]`).FindAllStringSubmatch(rt, -1) { - // qr := qrcode2console.NewQRCode2ConsoleWithUrl(v[1], true) - // defer qr.Output() - rt = strings.Replace(rt, fmt.Sprintf(`[CQ:image,file=%s]`, v[1]), "", -1) - } - } +// for _, v := range regexp.MustCompile(`\[CQ:image,file=([^\[\]]+)\]`).FindAllStringSubmatch(rt, -1) { +// // qr := qrcode2console.NewQRCode2ConsoleWithUrl(v[1], true) +// // defer qr.Output() +// rt = strings.Replace(rt, fmt.Sprintf(`[CQ:image,file=%s]`, v[1]), "", -1) +// } +// } - // if rt != "" && n != nil { - // NotifyMasters(rt) - // } +// if rt != "" && n != nil { +// NotifyMasters(rt) +// } - // if rt != "" && sender.Carry != nil { - // sender.Carry <- rt - // } +// if rt != "" && sender.Carry != nil { +// sender.Carry <- rt +// } - if rt != "" && sender.Type == "terminal" { - fmt.Printf("\x1b[%dm%s \x1b[0m\n", 31, rt) - } - return "", nil -} +// if rt != "" && sender.Type == "terminal" { +// fmt.Printf("\x1b[%dm%s \x1b[0m\n", 31, rt) +// } +// return "", nil +// } -func (sender *Faker) Delete() error { - return nil -} +//func (sender *Faker) Delete() error { +// return nil +// } -func (sender *Faker) Disappear(lifetime ...time.Duration) { +//func (sender *Faker) Disappear(lifetime ...time.Duration) { -} +// } -func (sender *Faker) Finish() { - if sender.Carry != nil { - close(sender.Carry) - } -} +//func (sender *Faker) Finish() { +// if sender.Carry != nil { +// close(sender.Carry) +// } +// } -func (sender *Faker) Copy() common.Sender { - new := reflect.Indirect(reflect.ValueOf(interface{}(sender))).Interface().(Faker) - return &new -} +//func (sender *Faker) Copy() common.Sender { +// new := reflect.Indirect(reflect.ValueOf(interface{}(sender))).Interface().(Faker) +// return &new +// } -func (sender *Faker) GroupKick(uid string, reject_add_request bool) error { - return nil -} +//func (sender *Faker) GroupKick(uid string, reject_add_request bool) error { +// return nil +// } -func (sender *Faker) GroupBan(uid string, duration int) error { - return nil -} +//func (sender *Faker) GroupBan(uid string, duration int) error { +// return nil +// } type BaseSender struct { matches [][]string @@ -165,30 +164,30 @@ type BaseSender struct { plugin_id string } -func (sender *BaseSender) SetPluginID(plugin_id string) { +func (sender *CustomSender) SetPluginID(plugin_id string) { sender.plugin_id = plugin_id } -func (sender *BaseSender) GetPluginID() string { +func (sender *CustomSender) GetPluginID() string { return sender.plugin_id } -func (sender *BaseSender) SetLevel(l int) { +func (sender *CustomSender) SetLevel(l int) { sender.level = l } -func (sender *BaseSender) GetLevel() int { +func (sender *CustomSender) GetLevel() int { return sender.level } -func (sender *BaseSender) SetMark(mark interface{}) { +func (sender *CustomSender) SetMark(mark interface{}) { sender.mark = mark } -func (sender *BaseSender) GetMark() interface{} { +func (sender *CustomSender) GetMark() interface{} { return sender.mark } -func (sender *BaseSender) SetExpandMessageInfo(emf map[string]interface{}) { +func (sender *CustomSender) SetExpandMessageInfo(emf map[string]interface{}) { if sender.emf == nil { sender.emf = map[string]interface{}{} } @@ -197,21 +196,21 @@ func (sender *BaseSender) SetExpandMessageInfo(emf map[string]interface{}) { } } -func (sender *BaseSender) GetExpandMessageInfo() map[string]interface{} { +func (sender *CustomSender) GetExpandMessageInfo() map[string]interface{} { if sender.emf == nil { sender.emf = map[string]interface{}{} } return sender.emf } -func (sender *BaseSender) SetVar(key string, value interface{}) { +func (sender *CustomSender) SetVar(key string, value interface{}) { if sender.emf == nil { sender.emf = map[string]interface{}{} } sender.emf[key] = value } -func (sender *BaseSender) GetVar(key string) interface{} { +func (sender *CustomSender) GetVar(key string) interface{} { if sender.emf == nil { sender.emf = map[string]interface{}{} } @@ -222,45 +221,45 @@ func (sender *BaseSender) GetVar(key string) interface{} { return v } -func (sender *BaseSender) SetMatch(ss []string) { +func (sender *CustomSender) SetMatch(ss []string) { sender.matches = [][]string{ss} } -func (sender *BaseSender) SetParams(ss []string) { +func (sender *CustomSender) SetParams(ss []string) { sender.params = ss } -func (sender *BaseSender) SetAllMatch(ss [][]string) { +func (sender *CustomSender) SetAllMatch(ss [][]string) { sender.matches = ss } -func (sender *BaseSender) SetContent(content string) { +func (sender *CustomSender) SetContent(content string) { sender.Fsps.Content = content } -func (sender *BaseSender) SetFsps(fsps *common.FakerSenderParams) { +func (sender *CustomSender) SetFsps(fsps *common.FakerSenderParams) { sender.Fsps = *fsps } -func (sender *BaseSender) GetMatch() []string { +func (sender *CustomSender) GetMatch() []string { return sender.matches[0] } -func (sender *BaseSender) GetAllMatch() [][]string { +func (sender *CustomSender) GetAllMatch() [][]string { return sender.matches } -func (sender *BaseSender) Continue() { +func (sender *CustomSender) Continue() { sender.goon = true } -func (sender *BaseSender) IsContinue() bool { +func (sender *CustomSender) IsContinue() bool { return sender.goon } -func (sender *BaseSender) ClearContinue() { +func (sender *CustomSender) ClearContinue() { sender.goon = false } -func (sender *BaseSender) Get(i interface{}) string { +func (sender *CustomSender) Get(i interface{}) string { switch i := i.(type) { case int: if len(sender.matches) == 0 { @@ -281,7 +280,7 @@ func (sender *BaseSender) Get(i interface{}) string { return "" } -func (sender *BaseSender) Delete() error { +func (sender *CustomSender) Delete() error { return nil } @@ -289,120 +288,70 @@ func (sender *BaseSender) Disappear(lifetime ...time.Duration) { } -func (sender *BaseSender) Finish() { +func (sender *CustomSender) Finish() { sender.IsFinished = true } -func (sender *BaseSender) IsMedia() bool { +func (sender *CustomSender) IsMedia() bool { return false } -func (sender *BaseSender) GetRawMessage() interface{} { +func (sender *CustomSender) GetRawMessage() interface{} { return nil } -func (sender *BaseSender) IsReply() bool { +func (sender *CustomSender) IsReply() bool { return false } -func (sender *BaseSender) GetMessageID() string { - return "" -} - -func (sender *BaseSender) RecallMessage(...interface{}) { - -} - -func (sender *BaseSender) GetUserID() string { - return "" -} -func (sender *BaseSender) GetChatID() string { - return "" -} -func (sender *BaseSender) Push(msg map[string]string) (string, error) { +func (sender *CustomSender) Push(msg map[string]string) (string, error) { return "", nil } -func (sender *BaseSender) GetImType() string { - return "" -} -func (sender *BaseSender) GroupKick(uid string, reject_add_request bool) error { +func (sender *CustomSender) GroupUnkick(uid string) error { return nil } -func (sender *BaseSender) GroupUnkick(uid string) error { - return nil -} - -func (sender *BaseSender) GroupBan(uid string, duration int) error { - return nil -} - -func (sender *BaseSender) GroupUnban(uid string) error { - return nil - -} - -func (sender *BaseSender) GetUserName() string { - return "" -} - -func (sender *BaseSender) IsAdmin() bool { - return false -} - -func (sender *BaseSender) GetChatName() string { - return "" -} - -func (sender *BaseSender) GetReplyUserID() int { +func (sender *CustomSender) GetReplyUserID() int { return 0 } -func (sender *BaseSender) GetReplyMessageID() int { +func (sender *CustomSender) GetReplyMessageID() int { return 0 } -func (sender *BaseSender) AtLast() { +func (sender *CustomSender) AtLast() { sender.Atlast = true } -func (sender *BaseSender) UAtLast() { +func (sender *CustomSender) UAtLast() { sender.Atlast = false } -func (sender *BaseSender) Stop() { +func (sender *CustomSender) Stop() { panic("stop") } -func (sender *BaseSender) Event() map[string]interface{} { - return nil -} - -func (sender *BaseSender) Action(map[string]interface{}) (interface{}, error) { - return nil, nil -} - -func (sender *BaseSender) GetID() string { +func (sender *CustomSender) GetID() string { return sender.id } -func (sender *BaseSender) SetID() string { +func (sender *CustomSender) SetID() string { sender.id = utils.GenUUID() sender.CreatedAt = time.Now() senders.Store(sender.id, sender) return sender.id } -func (sender *BaseSender) GetTime() time.Time { +func (sender *CustomSender) GetTime() time.Time { return sender.CreatedAt } -func (sender *BaseSender) IsAtLast() bool { +func (sender *CustomSender) IsAtLast() bool { return sender.Atlast } -func (sender *BaseSender) MessagesToSend() string { +func (sender *CustomSender) MessagesToSend() string { return strings.Join(sender.ToSendMessages, "\n") } @@ -507,7 +456,7 @@ type Switch []string var listenCounter int64 -func (s *BaseSender) Await(message common.Sender, callback func(common.Sender) interface{}, params ...interface{}) interface{} { +func (s *CustomSender) Await(message common.Sender, callback func(common.Sender) interface{}, params ...interface{}) interface{} { timeout := time.Hour * 999999 var handleErr func(error) var persistent = false diff --git a/core/function.go b/core/function.go index 7984ae3..ab96a28 100644 --- a/core/function.go +++ b/core/function.go @@ -378,8 +378,10 @@ func AddCommand(cmds []*common.Function) { go func(f *common.Function) { time.Sleep(time.Second) console.Log("初始化%v服务", f.Title) - f.Handle(&Faker{ - Type: "*", + f.Handle(&CustomSender{ + F: &Factory{ + botplt: "*", + }, }, nil) }(cmds[j]) } @@ -393,9 +395,10 @@ func AddCommand(cmds []*common.Function) { Cron = "0 " + Cron } cronId, err := CRON.AddFunc(Cron, func() { - cmds[j].Handle(&Faker{ - Admin: true, - Type: plt, + cmds[j].Handle(&CustomSender{ + F: &Factory{ + botplt: plt, + }, }, nil) }) if err == nil { @@ -540,23 +543,23 @@ func HandleMessage(sender common.Sender) { sender.SetMatch(res[1:]) sender.SetParams(c.Function.Params[i]) mtd = true - if f, ok := c.Message.(*Faker); ok && f.Carry != nil { - if s1, o := sender.(*Faker); o && s1.Carry != nil { - f.Carry = s1.Carry - c := make(chan string) - oc := s1.Carry - s1.Carry = c - go func() { - for { - r, o := <-c - if !o { - break - } - oc <- r - } - }() - } - } + // if f, ok := c.Message.(*CustomSender); ok && f.Carry != nil { + // if s1, o := sender.(*CustomSender); o && s1.Carry != nil { + // f.Carry = s1.Carry + // c := make(chan string) + // oc := s1.Carry + // s1.Carry = c + // go func() { + // for { + // r, o := <-c + // if !o { + // break + // } + // oc <- r + // } + // }() + // } + // } c.Chan <- sender sender.Reply(<-c.Result) if !sender.IsContinue() { diff --git a/core/grpc_asset.go b/core/grpc_asset.go index d809a36..723e99d 100644 --- a/core/grpc_asset.go +++ b/core/grpc_asset.go @@ -24,7 +24,7 @@ type Language struct { } var plugin_dir = utils.ExecPath + "/plugins" -var release = "20230726" +var release = "20230727" var languages = []Language{ { diff --git a/core/grpc_plugins.go b/core/grpc_plugins.go index ac93715..56c48d2 100644 --- a/core/grpc_plugins.go +++ b/core/grpc_plugins.go @@ -313,7 +313,9 @@ func AddNodePlugin(path, name string) error { } senders.Store(id, s) - defer senders.Delete(id) + defer func() { + fmt.Println("senders.Delete(id)") + }() defer processes.Delete(cmd) err = cmd.Wait() if err != nil { diff --git a/core/grpc_sender.go b/core/grpc_sender.go index 7640fab..800bb9d 100644 --- a/core/grpc_sender.go +++ b/core/grpc_sender.go @@ -34,7 +34,6 @@ var senders sync.Map // } func GetSender(uuid string) (common.Sender, error) { - if uuid == "" { return &CustomSender{ F: &Factory{ @@ -43,7 +42,6 @@ func GetSender(uuid string) (common.Sender, error) { }, nil } v, ok := senders.Load(uuid) - // fmt.Println("uuid", uuid, v, ok) if !ok { return nil, errors.New("not found sender") } @@ -201,10 +199,13 @@ func (sg *SillyGirlService) SenderListen(stream srpc.SillyGirlService_SenderList if req.Persistent { persistent = req.Persistent options = append(options, "persistent") + } else { + options = append(options, func(err error) { + stream.Send(&srpc.SenderListenResponse{Echo: ""}) + }) } go s.Await(s, func(s common.Sender) interface{} { id := s.SetID() - defer senders.Delete(id) echo := utils.GenUUID() ch := make(chan string) echos.Store(echo, ch) @@ -219,6 +220,7 @@ func (sg *SillyGirlService) SenderListen(stream srpc.SillyGirlService_SenderList stream.Send(&srpc.SenderListenResponse{Echo: "END"}) } } else { + defer senders.Delete(id) value = strings.Replace(value, "go_again_", "", 1) } return value diff --git a/core/web.go b/core/web.go index 3d9b94f..01b2c80 100644 --- a/core/web.go +++ b/core/web.go @@ -243,8 +243,10 @@ func initWeb() { } if (matched || c.Request.URL.Path == path) && (c.Request.Method == method || "ANY" == method) { req.handled = true - function.Handle(&Faker{ - Type: "http", + function.Handle(&CustomSender{ + F: &Factory{ + botplt: "http", + }, }, func(vm *goja.Runtime) { vm.Set("res", res) vm.Set("req", req) diff --git a/core/websocket.go b/core/websocket.go index 3fdf879..d132739 100644 --- a/core/websocket.go +++ b/core/websocket.go @@ -109,8 +109,11 @@ func handleWebsocket(c *gin.Context) { req._event = "connect" wc.conn = ws - go function.Handle(&Faker{ - Type: "websocket", + + go function.Handle(&CustomSender{ + F: &Factory{ + botplt: "websocket", + }, }, func(vm *goja.Runtime) { vm.Set("res", &Response{ c: c, @@ -173,8 +176,10 @@ func handleWebsocket(c *gin.Context) { function = f2 } } - function.Handle(&Faker{ - Type: "websocket", + function.Handle(&CustomSender{ + F: &Factory{ + botplt: "websocket", + }, }, func(vm *goja.Runtime) { vm.Set("res", &Response{ c: c, @@ -193,8 +198,10 @@ func handleWebsocket(c *gin.Context) { function = f2 } } - go function.Handle(&Faker{ - Type: "websocket", + go function.Handle(&CustomSender{ + F: &Factory{ + botplt: "websocket", + }, }, func(vm *goja.Runtime) { vm.Set("res", &Response{ c: c, diff --git a/proto3/note.sh b/proto3/note.sh index 76b218f..3691011 100644 --- a/proto3/note.sh +++ b/proto3/note.sh @@ -24,8 +24,8 @@ macos编译: cp /Users/a1-6/Code/sillyplus/proto3/dist/sillygirl.js /Users/a1-6/Code/node/node-v18.16.1/lib/sillygirl.js && cd /Users/a1-6/Code/node/node-v18.16.1 && ninja -C out/Release && cp out/Release/node /Users/a1-6/Code/nodes/node_darwin_arm64 #压缩 -cd /Users/a1-6/Code/nodes/node_darwin_arm64 && zip node_darwin_arm64.zip node -cd /Users/a1-6/Code/nodes/node_linux_amd64 && zip node_linux_amd64.zip node +cd /Users/a1-6/Code/nodes/node_darwin_arm64 +cd /Users/a1-6/Code/nodes/node_linux_amd64 ## git add . && git commit -m "x" && git push \ No newline at end of file diff --git a/proto3/sillygirl.d.ts b/proto3/sillygirl.d.ts index 68399ae..5d64cb2 100644 --- a/proto3/sillygirl.d.ts +++ b/proto3/sillygirl.d.ts @@ -28,7 +28,7 @@ declare class Sender { allow_users?: string[]; prohibit_users?: string[]; persistent?: boolean; - }): Promise; + }): Promise; holdOn(str: string): string; reply(content: string): Promise; action(options: any): Promise; diff --git a/proto3/sillygirl.js b/proto3/sillygirl.js index 6431418..ef92445 100644 --- a/proto3/sillygirl.js +++ b/proto3/sillygirl.js @@ -237,8 +237,8 @@ class Sender { call.cancel(); return; } - let s = new Sender(response.uuid); - if (options?.handle) { + let s = response.uuid ? new Sender(response.uuid) : undefined; + if (options?.handle && s) { // console.log(`options?.handle`, options.persistent) let obj = options?.handle(s); if (typeof obj == "string") { @@ -538,7 +538,9 @@ class Adapter { this.bot_id = options.bot_id; if (options.replyHandler) { const call = client.AdapterRegist(); + // let callback: any = ; call.on("data", async (response) => { + // console.log("start on data") let message = JSON.parse(response.value); const { echo, __type__ } = message; delete message.__type__; diff --git a/proto3/sillygirl.ts b/proto3/sillygirl.ts index 2cc4e6f..34694ae 100644 --- a/proto3/sillygirl.ts +++ b/proto3/sillygirl.ts @@ -230,7 +230,7 @@ class Sender { allow_users?: string[]; // 用户白名单 prohibit_users?: string[]; // 群聊白名单 persistent?: boolean; //持久化监听 - }): Promise { + }): Promise { return new Promise( async (resolve, reject) => { let params: any = { @@ -259,8 +259,8 @@ class Sender { call.cancel(); return; } - let s = new Sender(response.uuid); - if (options?.handle) { + let s = response.uuid ? new Sender(response.uuid) : undefined; + if (options?.handle && s) { // console.log(`options?.handle`, options.persistent) let obj = options?.handle(s); if (typeof obj == "string") {