diff --git a/client/entities.go b/client/entities.go index 402b81dd..66c82bd3 100644 --- a/client/entities.go +++ b/client/entities.go @@ -1,9 +1,6 @@ package client import ( - "strings" - "sync" - "github.com/Mrs4s/MiraiGo/binary/jce" "github.com/Mrs4s/MiraiGo/message" "github.com/pkg/errors" @@ -65,35 +62,6 @@ type ( List []*FriendInfo } - GroupInfo struct { - Uin int64 - Code int64 - Name string - Memo string - OwnerUin int64 - MemberCount uint16 - MaxMemberCount uint16 - Members []*GroupMemberInfo - - client *QQClient - lastMsgSeq int64 - lock sync.RWMutex - } - - GroupMemberInfo struct { - Group *GroupInfo - Uin int64 - Gender byte - Nickname string - CardName string - Level uint16 - JoinTime int64 - LastSpeakTime int64 - SpecialTitle string - SpecialTitleExpireTime int64 - Permission MemberPermission - } - GroupMuteEvent struct { GroupCode int64 OperatorUin int64 @@ -263,145 +231,6 @@ const ( MacOS ClientProtocol = 4 ) -func (g *GroupInfo) UpdateName(newName string) { - if g.AdministratorOrOwner() && newName != "" && strings.Count(newName, "") <= 20 { - g.client.updateGroupName(g.Code, newName) - g.Name = newName - } -} - -func (g *GroupInfo) UpdateMemo(newMemo string) { - if g.AdministratorOrOwner() { - g.client.updateGroupMemo(g.Code, newMemo) - g.Memo = newMemo - } -} - -func (g *GroupInfo) UpdateGroupHeadPortrait(img []byte) { - if g.AdministratorOrOwner() { - _ = g.client.uploadGroupHeadPortrait(g.Uin, img) - } -} - -func (g *GroupInfo) MuteAll(mute bool) { - if g.AdministratorOrOwner() { - g.client.groupMuteAll(g.Code, mute) - } -} - -func (g *GroupInfo) Quit() { - if g.SelfPermission() != Owner { - g.client.quitGroup(g.Code) - } -} - -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{} { - return info.FindMemberWithoutLock(uin) - }) - if r == nil { - return nil - } - return r.(*GroupMemberInfo) -} - -func (g *GroupInfo) FindMemberWithoutLock(uin int64) *GroupMemberInfo { - for _, m := range g.Members { - f := m - if f.Uin == uin { - return f - } - } - return nil -} - -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 { - if m.CardName == "" { - return m.Nickname - } - return m.CardName -} - -func (m *GroupMemberInfo) EditCard(card string) { - if m.CardChangable() && len(card) <= 60 { - m.Group.client.editMemberCard(m.Group.Code, m.Uin, card) - m.CardName = card - } -} - -func (m *GroupMemberInfo) Poke() { - m.Group.client.sendGroupPoke(m.Group.Code, m.Uin) -} - -func (m *GroupMemberInfo) SetAdmin(flag bool) { - if m.Group.OwnerUin == m.Group.client.Uin { - m.Group.client.setGroupAdmin(m.Group.Code, m.Uin, flag) - } -} - -func (m *GroupMemberInfo) EditSpecialTitle(title string) { - if m.Group.SelfPermission() == Owner && len(title) <= 18 { - m.Group.client.editMemberSpecialTitle(m.Group.Code, m.Uin, title) - m.SpecialTitle = title - } -} - -func (m *GroupMemberInfo) Kick(msg string, block bool) { - if m.Uin != m.Group.client.Uin && m.Manageable() { - m.Group.client.kickGroupMember(m.Group.Code, m.Uin, msg, block) - } -} - -func (m *GroupMemberInfo) Mute(time uint32) { - if m.Uin != m.Group.client.Uin && m.Manageable() { - if time < 2592000 { - m.Group.client.groupMute(m.Group.Code, m.Uin, time) - } - } -} - -func (m *GroupMemberInfo) Manageable() bool { - if m.Uin == m.Group.client.Uin { - return true - } - self := m.Group.SelfPermission() - if self == Member || m.Permission == Owner { - return false - } - return m.Permission != Administrator || self == Owner -} - -func (m *GroupMemberInfo) CardChangable() bool { - if m.Uin == m.Group.client.Uin { - return true - } - self := m.Group.SelfPermission() - if self == Member { - return false - } - return m.Permission != Owner -} - func (r *UserJoinGroupRequest) Accept() { r.client.SolveGroupJoinRequest(r, true, false, "") } diff --git a/client/group_info.go b/client/group_info.go index 7a6b929d..f82c5220 100644 --- a/client/group_info.go +++ b/client/group_info.go @@ -7,6 +7,39 @@ import ( "github.com/Mrs4s/MiraiGo/protocol/packets" "github.com/pkg/errors" "google.golang.org/protobuf/proto" + "strings" + "sync" +) + +type ( + GroupInfo struct { + Uin int64 + Code int64 + Name string + Memo string + OwnerUin int64 + MemberCount uint16 + MaxMemberCount uint16 + Members []*GroupMemberInfo + + client *QQClient + lastMsgSeq int64 + lock sync.RWMutex + } + + GroupMemberInfo struct { + Group *GroupInfo + Uin int64 + Gender byte + Nickname string + CardName string + Level uint16 + JoinTime int64 + LastSpeakTime int64 + SpecialTitle string + SpecialTitleExpireTime int64 + Permission MemberPermission + } ) func init() { @@ -151,3 +184,142 @@ func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{} client: c, }, nil } + +func (g *GroupInfo) UpdateName(newName string) { + if g.AdministratorOrOwner() && newName != "" && strings.Count(newName, "") <= 20 { + g.client.updateGroupName(g.Code, newName) + g.Name = newName + } +} + +func (g *GroupInfo) UpdateMemo(newMemo string) { + if g.AdministratorOrOwner() { + g.client.updateGroupMemo(g.Code, newMemo) + g.Memo = newMemo + } +} + +func (g *GroupInfo) UpdateGroupHeadPortrait(img []byte) { + if g.AdministratorOrOwner() { + _ = g.client.uploadGroupHeadPortrait(g.Uin, img) + } +} + +func (g *GroupInfo) MuteAll(mute bool) { + if g.AdministratorOrOwner() { + g.client.groupMuteAll(g.Code, mute) + } +} + +func (g *GroupInfo) Quit() { + if g.SelfPermission() != Owner { + g.client.quitGroup(g.Code) + } +} + +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{} { + return info.FindMemberWithoutLock(uin) + }) + if r == nil { + return nil + } + return r.(*GroupMemberInfo) +} + +func (g *GroupInfo) FindMemberWithoutLock(uin int64) *GroupMemberInfo { + for _, m := range g.Members { + f := m + if f.Uin == uin { + return f + } + } + return nil +} + +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 { + if m.CardName == "" { + return m.Nickname + } + return m.CardName +} + +func (m *GroupMemberInfo) EditCard(card string) { + if m.CardChangable() && len(card) <= 60 { + m.Group.client.editMemberCard(m.Group.Code, m.Uin, card) + m.CardName = card + } +} + +func (m *GroupMemberInfo) Poke() { + m.Group.client.sendGroupPoke(m.Group.Code, m.Uin) +} + +func (m *GroupMemberInfo) SetAdmin(flag bool) { + if m.Group.OwnerUin == m.Group.client.Uin { + m.Group.client.setGroupAdmin(m.Group.Code, m.Uin, flag) + } +} + +func (m *GroupMemberInfo) EditSpecialTitle(title string) { + if m.Group.SelfPermission() == Owner && len(title) <= 18 { + m.Group.client.editMemberSpecialTitle(m.Group.Code, m.Uin, title) + m.SpecialTitle = title + } +} + +func (m *GroupMemberInfo) Kick(msg string, block bool) { + if m.Uin != m.Group.client.Uin && m.Manageable() { + m.Group.client.kickGroupMember(m.Group.Code, m.Uin, msg, block) + } +} + +func (m *GroupMemberInfo) Mute(time uint32) { + if m.Uin != m.Group.client.Uin && m.Manageable() { + if time < 2592000 { + m.Group.client.groupMute(m.Group.Code, m.Uin, time) + } + } +} + +func (m *GroupMemberInfo) Manageable() bool { + if m.Uin == m.Group.client.Uin { + return true + } + self := m.Group.SelfPermission() + if self == Member || m.Permission == Owner { + return false + } + return m.Permission != Administrator || self == Owner +} + +func (m *GroupMemberInfo) CardChangable() bool { + if m.Uin == m.Group.client.Uin { + return true + } + self := m.Group.SelfPermission() + if self == Member { + return false + } + return m.Permission != Owner +}