From 5b20b58d7842583bf529d8c4ed1c0d95584d24b6 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 14 Jul 2021 21:29:12 +0800 Subject: [PATCH] rf(message): simply send message. --- client/group_msg.go | 51 ++++++++++++++++++++++--------------------- client/private_msg.go | 2 +- message/message.go | 15 +++++-------- utils/string.go | 51 +++++++++++++++---------------------------- 4 files changed, 49 insertions(+), 70 deletions(-) diff --git a/client/group_msg.go b/client/group_msg.go index bc7fb64d..5c98ee99 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -36,17 +36,20 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, if len(f) > 0 { useFram = f[0] } - imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) - if useFram { - if m.Any(func(e message.IMessageElement) bool { return e.Type() == message.Reply }) { + imgCount := 0 + for _, e := range m.Elements { + switch e.Type() { + case message.Image: + imgCount++ + case message.Reply: useFram = false } } - msgLen := message.EstimateLength(m.Elements, 5000) + msgLen := message.EstimateLength(m.Elements) if msgLen > 5000 || imgCount > 50 { return nil } - if (msgLen > 100 || imgCount > 2) && !useFram { + if !useFram && (msgLen > 100 || imgCount > 2) { ret := c.sendGroupMessage(groupCode, false, &message.SendingMessage{Elements: []message.IMessageElement{ c.uploadGroupLongMessage(groupCode, @@ -61,14 +64,8 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, ), }}, ) - return &message.GroupMessage{ - Id: ret.Id, - InternalId: ret.InternalId, - GroupCode: ret.GroupCode, - Sender: ret.Sender, - Time: ret.Time, - Elements: m.Elements, - } + ret.Elements = m.Elements + return ret } return c.sendGroupMessage(groupCode, false, m) } @@ -101,25 +98,29 @@ func (c *QQClient) GetAtAllRemain(groupCode int64) (*AtAllRemainInfo, error) { func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.SendingMessage) *message.GroupMessage { eid := utils.RandomString(6) mr := int32(rand.Uint32()) - ch := make(chan int32) + ch := make(chan int32, 1) c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) { - if e.Rand == mr && !utils.IsChanClosed(ch) { + if e.Rand == mr { ch <- e.Seq } }) defer c.onGroupMessageReceipt(eid) - imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) - msgLen := message.EstimateLength(m.Elements, 703) - if (msgLen > 100 || imgCount > 1) && !forward && !m.Any(func(e message.IMessageElement) bool { - _, ok := e.(*message.GroupVoiceElement) - _, ok2 := e.(*message.ServiceElement) - _, ok3 := e.(*message.ReplyElement) - if _, ok4 := e.(*message.ForwardElement); ok4 { + imgCount := 0 + frag := false +L: + for _, e := range m.Elements { + switch e.Type() { + case message.Image: + imgCount++ + case message.Forward: forward = true - return true + fallthrough + case message.Reply, message.Voice, message.Service: + frag = true + break L } - return ok || ok2 || ok3 - }) { + } + if !forward && !frag && (imgCount > 1 || message.EstimateLength(m.Elements) > 100) { div := int32(rand.Uint32()) fragmented := m.ToFragmented() for i, elems := range fragmented { diff --git a/client/private_msg.go b/client/private_msg.go index 16519650..5377a4ff 100644 --- a/client/private_msg.go +++ b/client/private_msg.go @@ -18,7 +18,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) * var seq int32 t := time.Now().Unix() imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) - msgLen := message.EstimateLength(m.Elements, 703) + msgLen := message.EstimateLength(m.Elements) if msgLen > 5000 || imgCount > 50 { return nil } diff --git a/message/message.go b/message/message.go index 83269766..a5f9fbc4 100644 --- a/message/message.go +++ b/message/message.go @@ -1,7 +1,6 @@ package message import ( - "math" "reflect" "regexp" "strconv" @@ -237,24 +236,20 @@ func (msg *SendingMessage) ToFragmented() [][]IMessageElement { return fragmented } -func EstimateLength(elems []IMessageElement, limit int) int { +func EstimateLength(elems []IMessageElement) int { sum := 0 for _, elem := range elems { - if sum > limit { - break - } - left := int(math.Max(float64(limit-sum), 0)) switch e := elem.(type) { case *TextElement: - sum += utils.ChineseLength(e.Content, left) + sum += len(e.Content) case *AtElement: - sum += utils.ChineseLength(e.Display, left) + sum += len(e.Display) case *ReplyElement: - sum += 444 + EstimateLength(e.Elements, left) + sum += 444 + EstimateLength(e.Elements) case *ImageElement, *GroupImageElement, *FriendImageElement: sum += 100 default: - sum += utils.ChineseLength(ToReadableString([]IMessageElement{elem}), left) + sum += len(ToReadableString([]IMessageElement{elem})) } } return sum diff --git a/utils/string.go b/utils/string.go index 4a21c17d..bbd32fe1 100644 --- a/utils/string.go +++ b/utils/string.go @@ -1,39 +1,42 @@ package utils import ( - "bytes" - "crypto/rand" - "math/big" + "math/rand" "reflect" "strconv" "strings" + "time" "unsafe" ) +func init() { + rand.Seed(time.Now().Unix()) +} + func RandomString(len int) string { return RandomStringRange(len, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") } -func RandomStringRange(len int, str string) string { - var res string - b := bytes.NewBufferString(str) - length := b.Len() - bigInt := big.NewInt(int64(length)) - for i := 0; i < len; i++ { - randomInt, _ := rand.Int(rand.Reader, bigInt) - res += string(str[randomInt.Int64()]) +func RandomStringRange(length int, str string) string { + sb := strings.Builder{} + for i := 0; i < length; i++ { + sb.WriteByte(str[rand.Intn(len(str))]) } - return res + return sb.String() } func ChunkString(s string, chunkSize int) []string { - var chunks []string runes := []rune(s) - if len(runes) == 0 || len(runes) <= chunkSize { return []string{s} } + chunkLen := len(runes) / chunkSize + if len(runes)%chunkSize != 0 { + chunkLen++ + } + + var chunks = make([]string, 0, chunkLen) for i := 0; i < len(runes); i += chunkSize { nn := i + chunkSize if nn > len(runes) { @@ -44,26 +47,6 @@ func ChunkString(s string, chunkSize int) []string { return chunks } -func ChineseLength(str string, limit int) int { - sum := 0 - for _, r := range str { - switch { - case r >= '\u0000' && r <= '\u007F': - sum += 1 - case r >= '\u0080' && r <= '\u07FF': - sum += 2 - case r >= '\u0800' && r <= '\uFFFF': - sum += 3 - default: - sum += 4 - } - if sum > limit { - break - } - } - return sum -} - func ConvertSubVersionToInt(str string) int32 { i, _ := strconv.ParseInt(strings.Join(strings.Split(str, "."), ""), 10, 64) return int32(i) * 10