Files
slgserver/server/slgserver/model/coalition.go
2025-11-18 18:08:48 +08:00

324 lines
7.1 KiB
Go

package model
import (
"encoding/json"
"fmt"
"log/slog"
"slgserver/db"
"slgserver/net"
"slgserver/server/slgserver/proto"
"time"
"xorm.io/xorm"
)
const (
UnionDismiss = 0 //解散
UnionRunning = 1 //运行中
)
/*******db 操作begin********/
var dbCoalitionMgr *coalitionDBMgr
func init() {
dbCoalitionMgr = &coalitionDBMgr{coalitions: make(chan *Coalition, 100)}
go dbCoalitionMgr.running()
}
type coalitionDBMgr struct {
coalitions chan *Coalition
}
func (this *coalitionDBMgr) running() {
for true {
select {
case coalition := <-this.coalitions:
if coalition.Id > 0 {
_, err := db.MasterDB.Table(coalition).ID(coalition.Id).Cols("name",
"members", "chairman", "vice_chairman", "notice", "state").Update(coalition)
if err != nil {
slog.Warn("db error", "error", err)
}
} else {
slog.Warn("update coalition fail, because id <= 0")
}
}
}
}
func (this *coalitionDBMgr) push(coalition *Coalition) {
this.coalitions <- coalition
}
/*******db 操作end********/
type Coalition struct {
Id int `xorm:"id pk autoincr"`
Name string `xorm:"name"`
Members string `xorm:"members"`
MemberArray []int `xorm:"-"`
CreateId int `xorm:"create_id"`
Chairman int `xorm:"chairman"`
ViceChairman int `xorm:"vice_chairman"`
Notice string `xorm:"notice"`
State int8 `xorm:"state"`
Ctime time.Time `xorm:"ctime"`
}
func (this *Coalition) ToProto() interface{} {
p := proto.Union{}
p.Id = this.Id
p.Name = this.Name
p.Notice = this.Notice
p.Cnt = this.Cnt()
return p
}
func (this *Coalition) TableName() string {
return "tb_coalition" + fmt.Sprintf("_%d", ServerId)
}
func (this *Coalition) AfterSet(name string, cell xorm.Cell) {
if name == "members" {
if cell != nil {
ss, ok := (*cell).([]uint8)
if ok {
json.Unmarshal(ss, &this.MemberArray)
}
if this.MemberArray == nil {
this.MemberArray = []int{}
slog.Debug("coalition members loaded", "members", this.MemberArray)
}
}
}
}
func (this *Coalition) BeforeInsert() {
data, _ := json.Marshal(this.MemberArray)
this.Members = string(data)
}
func (this *Coalition) BeforeUpdate() {
data, _ := json.Marshal(this.MemberArray)
this.Members = string(data)
}
func (this *Coalition) Cnt() int {
return len(this.MemberArray)
}
func (this *Coalition) SyncExecute() {
dbCoalitionMgr.push(this)
}
type CoalitionApply struct {
Id int `xorm:"id pk autoincr"`
UnionId int `xorm:"union_id"`
RId int `xorm:"rid"`
State int8 `xorm:"state"`
Ctime time.Time `xorm:"ctime"`
}
func (this *CoalitionApply) TableName() string {
return "tb_coalition_apply" + fmt.Sprintf("_%d", ServerId)
}
/* 推送同步 begin */
func (this *CoalitionApply) IsCellView() bool {
return false
}
func (this *CoalitionApply) IsCanView(rid, x, y int) bool {
return false
}
func (this *CoalitionApply) BelongToRId() []int {
r := GetMainMembers(this.UnionId)
return append(r, this.RId)
}
func (this *CoalitionApply) PushMsgName() string {
return "unionApply.push"
}
func (this *CoalitionApply) Position() (int, int) {
return -1, -1
}
func (this *CoalitionApply) TPosition() (int, int) {
return -1, -1
}
func (this *CoalitionApply) ToProto() interface{} {
p := proto.ApplyItem{}
p.RId = this.RId
p.Id = this.Id
p.NickName = GetRoleNickName(this.RId)
return p
}
func (this *CoalitionApply) Push() {
net.ConnMgr.Push(this)
}
/* 推送同步 end */
func (this *CoalitionApply) SyncExecute() {
this.Push()
}
const (
UnionOpCreate = 0 //创建
UnionOpDismiss = 1 //解散
UnionOpJoin = 2 //加入
UnionOpExit = 3 //退出
UnionOpKick = 4 //踢出
UnionOpAppoint = 5 //任命
UnionOpAbdicate = 6 //禅让
UnionOpModNotice = 7 //修改公告
)
type CoalitionLog struct {
Id int `xorm:"id pk autoincr"`
UnionId int `xorm:"union_id"`
OPRId int `xorm:"op_rid"`
TargetId int `xorm:"target_id"`
State int8 `xorm:"state"`
Des string `xorm:"des"`
Ctime time.Time `xorm:"ctime"`
}
func (this *CoalitionLog) TableName() string {
return "tb_coalition_log" + fmt.Sprintf("_%d", ServerId)
}
func (this *CoalitionLog) ToProto() interface{} {
p := proto.UnionLog{}
p.OPRId = this.OPRId
p.TargetId = this.TargetId
p.Des = this.Des
p.State = this.State
p.Ctime = this.Ctime.UnixNano() / 1e6
return p
}
func NewCreate(opNickName string, unionId int, opRId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: 0,
State: UnionOpCreate,
Des: opNickName + " 创建了联盟",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewDismiss(opNickName string, unionId int, opRId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: 0,
State: UnionOpDismiss,
Des: opNickName + " 解散了联盟",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewJoin(targetNickName string, unionId int, opRId int, targetId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: targetId,
State: UnionOpJoin,
Des: targetNickName + " 加入了联盟",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewExit(opNickName string, unionId int, opRId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: opRId,
State: UnionOpExit,
Des: opNickName + " 退出了联盟",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewKick(opNickName string, targetNickName string, unionId int, opRId int, targetId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: targetId,
State: UnionOpKick,
Des: opNickName + " 将 " + targetNickName + " 踢出了联盟",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewAppoint(opNickName string, targetNickName string,
unionId int, opRId int, targetId int, memberType int) {
title := ""
if memberType == proto.UnionChairman {
title = "盟主"
} else if memberType == proto.UnionViceChairman {
title = "副盟主"
} else {
title = "普通成员"
}
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: targetId,
State: UnionOpAppoint,
Des: opNickName + " 将 " + targetNickName + " 任命为 " + title,
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewAbdicate(opNickName string, targetNickName string,
unionId int, opRId int, targetId int, memberType int) {
title := ""
if memberType == proto.UnionChairman {
title = "盟主"
} else if memberType == proto.UnionViceChairman {
title = "副盟主"
} else {
title = "普通成员"
}
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: targetId,
State: UnionOpAbdicate,
Des: opNickName + " 将 " + title + " 禅让给 " + targetNickName,
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}
func NewModNotice(opNickName string, unionId int, opRId int) {
ulog := &CoalitionLog{
UnionId: unionId,
OPRId: opRId,
TargetId: 0,
State: UnionOpModNotice,
Des: opNickName + " 修改了公告",
Ctime: time.Now(),
}
db.MasterDB.InsertOne(ulog)
}