1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

supported MemberLeaveGroupEvent.

This commit is contained in:
Mrs4s 2020-07-14 18:44:47 +08:00
parent 644c0bfacc
commit 92b493e5ac
4 changed files with 76 additions and 18 deletions

View File

@ -341,6 +341,20 @@ func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
return nil return nil
} }
func (g *GroupInfo) RemoveMember(uin int64) {
if g.memLock == nil {
g.memLock = new(sync.Mutex)
}
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
}
}
}
func (c *QQClient) connect() error { func (c *QQClient) connect() error {
conn, err := net.Dial("tcp", "125.94.60.146:80") //TODO: more servers conn, err := net.Dial("tcp", "125.94.60.146:80") //TODO: more servers
if err != nil { if err != nil {

View File

@ -16,7 +16,7 @@ var (
groupLeaveLock = new(sync.Mutex) groupLeaveLock = new(sync.Mutex)
) )
func decodeLoginResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeLoginResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
reader := binary.NewReader(payload) reader := binary.NewReader(payload)
reader.ReadUInt16() // sub command reader.ReadUInt16() // sub command
t := reader.ReadByte() t := reader.ReadByte()
@ -100,7 +100,7 @@ func decodeLoginResponse(c *QQClient, seq uint16, payload []byte) (interface{},
return nil, nil // ? return nil, nil // ?
} }
func decodeClientRegisterResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeClientRegisterResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
request := &jce.RequestPacket{} request := &jce.RequestPacket{}
request.ReadFrom(jce.NewJceReader(payload)) request.ReadFrom(jce.NewJceReader(payload))
data := &jce.RequestDataVersion2{} data := &jce.RequestDataVersion2{}
@ -108,7 +108,7 @@ func decodeClientRegisterResponse(c *QQClient, seq uint16, payload []byte) (inte
return nil, nil return nil, nil
} }
func decodePushReqPacket(c *QQClient, s uint16, payload []byte) (interface{}, error) { func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
request := &jce.RequestPacket{} request := &jce.RequestPacket{}
request.ReadFrom(jce.NewJceReader(payload)) request.ReadFrom(jce.NewJceReader(payload))
data := &jce.RequestDataVersion2{} data := &jce.RequestDataVersion2{}
@ -122,7 +122,7 @@ func decodePushReqPacket(c *QQClient, s uint16, payload []byte) (interface{}, er
return nil, c.send(pkt) return nil, c.send(pkt)
} }
func decodeMessageSvcPacket(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
rsp := msg.GetMessageResponse{} rsp := msg.GetMessageResponse{}
err := proto.Unmarshal(payload, &rsp) err := proto.Unmarshal(payload, &rsp)
if err != nil { if err != nil {
@ -198,7 +198,7 @@ func decodeMessageSvcPacket(c *QQClient, seq uint16, payload []byte) (interface{
return nil, err return nil, err
} }
func decodeGroupMessagePacket(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
pkt := msg.PushMessagePacket{} pkt := msg.PushMessagePacket{}
err := proto.Unmarshal(payload, &pkt) err := proto.Unmarshal(payload, &pkt)
if err != nil { if err != nil {
@ -215,12 +215,12 @@ func decodeGroupMessagePacket(c *QQClient, seq uint16, payload []byte) (interfac
return nil, nil return nil, nil
} }
func decodeSvcNotify(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeSvcNotify(c *QQClient, _ uint16, _ []byte) (interface{}, error) {
_, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()) _, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix())
return nil, c.send(pkt) return nil, c.send(pkt)
} }
func decodeFriendGroupListResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeFriendGroupListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
request := &jce.RequestPacket{} request := &jce.RequestPacket{}
request.ReadFrom(jce.NewJceReader(payload)) request.ReadFrom(jce.NewJceReader(payload))
data := &jce.RequestDataVersion3{} data := &jce.RequestDataVersion3{}
@ -245,7 +245,7 @@ func decodeFriendGroupListResponse(c *QQClient, seq uint16, payload []byte) (int
return rsp, nil return rsp, nil
} }
func decodeGroupListResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeGroupListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
request := &jce.RequestPacket{} request := &jce.RequestPacket{}
request.ReadFrom(jce.NewJceReader(payload)) request.ReadFrom(jce.NewJceReader(payload))
data := &jce.RequestDataVersion3{} data := &jce.RequestDataVersion3{}
@ -268,7 +268,7 @@ func decodeGroupListResponse(c *QQClient, seq uint16, payload []byte) (interface
return l, nil return l, nil
} }
func decodeGroupMemberListResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeGroupMemberListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
request := &jce.RequestPacket{} request := &jce.RequestPacket{}
request.ReadFrom(jce.NewJceReader(payload)) request.ReadFrom(jce.NewJceReader(payload))
data := &jce.RequestDataVersion3{} data := &jce.RequestDataVersion3{}
@ -302,7 +302,7 @@ func decodeGroupMemberListResponse(c *QQClient, seq uint16, payload []byte) (int
}, nil }, nil
} }
func decodeGroupImageStoreResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeGroupImageStoreResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
pkt := pb.D388RespBody{} pkt := pb.D388RespBody{}
err := proto.Unmarshal(payload, &pkt) err := proto.Unmarshal(payload, &pkt)
if err != nil { if err != nil {
@ -412,7 +412,7 @@ func decodeOnlinePushReqPacket(c *QQClient, seq uint16, payload []byte) (interfa
return nil, nil return nil, nil
} }
func decodeOnlinePushTransPacket(c *QQClient, seq uint16, payload []byte) (interface{}, error) { func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
info := msg.TransMsgInfo{} info := msg.TransMsgInfo{}
err := proto.Unmarshal(payload, &info) err := proto.Unmarshal(payload, &info)
if err != nil { if err != nil {
@ -422,14 +422,14 @@ func decodeOnlinePushTransPacket(c *QQClient, seq uint16, payload []byte) (inter
if info.MsgType == 34 { if info.MsgType == 34 {
data.ReadInt32() data.ReadInt32()
data.ReadByte() data.ReadByte()
_ = int64(uint32(data.ReadInt32())) target := int64(uint32(data.ReadInt32()))
typ := int32(data.ReadByte()) typ := int32(data.ReadByte())
operator := int64(uint32(data.ReadInt32())) operator := int64(uint32(data.ReadInt32()))
switch typ { if g := c.FindGroup(info.FromUin); g != nil {
case 0x03: switch typ {
groupLeaveLock.Lock() case 0x03:
defer groupLeaveLock.Unlock() groupLeaveLock.Lock()
if g := c.FindGroup(info.FromUin); g != nil { defer groupLeaveLock.Unlock()
if err = c.ReloadGroupList(); err != nil { if err = c.ReloadGroupList(); err != nil {
return nil, err return nil, err
} }
@ -437,6 +437,23 @@ func decodeOnlinePushTransPacket(c *QQClient, seq uint16, payload []byte) (inter
Group: g, Group: g,
Operator: g.FindMember(operator), Operator: g.FindMember(operator),
}) })
case 0x82:
if m := g.FindMember(target); m != nil {
g.RemoveMember(m.Uin)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g,
Member: m,
})
}
case 0x83:
if m := g.FindMember(target); m != nil {
g.RemoveMember(m.Uin)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g,
Member: m,
Operator: g.FindMember(operator),
})
}
} }
} }

View File

@ -1,6 +1,9 @@
package client package client
import "errors" import (
"errors"
"sync"
)
var ( var (
ErrAlreadyRunning = errors.New("already running") ErrAlreadyRunning = errors.New("already running")
@ -47,6 +50,8 @@ type (
MemberCount uint16 MemberCount uint16
MaxMemberCount uint16 MaxMemberCount uint16
Members []*GroupMemberInfo Members []*GroupMemberInfo
memLock *sync.Mutex
} }
GroupMemberInfo struct { GroupMemberInfo struct {
@ -81,6 +86,12 @@ type (
Operator *GroupMemberInfo Operator *GroupMemberInfo
} }
MemberLeaveGroupEvent struct {
Group *GroupInfo
Member *GroupMemberInfo
Operator *GroupMemberInfo
}
groupMemberListResponse struct { groupMemberListResponse struct {
NextUin int64 NextUin int64
list []*GroupMemberInfo list []*GroupMemberInfo

View File

@ -13,6 +13,7 @@ type eventHandlers struct {
joinGroupHandlers []func(*QQClient, *GroupInfo) joinGroupHandlers []func(*QQClient, *GroupInfo)
leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent) leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent)
memberJoinedHandlers []func(*QQClient, *GroupInfo, *GroupMemberInfo) memberJoinedHandlers []func(*QQClient, *GroupInfo, *GroupMemberInfo)
memberLeavedHandlers []func(*QQClient, *MemberLeaveGroupEvent)
groupMessageReceiptHandlers sync.Map groupMessageReceiptHandlers sync.Map
} }
@ -48,6 +49,10 @@ func (c *QQClient) OnGroupMemberJoined(f func(*QQClient, *GroupInfo, *GroupMembe
c.eventHandlers.memberJoinedHandlers = append(c.eventHandlers.memberJoinedHandlers, f) c.eventHandlers.memberJoinedHandlers = append(c.eventHandlers.memberJoinedHandlers, f)
} }
func (c *QQClient) OnGroupMemberLeaved(f func(*QQClient, *MemberLeaveGroupEvent)) {
c.eventHandlers.memberLeavedHandlers = append(c.eventHandlers.memberLeavedHandlers, f)
}
func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) { func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) {
c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f) c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f)
} }
@ -143,6 +148,17 @@ func (c *QQClient) dispatchNewMemberEvent(group *GroupInfo, mem *GroupMemberInfo
} }
} }
func (c *QQClient) dispatchMemberLeaveEvent(e *MemberLeaveGroupEvent) {
if e == nil {
return
}
for _, f := range c.eventHandlers.memberLeavedHandlers {
cover(func() {
f(c, e)
})
}
}
func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) { func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) {
c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool { c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool {
go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e) go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e)