2025-07-29 11:57:20 +08:00

281 lines
8.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}