go_dreamfactory/modules/sociaty/module.go
2023-07-04 17:57:17 +08:00

378 lines
11 KiB
Go

// package
// 公会
// 赵长远
package sociaty
import (
"context"
"errors"
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/base"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/event"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"go_dreamfactory/sys/configure"
cfg "go_dreamfactory/sys/configure/structs"
"go_dreamfactory/sys/db"
"go.mongodb.org/mongo-driver/bson"
)
var _ comm.ISociaty = (*Sociaty)(nil)
type Sociaty struct {
modules.ModuleBase
api *apiComp
service base.IRPCXService
modelSociaty *ModelSociaty
modelSociatyTask *ModelSociatyTask
modelSociatyLog *ModelSociatyLog
modelSociatyBoss *ModelSociatyBoss
configure *configureComp
globalConf *cfg.GameGlobalData
sociatyActivityConf *cfg.GameGuildActivity
sociatyTaskConf *cfg.GameGuildTask
sociatySignConf *cfg.GameGuildSign
rtaskCondConf *cfg.GameRdtaskCondi
}
func NewModule() core.IModule {
return &Sociaty{}
}
func (this *Sociaty) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
err = this.ModuleBase.Init(service, module, options)
this.service = service.(base.IRPCXService)
return
}
func (this *Sociaty) GetType() core.M_Modules {
return comm.ModuleSociaty
}
func (this *Sociaty) OnInstallComp() {
this.ModuleBase.OnInstallComp()
this.api = this.RegisterComp(new(apiComp)).(*apiComp)
this.modelSociaty = this.RegisterComp(new(ModelSociaty)).(*ModelSociaty)
this.modelSociatyTask = this.RegisterComp(new(ModelSociatyTask)).(*ModelSociatyTask)
this.modelSociatyLog = this.RegisterComp(new(ModelSociatyLog)).(*ModelSociatyLog)
this.modelSociatyBoss = this.RegisterComp(new(ModelSociatyBoss)).(*ModelSociatyBoss)
this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
event.Register(comm.EventBuriedComplete, this.TCondFinishNotify)
}
func (this *Sociaty) Start() (err error) {
err = this.ModuleBase.Start()
this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociaty), this.RpcGetSociaty)
this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyUpdate), this.RpcUpdateSociaty)
this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyTask), this.RpcUpdateUserTask)
this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyGetTask), this.RpcGetUserTask)
this.globalConf = this.ModuleTools.GetGlobalConf()
if this.globalConf == nil {
err = errors.New("global config not found")
return
}
if this.sociatyActivityConf, err = this.configure.getSociatyActivityCfg(); err != nil {
return err
}
if this.sociatyTaskConf, err = this.configure.getSociatyTaskCfg(); err != nil {
return err
}
if this.rtaskCondConf, err = this.configure.getRtaskCondiCfg(); err != nil {
return err
}
if this.sociatySignConf, err = this.configure.getSociatySignCfg(); err != nil {
return err
}
if err = this.checkSociatyConf(); err != nil {
return err
}
this.Debug("check guild conf completed")
// 初始化公会BOSS赛季开始时间
this.modelSociatyBoss.initSports()
return
}
var errs []string
func (this *Sociaty) checkSociatyConf() (err error) {
buriedCondConf, err := this.configure.getBuriedCondCfg()
if err != nil {
return err
}
for _, data := range this.sociatyTaskConf.GetDataList() {
if _, ok := buriedCondConf.GetDataMap()[data.TypeId]; !ok {
errs = append(errs, fmt.Sprintf("condId:%v 可能无效,检查guild_task表字段type_id值是否存在于buried_condi", data.TypeId))
}
}
return
}
// 会长弹劾处理
// Deprecated
func (this *Sociaty) ProcessAccuse(uid, sociatyId string) {
t := this.globalConf.GuildImpeachmentCountDown
if t == 0 {
return
}
sociaty := this.modelSociaty.getSociaty(sociatyId)
if sociaty != nil {
if sociaty.AccuseTime > 0 {
now := configure.Now().Unix()
if now-sociaty.AccuseTime >= int64(3600*t) {
//TODO 选新会长
} else {
//结束弹劾
update := map[string]interface{}{
"accuseTime": 0,
}
if err := this.modelSociaty.updateSociaty(sociatyId, update); err != nil {
this.Errorf("弹劾时间更新失败 %v", err)
}
}
}
}
}
// 获取我的公会成员
func (this *Sociaty) MembersByUid(uid string) (list []*pb.SociatyMemberInfo) {
sociaty := this.modelSociaty.getUserSociaty(uid)
return this.modelSociaty.members(sociaty)
}
// 获取公会成员
func (this *Sociaty) MembersBySociatyId(sociatyId string) (list []*pb.SociatyMemberInfo) {
sociaty := this.modelSociaty.getSociaty(sociatyId)
return this.modelSociaty.members(sociaty)
}
// 公会
func (this *Sociaty) Reddot(session comm.IUserSession, rid ...comm.ReddotType) (reddot map[comm.ReddotType]*pb.ReddotItem) {
reddot = make(map[comm.ReddotType]*pb.ReddotItem)
sociaty := this.modelSociaty.getUserSociaty(session.GetUserId())
if sociaty == nil || sociaty.Id == "" {
log.Warn("公会红点未获得公会信息", log.Field{Key: "uid", Value: session.GetUserId()})
for _, v := range rid {
reddot[v] = &pb.ReddotItem{
Rid: int32(v),
Activated: false,
Nextchanagetime: 0,
}
}
} else {
var applyReddot bool
if this.modelSociaty.isRight(session.GetUserId(), sociaty,
pb.SociatyJob_PRESIDENT,
pb.SociatyJob_VICEPRESIDENT,
pb.SociatyJob_ADMIN) {
if len(sociaty.ApplyRecord) > 0 {
applyReddot = true
}
}
for _, v := range rid {
switch v {
case comm.Reddot15102:
tf := this.modelSociaty.IsSign(session.GetUserId(), sociaty)
reddot[comm.Reddot15102] =
&pb.ReddotItem{
Rid: int32(comm.Reddot15102),
Activated: !tf,
Nextchanagetime: 0,
}
case comm.Reddot15201:
reddot[comm.Reddot15201] = &pb.ReddotItem{
Rid: int32(comm.Reddot15201),
Activated: applyReddot,
Nextchanagetime: 0,
}
}
}
}
return
}
// 跨服获取公会
func (this *Sociaty) RpcGetSociaty(ctx context.Context, req *pb.RPCGeneralReqA1, reply *pb.DBSociaty) error {
this.Debug("Rpc_ModuleSociaty", log.Field{Key: "req", Value: req.String()})
sociaty := this.modelSociaty.getSociaty(req.Param1)
reply.Id = sociaty.Id
reply.Lv = sociaty.Lv
reply.Exp = sociaty.Exp
reply.Members = sociaty.Members
reply.DismissCD = sociaty.DismissCD
reply.Name = sociaty.Name
reply.Icon = sociaty.Icon
reply.Notice = sociaty.Notice
reply.DismissTime = sociaty.DismissTime
reply.IsApplyCheck = sociaty.IsApplyCheck
reply.SignIds = sociaty.SignIds
reply.LastSignCount = sociaty.LastSignCount
reply.ApplyLv = sociaty.ApplyLv
reply.Activity = sociaty.Activity
reply.AccuseTime = sociaty.AccuseTime
reply.ApplyRecord = sociaty.ApplyRecord
return nil
}
type SociatyUpdateParam struct {
SociatyId string
Update map[string]interface{}
}
// 跨服更新数据
func (this *Sociaty) RpcUpdateSociaty(ctx context.Context, req *SociatyUpdateParam, reply *pb.DBSociaty) error {
return this.modelSociaty.ChangeList(comm.RDS_EMPTY, req.SociatyId, req.Update)
}
// 设置工会经验
func (this *Sociaty) BingoSetExp(session comm.IUserSession, exp int32) error {
sociaty := this.modelSociaty.getUserSociaty(session.GetUserId())
if sociaty == nil || sociaty.Id == "" {
log.Warn("未获得公会信息", log.Field{Key: "uid", Value: session.GetUserId()})
return comm.NewCustomError(pb.ErrorCode_SociatyNoFound)
}
sociaty.Exp += exp
update := map[string]interface{}{
"exp": sociaty.Exp,
}
err := this.modelSociaty.updateSociaty(sociaty.Id, update)
if err != nil {
return err
}
return this.modelSociaty.changeLv(sociaty)
}
// 设置工会活跃度
func (this *Sociaty) BingoSetActivity(session comm.IUserSession, activity int32) error {
sociaty := this.modelSociaty.getUserSociaty(session.GetUserId())
if sociaty == nil || sociaty.Id == "" {
log.Warn("未获得公会信息", log.Field{Key: "uid", Value: session.GetUserId()})
return comm.NewCustomError(pb.ErrorCode_SociatyNoFound)
}
activity += sociaty.Activity
update := map[string]interface{}{
"activity": activity,
}
return this.modelSociaty.updateSociaty(sociaty.Id, update)
}
type TaskParams struct {
SociatyId string
Uid string
Data interface{}
}
// 任务条件达成通知
func (this *Sociaty) TCondFinishNotify(uid string, conds []*pb.ConIProgress) {
log.Debug("公会任务通知",
log.Field{Key: "uid", Value: uid},
log.Field{Key: "condIds", Value: conds})
sociaty := this.modelSociaty.getUserSociaty(uid)
if sociaty == nil {
return
}
sociatyId := sociaty.Id
dt := &pb.DBSociatyTask{}
err := this.service.AcrossClusterRpcCall(context.Background(), this.GetCrossTag(),
comm.Service_Worker, string(comm.Rpc_ModuleSociatyGetTask),
&pb.RPCGeneralReqA2{Param1: sociatyId, Param2: uid}, dt)
var flag bool
for _, v := range dt.TaskList {
for _, cond := range conds {
if v.TaskId == cond.Conid && cond.State == pb.BuriedItemFinishState_buried_finish {
v.Status = 1
flag = true
}
}
}
if !flag {
return
}
update := map[string]interface{}{
"taskList": dt.TaskList,
"lastUpdateTime": configure.Now().Unix(),
}
err = this.service.AcrossClusterRpcCall(context.Background(), this.GetCrossTag(),
comm.Service_Worker, string(comm.Rpc_ModuleSociatyTask),
&TaskParams{SociatyId: sociatyId, Uid: uid, Data: update}, &pb.EmptyResp{})
if err != nil {
return
}
return
}
func (this *Sociaty) RpcUpdateUserTask(ctx context.Context, p *TaskParams, reply *pb.EmptyResp) error {
conn, err := db.Local()
if err != nil {
return err
}
model := db.NewDBModel(comm.TableSociatyTask, 0, conn)
if err := model.Redis.HMSet(fmt.Sprintf("%s:%s-%s", this.modelSociatyTask.TableName,
p.SociatyId, p.Uid), p.Data); err != nil {
log.Error("DBModel ChangeList", log.Field{Key: "err", Value: err.Error()})
return err
}
if err := model.UpdateModelLogs(this.modelSociatyTask.TableName,
p.Uid, bson.M{"sociatyid": p.SociatyId, "uid": p.Uid}, p.Data); err != nil {
return err
}
return nil
}
func (this *Sociaty) RpcGetUserTask(ctx context.Context, p *pb.RPCGeneralReqA2, reply *pb.DBSociatyTask) error {
dt := this.modelSociatyTask.getUserTask(p.Param2, p.Param1)
if dt == nil {
return errors.New("not found")
}
reply.Uid = dt.Uid
reply.TaskList = dt.TaskList
reply.ActivityList = dt.ActivityList
reply.SociatyId = dt.SociatyId
reply.LastUpdateTime = dt.LastUpdateTime
return nil
}
// 创建公会3.10
func (this *Sociaty) CreateSociaty(uid, sociatyName string) error {
//创建公会
sociaty := &pb.DBSociaty{
Creater: uid,
Name: sociatyName,
Icon: "wp_icon_10015",
ApplyLv: 1,
}
//会长
sociaty.Members = append(sociaty.Members, &pb.SociatyMember{
Uid: uid,
Job: pb.SociatyJob_PRESIDENT, //创建人是会长
Ctime: configure.Now().Unix(),
})
return this.modelSociaty.create(sociaty)
}
func (this *Sociaty) GetSociaty(uid string) *pb.DBSociaty {
return this.modelSociaty.getUserSociaty(uid)
}