package smdl import ( "admin/apps/game/domain/entity" "admin/apps/game/model" "admin/internal/consts" "admin/internal/errcode" "admin/internal/model/dto" "admin/lib/httpclient" "admin/lib/xlog" "fmt" "net/url" "strconv" "time" ) const crossMaxIncNo = 5 const crossIdPrefix = "208" type BanHook struct { } func (hook *BanHook) Create(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error { alisrvAddr := projectInfo.GetApiAddr() if alisrvAddr == "" { return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name) } et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj) banInfo := et.ToPo().(*model.Ban) banApi := "" switch banInfo.BanType { case consts.BanType_Role: banApi = "banrole" case consts.BanType_RoleChat: banApi = "banroletalk" default: if banInfo.BanType == consts.BanType_AccountTrade || banInfo.BanType == consts.BanType_RoleTrade { err := hook.triggerBanTradeInfoChange(projectInfo, "add", banInfo) return err } xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType) return nil } roleId := banInfo.Value params := &url.Values{} params.Add("server", banInfo.ServerConfID) params.Add("roleid", roleId) expireAt := banInfo.ExpireAt if !expireAt.Valid { // 解封 params.Add("forbidtime", "0") params.Add("desc", banInfo.BanReason) params.Add("notifytouser", banInfo.BanNotifyReason) } else { dura := int64(expireAt.Time.Sub(time.Now()).Minutes()) // 神魔大陆封禁是分钟 if dura <= 0 { // 解封 params.Add("forbidtime", "0") } else { params.Add("forbidtime", strconv.FormatInt(int64(dura), 10)) params.Add("desc", banInfo.BanReason) params.Add("notifytouser", banInfo.BanNotifyReason) } } rsp := make(map[string]any) err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp) if err != nil { return err } return nil } func (hook *BanHook) Edit(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error { alisrvAddr := projectInfo.GetApiAddr() if alisrvAddr == "" { return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name) } et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj) banInfo := et.ToPo().(*model.Ban) banApi := "" switch banInfo.BanType { case consts.BanType_Role: banApi = "banrole" case consts.BanType_RoleChat: banApi = "banroletalk" default: if banInfo.BanType == consts.BanType_AccountTrade || banInfo.BanType == consts.BanType_RoleTrade { err := hook.triggerBanTradeInfoChange(projectInfo, "add", banInfo) return err } xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType) return nil } roleId := banInfo.Value params := &url.Values{} params.Add("server", banInfo.ServerConfID) params.Add("roleid", roleId) expireAt := banInfo.ExpireAt if !expireAt.Valid { // 解封 params.Add("forbidtime", "0") params.Add("desc", banInfo.BanReason) params.Add("notifytouser", banInfo.BanNotifyReason) } else { dura := int64(expireAt.Time.Sub(time.Now()).Minutes()) // 神魔大陆封禁是分钟 if dura <= 0 { // 解封 params.Add("forbidtime", "-1") params.Add("desc", "") params.Add("notifytouser", "") } else { params.Add("forbidtime", strconv.FormatInt(int64(dura), 10)) params.Add("desc", banInfo.BanReason) params.Add("notifytouser", banInfo.BanNotifyReason) } } rsp := make(map[string]any) err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp) if err != nil { return err } return nil } func (hook *BanHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error { alisrvAddr := projectInfo.GetApiAddr() if alisrvAddr == "" { return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name) } et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj) banInfo := et.ToPo().(*model.Ban) banApi := "" switch banInfo.BanType { case consts.BanType_Role: banApi = "banrole" case consts.BanType_RoleChat: banApi = "banroletalkdel" default: if banInfo.BanType == consts.BanType_AccountTrade || banInfo.BanType == consts.BanType_RoleTrade { err := hook.triggerBanTradeInfoChange(projectInfo, "remove", banInfo) return err } xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType) return nil } roleId := banInfo.Value params := &url.Values{} params.Add("server", banInfo.ServerConfID) params.Add("roleid", roleId) // 解封 params.Add("forbidtime", "-1") params.Add("desc", "") params.Add("notifytouser", "") rsp := make(map[string]any) err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp) if err != nil { return err } return nil } func (hook *BanHook) triggerBanTradeInfoChange(projectInfo *entity.Project, op string, banInfo *model.Ban) error { if banInfo.BanType == consts.BanType_AccountTrade { params := &url.Values{} params.Add("cmd_data", "OpWhitelist") params.Add("type", banInfo.BanType) params.Add("value", banInfo.Value) params.Add("op", op) // 所有区服 serverList, err := getAllRunningServers(projectInfo) if err != nil { return err } for _, v := range serverList { params.Set("server", v.ServerId) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { err = errcode.New(errcode.ServerError, "发送新增禁止账号交易白名单请求:%+v错误:%v", banInfo, err) xlog.Warnf("%v", err) } } // 无论是封禁账号是还是角色,都要通知跨服,否则角色可以在跨服交易 for i := 0; i < crossMaxIncNo; i++ { // 再通知下跨服,跨服因为没管理在服务器列表,先这样顶一下 crossServerId := fmt.Sprintf(crossIdPrefix+"%.2d", i) params.Set("server", crossServerId) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { err = errcode.New(errcode.ServerError, "发送%v新增禁止账号交易白名单请求:%+v错误:%v", crossServerId, banInfo, err) xlog.Warnf("%v", err) } } for i := 0; i < crossMaxIncNo; i++ { // 再通知下跨服,跨服因为没管理在服务器列表,先这样顶一下 bigCrossServerId := fmt.Sprintf("298%.2d", i) params.Set("server", bigCrossServerId) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { err = errcode.New(errcode.ServerError, "发送%v新增禁止账号交易白名单请求:%+v错误:%v", bigCrossServerId, banInfo, err) xlog.Warnf("%v", err) } } return nil } else if banInfo.BanType == consts.BanType_RoleTrade { params := &url.Values{} params.Add("cmd_data", "OpWhitelist") params.Add("type", banInfo.BanType) params.Add("value", banInfo.Value) params.Add("op", op) params.Set("server", banInfo.ServerConfID) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { return errcode.New(errcode.ServerError, "发送新增禁止角色交易白名单请求:%+v错误:%v", banInfo, err) } // 无论是封禁账号是还是角色,都要通知跨服,否则角色可以在跨服交易,通知错了跨服也不管,因为角色id前缀就是服务器id, // 不会影响别的服逻辑判断 for i := 0; i < crossMaxIncNo; i++ { // 再通知下跨服,跨服因为没管理在服务器列表,先这样顶一下 crossServerId := fmt.Sprintf(crossIdPrefix+"%.2d", i) params.Set("server", crossServerId) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { err = errcode.New(errcode.ServerError, "发送%v新增禁止账号交易白名单请求:%+v错误:%v", crossServerId, banInfo, err) xlog.Warnf("%v", err) } } for i := 0; i < crossMaxIncNo; i++ { // 再通知下跨服,跨服因为没管理在服务器列表,先这样顶一下 bigCrossServerId := fmt.Sprintf("298%.2d", i) params.Set("server", bigCrossServerId) rsp := make(map[string]any) err := httpclient.Request(projectInfo.GetApiAddr()+"/gm", "get", params, &rsp) if err != nil { err = errcode.New(errcode.ServerError, "发送%v新增禁止账号交易白名单请求:%+v错误:%v", bigCrossServerId, banInfo, err) xlog.Warnf("%v", err) } } return nil } return nil }