1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00
This commit is contained in:
wdvxdr 2020-09-29 20:25:30 +08:00
commit 2da5d47288
5 changed files with 60 additions and 36 deletions

View File

@ -779,6 +779,9 @@ func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]*GroupMemberInfo, error)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if data == nil {
return nil, errors.New("rsp is nil")
}
rsp := data.(groupMemberListResponse) rsp := data.(groupMemberListResponse)
nextUin = rsp.NextUin nextUin = rsp.NextUin
for _, m := range rsp.list { for _, m := range rsp.list {
@ -845,24 +848,6 @@ func (c *QQClient) SolveFriendRequest(req *NewFriendRequest, accept bool) {
_ = c.send(pkt) _ = c.send(pkt)
} }
func (g *GroupInfo) SelfPermission() MemberPermission {
return g.FindMember(g.client.Uin).Permission
}
func (g *GroupInfo) AdministratorOrOwner() bool {
return g.SelfPermission() == Administrator || g.SelfPermission() == Owner
}
func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
for _, m := range g.Members {
f := m
if f.Uin == uin {
return f
}
}
return nil
}
func (c *QQClient) getCookies() string { func (c *QQClient) getCookies() string {
return fmt.Sprintf("uin=o%d; skey=%s;", c.Uin, c.sigInfo.sKey) return fmt.Sprintf("uin=o%d; skey=%s;", c.Uin, c.sigInfo.sKey)
} }
@ -930,14 +915,14 @@ func (c *QQClient) kickGroupMember(groupCode, memberUin int64, msg string) {
} }
func (g *GroupInfo) removeMember(uin int64) { func (g *GroupInfo) removeMember(uin int64) {
g.memLock.Lock() g.Update(func(info *GroupInfo) {
defer g.memLock.Unlock() for i, m := range info.Members {
for i, m := range g.Members { if m.Uin == uin {
if m.Uin == uin { info.Members = append(info.Members[:i], info.Members[i+1:]...)
g.Members = append(g.Members[:i], g.Members[i+1:]...) break
break }
} }
} })
} }
func (c *QQClient) connect() error { func (c *QQClient) connect() error {
@ -1082,7 +1067,7 @@ func (c *QQClient) netLoop() {
go func() { go func() {
defer func() { defer func() {
if pan := recover(); pan != nil { if pan := recover(); pan != nil {
c.Error("panic on decoder: %v", pan) c.Error("panic on decoder %v : %v", pkt.CommandName, pan)
//fmt.Println("panic on decoder:", pan) //fmt.Println("panic on decoder:", pan)
} }
}() }()

View File

@ -29,8 +29,8 @@ import (
) )
var ( var (
groupJoinLock = new(sync.Mutex) groupJoinLock sync.Mutex
groupLeaveLock = new(sync.Mutex) groupLeaveLock sync.Mutex
) )
// wtlogin.login // wtlogin.login
@ -228,7 +228,9 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
Permission: Member, Permission: Member,
Group: group, Group: group,
} }
group.Members = append(group.Members, mem) group.Update(func(info *GroupInfo) {
info.Members = append(info.Members, mem)
})
c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ c.dispatchNewMemberEvent(&MemberJoinGroupEvent{
Group: group, Group: group,
Member: mem, Member: mem,
@ -459,6 +461,7 @@ func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{}
OwnerUin: int64(*info.GroupInfo.GroupOwner), OwnerUin: int64(*info.GroupInfo.GroupOwner),
MemberCount: uint16(*info.GroupInfo.GroupMemberNum), MemberCount: uint16(*info.GroupInfo.GroupMemberNum),
MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum), MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum),
Members: []*GroupMemberInfo{},
client: c, client: c,
}, nil }, nil
} }

View File

@ -70,8 +70,8 @@ type (
MaxMemberCount uint16 MaxMemberCount uint16
Members []*GroupMemberInfo Members []*GroupMemberInfo
client *QQClient client *QQClient
memLock sync.Mutex lock sync.RWMutex
} }
GroupMemberInfo struct { GroupMemberInfo struct {
@ -285,6 +285,42 @@ func (g *GroupInfo) Quit() {
} }
} }
func (g *GroupInfo) SelfPermission() MemberPermission {
return g.FindMember(g.client.Uin).Permission
}
func (g *GroupInfo) AdministratorOrOwner() bool {
return g.SelfPermission() == Administrator || g.SelfPermission() == Owner
}
func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
r := g.Read(func(info *GroupInfo) interface{} {
for _, m := range info.Members {
f := m
if f.Uin == uin {
return f
}
}
return nil
})
if r == nil {
return nil
}
return r.(*GroupMemberInfo)
}
func (g *GroupInfo) Update(f func(*GroupInfo)) {
g.lock.Lock()
defer g.lock.Unlock()
f(g)
}
func (g *GroupInfo) Read(f func(*GroupInfo) interface{}) interface{} {
g.lock.RLock()
defer g.lock.RUnlock()
return f(g)
}
func (m *GroupMemberInfo) DisplayName() string { func (m *GroupMemberInfo) DisplayName() string {
if m.CardName == "" { if m.CardName == "" {
return m.Nickname return m.Nickname

View File

@ -304,8 +304,8 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
if info == nil { if info == nil {
return nil return nil
} }
group.Members = append(group.Members, mem)
mem = info mem = info
group.Members = append(group.Members, mem)
go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{
Group: group, Group: group,
Member: info, Member: info,

View File

@ -294,15 +294,15 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) {
CustomFace: &msg.CustomFace{ CustomFace: &msg.CustomFace{
FilePath: e.Filename, FilePath: e.Filename,
Md5: e.Md5, Md5: e.Md5,
Size: e.Size, //Size: e.Size,
Flag: make([]byte, 4), Flag: make([]byte, 4),
OldData: imgOld, OldData: imgOld,
}, },
}) })
case *GroupImageElement: case *GroupImageElement:
r = append(r, &msg.Elem{ r = append(r, &msg.Elem{
CustomFace: &msg.CustomFace{ CustomFace: &msg.CustomFace{
FileType: 66, //FileType: 66,
Useful: 1, Useful: 1,
Origin: 1, Origin: 1,
FileId: int32(e.FileId), FileId: int32(e.FileId),