mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
move structs.
This commit is contained in:
parent
7312c96e82
commit
7dca259315
@ -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, "")
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user