x
This commit is contained in:
@@ -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",
|
||||
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+55
-49
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
|
||||
Reference in New Issue
Block a user