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

supported MemberPermissionChangedEvent.

update README.md
fix group code convert error.
This commit is contained in:
Mrs4s 2020-07-15 02:28:49 +08:00
parent 92b493e5ac
commit a6bef48fe2
5 changed files with 117 additions and 20 deletions

View File

@ -4,16 +4,51 @@ qq-android协议的golang实现 移植于Mirai
# 警告
本项目目前还处于玩具阶段,强烈不推荐使用.
# 计划
# 已完成功能/开发计划
#### 登录
- [x] 账号密码登录
- [x] 验证码提交
- [x] 设备锁验证
- [x] 错误信息解析
| 功能 | 状态 |
| -------- | ------ |
| 登录 | 完成 |
| 自动重连 | 大概能用了 |
| 好友/群列表 | 完成 |
| 好友消息接受 | 完成 |
| 好友消息发送 | 正在做|
| 群消息接受 |完成|
| 群消息发送 | 50% (仅支持 文本/图片/表情)|
| QQ各种事件 | 正在做, 已支持 群内禁言/群内消息撤回/加群/新成员进群 |
| MiraiGo文档 | 咕咕|
#### 消息类型
- [x] 文本
- [x] 图片
- [x] At
- [x] 回复
- [ ] 长消息
- [ ] 分享
- [ ] 富文本
- [ ] 转发
#### 事件
- [x] 好友消息
- [x] 群消息
- [ ] 临时会话消息
- [ ] 讨论组消息
- [x] 登录号加群
- [x] 登录号退群(包含T出)
- [x] 新成员进群/退群
- [x] 群消息撤回
- [x] 群禁言
- [x] 群成员权限变更
- [ ] 被邀请进群
- [ ] 新好友
#### 主动操作
- [x] 发送群消息
- [ ] 发送好友消息
- [ ] 发送临时会话消息
- [ ] 发送讨论组消息
- [x] 获取/刷新群列表
- [x] 获取/刷新群成员列表
- [x] 获取/刷新好友列表
- [ ] 获取/刷新讨论组列表
- [ ] 处理加群请求
- [ ] 处理好友请求
- [ ] 撤回消息
- [ ] 群公告设置
- [ ] 群设置
- [ ] 修改群成员Card
- [ ] 群成员邀请
- [ ] T出群成员

View File

@ -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
}

View File

@ -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

View File

@ -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)

View File

@ -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),