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 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",
+4
View File
@@ -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()
-21
View File
@@ -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
View File
@@ -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
}
}
+8
View File
@@ -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{}