This commit is contained in:
cdle
2023-06-10 12:33:14 +08:00
parent 10d5400f2f
commit a557523a11
11 changed files with 364 additions and 52 deletions
+3 -1
View File
@@ -395,7 +395,9 @@ class Adapter(botplt: string, botid: string) {
setIsAdmin(func: (user_id: string) => boolean): void; //设置用户是否是成员函数,默认自动实现 setIsAdmin(func: (user_id: string) => boolean): void; //设置用户是否是成员函数,默认自动实现
destroy(): void;//销毁机器人 destroy(): void;//销毁机器人
} }
function getAdapter(platform: string, bot_id string): [Adapter: string[], error: string]; //获取一个机器人 function getAdapter(platform: string, bot_id string): [Adapter: string, error: string]; //获取一个机器人
function getAdapters(platform: string, bot_ids ...string): [Adapter: string[], error: string]; //获取多个机器人
function getAdapterBotsID(bot_id string): string[]; //获取一个平台的所有机器人 function getAdapterBotsID(bot_id string): string[]; //获取一个平台的所有机器人
+2 -4
View File
@@ -238,7 +238,6 @@ func init() {
}() }()
for { for {
//{"self_id":"17745270","status":{"online":true,"good":false},"time":1686281911,"post_type":"meta_event","meta_event_type":"heartbeat","interval":3000}
_, data, err := ws.ReadMessage() _, data, err := ws.ReadMessage()
if err != nil { if err != nil {
@@ -295,14 +294,13 @@ func init() {
content = strings.Replace(content, "]", "]", -1) content = strings.Replace(content, "]", "]", -1)
content = strings.Trim(content, " ") content = strings.Trim(content, " ")
_msg := map[string]interface{}{ _msg := map[string]interface{}{
"user_id": fmt.Sprint(msg.UserID), "user_id": utils.Itoa(msg.UserID),
"chat_id": core.ChatID(msg.GroupID), "chat_id": core.ChatID(msg.GroupID),
"user_name": msg.Sender.Nickname, "user_name": msg.Sender.Nickname,
"chat_name": "", "chat_name": "",
"message_id": fmt.Sprint(msg.MessageID), "message_id": utils.Itoa(msg.MessageID),
"content": content, "content": content,
} }
if debug { if debug {
logs.Debug("QQ处理消息:", string(utils.JsonMarshal(_msg))) logs.Debug("QQ处理消息:", string(utils.JsonMarshal(_msg)))
} }
+3 -1
View File
@@ -31,7 +31,7 @@ func FindFile(c *gin.Context) {
statics.Range(func(_, value any) bool { statics.Range(func(_, value any) bool {
path := value.(string) path := value.(string)
// 拼接文件路径 // 拼接文件路径
filepath := filepath.Join(path, filename) filepath := strings.ReplaceAll(filepath.Join(path, filename), "\\/", "\\")
// 判断文件是否存在 // 判断文件是否存在
_, err := os.Stat(filepath) _, err := os.Stat(filepath)
if err == nil { if err == nil {
@@ -48,6 +48,8 @@ func FindFile(c *gin.Context) {
// 返回文件内容 // 返回文件内容
c.Data(http.StatusOK, contentType, file) c.Data(http.StatusOK, contentType, file)
return false return false
} else {
console.Log(err)
} }
return true return true
}) })
+27
View File
@@ -36,6 +36,33 @@ func (sender *Strings) JoinFilepath(elem ...string) string {
return filepath.Join(elem...) return filepath.Join(elem...)
} }
func (sender *Strings) Trim(s, cutset string) string {
return strings.Trim(s, cutset)
}
func (sender *Strings) TrimLeft(s, cutset string) string {
return strings.TrimLeft(s, cutset)
}
func (sender *Strings) TrimRight(s, cutset string) string {
return strings.TrimRight(s, cutset)
}
func (sender *Strings) Filename(path string) string {
re := regexp.MustCompile(`[\\/]+`)
parts := re.Split(path, -1)
filename := parts[len(parts)-1]
return filename
}
func (sender *Strings) Dir(path string) string {
re := regexp.MustCompile(`[\\/]+`)
parts := re.Split(path, -1)
filename := parts[len(parts)-1]
dir := path[:len(path)-len(filename)]
dir = filepath.Clean(dir)
return dir
}
func (sender *Strings) Contains(s, substr string) bool { func (sender *Strings) Contains(s, substr string) bool {
return strings.Contains(s, substr) return strings.Contains(s, substr)
} }
+6 -2
View File
@@ -259,6 +259,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
var origin = "自定义" var origin = "自定义"
var http *common.Http var http *common.Http
var message *common.Reply var message *common.Reply
var FindAll bool
ress := regexp.MustCompile( ress := regexp.MustCompile(
`\*\s?@([\d\w+-]+)\s+([^\n]+?)\n`, `\*\s?@([\d\w+-]+)\s+([^\n]+?)\n`,
).FindAllStringSubmatch(data, -1) ).FindAllStringSubmatch(data, -1)
@@ -366,6 +367,8 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
admin = strings.TrimSpace(res[2]) == "true" admin = strings.TrimSpace(res[2]) == "true"
case "disable": case "disable":
disable = strings.TrimSpace(res[2]) == "true" disable = strings.TrimSpace(res[2]) == "true"
case "findall":
FindAll = strings.TrimSpace(res[2]) == "true"
case "priority": case "priority":
priority = utils.Int(strings.TrimSpace(res[2])) priority = utils.Int(strings.TrimSpace(res[2]))
case "title", "name", "show": case "title", "name", "show":
@@ -549,6 +552,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) {
Running: onStart, Running: onStart,
Reply: message, Reply: message,
Http: http, Http: http,
FindAll: FindAll,
} }
running = func() bool { running = func() bool {
return f.Running return f.Running
@@ -562,13 +566,13 @@ func ChatID(p interface{}) string {
if p == 0 { if p == 0 {
return "" return ""
} else { } else {
return fmt.Sprint(p) return utils.Itoa(p)
} }
case string: case string:
return p return p
case nil: case nil:
return "" return ""
default: default:
return fmt.Sprint(p) return utils.Itoa(p)
} }
} }
+17
View File
@@ -235,6 +235,23 @@ func (sender *SenderJsIplm) Param(i interface{}) string {
return "" return ""
} }
func (sender *SenderJsIplm) GetAllMatch() [][]string {
return sender.Message.GetAllMatch()
}
func (sender *SenderJsIplm) Params(i int) []string {
if i == 0 {
i = 1
}
ss := []string{}
for _, v := range sender.Message.GetAllMatch() {
ss = append(ss, v[i-1])
}
return ss
}
// GetAllMatch
func (Sender *SenderJsIplm) Get(i interface{}) string { func (Sender *SenderJsIplm) Get(i interface{}) string {
return Sender.Param(i) return Sender.Param(i)
} }
+19 -19
View File
@@ -248,25 +248,6 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func(
return o return o
}) })
vm.Set("Express", func() *goja.Object {
o := vm.NewObject()
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,
})
})
}
o.Set("static", func(path string) {
addStatic(uuid, path)
})
return o
})
// registry.RegisterNativeModule("express", func(runtime *goja.Runtime, module *goja.Object) { // registry.RegisterNativeModule("express", func(runtime *goja.Runtime, module *goja.Object) {
// o := module.Get("exports").(*goja.Object) // o := module.Get("exports").(*goja.Object)
// methods := []string{"get", "post", "delete", "put", "fetch"} // methods := []string{"get", "post", "delete", "put", "fetch"}
@@ -331,6 +312,25 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func(
// }() // }()
// } // }
} }
vm.Set("Express", func() *goja.Object {
o := vm.NewObject()
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,
})
})
}
o.Set("static", func(path string) {
addStatic(uuid, path)
})
return o
})
registry.Enable(vm) registry.Enable(vm)
vm.SetFieldNameMapper(myFieldNameMapper{}) vm.SetFieldNameMapper(myFieldNameMapper{})
// vm.Set("sleep", sleep) // vm.Set("sleep", sleep)
+40 -1
View File
@@ -4,7 +4,46 @@ package emoji
var ( var (
emojiMap = map[string]Emoji{ emojiMap = map[string]Emoji{
"❶": {
Character: "❶",
CodePoint: "2776",
},
"❷": {
Character: "❷",
CodePoint: "2777",
},
"❸": {
Character: "❸",
CodePoint: "2778",
},
"❹": {
Character: "❹",
CodePoint: "2779",
},
"❺": {
Character: "❺",
CodePoint: "277A",
},
"❻": {
Character: "❻",
CodePoint: "277B",
},
"❼": {
Character: "❼",
CodePoint: "277C",
},
"❽": {
Character: "❽",
CodePoint: "277D",
},
"❾": {
Character: "❾",
CodePoint: "277E",
},
"❿": {
Character: "❿",
CodePoint: "277F",
},
"#⃣": { "#⃣": {
Slug: "keycap-#", Slug: "keycap-#",
Character: "#⃣", Character: "#⃣",
+176
View File
@@ -0,0 +1,176 @@
package emoji
import (
"fmt"
"regexp"
"strconv"
"strings"
"unicode/utf16"
)
func init() {
for i, emoji := range emojiMap {
code_points := []string{}
for _, v := range strings.Split(emojiMap[i].CodePoint, " ") {
switch len(v) {
case 4:
code_points = append(code_points, v)
case 5:
code_points = append(code_points, transfer(v)...)
default:
}
}
if len(code_points) == 0 {
for _, v := range strings.Split(emojiMap[i].CodePoint, "-") {
switch len(v) {
case 4:
code_points = append(code_points, v)
case 5:
code_points = append(code_points, transfer(v)...)
default:
}
}
}
if len(code_points) == 0 {
delete(emojiMap, i)
} else {
emoji.CodePoint2 = code_points
emojiMap[i] = emoji
}
}
}
func ConvertRegex(input string) string {
// 定义要转义的字符集合
escapeSet := []string{"\\", "[", "]", "(", ")", "{", "}", ".", "*", "+", "?", "^", "$", "|"}
// 定义正则表达式模式和替换字符串
var pattern = `%s`
var replaceStr = `([0-9A-Za-z]{4})`
// 对可能引起正则表达式冲突的字符进行转义
for _, esc := range escapeSet {
input = strings.ReplaceAll(input, esc, "\\"+esc)
}
// 将子匹配内容替换为指定格式的正则表达式
replaced := strings.ReplaceAll(input, pattern, replaceStr)
// 返回转换结果和是否大写的标记
return replaced
}
// \[emoji=[0-9A-Z]{4}\]
func ReplaceToEmojis(str string, pattern string) string {
format := pattern
pattern = ConvertRegex(pattern)
str = regexp.MustCompile("[0-9]"+pattern+pattern).ReplaceAllStringFunc(str, func(s string) string {
if !strings.EqualFold(strings.ToUpper(s[1:]), strings.ToUpper(fmt.Sprintf(format+format, "FE0F", "20E3"))) { //"[emoji=FE0F][emoji=20E3]"
return s
}
return fmt.Sprintf(format, fmt.Sprintf("%04X", s[0])) + s[1:]
})
res := str
h := func(ssr *[]string) string {
chs := []string{}
ch := ""
l := 100
lft := []string{}
again:
for j := range emojiMap {
ok, left := matchPrefix(emojiMap[j].CodePoint2, *ssr)
if ok {
if ln := len(left); ln < l {
ch = emojiMap[j].Character
l = ln
lft = left
}
}
}
if ch != "" {
chs = append(chs, ch)
}
if len(lft) != 0 && ch != "" {
ch = ""
l = 100
*ssr = lft
lft = []string{}
goto again
}
return strings.Join(chs, "")
}
sss := regexp.MustCompile(pattern).FindAllStringSubmatchIndex(str, -1)
ssr := []string{}
ssrs := []string{}
e := -1
for i := range sss {
ss := sss[i]
a, b, c, d := ss[0], ss[1], ss[2], ss[3]
//结算
if e != a && len(ssr) != 0 {
rs := h(&ssr)
res = strings.Replace(res, strings.Join(ssrs, ""), rs, 1)
ssr = []string{}
ssrs = []string{}
e = -1
}
ssrs = append(ssrs, str[a:b])
// if upper {
// ssr = append(ssr, str[c:d])
// } else {
ssr = append(ssr, strings.ToUpper(str[c:d]))
// }
e = b
}
if len(ssr) != 0 {
rs := h(&ssr)
res = strings.Replace(res, strings.Join(ssrs, ""), rs, 1)
e = -1
}
return res
}
func transfer(str string) []string {
// 将输入字符串解析为十六进制数
unicodeValue, err := strconv.ParseUint(str, 16, 32)
if err != nil {
panic(err)
}
// 将 Unicode 编码值转换为 UTF-16 编码单元
utf16Units := utf16.Encode([]rune{rune(unicodeValue)})
// 将 UTF-16 编码单元格式化为字符串,并返回字符串切片
return []string{fmt.Sprintf("%04X", utf16Units[0]), fmt.Sprintf("%04X", utf16Units[1])}
}
func matchPrefix(s1 []string, s2 []string) (bool, []string) {
if len(s1) > len(s2) {
return false, s2
}
for i := range s1 {
if s1[i] != s2[i] {
return false, nil
}
}
return true, s2[len(s1):]
}
func RuneToHx(a rune) string {
return fmt.Sprintf("%04X", a)
}
func HexToRune(hexStr string) (rune, error) {
// 解析十六进制字符串,获取对应的无符号整数
u, err := strconv.ParseUint(hexStr, 16, 32)
if err != nil {
return 0, err
}
// 将无符号整数转换为 rune 类型的 Unicode 编码值
r := rune(u)
// 返回转换结果
return r, nil
}
+43 -13
View File
@@ -40,7 +40,8 @@ func init() {
} }
} }
func ConvertRegex(input string) string { func ConvertRegex(input string) (string, int) {
count := strings.Count(input, "%s")
// 定义要转义的字符集合 // 定义要转义的字符集合
escapeSet := []string{"\\", "[", "]", "(", ")", "{", "}", ".", "*", "+", "?", "^", "$", "|"} escapeSet := []string{"\\", "[", "]", "(", ")", "{", "}", ".", "*", "+", "?", "^", "$", "|"}
@@ -57,21 +58,37 @@ func ConvertRegex(input string) string {
replaced := strings.ReplaceAll(input, pattern, replaceStr) replaced := strings.ReplaceAll(input, pattern, replaceStr)
// 返回转换结果和是否大写的标记 // 返回转换结果和是否大写的标记
return replaced return replaced, count
} }
// \[emoji=[0-9A-Z]{4}\] // \[emoji=[0-9A-Z]{4}\]
func ReplaceToEmojis(str string, pattern string) string { func ReplaceToEmojis(str string, format string) string {
format := pattern pattern, count := ConvertRegex(format)
pattern = ConvertRegex(pattern) if count == 1 {
str = regexp.MustCompile("[0-9]"+pattern+pattern).ReplaceAllStringFunc(str, func(s string) string { str = regexp.MustCompile("[0-9]"+pattern+pattern).ReplaceAllStringFunc(str, func(s string) string {
if !strings.EqualFold(strings.ToUpper(s[1:]), strings.ToUpper(fmt.Sprintf(format+format, "FE0F", "20E3"))) { //"[emoji=FE0F][emoji=20E3]" if !strings.EqualFold(strings.ToUpper(s[1:]), strings.ToUpper(fmt.Sprintf(format+format, "FE0F", "20E3"))) { //"[emoji=FE0F][emoji=20E3]"
return s return s
} }
return fmt.Sprintf(format, fmt.Sprintf("%04X", s[0])) + s[1:] return fmt.Sprintf(format, fmt.Sprintf("%04X", s[0])) + s[1:]
}) })
} else if count == 2 {
str = regexp.MustCompile("[0-9]"+pattern).ReplaceAllStringFunc(str, func(s string) string {
if !strings.EqualFold(strings.ToUpper(s[1:]), strings.ToUpper(fmt.Sprintf(format, "FE0F", "20E3"))) { //"[emoji=FE0F][emoji=20E3]"
return s
}
return fmt.Sprintf(format, fmt.Sprintf("%04X", s[0]), "0000") + s[1:]
})
} else {
return str
}
res := str res := str
h := func(ssr *[]string) string { h := func(ssr *[]string) string {
for i := range *ssr {
if (*ssr)[i] == "0000" {
s := append((*ssr)[:i], (*ssr)[i+1:]...)
ssr = &s
}
}
chs := []string{} chs := []string{}
ch := "" ch := ""
l := 100 l := 100
@@ -89,14 +106,22 @@ func ReplaceToEmojis(str string, pattern string) string {
} }
if ch != "" { if ch != "" {
chs = append(chs, ch) chs = append(chs, ch)
} if len(lft) != 0 {
if len(lft) != 0 && ch != "" {
ch = "" ch = ""
l = 100 l = 100
*ssr = lft *ssr = lft
lft = []string{} lft = []string{}
goto again goto again
} }
} else {
for _, hex := range *ssr {
r, err := HexToRune(hex)
if err == nil {
chs = append(chs, string([]rune{r}))
}
}
}
return strings.Join(chs, "") return strings.Join(chs, "")
} }
sss := regexp.MustCompile(pattern).FindAllStringSubmatchIndex(str, -1) sss := regexp.MustCompile(pattern).FindAllStringSubmatchIndex(str, -1)
@@ -105,7 +130,8 @@ func ReplaceToEmojis(str string, pattern string) string {
e := -1 e := -1
for i := range sss { for i := range sss {
ss := sss[i] ss := sss[i]
a, b, c, d := ss[0], ss[1], ss[2], ss[3] a, b := ss[0], ss[1] //, ss[2], ss[3]
// fmt.Println(str[a:b], str[c:d])
//结算 //结算
if e != a && len(ssr) != 0 { if e != a && len(ssr) != 0 {
@@ -117,11 +143,15 @@ func ReplaceToEmojis(str string, pattern string) string {
} }
ssrs = append(ssrs, str[a:b]) ssrs = append(ssrs, str[a:b])
// if upper { k := []int{}
// ssr = append(ssr, str[c:d]) for _, j := range ss[2:] {
// } else { k = append(k, j)
ssr = append(ssr, strings.ToUpper(str[c:d])) if len(k) == 2 {
// } ssr = append(ssr, strings.ToUpper(str[k[0]:k[1]]))
k = []int{}
}
}
// ssr = append(ssr, strings.ToUpper(str[c:d]))
e = b e = b
} }
if len(ssr) != 0 { if len(ssr) != 0 {
+17
View File
@@ -423,3 +423,20 @@ func flatten(arr [][]string) []interface{} {
} }
return result return result
} }
func Itoa(i interface{}) string {
switch i := i.(type) {
case int:
return strconv.Itoa(i)
case int32:
return strconv.Itoa(int(i))
case int64:
return strconv.Itoa(int(i))
case int16:
return strconv.Itoa(int(i))
case string:
return i
default:
return fmt.Sprint(i)
}
}