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

supported group card edit.

This commit is contained in:
Mrs4s 2020-07-21 01:56:44 +08:00
parent 6a946b3bde
commit 0a8fa220ea
6 changed files with 89 additions and 23 deletions

View File

@ -54,6 +54,6 @@ qq-android协议的golang实现 移植于Mirai
- [x] 撤回群消息 - [x] 撤回群消息
- [ ] 群公告设置 - [ ] 群公告设置
- [ ] 群设置 - [ ] 群设置
- [ ] 修改群成员Card - [x] 修改群成员Card
- [ ] 群成员邀请 - [ ] 群成员邀请
- [ ] T出群成员 - [ ] T出群成员

View File

@ -28,6 +28,7 @@ type (
} }
SvcReqRegister struct { SvcReqRegister struct {
IJceStruct
Uin int64 `jceId:"0"` Uin int64 `jceId:"0"`
Bid int64 `jceId:"1"` Bid int64 `jceId:"1"`
ConnType byte `jceId:"2"` ConnType byte `jceId:"2"`
@ -86,6 +87,7 @@ type (
} }
SvcRespPushMsg struct { SvcRespPushMsg struct {
IJceStruct
Uin int64 `jceId:"0"` Uin int64 `jceId:"0"`
DelInfos []IJceStruct `jceId:"1"` DelInfos []IJceStruct `jceId:"1"`
Svrip int32 `jceId:"2"` Svrip int32 `jceId:"2"`
@ -94,6 +96,7 @@ type (
} }
DelMsgInfo struct { DelMsgInfo struct {
IJceStruct
FromUin int64 `jceId:"0"` FromUin int64 `jceId:"0"`
MsgTime int64 `jceId:"1"` MsgTime int64 `jceId:"1"`
MsgSeq int16 `jceId:"2"` MsgSeq int16 `jceId:"2"`
@ -108,6 +111,7 @@ type (
} }
FriendListRequest struct { FriendListRequest struct {
IJceStruct
Reqtype int32 `jceId:"0"` Reqtype int32 `jceId:"0"`
IfReflush byte `jceId:"1"` IfReflush byte `jceId:"1"`
Uin int64 `jceId:"2"` Uin int64 `jceId:"2"`
@ -189,6 +193,7 @@ type (
} }
TroopListRequest struct { TroopListRequest struct {
IJceStruct
Uin int64 `jceId:"0"` Uin int64 `jceId:"0"`
GetMSFMsgFlag byte `jceId:"1"` GetMSFMsgFlag byte `jceId:"1"`
Cookies []byte `jceId:"2"` Cookies []byte `jceId:"2"`
@ -239,6 +244,7 @@ type (
} }
TroopMemberListRequest struct { TroopMemberListRequest struct {
IJceStruct
Uin int64 `jceId:"0"` Uin int64 `jceId:"0"`
GroupCode int64 `jceId:"1"` GroupCode int64 `jceId:"1"`
NextUin int64 `jceId:"2"` NextUin int64 `jceId:"2"`
@ -286,6 +292,25 @@ type (
Nameplate int64 `jceId:"38"` Nameplate int64 `jceId:"38"`
GroupHonor []byte `jceId:"39"` GroupHonor []byte `jceId:"39"`
} }
ModifyGroupCardRequest struct {
IJceStruct
Zero int64 `jceId:"0"`
GroupCode int64 `jceId:"1"`
NewSeq int64 `jceId:"2"`
UinInfo []IJceStruct `jceId:"3"`
}
UinInfo struct {
IJceStruct
Uin int64 `jceId:"0"`
Flag int64 `jceId:"1"`
Name string `jceId:"2"`
Gender byte `jceId:"3"`
Phone string `jceId:"4"`
Email string `jceId:"5"`
Remark string `jceId:"6"`
}
) )
func (pkt *RequestPacket) ToBytes() []byte { func (pkt *RequestPacket) ToBytes() []byte {
@ -339,20 +364,12 @@ func (pkt *SvcReqRegister) ToBytes() []byte {
return w.Bytes() return w.Bytes()
} }
func (pkt *SvcReqRegister) ReadFrom(r *JceReader) {
}
func (pkt *FriendListRequest) ToBytes() []byte { func (pkt *FriendListRequest) ToBytes() []byte {
w := NewJceWriter() w := NewJceWriter()
w.WriteJceStructRaw(pkt) w.WriteJceStructRaw(pkt)
return w.Bytes() return w.Bytes()
} }
func (pkt *FriendListRequest) ReadFrom(r *JceReader) {
}
func (pkt *FriendInfo) ReadFrom(r *JceReader) { func (pkt *FriendInfo) ReadFrom(r *JceReader) {
pkt.FriendUin = r.ReadInt64(0) pkt.FriendUin = r.ReadInt64(0)
pkt.GroupId = r.ReadByte(1) pkt.GroupId = r.ReadByte(1)
@ -373,10 +390,6 @@ func (pkt *TroopListRequest) ToBytes() []byte {
return w.Bytes() return w.Bytes()
} }
func (pkt *TroopListRequest) ReadFrom(r *JceReader) {
}
func (pkt *TroopNumber) ReadFrom(r *JceReader) { func (pkt *TroopNumber) ReadFrom(r *JceReader) {
pkt.GroupUin = r.ReadInt64(0) pkt.GroupUin = r.ReadInt64(0)
pkt.GroupCode = r.ReadInt64(1) pkt.GroupCode = r.ReadInt64(1)
@ -393,10 +406,6 @@ func (pkt *TroopMemberListRequest) ToBytes() []byte {
return w.Bytes() return w.Bytes()
} }
func (pkt *TroopMemberListRequest) ReadFrom(r *JceReader) {
}
func (pkt *TroopMemberInfo) ReadFrom(r *JceReader) { func (pkt *TroopMemberInfo) ReadFrom(r *JceReader) {
pkt.MemberUin = r.ReadInt64(0) pkt.MemberUin = r.ReadInt64(0)
pkt.FaceId = r.ReadInt16(1) pkt.FaceId = r.ReadInt16(1)
@ -431,8 +440,8 @@ func (pkt *SvcRespPushMsg) ToBytes() []byte {
return w.Bytes() return w.Bytes()
} }
func (pkt *SvcRespPushMsg) ReadFrom(r *JceReader) { func (pkt *ModifyGroupCardRequest) ToBytes() []byte {
} w := NewJceWriter()
w.WriteJceStructRaw(pkt)
func (pkt *DelMsgInfo) ReadFrom(r *JceReader) { return w.Bytes()
} }

View File

@ -678,6 +678,33 @@ func (c *QQClient) buildGroupRecallPacket(groupCode int64, msgSeq, msgRan int32)
return seq, packet return seq, packet
} }
// friendlist.ModifyGroupCardReq
func (c *QQClient) buildEditGroupTagPacket(groupCode, memberUin int64, newTag string) (uint16, []byte) {
seq := c.nextSeq()
req := &jce.ModifyGroupCardRequest{
GroupCode: groupCode,
UinInfo: []jce.IJceStruct{
&jce.UinInfo{
Uin: memberUin,
Flag: 31,
Name: newTag,
},
},
}
buf := &jce.RequestDataVersion3{Map: map[string][]byte{"MGCREQ": packRequestDataV3(req.ToBytes())}}
pkt := &jce.RequestPacket{
IVersion: 3,
IRequestId: c.nextPacketSeq(),
SServantName: "mqq.IMService.FriendListServiceServantObj",
SFuncName: "ModifyGroupCardReq",
SBuffer: buf.ToBytes(),
Context: map[string]string{},
Status: map[string]string{},
}
packet := packets.BuildUniPacket(c.Uin, seq, "friendlist.ModifyGroupCardReq", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes())
return seq, packet
}
/* /*
func (c *QQClient) buildMultiMsgDownRequestPacket() (uint16, []byte){ func (c *QQClient) buildMultiMsgDownRequestPacket() (uint16, []byte){
seq := c.nextSeq() seq := c.nextSeq()

View File

@ -373,9 +373,9 @@ func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]*GroupMemberInfo, error)
rsp := data.(groupMemberListResponse) rsp := data.(groupMemberListResponse)
nextUin = rsp.NextUin nextUin = rsp.NextUin
for _, m := range rsp.list { for _, m := range rsp.list {
m.Group = group
if m.Uin == group.OwnerUin { if m.Uin == group.OwnerUin {
m.Permission = Owner m.Permission = Owner
break
} }
} }
list = append(list, rsp.list...) list = append(list, rsp.list...)
@ -431,6 +431,10 @@ func (c *QQClient) SolveFriendRequest(req *NewFriendRequest, accept bool) {
_ = c.send(pkt) _ = c.send(pkt)
} }
func (g *GroupInfo) SelfPermission() MemberPermission {
return g.FindMember(g.bot.Uin).Permission
}
func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo { func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
for _, m := range g.Members { for _, m := range g.Members {
f := m f := m
@ -441,6 +445,10 @@ func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
return nil return nil
} }
func (c *QQClient) EditMemberCard(groupCode, memberUin int64, card string) {
_, _ = c.sendAndWait(c.buildEditGroupTagPacket(groupCode, memberUin, card))
}
func (g *GroupInfo) removeMember(uin int64) { func (g *GroupInfo) removeMember(uin int64) {
if g.memLock == nil { if g.memLock == nil {
g.memLock = new(sync.Mutex) g.memLock = new(sync.Mutex)
@ -518,6 +526,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
return nil, err return nil, err
} }
ch := make(chan T) ch := make(chan T)
defer close(ch)
c.handlers[seq] = func(i interface{}, err error) { c.handlers[seq] = func(i interface{}, err error) {
ch <- T{ ch <- T{
Response: i, Response: i,

View File

@ -311,7 +311,7 @@ func decodeFriendGroupListResponse(_ *QQClient, _ uint16, payload []byte) (inter
return rsp, nil return rsp, nil
} }
func decodeGroupListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { func decodeGroupListResponse(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.RequestDataVersion3{} data := &jce.RequestDataVersion3{}
@ -329,6 +329,7 @@ func decodeGroupListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}
OwnerUin: g.GroupOwnerUin, OwnerUin: g.GroupOwnerUin,
MemberCount: uint16(g.MemberNum), MemberCount: uint16(g.MemberNum),
MaxMemberCount: uint16(g.MaxGroupMemberNum), MaxMemberCount: uint16(g.MaxGroupMemberNum),
bot: c,
}) })
} }
return l, nil return l, nil

View File

@ -51,10 +51,12 @@ type (
MaxMemberCount uint16 MaxMemberCount uint16
Members []*GroupMemberInfo Members []*GroupMemberInfo
bot *QQClient
memLock *sync.Mutex memLock *sync.Mutex
} }
GroupMemberInfo struct { GroupMemberInfo struct {
Group *GroupInfo
Uin int64 Uin int64
Nickname string Nickname string
CardName string CardName string
@ -179,6 +181,24 @@ func (m *GroupMemberInfo) DisplayName() string {
return m.CardName return m.CardName
} }
func (m *GroupMemberInfo) EditCard(card string) {
if m.Manageable() {
m.Group.bot.EditMemberCard(m.Group.Code, m.Uin, card)
m.CardName = card
}
}
func (m *GroupMemberInfo) Manageable() bool {
if m.Uin == m.Group.bot.Uin {
return true
}
self := m.Group.SelfPermission()
if self == Member || m.Permission == Owner {
return false
}
return m.Permission != Administrator
}
func (r *UserJoinGroupRequest) Accept() { func (r *UserJoinGroupRequest) Accept() {
r.client.SolveGroupJoinRequest(r, true) r.client.SolveGroupJoinRequest(r, true)
} }