From a6bef48fe22321f63c9cfd554f2241445eeec0f8 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Wed, 15 Jul 2020 02:28:49 +0800 Subject: [PATCH] supported MemberPermissionChangedEvent. update README.md fix group code convert error. --- README.md | 59 ++++++++++++++++++++++++++++++++++++---------- client/decoders.go | 35 ++++++++++++++++++++++++++- client/entities.go | 12 ++++++++++ client/events.go | 26 ++++++++++++++++---- client/global.go | 5 ++-- 5 files changed, 117 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 01becdc3..bce8c8af 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,51 @@ qq-android协议的golang实现 移植于Mirai # 警告 本项目目前还处于玩具阶段,强烈不推荐使用. -# 计划 +# 已完成功能/开发计划 +#### 登录 +- [x] 账号密码登录 +- [x] 验证码提交 +- [x] 设备锁验证 +- [x] 错误信息解析 -| 功能 | 状态 | -| -------- | ------ | -| 登录 | 完成 | -| 自动重连 | 大概能用了 | -| 好友/群列表 | 完成 | -| 好友消息接受 | 完成 | -| 好友消息发送 | 正在做| -| 群消息接受 |完成| -| 群消息发送 | 50% (仅支持 文本/图片/表情)| -| QQ各种事件 | 正在做, 已支持 群内禁言/群内消息撤回/加群/新成员进群 | -| MiraiGo文档 | 咕咕| \ No newline at end of file +#### 消息类型 +- [x] 文本 +- [x] 图片 +- [x] At +- [x] 回复 +- [ ] 长消息 +- [ ] 分享 +- [ ] 富文本 +- [ ] 转发 + +#### 事件 +- [x] 好友消息 +- [x] 群消息 +- [ ] 临时会话消息 +- [ ] 讨论组消息 +- [x] 登录号加群 +- [x] 登录号退群(包含T出) +- [x] 新成员进群/退群 +- [x] 群消息撤回 +- [x] 群禁言 +- [x] 群成员权限变更 +- [ ] 被邀请进群 +- [ ] 新好友 + +#### 主动操作 +- [x] 发送群消息 +- [ ] 发送好友消息 +- [ ] 发送临时会话消息 +- [ ] 发送讨论组消息 +- [x] 获取/刷新群列表 +- [x] 获取/刷新群成员列表 +- [x] 获取/刷新好友列表 +- [ ] 获取/刷新讨论组列表 +- [ ] 处理加群请求 +- [ ] 处理好友请求 +- [ ] 撤回消息 +- [ ] 群公告设置 +- [ ] 群设置 +- [ ] 修改群成员Card +- [ ] 群成员邀请 +- [ ] T出群成员 diff --git a/client/decoders.go b/client/decoders.go index f40d3fb7..43ccda44 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -174,7 +174,10 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, Permission: Member, } group.Members = append(group.Members, mem) - c.dispatchNewMemberEvent(group, mem) + c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + Group: group, + Member: mem, + }) } } groupJoinLock.Unlock() @@ -458,5 +461,35 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa } } + if info.MsgType == 44 { + data.ReadBytes(5) + var4 := int32(data.ReadByte()) + var var5 int64 = 0 + target := int64(uint32(data.ReadInt32())) + if var4 != 0 && var4 != 1 { + var5 = int64(uint32(data.ReadInt32())) + } + if g := c.FindGroup(info.FromUin); g != nil { + if var5 == 0 && data.Len() == 1 { + newPermission := func() MemberPermission { + if data.ReadByte() == 1 { + return Administrator + } + return Member + }() + mem := g.FindMember(target) + if mem.Permission != newPermission { + old := mem.Permission + mem.Permission = newPermission + c.dispatchPermissionChanged(&MemberPermissionChangedEvent{ + Group: g, + Member: mem, + OldPermission: old, + NewPermission: newPermission, + }) + } + } + } + } return nil, nil } diff --git a/client/entities.go b/client/entities.go index e94841af..94ae5692 100644 --- a/client/entities.go +++ b/client/entities.go @@ -86,12 +86,24 @@ type ( Operator *GroupMemberInfo } + MemberJoinGroupEvent struct { + Group *GroupInfo + Member *GroupMemberInfo + } + MemberLeaveGroupEvent struct { Group *GroupInfo Member *GroupMemberInfo Operator *GroupMemberInfo } + MemberPermissionChangedEvent struct { + Group *GroupInfo + Member *GroupMemberInfo + OldPermission MemberPermission + NewPermission MemberPermission + } + groupMemberListResponse struct { NextUin int64 list []*GroupMemberInfo diff --git a/client/events.go b/client/events.go index dead4f4a..1f3878e0 100644 --- a/client/events.go +++ b/client/events.go @@ -12,8 +12,9 @@ type eventHandlers struct { groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) joinGroupHandlers []func(*QQClient, *GroupInfo) leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent) - memberJoinedHandlers []func(*QQClient, *GroupInfo, *GroupMemberInfo) + memberJoinedHandlers []func(*QQClient, *MemberJoinGroupEvent) memberLeavedHandlers []func(*QQClient, *MemberLeaveGroupEvent) + permissionChangedHandlers []func(*QQClient, *MemberPermissionChangedEvent) groupMessageReceiptHandlers sync.Map } @@ -45,7 +46,7 @@ func (c *QQClient) OnLeaveGroup(f func(*QQClient, *GroupLeaveEvent)) { c.eventHandlers.leaveGroupHandlers = append(c.eventHandlers.leaveGroupHandlers, f) } -func (c *QQClient) OnGroupMemberJoined(f func(*QQClient, *GroupInfo, *GroupMemberInfo)) { +func (c *QQClient) OnGroupMemberJoined(f func(*QQClient, *MemberJoinGroupEvent)) { c.eventHandlers.memberJoinedHandlers = append(c.eventHandlers.memberJoinedHandlers, f) } @@ -53,6 +54,10 @@ func (c *QQClient) OnGroupMemberLeaved(f func(*QQClient, *MemberLeaveGroupEvent) c.eventHandlers.memberLeavedHandlers = append(c.eventHandlers.memberLeavedHandlers, f) } +func (c *QQClient) OnGroupMemberPermissionChanged(f func(*QQClient, *MemberPermissionChangedEvent)) { + c.eventHandlers.permissionChangedHandlers = append(c.eventHandlers.permissionChangedHandlers, f) +} + func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) { c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f) } @@ -137,13 +142,13 @@ func (c *QQClient) dispatchLeaveGroupEvent(e *GroupLeaveEvent) { } } -func (c *QQClient) dispatchNewMemberEvent(group *GroupInfo, mem *GroupMemberInfo) { - if group == nil || mem == nil { +func (c *QQClient) dispatchNewMemberEvent(e *MemberJoinGroupEvent) { + if e == nil { return } for _, f := range c.eventHandlers.memberJoinedHandlers { cover(func() { - f(c, group, mem) + f(c, e) }) } } @@ -159,6 +164,17 @@ func (c *QQClient) dispatchMemberLeaveEvent(e *MemberLeaveGroupEvent) { } } +func (c *QQClient) dispatchPermissionChanged(e *MemberPermissionChangedEvent) { + if e == nil { + return + } + for _, f := range c.eventHandlers.permissionChangedHandlers { + cover(func() { + f(c, e) + }) + } +} + func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) { c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool { go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e) diff --git a/client/global.go b/client/global.go index 39e3cfa4..db95ebaf 100644 --- a/client/global.go +++ b/client/global.go @@ -6,6 +6,7 @@ import ( devinfo "github.com/Mrs4s/MiraiGo/client/pb" "github.com/Mrs4s/MiraiGo/client/pb/msg" "github.com/Mrs4s/MiraiGo/message" + "github.com/Mrs4s/MiraiGo/utils" "google.golang.org/protobuf/proto" "math/rand" ) @@ -131,7 +132,7 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage } func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { - group := c.FindGroup(m.Head.GroupInfo.GroupCode) + group := c.FindGroup(utils.ToGroupUin(m.Head.GroupInfo.GroupCode)) if group == nil { return nil } @@ -162,7 +163,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { } g := &message.GroupMessage{ Id: m.Head.MsgSeq, - GroupUin: m.Head.GroupInfo.GroupCode, + GroupUin: group.Uin, GroupName: string(m.Head.GroupInfo.GroupName), Sender: sender, Elements: parseMessageElems(m.Body.RichText.Elems),