diff --git a/user.go b/user.go index 0347c74..de526e0 100644 --- a/user.go +++ b/user.go @@ -3,10 +3,13 @@ package openwechat import ( "errors" "fmt" + "html" "io" "net/http" "net/url" "os" + "regexp" + "sort" "strconv" "strings" "time" @@ -214,6 +217,25 @@ func (u *User) IsSelf() bool { return u.UserName == u.Self().UserName } +// OrderSymbol 获取用户的排序标识 +func (u *User) OrderSymbol() string { + var symbol string + if u.RemarkPYQuanPin != "" { + symbol = u.RemarkPYQuanPin + } else if u.PYQuanPin != "" { + symbol = u.PYQuanPin + } else { + symbol = u.NickName + } + symbol = html.UnescapeString(symbol) + symbol = strings.ToUpper(symbol) + symbol = regexp.MustCompile("/\\W/ig").ReplaceAllString(symbol, "") + if len(symbol) > 0 && symbol[0] < 'A' { + return "~" + } + return symbol +} + // 格式化emoji表情 func (u *User) formatEmoji() { u.NickName = FormatEmoji(u.NickName) @@ -645,6 +667,19 @@ func (s *Self) SendVideoToGroups(video io.Reader, delay time.Duration, groups .. // Members 抽象的用户组 type Members []*User +func (m Members) Len() int { + return len(m) +} + +// Less 按照微信的规则排序 +func (m Members) Less(i, j int) bool { + return m[i].OrderSymbol() < m[j].OrderSymbol() +} + +func (m Members) Swap(i, j int) { + m[i], m[j] = m[j], m[i] +} + // Uniq Members 去重 func (m Members) Uniq() Members { var uniqMembers = make(map[string]*User) @@ -658,6 +693,12 @@ func (m Members) Uniq() Members { return members } +// Sort 对联系人进行排序 +func (m Members) Sort() Members { + sort.Sort(m) + return m +} + // Count 统计数量 func (m Members) Count() int { return len(m)