mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
supported MemberPermissionChangedEvent.
update README.md fix group code convert error.
This commit is contained in:
parent
92b493e5ac
commit
a6bef48fe2
59
README.md
59
README.md
@ -4,16 +4,51 @@ qq-android协议的golang实现 移植于Mirai
|
|||||||
# 警告
|
# 警告
|
||||||
本项目目前还处于玩具阶段,强烈不推荐使用.
|
本项目目前还处于玩具阶段,强烈不推荐使用.
|
||||||
|
|
||||||
# 计划
|
# 已完成功能/开发计划
|
||||||
|
#### 登录
|
||||||
|
- [x] 账号密码登录
|
||||||
|
- [x] 验证码提交
|
||||||
|
- [x] 设备锁验证
|
||||||
|
- [x] 错误信息解析
|
||||||
|
|
||||||
| 功能 | 状态 |
|
#### 消息类型
|
||||||
| -------- | ------ |
|
- [x] 文本
|
||||||
| 登录 | 完成 |
|
- [x] 图片
|
||||||
| 自动重连 | 大概能用了 |
|
- [x] At
|
||||||
| 好友/群列表 | 完成 |
|
- [x] 回复
|
||||||
| 好友消息接受 | 完成 |
|
- [ ] 长消息
|
||||||
| 好友消息发送 | 正在做|
|
- [ ] 分享
|
||||||
| 群消息接受 |完成|
|
- [ ] 富文本
|
||||||
| 群消息发送 | 50% (仅支持 文本/图片/表情)|
|
- [ ] 转发
|
||||||
| QQ各种事件 | 正在做, 已支持 群内禁言/群内消息撤回/加群/新成员进群 |
|
|
||||||
| MiraiGo文档 | 咕咕|
|
#### 事件
|
||||||
|
- [x] 好友消息
|
||||||
|
- [x] 群消息
|
||||||
|
- [ ] 临时会话消息
|
||||||
|
- [ ] 讨论组消息
|
||||||
|
- [x] 登录号加群
|
||||||
|
- [x] 登录号退群(包含T出)
|
||||||
|
- [x] 新成员进群/退群
|
||||||
|
- [x] 群消息撤回
|
||||||
|
- [x] 群禁言
|
||||||
|
- [x] 群成员权限变更
|
||||||
|
- [ ] 被邀请进群
|
||||||
|
- [ ] 新好友
|
||||||
|
|
||||||
|
#### 主动操作
|
||||||
|
- [x] 发送群消息
|
||||||
|
- [ ] 发送好友消息
|
||||||
|
- [ ] 发送临时会话消息
|
||||||
|
- [ ] 发送讨论组消息
|
||||||
|
- [x] 获取/刷新群列表
|
||||||
|
- [x] 获取/刷新群成员列表
|
||||||
|
- [x] 获取/刷新好友列表
|
||||||
|
- [ ] 获取/刷新讨论组列表
|
||||||
|
- [ ] 处理加群请求
|
||||||
|
- [ ] 处理好友请求
|
||||||
|
- [ ] 撤回消息
|
||||||
|
- [ ] 群公告设置
|
||||||
|
- [ ] 群设置
|
||||||
|
- [ ] 修改群成员Card
|
||||||
|
- [ ] 群成员邀请
|
||||||
|
- [ ] T出群成员
|
||||||
|
@ -174,7 +174,10 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
|
|||||||
Permission: Member,
|
Permission: Member,
|
||||||
}
|
}
|
||||||
group.Members = append(group.Members, mem)
|
group.Members = append(group.Members, mem)
|
||||||
c.dispatchNewMemberEvent(group, mem)
|
c.dispatchNewMemberEvent(&MemberJoinGroupEvent{
|
||||||
|
Group: group,
|
||||||
|
Member: mem,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
groupJoinLock.Unlock()
|
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
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -86,12 +86,24 @@ type (
|
|||||||
Operator *GroupMemberInfo
|
Operator *GroupMemberInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MemberJoinGroupEvent struct {
|
||||||
|
Group *GroupInfo
|
||||||
|
Member *GroupMemberInfo
|
||||||
|
}
|
||||||
|
|
||||||
MemberLeaveGroupEvent struct {
|
MemberLeaveGroupEvent struct {
|
||||||
Group *GroupInfo
|
Group *GroupInfo
|
||||||
Member *GroupMemberInfo
|
Member *GroupMemberInfo
|
||||||
Operator *GroupMemberInfo
|
Operator *GroupMemberInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MemberPermissionChangedEvent struct {
|
||||||
|
Group *GroupInfo
|
||||||
|
Member *GroupMemberInfo
|
||||||
|
OldPermission MemberPermission
|
||||||
|
NewPermission MemberPermission
|
||||||
|
}
|
||||||
|
|
||||||
groupMemberListResponse struct {
|
groupMemberListResponse struct {
|
||||||
NextUin int64
|
NextUin int64
|
||||||
list []*GroupMemberInfo
|
list []*GroupMemberInfo
|
||||||
|
@ -12,8 +12,9 @@ type eventHandlers struct {
|
|||||||
groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent)
|
groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent)
|
||||||
joinGroupHandlers []func(*QQClient, *GroupInfo)
|
joinGroupHandlers []func(*QQClient, *GroupInfo)
|
||||||
leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent)
|
leaveGroupHandlers []func(*QQClient, *GroupLeaveEvent)
|
||||||
memberJoinedHandlers []func(*QQClient, *GroupInfo, *GroupMemberInfo)
|
memberJoinedHandlers []func(*QQClient, *MemberJoinGroupEvent)
|
||||||
memberLeavedHandlers []func(*QQClient, *MemberLeaveGroupEvent)
|
memberLeavedHandlers []func(*QQClient, *MemberLeaveGroupEvent)
|
||||||
|
permissionChangedHandlers []func(*QQClient, *MemberPermissionChangedEvent)
|
||||||
groupMessageReceiptHandlers sync.Map
|
groupMessageReceiptHandlers sync.Map
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,7 +46,7 @@ func (c *QQClient) OnLeaveGroup(f func(*QQClient, *GroupLeaveEvent)) {
|
|||||||
c.eventHandlers.leaveGroupHandlers = append(c.eventHandlers.leaveGroupHandlers, f)
|
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)
|
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)
|
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)) {
|
func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) {
|
||||||
c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f)
|
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) {
|
func (c *QQClient) dispatchNewMemberEvent(e *MemberJoinGroupEvent) {
|
||||||
if group == nil || mem == nil {
|
if e == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, f := range c.eventHandlers.memberJoinedHandlers {
|
for _, f := range c.eventHandlers.memberJoinedHandlers {
|
||||||
cover(func() {
|
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) {
|
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)
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
devinfo "github.com/Mrs4s/MiraiGo/client/pb"
|
devinfo "github.com/Mrs4s/MiraiGo/client/pb"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
||||||
"github.com/Mrs4s/MiraiGo/message"
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
)
|
)
|
||||||
@ -131,7 +132,7 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
|
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 {
|
if group == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -162,7 +163,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
|
|||||||
}
|
}
|
||||||
g := &message.GroupMessage{
|
g := &message.GroupMessage{
|
||||||
Id: m.Head.MsgSeq,
|
Id: m.Head.MsgSeq,
|
||||||
GroupUin: m.Head.GroupInfo.GroupCode,
|
GroupUin: group.Uin,
|
||||||
GroupName: string(m.Head.GroupInfo.GroupName),
|
GroupName: string(m.Head.GroupInfo.GroupName),
|
||||||
Sender: sender,
|
Sender: sender,
|
||||||
Elements: parseMessageElems(m.Body.RichText.Elems),
|
Elements: parseMessageElems(m.Body.RichText.Elems),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user