mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2026-02-12 02:00:24 +00:00
✨ 新增 插件冲突检测、b14 加解密 添加随机等待 1~2s 工具函数
This commit is contained in:
92
control/cd.go
Normal file
92
control/cd.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package control
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
b14 "github.com/fumiama/go-base16384"
|
||||
zero "github.com/wdvxdr1123/ZeroBot"
|
||||
"github.com/wdvxdr1123/ZeroBot/message"
|
||||
"github.com/wdvxdr1123/ZeroBot/utils/helper"
|
||||
|
||||
"github.com/FloatTech/ZeroBot-Plugin/utils/process"
|
||||
)
|
||||
|
||||
var startTime int64
|
||||
|
||||
func init() {
|
||||
// 插件冲突检测 会在本群发送一条消息并在约 1s 后撤回
|
||||
zero.OnFullMatch("插件冲突检测", zero.OnlyGroup, zero.AdminPermission, zero.OnlyToMe).SetBlock(true).FirstPriority().
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
tok, err := genToken()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
t := message.Text("●cd" + tok)
|
||||
startTime = time.Now().Unix()
|
||||
id := ctx.SendChain(t)
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.DeleteMessage(id)
|
||||
})
|
||||
|
||||
zero.OnRegex("^●cd([\u4e00-\u9fa5]{4})$", zero.OnlyGroup).SetBlock(true).FirstPriority().
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
tok := ctx.State["regex_matched"].([]string)[1]
|
||||
if isValidToken(tok) && time.Now().Unix()-startTime < 10 {
|
||||
msg := ""
|
||||
gid := ctx.Event.GroupID
|
||||
ForEach(func(key string, manager *Control) bool {
|
||||
if manager.IsEnabledIn(gid) {
|
||||
msg += "\xfe\xff" + key
|
||||
}
|
||||
return true
|
||||
})
|
||||
if len(msg) > 2 {
|
||||
my, err := b14.UTF16be2utf8(b14.EncodeString(msg[2:]))
|
||||
mys := "●cd●" + helper.BytesToString(my)
|
||||
if err == nil {
|
||||
id := ctx.SendChain(message.Text(mys))
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.DeleteMessage(id)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
zero.OnRegex("^●cd●(.*)", zero.OnlyGroup).SetBlock(true).FirstPriority().
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
msg, err := b14.UTF82utf16be(helper.StringToBytes(ctx.State["regex_matched"].([]string)[1]))
|
||||
if err == nil {
|
||||
gid := ctx.Event.GroupID
|
||||
for _, s := range strings.Split(b14.DecodeString(msg), "\xfe\xff") {
|
||||
mu.RLock()
|
||||
c, ok := managers[s]
|
||||
mu.RUnlock()
|
||||
if ok && c.IsEnabledIn(gid) {
|
||||
c.Disable(gid)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func genToken() (tok string, err error) {
|
||||
timebytes := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(timebytes, uint64(time.Now().Unix()))
|
||||
timebytes, err = b14.UTF16be2utf8(b14.Encode(timebytes[1:]))
|
||||
if err == nil {
|
||||
tok = helper.BytesToString(timebytes)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func isValidToken(tok string) (yes bool) {
|
||||
s, err := b14.UTF82utf16be(helper.StringToBytes(tok))
|
||||
if err == nil {
|
||||
timebytes := make([]byte, 1, 8)
|
||||
timebytes = append(timebytes, b14.Decode(s)...)
|
||||
yes = time.Now().Unix()-int64(binary.BigEndian.Uint64(timebytes)) < 10
|
||||
}
|
||||
return
|
||||
}
|
||||
19
control/cd_test.go
Normal file
19
control/cd_test.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package control
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGenToken(t *testing.T) {
|
||||
tok, err := genToken()
|
||||
if err == nil {
|
||||
t.Log(tok)
|
||||
t.Log(isValidToken(tok))
|
||||
t.Fail()
|
||||
} else {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMaru(t *testing.T) {
|
||||
t.Log(len("\xff"))
|
||||
t.Fail()
|
||||
}
|
||||
Reference in New Issue
Block a user