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  }