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:
parent
6a946b3bde
commit
0a8fa220ea
@ -54,6 +54,6 @@ qq-android协议的golang实现 移植于Mirai
|
|||||||
- [x] 撤回群消息
|
- [x] 撤回群消息
|
||||||
- [ ] 群公告设置
|
- [ ] 群公告设置
|
||||||
- [ ] 群设置
|
- [ ] 群设置
|
||||||
- [ ] 修改群成员Card
|
- [x] 修改群成员Card
|
||||||
- [ ] 群成员邀请
|
- [ ] 群成员邀请
|
||||||
- [ ] T出群成员
|
- [ ] T出群成员
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user