1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +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 {
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 {

View File

@ -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
}

View File

@ -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

View File

@ -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