This commit is contained in:
cdle
2023-06-02 10:46:18 +08:00
parent 0432c2505b
commit 95c39869a6
11 changed files with 354 additions and 74 deletions
+2 -1
View File
@@ -27,4 +27,5 @@ develop/boltdb
develop/core
*.db
dist/
core/dist
core/dist
.verysync
+5 -5
View File
@@ -76,19 +76,19 @@ func DestroyAdapterByUUID(uuid string) {
}
}
func GetAdapter(botids ...string) (*Factory, error) {
func GetAdapter(botplt string, bots_id ...string) (*Factory, error) {
BotsLocker.RLock()
defer BotsLocker.RUnlock()
botplt := botids[0]
bots_id := botids[1:]
var bots = []*Factory{}
var select_bots = []*Factory{}
for i := range Bots {
plt, id := i[0], i[1]
// fmt.Println("plt", plt, "id", id, botplt, bots_id)
for j := range bots_id {
if plt == botplt && bots_id[j] == id {
select_bots = append(select_bots, Bots[i])
} else if plt == botplt {
}
if plt == botplt {
bots = append(bots, Bots[i])
}
}
@@ -189,8 +189,8 @@ func (f *Factory) Push(msg map[string]string) (string, error) {
var sender = &demo
fsps := &common.FakerSenderParams{
UserID: msg[USER_ID],
ChatID: msg[CHAT_ID],
}
fsps.ChatID = msg[CHAT_ID]
sender.SetFsps(fsps)
return sender.Reply(msg[CONETNT], PUSH(""))
}
+25 -9
View File
@@ -5,6 +5,7 @@ import (
"regexp"
"sort"
"strings"
"sync/atomic"
"time"
"github.com/cdle/sillyplus/core/common"
@@ -26,6 +27,8 @@ type CarryGroupsResult struct {
var CarryGroups = MakeBucket("CarryGroups")
var carryCounter int64
// LOGIC
func init() {
AddCommand([]*common.Function{
@@ -40,9 +43,9 @@ func init() {
var content = s.GetContent()
var from *CarryGroup //判断当前消息来自采集源
var cgs = cgs
var uuid = utils.GenUUID()
var uuid = fmt.Sprintf("%d. ", atomic.AddInt64(&carryCounter, 1))
for i := range cgs {
if chat_id == cgs[i].ID && cgs[i].In {
if chat_id == cgs[i].ID && cgs[i].In && cgs[i].Enable {
from = &cgs[i]
break
}
@@ -101,7 +104,7 @@ func init() {
}
var outs []CarryGroup //预测转发群
for i := range cgs {
if cgs[i].Out && cgs[i].ID != chat_id {
if cgs[i].Enable && cgs[i].Out && cgs[i].ID != chat_id {
for j := range cgs[i].From {
if cgs[i].From[j] == chat_id {
if len(cgs[i].Allowed) != 0 { //白名单
@@ -132,8 +135,9 @@ func init() {
}
}
}
console.Debug("%s 预测转发群数目 %v", uuid, len(outs))
if len(outs) == 0 {
num := len(outs)
console.Debug("%s 预测转发群数目 %v", uuid, num)
if num == 0 {
return nil
}
var scripts = []string{}
@@ -170,13 +174,15 @@ func init() {
}
HELL:
if content != "" { //选择机器人
adapter, err := GetAdapter(append([]string{platform}, outs[i].BotsID...)...)
platform := outs[i].Platform
chat_id := outs[i].ID
adapter, err := GetAdapter(platform, outs[i].BotsID...)
if adapter == nil {
console.Warn("%s 转发群(%s)相关机器人%v都不在线", uuid, outs[i].ID, outs[i].BotsID)
console.Warn("%s (%s)转发群(%s)相关机器人%v都不在线", uuid, platform, chat_id, outs[i].BotsID)
continue
}
if err != nil {
console.Debug("%s 指定机器人都不在线,转发群(%s)已选择其他机器人(%s)推送", uuid, outs[i].ID, adapter.botid)
console.Debug("%s 指定(%s)机器人都不在线,转发群(%s)已选择其他机器人(%s)推送", uuid, platform, chat_id, adapter.botid)
}
if adapter != nil {
adapter.Push(map[string]string{
@@ -348,7 +354,17 @@ func init() {
var bots_id = []string{}
var users = []string{}
for _, cg := range cgs {
names[cg.ID] = cg.ChatName
if cg.In {
if cg.ChatName != "" {
names[cg.ID] = cg.ChatName
} else {
if cg.Remark != "" {
names[cg.ID] = cg.Remark
} else {
names[cg.ID] = cg.ID
}
}
}
if cg.ID == chat_id {
users = append(users, cg.Allowed...)
users = append(users, cg.Prohibited...)
+44 -36
View File
@@ -44,45 +44,53 @@ func init() {
}
platform := ctx.Query("platform")
data := []NicklabeL{}
if keyword != "" {
full := false
nickname.Foreach(func(b1, b2 []byte) error {
v := &Nickname{}
code := string(b1)
err := json.Unmarshal(b2, v)
if err == nil {
if v.Group != group {
return nil
}
if platform != "" && v.Platform != platform {
return nil
}
if strings.HasPrefix(code, keyword) || strings.Contains(v.Value, keyword) {
nl := NicklabeL{
ChatName: v.Value,
Value: code,
Platform: v.Platform,
}
if !group {
nl.Label = fmt.Sprintf("%s(%s)", v.Value, code)
} else {
nl.Label = fmt.Sprintf("%s %s@%s", v.Value, code, v.Platform)
}
data = append(data, nl)
if code == keyword {
full = true
}
}
data2 := []NicklabeL{}
// if keyword != "" {
// full := false
nickname.Foreach(func(b1, b2 []byte) error {
v := &Nickname{}
code := string(b1)
err := json.Unmarshal(b2, v)
if err == nil {
if v.Group != group {
return nil
}
return nil
})
if !full {
data = append([]NicklabeL{{
Label: keyword,
Value: keyword,
}}, data...)
if platform != "" && v.Platform != platform {
return nil
}
nl := NicklabeL{
ChatName: v.Value,
Value: code,
Platform: v.Platform,
}
if !group {
nl.Label = fmt.Sprintf("%s(%s)", v.Value, code)
} else {
nl.Label = fmt.Sprintf("%s %s@%s", v.Value, code, v.Platform)
}
if strings.HasPrefix(code, keyword) || strings.Contains(v.Value, keyword) {
data = append(data, nl)
// if code == keyword {
// full = true
// }
}
data2 = append(data2, nl)
}
return nil
})
// if !full {
// data = append([]NicklabeL{{
// Label: keyword,
// Value: keyword,
// }}, data...)
// } else
if len(data) == 0 {
data = append([]NicklabeL{{
Label: keyword,
Value: keyword,
}}, data2...)
}
// }
ctx.JSON(200, map[string]interface{}{
"success": true,
"data": data,
-1
View File
@@ -8,7 +8,6 @@ import (
func MakeBucketObject(vm *goja.Runtime, uuid string, on_start bool, bucket storage.Bucket) *goja.Object {
obj := vm.NewObject()
obj.Set("get", func(v ...interface{}) interface{} {
return GetBucketKeyValue(bucket, v...)
})
obj.Set("foreach", func(v ...interface{}) map[string]interface{} {
+56
View File
@@ -0,0 +1,56 @@
package core
import (
"sync"
"sync/atomic"
"github.com/dop251/goja"
)
type RR struct {
Req *Request
Res *Response
End func()
}
type HttpListen struct {
Path string
Method string
Chan chan *RR
UUID string
Closed bool
// Handle func(*Request, *Response)
}
var httpListens sync.Map
var listenCounter2 int64
func AddHttpListen(api, method string, vm *goja.Runtime, uuid string, resolve func(result interface{}), reject func(reason interface{})) {
key := atomic.AddInt64(&listenCounter2, 1)
hl := &HttpListen{
Path: api,
Method: method,
Chan: make(chan *RR, 1),
}
httpListens.Store(key, hl)
f, ok := <-hl.Chan
if ok {
resolve(f)
} else {
reject(Error(vm, "script is stopped"))
}
}
func CancelHttpListen(uuid string) {
httpListens.Range(func(key, value any) bool {
hl := value.(*HttpListen)
if hl.UUID == uuid {
httpListens.Delete(key)
if !hl.Closed {
hl.Closed = true
close(hl.Chan)
}
}
return true
})
}
+8 -7
View File
@@ -204,6 +204,7 @@ func initPlugins() {
CancelPluginCrons(key)
CancelPluginWebs(key)
CancelPluginlistening(key)
CancelHttpListen(key)
storage.DisableHandle(key)
if new != "" {
AddCommand([]*common.Function{f})
@@ -415,13 +416,13 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
var running func() bool
f := &common.Function{
Handle: func(s common.Sender) interface{} {
defer func() {
err := recover()
if err != nil {
console.Error("脚本错误:", err)
s.Reply(fmt.Sprint(err))
}
}()
// defer func() {
// err := recover()
// if err != nil {
// console.Error("脚本错误:", err)
// s.Reply(fmt.Sprint(err))
// }
// }()
if err2 != nil {
panic(err2)
}
+36 -15
View File
@@ -264,21 +264,21 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool) {
}
return o
})
registry.RegisterNativeModule("express", func(runtime *goja.Runtime, module *goja.Object) {
o := module.Get("exports").(*goja.Object)
methods := []string{"get", "post", "delete", "put", "fetch"}
for i := range methods {
method := methods[i]
o.Set(method, func(path string, handles ...func(*Request, *Response)) {
webs = append(webs, Web{
uuid: uuid,
method: strings.ToUpper(method),
path: path,
handles: handles,
})
})
}
})
// registry.RegisterNativeModule("express", func(runtime *goja.Runtime, module *goja.Object) {
// o := module.Get("exports").(*goja.Object)
// methods := []string{"get", "post", "delete", "put", "fetch"}
// for i := range methods {
// method := methods[i]
// o.Set(method, func(path string, handles ...func(*Request, *Response)) {
// webs = append(webs, Web{
// uuid: uuid,
// method: strings.ToUpper(method),
// path: path,
// handles: handles,
// })
// })
// }
// })
vm.Set("gofor", func(running func() bool, handle func()) {
go func() {
for {
@@ -377,6 +377,27 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool) {
}()
return promise
})
// for _, method := range []string{"get", "post", "delete", "put", "fetch"} {
// vm.Set(method, )
// }
vm.Set("HttpListen", func(method, api string) *goja.Promise {
promise, resolve, reject := vm.NewPromise()
go func() {
func() {
v := recover()
if v != nil {
if err, ok := v.(error); ok {
reject(Error(vm, err))
} else {
reject(Error(vm, fmt.Sprint(v)))
}
}
}()
AddHttpListen(api, strings.ToUpper(method), vm, uuid, resolve, reject)
}()
return promise
})
vm.Set("request", request)
}
+96
View File
@@ -41,6 +41,8 @@ func Cors() gin.HandlerFunc {
var Server = gin.New()
func init() {
gin.SetMode(gin.ReleaseMode)
// Server.Use(gin.Recovery())
Server.Use(Cors())
Server.Use(gzip.Gzip(gzip.DefaultCompression))
Server.NoRoute(func(c *gin.Context) {
@@ -85,6 +87,65 @@ func init() {
var res = &Response{
c: c,
}
httpListens.Range(func(key, value any) bool {
web := value.(*HttpListen)
if web.Closed {
return true
}
// fmt.Println(c.Request.URL.Path, key, web.Method, c.Request.Method)
if web.Method == c.Request.Method {
var matched = web.Path == c.Request.URL.Path
if !matched && strings.HasPrefix(web.Path, "^") {
reg, err := regexp.Compile(web.Path)
if err != nil {
console.Error(err)
return true
}
req.ress = reg.FindAllStringSubmatch(c.Request.URL.Path, -1)
matched = len(req.ress) != 0
}
if matched {
httpListens.Delete(key)
req.handled = true
var end = make(chan bool, 1)
// fmt.Println(c.Request.URL.Path, key)
web.Chan <- &RR{
Req: req,
Res: res,
End: func() {
if !web.Closed {
end <- true
}
},
}
select {
case <-end:
case <-time.After(time.Second * 10):
logs.Warn("%s 响应超时", c.Request.URL.Path)
}
web.Closed = true
close(end)
if !web.Closed {
close(web.Chan)
}
if req.handled {
if res.isRedirect {
return false
}
if res.isJson {
c.Header("Content-Type", "application/json")
}
// fmt.Println(res.status, res.content)
c.String(res.status, res.content)
return false
}
}
}
return true
})
if req.handled {
return
}
for _, web := range webs {
if web.handles == nil {
continue
@@ -121,6 +182,7 @@ func init() {
if res.isJson {
c.Header("Content-Type", "application/json")
}
// fmt.Println(res.status, res.content)
c.String(res.status, res.content)
return
}
@@ -129,6 +191,9 @@ func init() {
}
c.String(404, "页面被喵咪劫走了。") //
//开启代理模式
// handleHTTP(c.Writer, c.Request)
})
port := sillyGirl.GetString("port", "8080")
@@ -184,6 +249,37 @@ func init() {
}()
}
// var httpProxys = MakeBucket("httpProxys")
func handleHTTP(w http.ResponseWriter, req *http.Request) {
// console.Info("%s", utils.JsonMarshal(req.Header))
// u, err := url.Parse("addr")
// if err != nil {
// core.Logs.Warn("can't connect to the http proxy:", err)
// return
// }
// Transport = &http.Transport{Proxy: http.ProxyURL(u)}
// resp, err := Transport.RoundTrip(req)
// fmt.Println("====")
resp, err := http.DefaultTransport.RoundTrip(req)
if err != nil {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
defer resp.Body.Close()
copyHeader(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}
func copyHeader(dst, src http.Header) {
for k, vv := range src {
for _, v := range vv {
dst.Add(k, v)
}
}
}
type Req struct {
Method string
Path string
View File
+82
View File
@@ -0,0 +1,82 @@
name: Go
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Git clone sillyplus
run:
cd develop && git clone https://${{ secrets.CABLE_TOKEN }}@github.com/cdle/sillyplus.git
- name: Push to binary
run: |
rm -rf *
cp sillyplus/* ./
n=$(date +%s%3N)
echo "package core" > sillyplus/core/compile_time.go
echo "var compiled_at = \"$n\"" >> develop/core/compile_time.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o sillyGirl_windows_amd64
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -o sillyGirl_linux_arm64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o sillyGirl_linux_amd64
sudo apt-get install upx-ucl
upx sillyGirl_linux_arm64
upx sillyGirl_linux_amd64
upx sillyGirl_windows_amd64
git clone https://${{ secrets.CABLE_TOKEN }}@github.com/cdle/binary.git
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
cd binary
git checkout --orphan latest_branch
rm -rf *
cp ../sillyGirl_windows_amd64 sillyGirl_windows_amd64_$n
cp ../sillyGirl_linux_amd64 sillyGirl_linux_amd64_$n
cp ../sillyGirl_linux_arm64 sillyGirl_linux_arm64_$n
cp ../develop/core/compile_time.go compile_time.go
git add -A
git commit -am "commit message"
git branch -D main
git branch -m main
git push -f origin main
wget -q -O - "${{ secrets.VERSION }}$n"
- name: Upload to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: sillyGirl_linux_amd64
asset_name: sillyGirl_linux_amd64
tag: ${{ github.ref }}
overwrite: true
- name: Upload to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: sillyGirl_windows_amd64
asset_name: sillyGirl_windows_amd64
tag: ${{ github.ref }}
overwrite: true
- name: Upload to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: sillyGirl_linux_arm64
asset_name: sillyGirl_linux_arm64
tag: ${{ github.ref }}
overwrite: true