mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
supported MemberLeaveGroupEvent.
This commit is contained in:
parent
644c0bfacc
commit
92b493e5ac
@ -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 {
|
||||||
|
@ -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),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user