github.com/Mrs4s/go-cqhttp@v1.2.0/internal/msg/parse.go (about) 1 package msg 2 3 import ( 4 "github.com/tidwall/gjson" 5 ) 6 7 // ParseObject 将消息JSON对象转为消息元素数组 8 func ParseObject(m gjson.Result) (r []Element) { 9 convert := func(e gjson.Result) { 10 var elem Element 11 elem.Type = e.Get("type").Str 12 e.Get("data").ForEach(func(key, value gjson.Result) bool { 13 pair := Pair{K: key.Str, V: value.String()} 14 elem.Data = append(elem.Data, pair) 15 return true 16 }) 17 r = append(r, elem) 18 } 19 20 if m.IsArray() { 21 m.ForEach(func(_, e gjson.Result) bool { 22 convert(e) 23 return true 24 }) 25 } 26 if m.IsObject() { 27 convert(m) 28 } 29 return 30 } 31 32 func text(txt string) Element { 33 return Element{ 34 Type: "text", 35 Data: []Pair{ 36 { 37 K: "text", 38 V: txt, 39 }, 40 }, 41 } 42 } 43 44 // ParseString 将字符串(CQ码)转为消息元素数组 45 func ParseString(raw string) (r []Element) { 46 var elem Element 47 for raw != "" { 48 i := 0 49 for i < len(raw) && !(raw[i] == '[' && i+4 < len(raw) && raw[i:i+4] == "[CQ:") { 50 i++ 51 } 52 if i > 0 { 53 r = append(r, text(UnescapeText(raw[:i]))) 54 } 55 56 if i+4 > len(raw) { 57 return 58 } 59 raw = raw[i+4:] // skip "[CQ:" 60 i = 0 61 for i < len(raw) && raw[i] != ',' && raw[i] != ']' { 62 i++ 63 } 64 if i+1 > len(raw) { 65 return 66 } 67 elem.Type = raw[:i] 68 elem.Data = nil // reset data 69 raw = raw[i:] 70 i = 0 71 for { 72 if raw[0] == ']' { 73 r = append(r, elem) 74 raw = raw[1:] 75 break 76 } 77 raw = raw[1:] 78 79 for i < len(raw) && raw[i] != '=' { 80 i++ 81 } 82 if i+1 > len(raw) { 83 return 84 } 85 key := raw[:i] 86 raw = raw[i+1:] // skip "=" 87 i = 0 88 for i < len(raw) && raw[i] != ',' && raw[i] != ']' { 89 i++ 90 } 91 92 if i+1 > len(raw) { 93 return 94 } 95 elem.Data = append(elem.Data, Pair{ 96 K: key, 97 V: UnescapeValue(raw[:i]), 98 }) 99 raw = raw[i:] 100 i = 0 101 } 102 } 103 return 104 }