diff --git a/adapters/pagermaid/main.py b/adapters/pagermaid/sillyplus.py similarity index 93% rename from adapters/pagermaid/main.py rename to adapters/pagermaid/sillyplus.py index abf1eec..2ac5641 100644 --- a/adapters/pagermaid/main.py +++ b/adapters/pagermaid/sillyplus.py @@ -1,4 +1,5 @@ import contextlib +import io import json from asyncio import sleep @@ -119,6 +120,9 @@ class WebSocket: action = data.get("action", None) action_data = data.get("data", None) bot_action = getattr(bot, action) + if action == "send_document": + action_data['document'] = io.BytesIO(str.encode(action_data['document'])) + if bot_action and action_data: message = await bot_action(**action_data) message = str(message.__str__()) @@ -146,7 +150,7 @@ async def websocket_push(message: Message): ChatType.SUPERGROUP, ChatType.CHANNEL, ]: - if not ws.whitelist or str(message.chat.id) not in ws.whitelist: + if not ws.whitelist or ((message.chat and str(message.chat.id) not in ws.whitelist) and (message.from_user and str(message.from_user.id) not in ws.whitelist)): if message.text not in [ "reply", "listen", diff --git a/core/adapter.go b/core/adapter.go index 039338d..9c5ac3b 100644 --- a/core/adapter.go +++ b/core/adapter.go @@ -265,6 +265,10 @@ func (f *Factory) IsAdapter(botid string) bool { return false } +func (f *Factory) Masters() []string { + return strings.Split(strings.Trim(MakeBucket(f.botplt).GetString("masters"), "&"), "&") +} + func (f *Factory) Destroy() { BotsLocker.Lock() defer BotsLocker.Unlock() diff --git a/core/node_request.go b/core/node_request.go index c06a873..1551458 100644 --- a/core/node_request.go +++ b/core/node_request.go @@ -99,26 +99,6 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro if instance != nil { defer instance.Close() } - - // var url, user, password string - // for k, v := range props[i].(map[string]interface{}) { - // if k == "url" { - // url = fmt.Sprint(v) - // } - // if k == "user" { - // user = fmt.Sprint(v) - // } - // if k == "password" { - // password = fmt.Sprint(v) - // } - // } - // if url != "" { - // var err error - // transport, err = GetTransport(url, user, password) - // if err != nil { - // return nil, err - // } - // } } } } @@ -201,7 +181,6 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro if err != nil { return nil, err } - defer rsp.Body.Close() obj, err := MakeResponseObject(vm, rsp, responseType) rspObj = vm.NewProxy(obj, &goja.ProxyTrapConfig{ Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { diff --git a/core/node_response.go b/core/node_response.go index acce5f0..ad8380e 100644 --- a/core/node_response.go +++ b/core/node_response.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "net/http" "strings" + "time" "github.com/dop251/goja" "github.com/goccy/go-json" @@ -17,19 +18,23 @@ import ( func readEvent(body io.Reader) (string, error) { var event string - // 读取一行数据 - reader := bufio.NewReader(body) - line, err := reader.ReadString('\n') - if err != nil { - return event, err + scanner := bufio.NewScanner(body) + + for scanner.Scan() { + line := scanner.Text() + + // 去掉换行符 + line = strings.TrimSuffix(line, "\n") + + // 判断是否是事件行 + if strings.HasPrefix(line, "data: ") { + event = strings.TrimPrefix(line, "data: ") + break + } } - // 去掉换行符 - line = strings.TrimSuffix(line, "\n") - - // 判断是否是事件行 - if strings.HasPrefix(line, "data: ") { - event = strings.TrimPrefix(line, "data: ") + if err := scanner.Err(); err != nil { + return event, err } return event, nil @@ -37,12 +42,8 @@ func readEvent(body io.Reader) (string, error) { func MakeResponseObject(vm *goja.Runtime, resp *http.Response, responseType string) (*goja.Object, error) { obj := vm.NewObject() - - cjson := false - var data []byte var err error - obj.Set("status", resp.StatusCode) obj.Set("headers", vm.NewProxy(MakeHeadersObject(vm, resp.Header), &goja.ProxyTrapConfig{ Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { @@ -60,52 +61,57 @@ func MakeResponseObject(vm *goja.Runtime, resp *http.Response, responseType stri return true }, })) - - var dataCallback func(chunk interface{}) - var endCallback func(chunk interface{}) - - obj.Set("on", func(event string, callback func(chunk interface{})) { - switch event { - case "data": - dataCallback = callback - case "json": - cjson = true - dataCallback = callback - case "end": - endCallback = callback - } - }) - if resp.Header.Get("Content-Type") == "text/event-stream" { - events := []string{} + var evc = make(chan interface{}, 100) + var closed = false go func() { + defer resp.Body.Close() for { event, err := readEvent(resp.Body) if err != nil { - if endCallback != nil { - endCallback(nil) - } + evc <- err break } - events = append(events, event) - if dataCallback != nil { - for i := range events { - if cjson { - var v interface{} - json.Unmarshal([]byte(events[i]), &v) - dataCallback(v) - } else { - dataCallback(events[i]) - } - } - events = nil - } + evc <- event + } + time.Sleep(time.Minute * 5) + if !closed { + close(evc) + evc = nil + closed = true } }() + obj.Set("on", func(event string) interface{} { + switch event { + case "data", "json": + var rs = <-evc + switch v := rs.(type) { + case error: + if !closed { + close(evc) + evc = nil + closed = true + } + panic(Error(vm, v)) + case string: + if event == "json" { + var r interface{} + err := json.Unmarshal([]byte([]byte(v)), &r) + if err != nil { + panic(Error(vm, err)) + } + return r + } + return v + } + } + return nil + }) return obj, err } else { + defer resp.Body.Close() data, err = ioutil.ReadAll(resp.Body) - if err != nil { /////// + if err != nil { return obj, err } } diff --git a/core/plugin_impl.go b/core/plugin_impl.go index 684ce1d..b18a0ed 100644 --- a/core/plugin_impl.go +++ b/core/plugin_impl.go @@ -283,6 +283,14 @@ func (sender *SenderJsIplm) IsAdmin() bool { return sender.Message.IsAdmin() } +func (sender *SenderJsIplm) Action(options map[string]interface{}) interface{} { + result, err := sender.Message.Action(options) + return map[string]interface{}{ + "result": result, + "error": err, + } +} + func (sender *SenderJsIplm) Reply(texts ...interface{}) interface{} { i, err := sender.Message.Reply(texts...) var errstr interface{}