From ff9ef5135ca154c891b709c8f260751697567210 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 16 Dec 2021 21:47:48 +0800 Subject: [PATCH] remove: stash.go these function seems not useful --- client/client.go | 23 ++- client/global.go | 21 ++- client/stash.go | 303 ------------------------------------ client/syncmarker_string.go | 29 ---- message/message.go | 33 ++-- 5 files changed, 35 insertions(+), 374 deletions(-) delete mode 100644 client/stash.go delete mode 100644 client/syncmarker_string.go diff --git a/client/client.go b/client/client.go index 03e0879b..40e92d71 100644 --- a/client/client.go +++ b/client/client.go @@ -550,10 +550,8 @@ func (c *QQClient) GetForwardMessage(resID string) *message.ForwardMessage { if m == nil { return nil } - var ( - item *msg.PbMultiMsgItem - ret = &message.ForwardMessage{Nodes: []*message.ForwardNode{}} - ) + var item *msg.PbMultiMsgItem + ret := &message.ForwardMessage{Nodes: []*message.ForwardNode{}} for _, iter := range m.Items { if iter.GetFileName() == m.FileName { item = iter @@ -563,16 +561,15 @@ func (c *QQClient) GetForwardMessage(resID string) *message.ForwardMessage { return nil } for _, m := range item.GetBuffer().GetMsg() { + name := m.Head.GetFromNick() + if m.Head.GetMsgType() == 82 && m.Head.GroupInfo != nil { + name = m.Head.GroupInfo.GetGroupCard() + } ret.Nodes = append(ret.Nodes, &message.ForwardNode{ - SenderId: m.Head.GetFromUin(), - SenderName: func() string { - if m.Head.GetMsgType() == 82 && m.Head.GroupInfo != nil { - return m.Head.GroupInfo.GetGroupCard() - } - return m.Head.GetFromNick() - }(), - Time: m.Head.GetMsgTime(), - Message: message.ParseMessageElems(m.Body.RichText.Elems), + SenderId: m.Head.GetFromUin(), + SenderName: name, + Time: m.Head.GetMsgTime(), + Message: message.ParseMessageElems(m.Body.RichText.Elems), }) } return ret diff --git a/client/global.go b/client/global.go index 73a1cd7d..882ae371 100644 --- a/client/global.go +++ b/client/global.go @@ -157,10 +157,7 @@ var SystemDeviceInfo = &DeviceInfo{ }, } -var ( - EmptyBytes = []byte{} - NumberRange = "0123456789" -) +var EmptyBytes = make([]byte, 0) func init() { r := make([]byte, 16) @@ -174,8 +171,9 @@ func init() { func GenRandomDevice() { r := make([]byte, 16) rand.Read(r) - SystemDeviceInfo.Display = []byte("MIRAI." + utils.RandomStringRange(6, NumberRange) + ".001") - SystemDeviceInfo.FingerPrint = []byte("mamoe/mirai/mirai:10/MIRAI.200122.001/" + utils.RandomStringRange(7, NumberRange) + ":user/release-keys") + const numberRange = "0123456789" + SystemDeviceInfo.Display = []byte("MIRAI." + utils.RandomStringRange(6, numberRange) + ".001") + SystemDeviceInfo.FingerPrint = []byte("mamoe/mirai/mirai:10/MIRAI.200122.001/" + utils.RandomStringRange(7, numberRange) + ":user/release-keys") SystemDeviceInfo.BootId = binary.GenUUID(r) SystemDeviceInfo.ProcVersion = []byte("Linux version 3.0.31-" + utils.RandomString(8) + " (android-build@xxx.xxx.xxx.xxx.com)") rand.Read(r) @@ -498,8 +496,7 @@ func qualityTest(addr string) (int64, error) { return 0, errors.Wrap(err, "failed to connect to server during quality test") } _ = conn.Close() - end := time.Now() - return end.Sub(start).Milliseconds(), nil + return time.Since(start).Milliseconds(), nil } func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage { @@ -582,10 +579,12 @@ func (b *groupMessageBuilder) build() *msg.Message { return base } -func packUniRequestData(data []byte) (r []byte) { - r = append([]byte{0x0A}, data...) +func packUniRequestData(data []byte) []byte { + r := make([]byte, 0, len(data)+2) + r = append(r, 0x0a) + r = append(r, data...) r = append(r, 0x0B) - return + return r } func genForwardTemplate(resID, preview, title, brief, source, summary string, ts int64, items []*msg.PbMultiMsgItem) *message.ForwardElement { diff --git a/client/stash.go b/client/stash.go deleted file mode 100644 index e8957b52..00000000 --- a/client/stash.go +++ /dev/null @@ -1,303 +0,0 @@ -// UNCHECKED - -package client - -import ( - "bytes" - "encoding/binary" - "io" - "strings" -) - -// Stash will store the data for the client, this will speed up booting -// the QQ client but some data may not sync with the server. So it is -// recommended to use this in development mode only. - -//go:generate stringer -type=syncMarker -trimprefix=syncMarker -type syncMarker int8 - -const ( - syncMarkerNone syncMarker = iota - syncMarkerFriendList - syncMarkerFriendInfo - syncMarkerGroupList - syncMarkerGroupInfo - syncMarkerGroupMemberList - syncMarkerGroupMemberInfo -) - -type StashSyncMarkerError struct { - marker syncMarker - expected syncMarker -} - -func (e *StashSyncMarkerError) Error() string { - return "stash sync marker error: expected " + e.expected.String() + ", got " + e.marker.String() -} - -// WriteStash will write the stash to the given writer. -func WriteStash(client *QQClient, writer io.Writer) { - var out intWriter - w := stashWriter{ - stringIndex: make(map[string]uint64), - } - - w.friendList(client.FriendList) - w.groupList(client.GroupList) - - out.uvarint(uint64(w.strings.Len())) - out.uvarint(uint64(w.data.Len())) - _, _ = io.Copy(&out, &w.strings) - _, _ = io.Copy(&out, &w.data) - _, _ = io.Copy(writer, &out) -} - -type stashWriter struct { - data intWriter - strings intWriter - stringIndex map[string]uint64 -} - -func (w *stashWriter) string(s string) { - off, ok := w.stringIndex[s] - if !ok { - off = uint64(w.strings.Len()) - w.strings.uvarint(uint64(len(s))) - _, _ = w.strings.WriteString(s) - w.stringIndex[s] = off - } - w.uvarint(off) -} - -func (w *stashWriter) sync(marker syncMarker) { w.data.uvarint(uint64(marker)) } -func (w *stashWriter) uvarint(v uint64) { w.data.uvarint(v) } -func (w *stashWriter) svarint(v int64) { w.data.svarint(v) } - -func (w *stashWriter) int64(v int64) { - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], uint64(v)) - _, _ = w.data.Write(buf[:]) -} - -func (w *stashWriter) friendList(list []*FriendInfo) { - w.sync(syncMarkerFriendList) - w.uvarint(uint64(len(list))) - for _, friend := range list { - w.sync(syncMarkerFriendInfo) - w.int64(friend.Uin) - w.string(friend.Nickname) - w.string(friend.Remark) - w.svarint(int64(friend.FaceId)) - } -} - -func (w *stashWriter) groupList(list []*GroupInfo) { - w.sync(syncMarkerGroupList) - w.uvarint(uint64(len(list))) - for _, group := range list { - w.sync(syncMarkerGroupInfo) - w.int64(group.Uin) - w.int64(group.Code) - w.string(group.Name) - w.string(group.Memo) - w.int64(group.OwnerUin) - w.uvarint(uint64(group.GroupCreateTime)) - w.uvarint(uint64(group.MemberCount)) - w.uvarint(uint64(group.MaxMemberCount)) - w.svarint(group.LastMsgSeq) - - w.groupMemberList(group.Members) - } -} - -func (w *stashWriter) groupMemberList(list []*GroupMemberInfo) { - w.sync(syncMarkerGroupMemberList) - w.uvarint(uint64(len(list))) - for _, member := range list { - w.sync(syncMarkerGroupMemberInfo) - w.int64(member.Uin) - w.uvarint(uint64(member.Gender)) - w.string(member.Nickname) - w.string(member.CardName) - w.uvarint(uint64(member.Level)) - w.int64(member.JoinTime) - w.int64(member.LastSpeakTime) - w.string(member.SpecialTitle) - w.svarint(member.SpecialTitleExpireTime) - w.svarint(member.ShutUpTimestamp) - w.uvarint(uint64(member.Permission)) - } -} - -type intWriter struct { - bytes.Buffer -} - -func (w *intWriter) svarint(x int64) { - w.uvarint(uint64(x)<<1 ^ uint64(x>>63)) -} - -func (w *intWriter) uvarint(x uint64) { - var buf [binary.MaxVarintLen64]byte - n := binary.PutUvarint(buf[:], x) - _, _ = w.Write(buf[:n]) -} - -// ReadStash will read the stash from the given reader and apply to the given QQClient. -func ReadStash(client *QQClient, data string) (err error) { - in := newIntReader(data) - sl := int64(in.uvarint()) - dl := int64(in.uvarint()) - whence, err := in.Seek(0, io.SeekCurrent) - if err != nil { - return err - } - sData := data[whence : whence+sl] - dData := data[whence+sl : whence+sl+dl] - - r := stashReader{ - data: newIntReader(dData), - strings: newIntReader(sData), - stringIndex: make(map[uint64]string), - } - defer func() { - if r := recover(); r != nil { - if e, ok := r.(error); ok { - err = e - return - } - panic(r) - } - }() - - client.FriendList = r.friendList() - client.GroupList = r.groupList(client) - return nil -} - -type stashReader struct { - data intReader - strings intReader - stringIndex map[uint64]string -} - -func (r *stashReader) string() string { - off := r.data.uvarint() - if off == 0 { - return "" - } - if s, ok := r.stringIndex[off]; ok { - return s - } - _, _ = r.strings.Seek(int64(off), io.SeekStart) - l := int64(r.strings.uvarint()) - whence, _ := r.strings.Seek(0, io.SeekCurrent) - s := r.strings.data[whence : whence+l] - r.stringIndex[off] = s - return s -} - -func (r *stashReader) sync(marker syncMarker) { - got := syncMarker(r.data.uvarint()) - if got != marker { - panic(&StashSyncMarkerError{ - marker: got, - expected: marker, - }) - } -} - -func (r *stashReader) friendList() []*FriendInfo { - r.sync(syncMarkerFriendList) - l := r.uvarint() - list := make([]*FriendInfo, l) - for i := uint64(0); i < l; i++ { - r.sync(syncMarkerFriendInfo) - list[i] = &FriendInfo{ - Uin: r.int64(), - Nickname: r.string(), - Remark: r.string(), - FaceId: int16(r.svarint()), - } - } - return list -} - -func (r *stashReader) groupList(client *QQClient) []*GroupInfo { - r.sync(syncMarkerGroupList) - l := r.uvarint() - list := make([]*GroupInfo, l) - for i := uint64(0); i < l; i++ { - r.sync(syncMarkerGroupInfo) - list[i] = &GroupInfo{ - Uin: r.int64(), - Code: r.int64(), - Name: r.string(), - Memo: r.string(), - OwnerUin: r.int64(), - GroupCreateTime: uint32(r.uvarint()), - GroupLevel: uint32(r.uvarint()), - MemberCount: uint16(r.uvarint()), - MaxMemberCount: uint16(r.uvarint()), - client: client, - } - list[i].Members = r.groupMemberList(list[i]) - list[i].LastMsgSeq = r.svarint() - } - return list -} - -func (r *stashReader) groupMemberList(group *GroupInfo) []*GroupMemberInfo { - r.sync(syncMarkerGroupMemberList) - l := r.uvarint() - list := make([]*GroupMemberInfo, l) - for i := uint64(0); i < l; i++ { - r.sync(syncMarkerGroupMemberInfo) - list[i] = &GroupMemberInfo{ - Group: group, - Uin: r.int64(), - Gender: byte(r.uvarint()), - Nickname: r.string(), - CardName: r.string(), - Level: uint16(r.uvarint()), - JoinTime: r.int64(), - LastSpeakTime: r.int64(), - SpecialTitle: r.string(), - SpecialTitleExpireTime: r.svarint(), - ShutUpTimestamp: r.svarint(), - Permission: MemberPermission(r.uvarint()), - } - } - return list -} - -func (r *stashReader) uvarint() uint64 { return r.data.uvarint() } -func (r *stashReader) svarint() int64 { return r.data.svarint() } - -func (r *stashReader) int64() int64 { - var buf [8]byte - _, _ = r.data.Read(buf[:]) - return int64(binary.LittleEndian.Uint64(buf[:])) -} - -type intReader struct { - data string - *strings.Reader -} - -func newIntReader(s string) intReader { - return intReader{ - data: s, - Reader: strings.NewReader(s), - } -} - -func (r *intReader) svarint() int64 { - i, _ := binary.ReadVarint(r) - return i -} - -func (r *intReader) uvarint() uint64 { - i, _ := binary.ReadUvarint(r) - return i -} diff --git a/client/syncmarker_string.go b/client/syncmarker_string.go deleted file mode 100644 index 729efd8b..00000000 --- a/client/syncmarker_string.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by "stringer -type=syncMarker -trimprefix=syncMarker"; DO NOT EDIT. - -package client - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[syncMarkerNone-0] - _ = x[syncMarkerFriendList-1] - _ = x[syncMarkerFriendInfo-2] - _ = x[syncMarkerGroupList-3] - _ = x[syncMarkerGroupInfo-4] - _ = x[syncMarkerGroupMemberList-5] - _ = x[syncMarkerGroupMemberInfo-6] -} - -const _syncMarker_name = "NoneFriendListFriendInfoGroupListGroupInfoGroupMemberListGroupMemberInfo" - -var _syncMarker_index = [...]uint8{0, 4, 14, 24, 33, 42, 57, 72} - -func (i syncMarker) String() string { - if i < 0 || i >= syncMarker(len(_syncMarker_index)-1) { - return "syncMarker(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _syncMarker_name[_syncMarker_index[i]:_syncMarker_index[i+1]] -} diff --git a/message/message.go b/message/message.go index 78c289bf..9a18c972 100644 --- a/message/message.go +++ b/message/message.go @@ -298,20 +298,17 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) { return } -func ToSrcProtoElems(elems []IMessageElement) (r []*msg.Elem) { - for _, elem := range elems { - switch elem.Type() { - case Image: - r = append(r, &msg.Elem{ - Text: &msg.Text{ - Str: proto.String("[图片]"), - }, - }) - default: - r = append(r, ToProtoElems([]IMessageElement{elem}, false)...) +var photoTextElem IMessageElement = NewText("[图片]") + +func ToSrcProtoElems(elems []IMessageElement) []*msg.Elem { + elems2 := make([]IMessageElement, len(elems)) + copy(elems2, elems) + for i, elem := range elems2 { + if elem.Type() == Image { + elems2[i] = photoTextElem } } - return + return ToProtoElems(elems2, false) } func ParseMessageElems(elems []*msg.Elem) []IMessageElement { @@ -434,12 +431,12 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { if len(elem.CustomFace.Md5) == 0 { continue } - url := func() string { - if elem.CustomFace.GetOrigUrl() == "" { - return "https://gchat.qpic.cn/gchatpic_new/0/0-0-" + strings.ReplaceAll(binary.CalculateImageResourceId(elem.CustomFace.Md5)[1:37], "-", "") + "/0?term=2" - } - return "https://gchat.qpic.cn" + elem.CustomFace.GetOrigUrl() - }() + var url string + if elem.CustomFace.GetOrigUrl() == "" { + url = "https://gchat.qpic.cn/gchatpic_new/0/0-0-" + strings.ReplaceAll(binary.CalculateImageResourceId(elem.CustomFace.Md5)[1:37], "-", "") + "/0?term=2" + } else { + url = "https://gchat.qpic.cn" + elem.CustomFace.GetOrigUrl() + } if strings.Contains(elem.CustomFace.GetOrigUrl(), "qmeet") { res = append(res, &GuildImageElement{ FileId: int64(elem.CustomFace.GetFileId()),