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