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