From c73e2f0cc55520838f44a0a6b5a7ed84f34d2020 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Sat, 26 Sep 2020 14:01:42 +0800 Subject: [PATCH 1/6] update cmd name. --- client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index fb07eb42..5dc97da6 100644 --- a/client/client.go +++ b/client/client.go @@ -1066,7 +1066,7 @@ func (c *QQClient) netLoop() { go func() { defer func() { if pan := recover(); pan != nil { - c.Error("panic on decoder: %v", pan) + c.Error("panic on decoder %v : %v", pkt.CommandName, pan) //fmt.Println("panic on decoder:", pan) } }() From afb0ed6368ad6f8ef67f8f71d9e3415384f3564f Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Sat, 26 Sep 2020 18:18:30 +0800 Subject: [PATCH 2/6] update lock. --- client/client.go | 32 +++++++------------------------- client/decoders.go | 8 +++++--- client/entities.go | 40 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/client/client.go b/client/client.go index 5dc97da6..97aa8874 100644 --- a/client/client.go +++ b/client/client.go @@ -829,24 +829,6 @@ func (c *QQClient) SolveFriendRequest(req *NewFriendRequest, accept bool) { _ = c.send(pkt) } -func (g *GroupInfo) SelfPermission() MemberPermission { - return g.FindMember(g.client.Uin).Permission -} - -func (g *GroupInfo) AdministratorOrOwner() bool { - return g.SelfPermission() == Administrator || g.SelfPermission() == Owner -} - -func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo { - for _, m := range g.Members { - f := m - if f.Uin == uin { - return f - } - } - return nil -} - func (c *QQClient) getCookies() string { return fmt.Sprintf("uin=o%d; skey=%s;", c.Uin, c.sigInfo.sKey) } @@ -914,14 +896,14 @@ func (c *QQClient) kickGroupMember(groupCode, memberUin int64, msg string) { } func (g *GroupInfo) removeMember(uin int64) { - g.memLock.Lock() - defer g.memLock.Unlock() - for i, m := range g.Members { - if m.Uin == uin { - g.Members = append(g.Members[:i], g.Members[i+1:]...) - break + g.Update(func(info *GroupInfo) { + for i, m := range info.Members { + if m.Uin == uin { + info.Members = append(info.Members[:i], info.Members[i+1:]...) + break + } } - } + }) } func (c *QQClient) connect() error { diff --git a/client/decoders.go b/client/decoders.go index 963af379..37d19731 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -29,8 +29,8 @@ import ( ) var ( - groupJoinLock = new(sync.Mutex) - groupLeaveLock = new(sync.Mutex) + groupJoinLock sync.Mutex + groupLeaveLock sync.Mutex ) // wtlogin.login @@ -228,7 +228,9 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, Permission: Member, Group: group, } - group.Members = append(group.Members, mem) + group.Update(func(info *GroupInfo) { + info.Members = append(info.Members, mem) + }) c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ Group: group, Member: mem, diff --git a/client/entities.go b/client/entities.go index b4333066..ddbad763 100644 --- a/client/entities.go +++ b/client/entities.go @@ -70,8 +70,8 @@ type ( MaxMemberCount uint16 Members []*GroupMemberInfo - client *QQClient - memLock sync.Mutex + client *QQClient + lock sync.RWMutex } GroupMemberInfo struct { @@ -285,6 +285,42 @@ func (g *GroupInfo) Quit() { } } +func (g *GroupInfo) SelfPermission() MemberPermission { + return g.FindMember(g.client.Uin).Permission +} + +func (g *GroupInfo) AdministratorOrOwner() bool { + return g.SelfPermission() == Administrator || g.SelfPermission() == Owner +} + +func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo { + r := g.Read(func(info *GroupInfo) interface{} { + for _, m := range info.Members { + f := m + if f.Uin == uin { + return f + } + } + return nil + }) + if r == nil { + return nil + } + return r.(*GroupMemberInfo) +} + +func (g *GroupInfo) Update(f func(*GroupInfo)) { + g.lock.Lock() + defer g.lock.Unlock() + f(g) +} + +func (g *GroupInfo) Read(f func(*GroupInfo) interface{}) interface{} { + g.lock.RLock() + defer g.lock.RUnlock() + return f(g) +} + func (m *GroupMemberInfo) DisplayName() string { if m.CardName == "" { return m.Nickname From 1a81a97597d7f0249bec448648e709fe1a0e5910 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Mon, 28 Sep 2020 10:25:52 +0800 Subject: [PATCH 3/6] fix image issue for android client. --- message/message.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/message/message.go b/message/message.go index e4f2ed1e..23e7deb9 100644 --- a/message/message.go +++ b/message/message.go @@ -294,9 +294,9 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) { CustomFace: &msg.CustomFace{ FilePath: e.Filename, Md5: e.Md5, - Size: e.Size, - Flag: make([]byte, 4), - OldData: imgOld, + //Size: e.Size, + Flag: make([]byte, 4), + OldData: imgOld, }, }) case *GroupImageElement: @@ -307,9 +307,9 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) { Origin: 1, FileId: int32(e.FileId), FilePath: e.ImageId, - Size: e.Size, - Md5: e.Md5[:], - Flag: make([]byte, 4), + //Size: e.Size, + Md5: e.Md5[:], + Flag: make([]byte, 4), //OldData: imgOld, }, }) From 65c1709f5eec68b1adff0a35d95ebed6d3f5da30 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Mon, 28 Sep 2020 16:23:41 +0800 Subject: [PATCH 4/6] fix decoder panic by new member message. --- client/decoders.go | 1 + client/global.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/decoders.go b/client/decoders.go index 37d19731..70e2154f 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -461,6 +461,7 @@ func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{} OwnerUin: int64(*info.GroupInfo.GroupOwner), MemberCount: uint16(*info.GroupInfo.GroupMemberNum), MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum), + Members: []*GroupMemberInfo{}, client: c, }, nil } diff --git a/client/global.go b/client/global.go index b5cf93a2..c474d90e 100644 --- a/client/global.go +++ b/client/global.go @@ -304,8 +304,8 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { if info == nil { return nil } - group.Members = append(group.Members, mem) mem = info + group.Members = append(group.Members, mem) go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ Group: group, Member: info, From efe1b528ca93144d204d3c67ac8d7c6f0086d133 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Mon, 28 Sep 2020 16:55:15 +0800 Subject: [PATCH 5/6] try to fix image issue. --- message/message.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/message/message.go b/message/message.go index 23e7deb9..a4eb863d 100644 --- a/message/message.go +++ b/message/message.go @@ -302,14 +302,14 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) { case *GroupImageElement: r = append(r, &msg.Elem{ CustomFace: &msg.CustomFace{ - FileType: 66, + //FileType: 66, Useful: 1, Origin: 1, FileId: int32(e.FileId), FilePath: e.ImageId, - //Size: e.Size, - Md5: e.Md5[:], - Flag: make([]byte, 4), + Size: e.Size, + Md5: e.Md5[:], + Flag: make([]byte, 4), //OldData: imgOld, }, }) From fbb53eba9b5a7bffa88da55f8dd7831af58a98fd Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Tue, 29 Sep 2020 18:12:32 +0800 Subject: [PATCH 6/6] fix GetGroupMembers panic. --- client/client.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/client.go b/client/client.go index 97aa8874..aabbb054 100644 --- a/client/client.go +++ b/client/client.go @@ -763,6 +763,9 @@ func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]*GroupMemberInfo, error) if err != nil { return nil, err } + if data == nil { + return nil, errors.New("rsp is nil") + } rsp := data.(groupMemberListResponse) nextUin = rsp.NextUin for _, m := range rsp.list {