2025-04-26 13:50:26 +08:00
|
|
|
|
package smdl
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"admin/apps/game/domain/entity"
|
|
|
|
|
"admin/apps/game/model"
|
2025-04-30 15:46:14 +08:00
|
|
|
|
"admin/internal/consts"
|
2025-04-26 13:50:26 +08:00
|
|
|
|
"admin/internal/errcode"
|
2025-05-16 15:17:10 +08:00
|
|
|
|
"admin/internal/model/dto"
|
2025-04-26 13:50:26 +08:00
|
|
|
|
"admin/lib/httpclient"
|
2025-04-30 15:46:14 +08:00
|
|
|
|
"admin/lib/xlog"
|
2025-07-29 11:57:20 +08:00
|
|
|
|
"fmt"
|
2025-04-26 13:50:26 +08:00
|
|
|
|
"net/url"
|
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2025-07-29 11:57:20 +08:00
|
|
|
|
const crossMaxIncNo = 5
|
|
|
|
|
const crossIdPrefix = "208"
|
|
|
|
|
|
2025-04-26 13:50:26 +08:00
|
|
|
|
type BanHook struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (hook *BanHook) Create(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
|
|
|
|
alisrvAddr := projectInfo.GetApiAddr()
|
|
|
|
|
if alisrvAddr == "" {
|
2025-04-30 15:46:14 +08:00
|
|
|
|
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj)
|
|
|
|
|
banInfo := et.ToPo().(*model.Ban)
|
2025-04-30 15:46:14 +08:00
|
|
|
|
|
|
|
|
|
banApi := ""
|
|
|
|
|
switch banInfo.BanType {
|
|
|
|
|
case consts.BanType_Role:
|
|
|
|
|
banApi = "banrole"
|
|
|
|
|
case consts.BanType_RoleChat:
|
|
|
|
|
banApi = "banroletalk"
|
|
|
|
|
default:
|
2025-07-29 11:57:20 +08:00
|
|
|
|
if banInfo.BanType == consts.BanType_AccountTrade ||
|
|
|
|
|
banInfo.BanType == consts.BanType_RoleTrade {
|
|
|
|
|
err := hook.triggerBanTradeInfoChange(projectInfo, "add", banInfo)
|
|
|
|
|
return err
|
2025-07-23 18:06:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 15:46:14 +08:00
|
|
|
|
xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-26 13:50:26 +08:00
|
|
|
|
roleId := banInfo.Value
|
2025-04-30 15:46:14 +08:00
|
|
|
|
|
2025-04-26 13:50:26 +08:00
|
|
|
|
params := &url.Values{}
|
|
|
|
|
params.Add("server", banInfo.ServerConfID)
|
|
|
|
|
params.Add("roleid", roleId)
|
|
|
|
|
|
2025-05-12 18:43:41 +08:00
|
|
|
|
expireAt := banInfo.ExpireAt
|
2025-04-28 15:56:04 +08:00
|
|
|
|
|
2025-05-12 18:43:41 +08:00
|
|
|
|
if !expireAt.Valid {
|
2025-04-26 13:50:26 +08:00
|
|
|
|
// 解封
|
|
|
|
|
params.Add("forbidtime", "0")
|
2025-04-30 15:46:14 +08:00
|
|
|
|
params.Add("desc", banInfo.BanReason)
|
|
|
|
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
} else {
|
2025-05-12 18:43:41 +08:00
|
|
|
|
dura := int64(expireAt.Time.Sub(time.Now()).Minutes()) // 神魔大陆封禁是分钟
|
2025-04-26 13:50:26 +08:00
|
|
|
|
if dura <= 0 {
|
|
|
|
|
// 解封
|
|
|
|
|
params.Add("forbidtime", "0")
|
|
|
|
|
} else {
|
2025-05-12 18:43:41 +08:00
|
|
|
|
params.Add("forbidtime", strconv.FormatInt(int64(dura), 10))
|
2025-04-30 15:46:14 +08:00
|
|
|
|
params.Add("desc", banInfo.BanReason)
|
|
|
|
|
params.Add("notifytouser", banInfo.BanNotifyReason)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rsp := make(map[string]any)
|
2025-04-30 15:46:14 +08:00
|
|
|
|
err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
2025-05-12 18:43:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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:
|
2025-07-29 11:57:20 +08:00
|
|
|
|
if banInfo.BanType == consts.BanType_AccountTrade ||
|
|
|
|
|
banInfo.BanType == consts.BanType_RoleTrade {
|
|
|
|
|
err := hook.triggerBanTradeInfoChange(projectInfo, "add", banInfo)
|
|
|
|
|
return err
|
2025-07-23 18:06:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-05-12 18:43:41 +08:00
|
|
|
|
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 {
|
|
|
|
|
// 解封
|
2025-05-14 18:09:20 +08:00
|
|
|
|
params.Add("forbidtime", "-1")
|
|
|
|
|
params.Add("desc", "")
|
|
|
|
|
params.Add("notifytouser", "")
|
2025-05-12 18:43:41 +08:00
|
|
|
|
} 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
|
2025-04-26 13:50:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (hook *BanHook) Delete(projectInfo *entity.Project, resource string, dtoObj dto.CommonDtoValues) error {
|
|
|
|
|
alisrvAddr := projectInfo.GetApiAddr()
|
|
|
|
|
if alisrvAddr == "" {
|
2025-04-30 15:46:14 +08:00
|
|
|
|
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
et := (&entity.CommonResource{}).FromPo(&model.Ban{}).FromDto(dtoObj)
|
|
|
|
|
banInfo := et.ToPo().(*model.Ban)
|
2025-04-30 15:46:14 +08:00
|
|
|
|
|
|
|
|
|
banApi := ""
|
|
|
|
|
switch banInfo.BanType {
|
|
|
|
|
case consts.BanType_Role:
|
|
|
|
|
banApi = "banrole"
|
|
|
|
|
case consts.BanType_RoleChat:
|
|
|
|
|
banApi = "banroletalkdel"
|
|
|
|
|
default:
|
2025-07-29 11:57:20 +08:00
|
|
|
|
if banInfo.BanType == consts.BanType_AccountTrade ||
|
|
|
|
|
banInfo.BanType == consts.BanType_RoleTrade {
|
|
|
|
|
err := hook.triggerBanTradeInfoChange(projectInfo, "remove", banInfo)
|
|
|
|
|
return err
|
2025-07-23 18:06:16 +08:00
|
|
|
|
}
|
2025-07-29 11:57:20 +08:00
|
|
|
|
|
2025-04-30 15:46:14 +08:00
|
|
|
|
xlog.Warnf("神魔大陆不支持此类型的封禁:%v", banInfo.BanType)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-26 13:50:26 +08:00
|
|
|
|
roleId := banInfo.Value
|
|
|
|
|
params := &url.Values{}
|
|
|
|
|
params.Add("server", banInfo.ServerConfID)
|
|
|
|
|
params.Add("roleid", roleId)
|
|
|
|
|
|
|
|
|
|
// 解封
|
2025-04-30 15:46:14 +08:00
|
|
|
|
params.Add("forbidtime", "-1")
|
2025-04-26 13:50:26 +08:00
|
|
|
|
params.Add("desc", "")
|
|
|
|
|
params.Add("notifytouser", "")
|
|
|
|
|
|
|
|
|
|
rsp := make(map[string]any)
|
2025-04-30 15:46:14 +08:00
|
|
|
|
err := httpclient.Request(alisrvAddr+"/"+banApi, "get", params, &rsp)
|
2025-04-26 13:50:26 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2025-07-29 11:57:20 +08:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|