This commit is contained in:
1-6
2023-07-15 16:46:09 +08:00
parent 20cc7e343c
commit a668e2b441
5 changed files with 72 additions and 71 deletions
@@ -1,4 +1,5 @@
import contextlib import contextlib
import io
import json import json
from asyncio import sleep from asyncio import sleep
@@ -119,6 +120,9 @@ class WebSocket:
action = data.get("action", None) action = data.get("action", None)
action_data = data.get("data", None) action_data = data.get("data", None)
bot_action = getattr(bot, action) 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: if bot_action and action_data:
message = await bot_action(**action_data) message = await bot_action(**action_data)
message = str(message.__str__()) message = str(message.__str__())
@@ -146,7 +150,7 @@ async def websocket_push(message: Message):
ChatType.SUPERGROUP, ChatType.SUPERGROUP,
ChatType.CHANNEL, 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 [ if message.text not in [
"reply", "reply",
"listen", "listen",
+4
View File
@@ -265,6 +265,10 @@ func (f *Factory) IsAdapter(botid string) bool {
return false return false
} }
func (f *Factory) Masters() []string {
return strings.Split(strings.Trim(MakeBucket(f.botplt).GetString("masters"), "&"), "&")
}
func (f *Factory) Destroy() { func (f *Factory) Destroy() {
BotsLocker.Lock() BotsLocker.Lock()
defer BotsLocker.Unlock() defer BotsLocker.Unlock()
-21
View File
@@ -99,26 +99,6 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro
if instance != nil { if instance != nil {
defer instance.Close() 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 { if err != nil {
return nil, err return nil, err
} }
defer rsp.Body.Close()
obj, err := MakeResponseObject(vm, rsp, responseType) obj, err := MakeResponseObject(vm, rsp, responseType)
rspObj = vm.NewProxy(obj, &goja.ProxyTrapConfig{ rspObj = vm.NewProxy(obj, &goja.ProxyTrapConfig{
Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
+55 -49
View File
@@ -7,6 +7,7 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strings" "strings"
"time"
"github.com/dop251/goja" "github.com/dop251/goja"
"github.com/goccy/go-json" "github.com/goccy/go-json"
@@ -17,19 +18,23 @@ import (
func readEvent(body io.Reader) (string, error) { func readEvent(body io.Reader) (string, error) {
var event string var event string
// 读取一行数据 scanner := bufio.NewScanner(body)
reader := bufio.NewReader(body)
line, err := reader.ReadString('\n') for scanner.Scan() {
if err != nil { line := scanner.Text()
return event, err
// 去掉换行符
line = strings.TrimSuffix(line, "\n")
// 判断是否是事件行
if strings.HasPrefix(line, "data: ") {
event = strings.TrimPrefix(line, "data: ")
break
}
} }
// 去掉换行符 if err := scanner.Err(); err != nil {
line = strings.TrimSuffix(line, "\n") return event, err
// 判断是否是事件行
if strings.HasPrefix(line, "data: ") {
event = strings.TrimPrefix(line, "data: ")
} }
return event, nil 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) { func MakeResponseObject(vm *goja.Runtime, resp *http.Response, responseType string) (*goja.Object, error) {
obj := vm.NewObject() obj := vm.NewObject()
cjson := false
var data []byte var data []byte
var err error var err error
obj.Set("status", resp.StatusCode) obj.Set("status", resp.StatusCode)
obj.Set("headers", vm.NewProxy(MakeHeadersObject(vm, resp.Header), &goja.ProxyTrapConfig{ obj.Set("headers", vm.NewProxy(MakeHeadersObject(vm, resp.Header), &goja.ProxyTrapConfig{
Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) { 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 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" { if resp.Header.Get("Content-Type") == "text/event-stream" {
events := []string{} var evc = make(chan interface{}, 100)
var closed = false
go func() { go func() {
defer resp.Body.Close()
for { for {
event, err := readEvent(resp.Body) event, err := readEvent(resp.Body)
if err != nil { if err != nil {
if endCallback != nil { evc <- err
endCallback(nil)
}
break break
} }
events = append(events, event) evc <- event
if dataCallback != nil { }
for i := range events { time.Sleep(time.Minute * 5)
if cjson { if !closed {
var v interface{} close(evc)
json.Unmarshal([]byte(events[i]), &v) evc = nil
dataCallback(v) closed = true
} else {
dataCallback(events[i])
}
}
events = nil
}
} }
}() }()
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 return obj, err
} else { } else {
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body) data, err = ioutil.ReadAll(resp.Body)
if err != nil { /////// if err != nil {
return obj, err return obj, err
} }
} }
+8
View File
@@ -283,6 +283,14 @@ func (sender *SenderJsIplm) IsAdmin() bool {
return sender.Message.IsAdmin() 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{} { func (sender *SenderJsIplm) Reply(texts ...interface{}) interface{} {
i, err := sender.Message.Reply(texts...) i, err := sender.Message.Reply(texts...)
var errstr interface{} var errstr interface{}