1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

move structs.

This commit is contained in:
Mrs4s 2020-12-24 20:01:47 +08:00
parent 7312c96e82
commit 7dca259315
2 changed files with 172 additions and 171 deletions

View File

@ -1,9 +1,6 @@
package client package client
import ( import (
"strings"
"sync"
"github.com/Mrs4s/MiraiGo/binary/jce" "github.com/Mrs4s/MiraiGo/binary/jce"
"github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/message"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -65,35 +62,6 @@ type (
List []*FriendInfo 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 { GroupMuteEvent struct {
GroupCode int64 GroupCode int64
OperatorUin int64 OperatorUin int64
@ -263,145 +231,6 @@ const (
MacOS ClientProtocol = 4 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() { func (r *UserJoinGroupRequest) Accept() {
r.client.SolveGroupJoinRequest(r, true, false, "") r.client.SolveGroupJoinRequest(r, true, false, "")
} }

View File

@ -7,6 +7,39 @@ import (
"github.com/Mrs4s/MiraiGo/protocol/packets" "github.com/Mrs4s/MiraiGo/protocol/packets"
"github.com/pkg/errors" "github.com/pkg/errors"
"google.golang.org/protobuf/proto" "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() { func init() {
@ -151,3 +184,142 @@ func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{}
client: c, client: c,
}, nil }, 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
}