From a557523a11fb0822a2530ca9e02d653e409a8b20 Mon Sep 17 00:00:00 2001 From: cdle Date: Sat, 10 Jun 2023 12:33:14 +0800 Subject: [PATCH] x --- README.md | 4 +- adapters/qq/main.go | 6 +- core/node_static.go | 4 +- core/node_strings.go | 27 +++++++ core/plugin_core.go | 8 +- core/plugin_impl.go | 17 +++++ core/plugin_utils.go | 38 +++++----- emoji/data.go | 41 +++++++++- emoji/my copy.go.bak | 176 +++++++++++++++++++++++++++++++++++++++++++ emoji/my.go | 78 +++++++++++++------ utils/init.go | 17 +++++ 11 files changed, 364 insertions(+), 52 deletions(-) create mode 100644 emoji/my copy.go.bak diff --git a/README.md b/README.md index 4d0d5b6..cfa0c37 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,9 @@ class Adapter(botplt: string, botid: string) { setIsAdmin(func: (user_id: string) => boolean): 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[]; //获取一个平台的所有机器人 diff --git a/adapters/qq/main.go b/adapters/qq/main.go index d837daf..8dcad5f 100644 --- a/adapters/qq/main.go +++ b/adapters/qq/main.go @@ -238,7 +238,6 @@ func init() { }() 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() if err != nil { @@ -295,14 +294,13 @@ func init() { content = strings.Replace(content, "]", "]", -1) content = strings.Trim(content, " ") _msg := map[string]interface{}{ - "user_id": fmt.Sprint(msg.UserID), + "user_id": utils.Itoa(msg.UserID), "chat_id": core.ChatID(msg.GroupID), "user_name": msg.Sender.Nickname, "chat_name": "", - "message_id": fmt.Sprint(msg.MessageID), + "message_id": utils.Itoa(msg.MessageID), "content": content, } - if debug { logs.Debug("QQ处理消息:", string(utils.JsonMarshal(_msg))) } diff --git a/core/node_static.go b/core/node_static.go index ca4dceb..1bc64bf 100644 --- a/core/node_static.go +++ b/core/node_static.go @@ -31,7 +31,7 @@ func FindFile(c *gin.Context) { statics.Range(func(_, value any) bool { path := value.(string) // 拼接文件路径 - filepath := filepath.Join(path, filename) + filepath := strings.ReplaceAll(filepath.Join(path, filename), "\\/", "\\") // 判断文件是否存在 _, err := os.Stat(filepath) if err == nil { @@ -48,6 +48,8 @@ func FindFile(c *gin.Context) { // 返回文件内容 c.Data(http.StatusOK, contentType, file) return false + } else { + console.Log(err) } return true }) diff --git a/core/node_strings.go b/core/node_strings.go index e65d096..333254b 100644 --- a/core/node_strings.go +++ b/core/node_strings.go @@ -36,6 +36,33 @@ func (sender *Strings) JoinFilepath(elem ...string) string { 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 { return strings.Contains(s, substr) } diff --git a/core/plugin_core.go b/core/plugin_core.go index 57ab10d..4c1e126 100644 --- a/core/plugin_core.go +++ b/core/plugin_core.go @@ -259,6 +259,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) { var origin = "自定义" var http *common.Http var message *common.Reply + var FindAll bool ress := regexp.MustCompile( `\*\s?@([\d\w+-]+)\s+([^\n]+?)\n`, ).FindAllStringSubmatch(data, -1) @@ -366,6 +367,8 @@ func initPlugin(data string, uuid string) (*common.Function, error) { admin = strings.TrimSpace(res[2]) == "true" case "disable": disable = strings.TrimSpace(res[2]) == "true" + case "findall": + FindAll = strings.TrimSpace(res[2]) == "true" case "priority": priority = utils.Int(strings.TrimSpace(res[2])) case "title", "name", "show": @@ -549,6 +552,7 @@ func initPlugin(data string, uuid string) (*common.Function, error) { Running: onStart, Reply: message, Http: http, + FindAll: FindAll, } running = func() bool { return f.Running @@ -562,13 +566,13 @@ func ChatID(p interface{}) string { if p == 0 { return "" } else { - return fmt.Sprint(p) + return utils.Itoa(p) } case string: return p case nil: return "" default: - return fmt.Sprint(p) + return utils.Itoa(p) } } diff --git a/core/plugin_impl.go b/core/plugin_impl.go index 1fe4dce..2b22fb3 100644 --- a/core/plugin_impl.go +++ b/core/plugin_impl.go @@ -235,6 +235,23 @@ func (sender *SenderJsIplm) Param(i interface{}) string { 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 { return Sender.Param(i) } diff --git a/core/plugin_utils.go b/core/plugin_utils.go index b26cc01..8c56992 100644 --- a/core/plugin_utils.go +++ b/core/plugin_utils.go @@ -248,25 +248,6 @@ func SetPluginMethod(vm *goja.Runtime, uuid string, on_start bool, running func( 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) { // o := module.Get("exports").(*goja.Object) // 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) vm.SetFieldNameMapper(myFieldNameMapper{}) // vm.Set("sleep", sleep) diff --git a/emoji/data.go b/emoji/data.go index 23af2cf..a589926 100644 --- a/emoji/data.go +++ b/emoji/data.go @@ -4,7 +4,46 @@ package emoji var ( 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-#", Character: "#⃣", diff --git a/emoji/my copy.go.bak b/emoji/my copy.go.bak new file mode 100644 index 0000000..fa61c16 --- /dev/null +++ b/emoji/my copy.go.bak @@ -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 +} diff --git a/emoji/my.go b/emoji/my.go index fa61c16..d4d42af 100644 --- a/emoji/my.go +++ b/emoji/my.go @@ -40,7 +40,8 @@ func init() { } } -func ConvertRegex(input string) string { +func ConvertRegex(input string) (string, int) { + count := strings.Count(input, "%s") // 定义要转义的字符集合 escapeSet := []string{"\\", "[", "]", "(", ")", "{", "}", ".", "*", "+", "?", "^", "$", "|"} @@ -57,21 +58,37 @@ func ConvertRegex(input string) string { replaced := strings.ReplaceAll(input, pattern, replaceStr) // 返回转换结果和是否大写的标记 - return replaced + return replaced, count } // \[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:] - }) +func ReplaceToEmojis(str string, format string) string { + pattern, count := ConvertRegex(format) + if count == 1 { + 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:] + }) + } 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 h := func(ssr *[]string) string { + for i := range *ssr { + if (*ssr)[i] == "0000" { + s := append((*ssr)[:i], (*ssr)[i+1:]...) + ssr = &s + } + } chs := []string{} ch := "" l := 100 @@ -89,14 +106,22 @@ func ReplaceToEmojis(str string, pattern string) string { } if ch != "" { chs = append(chs, ch) + if len(lft) != 0 { + ch = "" + l = 100 + *ssr = lft + lft = []string{} + goto again + } + } else { + for _, hex := range *ssr { + r, err := HexToRune(hex) + if err == nil { + chs = append(chs, string([]rune{r})) + } + } } - 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) @@ -105,7 +130,8 @@ func ReplaceToEmojis(str string, pattern string) string { e := -1 for i := range sss { 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 { @@ -117,11 +143,15 @@ func ReplaceToEmojis(str string, pattern string) string { } ssrs = append(ssrs, str[a:b]) - // if upper { - // ssr = append(ssr, str[c:d]) - // } else { - ssr = append(ssr, strings.ToUpper(str[c:d])) - // } + k := []int{} + for _, j := range ss[2:] { + k = append(k, j) + 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 } if len(ssr) != 0 { diff --git a/utils/init.go b/utils/init.go index 8a17038..dd44d96 100644 --- a/utils/init.go +++ b/utils/init.go @@ -423,3 +423,20 @@ func flatten(arr [][]string) []interface{} { } 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) + } +}