1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

rf(message): simply send message.

This commit is contained in:
wdvxdr 2021-07-14 21:29:12 +08:00
parent 211a39e36c
commit 5b20b58d78
No known key found for this signature in database
GPG Key ID: 55FF1414A69CEBA6
4 changed files with 49 additions and 70 deletions

View File

@ -36,17 +36,20 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage,
if len(f) > 0 { if len(f) > 0 {
useFram = f[0] useFram = f[0]
} }
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) imgCount := 0
if useFram { for _, e := range m.Elements {
if m.Any(func(e message.IMessageElement) bool { return e.Type() == message.Reply }) { switch e.Type() {
case message.Image:
imgCount++
case message.Reply:
useFram = false useFram = false
} }
} }
msgLen := message.EstimateLength(m.Elements, 5000) msgLen := message.EstimateLength(m.Elements)
if msgLen > 5000 || imgCount > 50 { if msgLen > 5000 || imgCount > 50 {
return nil return nil
} }
if (msgLen > 100 || imgCount > 2) && !useFram { if !useFram && (msgLen > 100 || imgCount > 2) {
ret := c.sendGroupMessage(groupCode, false, ret := c.sendGroupMessage(groupCode, false,
&message.SendingMessage{Elements: []message.IMessageElement{ &message.SendingMessage{Elements: []message.IMessageElement{
c.uploadGroupLongMessage(groupCode, c.uploadGroupLongMessage(groupCode,
@ -61,14 +64,8 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage,
), ),
}}, }},
) )
return &message.GroupMessage{ ret.Elements = m.Elements
Id: ret.Id, return ret
InternalId: ret.InternalId,
GroupCode: ret.GroupCode,
Sender: ret.Sender,
Time: ret.Time,
Elements: m.Elements,
}
} }
return c.sendGroupMessage(groupCode, false, m) 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 { func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.SendingMessage) *message.GroupMessage {
eid := utils.RandomString(6) eid := utils.RandomString(6)
mr := int32(rand.Uint32()) mr := int32(rand.Uint32())
ch := make(chan int32) ch := make(chan int32, 1)
c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) { c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) {
if e.Rand == mr && !utils.IsChanClosed(ch) { if e.Rand == mr {
ch <- e.Seq ch <- e.Seq
} }
}) })
defer c.onGroupMessageReceipt(eid) defer c.onGroupMessageReceipt(eid)
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) imgCount := 0
msgLen := message.EstimateLength(m.Elements, 703) frag := false
if (msgLen > 100 || imgCount > 1) && !forward && !m.Any(func(e message.IMessageElement) bool { L:
_, ok := e.(*message.GroupVoiceElement) for _, e := range m.Elements {
_, ok2 := e.(*message.ServiceElement) switch e.Type() {
_, ok3 := e.(*message.ReplyElement) case message.Image:
if _, ok4 := e.(*message.ForwardElement); ok4 { imgCount++
case message.Forward:
forward = true 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()) div := int32(rand.Uint32())
fragmented := m.ToFragmented() fragmented := m.ToFragmented()
for i, elems := range fragmented { for i, elems := range fragmented {

View File

@ -18,7 +18,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *
var seq int32 var seq int32
t := time.Now().Unix() t := time.Now().Unix()
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) 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 { if msgLen > 5000 || imgCount > 50 {
return nil return nil
} }

View File

@ -1,7 +1,6 @@
package message package message
import ( import (
"math"
"reflect" "reflect"
"regexp" "regexp"
"strconv" "strconv"
@ -237,24 +236,20 @@ func (msg *SendingMessage) ToFragmented() [][]IMessageElement {
return fragmented return fragmented
} }
func EstimateLength(elems []IMessageElement, limit int) int { func EstimateLength(elems []IMessageElement) int {
sum := 0 sum := 0
for _, elem := range elems { for _, elem := range elems {
if sum > limit {
break
}
left := int(math.Max(float64(limit-sum), 0))
switch e := elem.(type) { switch e := elem.(type) {
case *TextElement: case *TextElement:
sum += utils.ChineseLength(e.Content, left) sum += len(e.Content)
case *AtElement: case *AtElement:
sum += utils.ChineseLength(e.Display, left) sum += len(e.Display)
case *ReplyElement: case *ReplyElement:
sum += 444 + EstimateLength(e.Elements, left) sum += 444 + EstimateLength(e.Elements)
case *ImageElement, *GroupImageElement, *FriendImageElement: case *ImageElement, *GroupImageElement, *FriendImageElement:
sum += 100 sum += 100
default: default:
sum += utils.ChineseLength(ToReadableString([]IMessageElement{elem}), left) sum += len(ToReadableString([]IMessageElement{elem}))
} }
} }
return sum return sum

View File

@ -1,39 +1,42 @@
package utils package utils
import ( import (
"bytes" "math/rand"
"crypto/rand"
"math/big"
"reflect" "reflect"
"strconv" "strconv"
"strings" "strings"
"time"
"unsafe" "unsafe"
) )
func init() {
rand.Seed(time.Now().Unix())
}
func RandomString(len int) string { func RandomString(len int) string {
return RandomStringRange(len, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") return RandomStringRange(len, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
} }
func RandomStringRange(len int, str string) string { func RandomStringRange(length int, str string) string {
var res string sb := strings.Builder{}
b := bytes.NewBufferString(str) for i := 0; i < length; i++ {
length := b.Len() sb.WriteByte(str[rand.Intn(len(str))])
bigInt := big.NewInt(int64(length))
for i := 0; i < len; i++ {
randomInt, _ := rand.Int(rand.Reader, bigInt)
res += string(str[randomInt.Int64()])
} }
return res return sb.String()
} }
func ChunkString(s string, chunkSize int) []string { func ChunkString(s string, chunkSize int) []string {
var chunks []string
runes := []rune(s) runes := []rune(s)
if len(runes) == 0 || len(runes) <= chunkSize { if len(runes) == 0 || len(runes) <= chunkSize {
return []string{s} 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 { for i := 0; i < len(runes); i += chunkSize {
nn := i + chunkSize nn := i + chunkSize
if nn > len(runes) { if nn > len(runes) {
@ -44,26 +47,6 @@ func ChunkString(s string, chunkSize int) []string {
return chunks 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 { func ConvertSubVersionToInt(str string) int32 {
i, _ := strconv.ParseInt(strings.Join(strings.Split(str, "."), ""), 10, 64) i, _ := strconv.ParseInt(strings.Join(strings.Split(str, "."), ""), 10, 64)
return int32(i) * 10 return int32(i) * 10