Browse Source

广告,热重载

master
linquan 2 weeks ago
parent
commit
98ad96147d
  1. 10
      api/v1/game/serverConfig.go
  2. 5
      internal/controller/game_login_url.go
  3. 11
      internal/controller/game_pub.go
  4. 25
      internal/controller/sys_login.go
  5. 18
      internal/service/sys_user.go
  6. 6
      internal/serviceGame/advertisement.go
  7. 108
      internal/serviceGame/internal/advertisement.go
  8. 71
      internal/serviceGame/loginUrl.go
  9. 1
      test/test.go
  10. 69
      test/testMongo.go

10
api/v1/game/serverConfig.go

@ -103,3 +103,13 @@ type GetServerConfigRes struct {
InnerIp string `json:"innerIp" description:""`
CreateTime int64 `json:"createTime" description:""`
}
type ServerReloadDllReq struct {
g.Meta `path:"/server/reloadDll" tags:"server" method:"get" summary:"reloadDll"`
Server string `p:"serverId"`
}
type ServerReloadDllRes struct {
g.Meta `mime:"application/json"`
Message string `json:"message"`
}

5
internal/controller/game_login_url.go

@ -76,3 +76,8 @@ func (c *loginUrlController) ServerUpdateMsg(ctx context.Context, req *game.Serv
res, err = serviceGame.GameLoginUrl().ServerUpdateMsg(ctx, req)
return
}
func (c *loginUrlController) ServerReloadDll(ctx context.Context, req *game.ServerReloadDllReq) (res *game.ServerReloadDllRes, err error) {
res, err = serviceGame.GameLoginUrl().ServerReloadDll(ctx, req)
return
}

11
internal/controller/game_pub.go

@ -2,7 +2,6 @@ package controller
import (
"context"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"log"
@ -144,35 +143,35 @@ func (c *pubController) AdvertiseHugeAmount(ctx context.Context, req *game.Adver
}
func (c *pubController) AdvertiseHugeAmount1(ctx context.Context, req *game.AdvertiseHA1Req) (res *game.AdvertiseHA1Res, err error) {
log.Print("AdvertiseHugeAmount1", gjson.MustEncodeString(req))
//log.Print("AdvertiseHugeAmount1", gjson.MustEncodeString(req))
res = new(game.AdvertiseHA1Res)
err = serviceGame.Advertisement().AdvertiseHugeAmount1(ctx, req.Androidid, req.Idfa, req.Os, req.Callback, req.TIMESTAMP)
return
}
func (c *pubController) AdvertiseHugeAmount2(ctx context.Context, req *game.AdvertiseHA2Req) (res *game.AdvertiseHA2Res, err error) {
log.Print("AdvertiseHugeAmount2", gjson.MustEncodeString(req))
//log.Print("AdvertiseHugeAmount2", gjson.MustEncodeString(req))
res = new(game.AdvertiseHA2Res)
err = serviceGame.Advertisement().AdvertiseHugeAmount1(ctx, req.Androidid, req.Idfa, req.Os, req.Callback, req.TIMESTAMP)
return
}
func (c *pubController) AdvertiseHugeAmount3(ctx context.Context, req *game.AdvertiseHA3Req) (res *game.AdvertiseHA3Res, err error) {
log.Print("AdvertiseHugeAmount3", gjson.MustEncodeString(req))
//log.Print("AdvertiseHugeAmount3", gjson.MustEncodeString(req))
res = new(game.AdvertiseHA3Res)
err = serviceGame.Advertisement().AdvertiseHugeAmount1(ctx, req.Androidid, req.Idfa, req.Os, req.Callback, req.TIMESTAMP)
return
}
func (c *pubController) AdvertiseHugeAmount4(ctx context.Context, req *game.AdvertiseHA4Req) (res *game.AdvertiseHA4Res, err error) {
log.Print("AdvertiseHugeAmount4", gjson.MustEncodeString(req))
//log.Print("AdvertiseHugeAmount4", gjson.MustEncodeString(req))
res = new(game.AdvertiseHA4Res)
err = serviceGame.Advertisement().AdvertiseHugeAmount1(ctx, req.Androidid, req.Idfa, req.Os, req.Callback, req.TIMESTAMP)
return
}
func (c *pubController) AdvertiseHugeAmount5(ctx context.Context, req *game.AdvertiseHA5Req) (res *game.AdvertiseHA5Res, err error) {
log.Print("AdvertiseHugeAmount5", gjson.MustEncodeString(req))
//log.Print("AdvertiseHugeAmount5", gjson.MustEncodeString(req))
res = new(game.AdvertiseHA5Res)
err = serviceGame.Advertisement().AdvertiseHugeAmount1(ctx, req.Androidid, req.Idfa, req.Os, req.Callback, req.TIMESTAMP)
return

25
internal/controller/sys_login.go

@ -223,13 +223,13 @@ func (c *loginController) MobileCode(ctx context.Context, req *system.MobileCode
})
return
}
liberr.ValueIsNil(user, "手机验证码错误")
liberr.ValueIsNil(user, "手机错误")
code, err := service.User().GetCodeByMobile(ctx, req.Phone)
if err != nil {
// 保存登录失败的日志信息
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
Status: 0,
Username: req.Phone + "_" + code,
Username: req.Phone,
Ip: ip,
UserAgent: userAgent,
Msg: err.Error(),
@ -250,6 +250,14 @@ func (c *loginController) MobileCode(ctx context.Context, req *system.MobileCode
})
return
}
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
Status: 0,
Username: req.Phone,
Ip: ip,
UserAgent: userAgent,
Msg: "获取验证码成功!" + "_" + code,
Module: "系统后台",
})
return
}
@ -348,13 +356,13 @@ func (c *loginController) EmailCode(ctx context.Context, req *system.EmailCodeRe
})
return
}
liberr.ValueIsNil(user, "验证码错误")
liberr.ValueIsNil(user, "邮箱地址错误")
code, err := service.User().GetCodeByEmail(ctx, req.Email)
if err != nil {
// 保存登录失败的日志信息
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
Status: 0,
Username: req.Email + "_" + code,
Username: req.Email,
Ip: ip,
UserAgent: userAgent,
Msg: err.Error(),
@ -375,5 +383,14 @@ func (c *loginController) EmailCode(ctx context.Context, req *system.EmailCodeRe
})
return
}
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
Status: 0,
Username: req.Email,
Ip: ip,
UserAgent: userAgent,
Msg: "获取验证码成功!" + "_" + code,
Module: "系统后台",
})
return
}

18
internal/service/sys_user.go

@ -168,7 +168,7 @@ func (s *userImpl) GetAdminUserByPhone(ctx context.Context, req *system.UserLogi
err = g.Try(ctx, func(ctx context.Context) {
user, err = s.GetUserByMobile(ctx, req.Phone)
liberr.ErrIsNil(ctx, err)
liberr.ValueIsNil(user, "手机验证码错误")
liberr.ValueIsNil(user, "手机错误")
//账号状态
if user.UserStatus == 0 {
liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))
@ -180,7 +180,7 @@ func (s *userImpl) GetAdminUserByPhone(ctx context.Context, req *system.UserLogi
if ok {
log.Printf("GetAdminUserByPhone >>> Phone:%s, time %s ", req.Phone, fmt.Sprint(model.Time.Unix())+"--"+fmt.Sprint(gtime.Now().Unix()))
}
liberr.ErrIsNil(ctx, gerror.New("手机验证码错误"))
liberr.ErrIsNil(ctx, gerror.New("验证码过期"))
}
if libUtils.EncryptPassword(req.Code+fmt.Sprint(model.Time.Unix()), user.UserSalt) != model.Password {
liberr.ErrIsNil(ctx, gerror.New("手机验证码错误"))
@ -201,7 +201,7 @@ func (s *userImpl) GetAdminUserByEmail(ctx context.Context, req *system.UserLogi
err = g.Try(ctx, func(ctx context.Context) {
user, err = s.GetUserByEmail(ctx, req.Email)
liberr.ErrIsNil(ctx, err)
liberr.ValueIsNil(user, "验证码错误")
liberr.ValueIsNil(user, "邮箱地址错误")
//账号状态
if user.UserStatus == 0 {
liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))
@ -213,7 +213,7 @@ func (s *userImpl) GetAdminUserByEmail(ctx context.Context, req *system.UserLogi
if ok {
log.Printf("GetAdminUserByEmail >>> Email:%s, time %s ", req.Email, fmt.Sprint(model.Time.Unix())+"--"+fmt.Sprint(gtime.Now().Unix()))
}
liberr.ErrIsNil(ctx, gerror.New("验证码错误"))
liberr.ErrIsNil(ctx, gerror.New("验证码过期"))
}
if libUtils.EncryptPassword(req.Code+fmt.Sprint(model.Time.Unix()), user.UserSalt) != model.Password {
liberr.ErrIsNil(ctx, gerror.New("验证码错误"))
@ -230,7 +230,7 @@ func (s *userImpl) GetUserByUsername(ctx context.Context, userName string) (user
err = g.Try(ctx, func(ctx context.Context) {
user = &model2.LoginUserRes{}
err = dao.SysUser.Ctx(ctx).Fields(user).Where(dao.SysUser.Columns().UserName, userName).Scan(user)
liberr.ErrIsNil(ctx, err, "账号密码错误")
liberr.ErrIsNil(ctx, err, "账号错误")
})
return
}
@ -240,7 +240,7 @@ func (s *userImpl) GetUserByMobile(ctx context.Context, mobile string) (user *mo
err = g.Try(ctx, func(ctx context.Context) {
user = &model2.LoginUserRes{}
err = dao.SysUser.Ctx(ctx).Fields(user).Where(dao.SysUser.Columns().Mobile, mobile).Scan(user)
liberr.ErrIsNil(ctx, err, "手机验证码错误")
liberr.ErrIsNil(ctx, err, "手机错误")
})
return
}
@ -250,7 +250,7 @@ func (s *userImpl) GetUserByEmail(ctx context.Context, email string) (user *mode
err = g.Try(ctx, func(ctx context.Context) {
user = &model2.LoginUserRes{}
err = dao.SysUser.Ctx(ctx).Fields(user).Where(dao.SysUser.Columns().UserEmail, email).Scan(user)
liberr.ErrIsNil(ctx, err, "验证码错误")
liberr.ErrIsNil(ctx, err, "邮箱地址错误")
})
return
}
@ -260,7 +260,7 @@ func (s *userImpl) GetCodeByMobile(ctx context.Context, mobile string) (code str
err = g.Try(ctx, func(ctx context.Context) {
user, err := s.GetUserByMobile(ctx, mobile)
liberr.ErrIsNil(ctx, err)
liberr.ValueIsNil(user, "手机验证码错误")
liberr.ValueIsNil(user, "手机错误")
//账号状态
if user.UserStatus == 0 {
liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))
@ -286,7 +286,7 @@ func (s *userImpl) GetCodeByEmail(ctx context.Context, email string) (code strin
err = g.Try(ctx, func(ctx context.Context) {
user, err := s.GetUserByEmail(ctx, email)
liberr.ErrIsNil(ctx, err)
liberr.ValueIsNil(user, "验证码错误")
liberr.ValueIsNil(user, "邮箱地址错误")
//账号状态
if user.UserStatus == 0 {
liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))

6
internal/serviceGame/advertisement.go

@ -66,6 +66,12 @@ func (g *advertisementImpl) AdvertiseHugeAmount1(ctx context.Context, androidId,
if osInt != 0 && osInt != 1 {
return errors.New("系统类型错误!")
}
if osInt == 1 && idfa == "__IDFA__" {
return
}
if osInt == 0 && androidId == "__ANDROIDID__" {
return
}
_, err = dao.AdvertisementOceanegine.Ctx(ctx).Insert(do.AdvertisementOceanegine{
AdvAndroidId: androidId,
Idfa: idfa,

108
internal/serviceGame/internal/advertisement.go

@ -98,7 +98,6 @@ func sendMsgHugeAmount(ctx context.Context, url string, data map[string]interfac
if err != nil {
return "", err
}
g.Log().Info(ctx, "sendMsgHugeAmount - res: ", bytes)
src := string(bytes.ReadAll())
tmp, err := gcharset.ToUTF8("UTF-8", src)
if err != nil {
@ -109,7 +108,7 @@ func sendMsgHugeAmount(ctx context.Context, url string, data map[string]interfac
}
func AttributionHugeAmount(ctx context.Context, req *game.ATHAReq) (res *game.ATHARes, err error) {
log.Printf("AttributionHugeAmount: %s", gjson.MustEncodeString(req))
//log.Printf("AttributionHugeAmount: %s", gjson.MustEncodeString(req))
data := map[string]interface{}{
"platform": req.Platform, // ios或android
"package_name": req.PackageName,
@ -118,19 +117,37 @@ func AttributionHugeAmount(ctx context.Context, req *game.ATHAReq) (res *game.AT
var adData []entity.AdvertisementOceanegine
model := dao.AdvertisementOceanegine.Ctx(ctx).Order("last_touch_time desc")
if req.Platform == "android" {
_ = model.Where("adv_android_id=?", req.AndroidId).Scan(&adData)
if req.AndroidId != "" {
_ = model.Where("adv_android_id=?", req.AndroidId).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("AttributionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
err = errors.New("account is nil")
return
}
data["android_id"] = req.AndroidId
} else if req.Platform == "ios" {
_ = model.Where("idfa=?", req.Idfa).Scan(&adData)
if req.Idfa != "" {
_ = model.Where("idfa=?", req.Idfa).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("AttributionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
return
if req.Idfv != "" {
_ = model.Where("adv_idfv=?", req.Idfv).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("AttributionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
err = errors.New("account is nil")
return
}
}
data["idfv"] = req.Idfv
} else {
err = errors.New("platform is error " + req.Platform)
return
}
if len(adData) == 0 || adData[0].CallbackParam == "" {
err = errors.New("无广告!")
return
}
url := "https://analytics.oceanengine.com/sdk/app/attribution"
@ -146,48 +163,79 @@ func AttributionHugeAmount(ctx context.Context, req *game.ATHAReq) (res *game.AT
if json != nil && json.Get("code").Int() == 0 {
callbackUrl := json.Get("callback_url").String()
callbackParam := json.Get("callback_param").String()
androidId := json.Get("adv_android_id").String()
if androidId == "" {
androidId = req.AndroidId
}
idfa := json.Get("idfa").String()
if idfa == "" {
idfa = req.Idfa
}
advIdfv := json.Get("adv_idfv").String()
if advIdfv == "" {
advIdfv = req.Idfv
}
lastTouchTime := json.Get("last_touch_time").Int64()
advertiseData := do.AdvertisementOceanegine{AdvAndroidId: req.AndroidId, Idfa: req.Idfa, AdvIdfv: req.Idfv,
advertiseData := do.AdvertisementOceanegine{AdvAndroidId: androidId, Idfa: idfa, AdvIdfv: advIdfv,
CallbackUrl: callbackUrl, CallbackParam: callbackParam, LastTouchTime: lastTouchTime * 1000}
if req.Platform == "android" {
advertiseData.Os = 0
} else if req.Platform == "ios" {
advertiseData.Os = 1
}
_, _ = dao.AdvertisementOceanegine.Ctx(ctx).Insert(advertiseData)
if callbackParam == "" {
return
}
_, err = dao.AdvertisementOceanegine.Ctx(ctx).Insert(advertiseData)
} else {
return nil, errors.New("获取失败")
err = errors.New("获取失败")
return
}
return
}
func ConversionHugeAmount(ctx context.Context, req *game.CSHAReq) (res *game.CSHARes, err error) {
log.Printf("ConversionHugeAmount: %s", gjson.MustEncodeString(req))
//log.Printf("ConversionHugeAmount: %s", gjson.MustEncodeString(req))
var adData []entity.AdvertisementOceanegine
device := map[string]interface{}{
"platform": req.Platform,
}
model := dao.AdvertisementOceanegine.Ctx(ctx).Order("last_touch_time desc")
if req.Platform == "android" {
_ = model.Where("adv_android_id=?", req.Id).Scan(&adData)
if req.Id != "" {
_ = model.Where("adv_android_id=?", req.Id).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("ConversionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
err = errors.New("account is nil")
return
}
device["android_id"] = req.Id
} else if req.Platform == "ios" && req.Idfa != "" {
_ = model.Where("idfa=?", req.Idfa).Scan(&adData)
} else if req.Platform == "ios" {
if req.Idfa != "" {
_ = model.Where("idfa=?", req.Idfa).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("ConversionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
return
if req.Id != "" {
_ = model.Where("adv_idfv=?", req.Id).Scan(&adData)
}
if len(adData) == 0 {
log.Printf("ConversionHugeAmount: adData is nil %s", gjson.MustEncodeString(req))
err = errors.New("account is nil")
return
}
}
device["idfv"] = req.Id
} else {
return nil, errors.New("")
err = errors.New("platform is error " + req.Platform)
return
}
if adData[0].CallbackParam == "" {
err = errors.New("callbackParam is nil")
return
}
// log.Printf("ConversionHugeAmount: adData: %s", gjson.MustEncodeString(adData))
ad := map[string]interface{}{
"callback": adData[0].CallbackParam,
}
@ -213,21 +261,32 @@ func ConversionHugeAmount(ctx context.Context, req *game.CSHAReq) (res *game.CSH
}
data["properties"] = properties
}
// log.Printf("ConversionHugeAmount: json.Unmarshal([]byte(req.Properties), &properties): %s", gjson.MustEncodeString(properties))
//log.Printf("ConversionHugeAmount: %s", gjson.MustEncodeString(data))
url := "https://analytics.oceanengine.com/api/v2/conversion"
_, _ = sendMsgHugeAmount(ctx, url, data)
tmp, err := sendMsgHugeAmount(ctx, url, data)
if err != nil {
return
}
json, err := gjson.DecodeToJson(tmp)
if json != nil && json.Get("code").Int() != 0 {
err = errors.New(json.Get("message").String())
}
return
}
func AdvertiseHugeAmount(ctx context.Context, req *game.AdvertiseHAReq) (res *game.AdvertiseHARes, err error) {
req.Platform = strings.ToLower(req.Platform)
log.Printf("AdvertiseHugeAmount: %s", gjson.MustEncodeString(req))
if req.Platform == "android" {
return
}
if req.Platform == "iphoneplayer" {
req.Platform = "ios"
}
go HugeAmount(ctx, req)
return
}
func HugeAmount(ctx context.Context, req *game.AdvertiseHAReq) {
req2 := game.CSHAReq{
Platform: req.Platform,
Id: req.Id,
@ -236,8 +295,11 @@ func AdvertiseHugeAmount(ctx context.Context, req *game.AdvertiseHAReq) (res *ga
Properties: req.Properties,
}
req2.Id = req.Id
_, err = ConversionHugeAmount(ctx, &req2)
_, err := ConversionHugeAmount(ctx, &req2)
if err != nil {
log.Printf("AdvertiseHugeAmount: ConversionHugeAmount err- %s, req: %s", err.Error(), gjson.MustEncodeString(req2))
return
}
req1 := game.ATHAReq{
Platform: req.Platform,
PackageName: req.PackageName,
@ -248,10 +310,12 @@ func AdvertiseHugeAmount(ctx context.Context, req *game.AdvertiseHAReq) (res *ga
} else if req.Platform == "ios" {
req1.Idfv = req.Id
} else {
log.Printf("AdvertiseHugeAmount: plarform err- %s, req.Platform: %s", err.Error(), req.Platform)
return
}
_, err = AttributionHugeAmount(ctx, &req1)
if err != nil {
log.Printf("AdvertiseHugeAmount: AttributionHugeAmount err- %s, req: %s", err.Error(), gjson.MustEncodeString(req1))
return
}
return

71
internal/serviceGame/loginUrl.go

@ -35,6 +35,7 @@ type IGameLoginUrl interface {
GetServerVersionList(ctx context.Context, req *game.GetServerVersionListReq) (res *game.GetServerVersionListRes, err error)
UpdateRouter(ctx context.Context, req *game.AddRouterReq) (res *game.AddRouterRes, err error)
ServerUpdateMsg(ctx context.Context, req *game.ServerUpdateMsgReq) (res *game.ServerUpdateMsgRes, err error)
ServerReloadDll(ctx context.Context, req *game.ServerReloadDllReq) (res *game.ServerReloadDllRes, err error)
}
type gameLoginUrlImpl struct {
@ -151,7 +152,7 @@ func (c *gameLoginUrlImpl) GetGameLoginUrl(ctx context.Context, req *game.GetGam
g.Log().Debugf(ctx, "GetWhiteList -> ", req.Account, gjson.MustEncodeString(list), ip)
err = g.Try(ctx, func(ctx context.Context) {
var LoginUrlList []*entity.GameLoginUrl
err = dao.GameLoginUrl.Ctx(ctx).Where("isShow=?", 1).Scan(&LoginUrlList)
err = dao.GameLoginUrl.Ctx(ctx).Scan(&LoginUrlList)
var unitData []*entity.GameUnit
if req.Account != "" {
err = dao.GameUnit.Ctx(ctx).Where("channel=?", req.Channel).Where("account=?", account).Scan(&unitData)
@ -178,29 +179,30 @@ func (c *gameLoginUrlImpl) GetGameLoginUrl(ctx context.Context, req *game.GetGam
}
channel += ";"
for _, v := range LoginUrlList {
if v.IsShow != 1 {
if !strings.Contains(v.Channel, channel) {
continue
}
if !strings.Contains(v.Channel, channel) {
if v.IsShow != 1 && !(utils.ContainsWhiteList(list, ip) || utils.ContainsWhiteList(list, req.Channel)) {
continue
}
var data = game.LoginUrlData{Id: v.Id, Host: v.Host, Port: v.Port, Difficulty: v.Difficulty, IsNew: v.IsNew,
Recommend: v.Recommend, Name: v.Name, State: v.State, Area: v.Area, CreateTime: v.CDate.Unix()}
if data.State == consts.Login_URL_STATE_WHITE {
if data.State == consts.Login_URL_STATE_Maintenance {
data.Host = consts.DEFAULT_HOST
} else if data.State == consts.Login_URL_STATE_WHITE {
if utils.ContainsWhiteList(list, ip) || utils.ContainsWhiteList(list, req.Channel) {
data.State = consts.Login_URL_STATE_NORMAL
} else {
data.State = consts.Login_URL_STATE_Maintenance
data.Host = consts.DEFAULT_HOST
}
}
if data.State == consts.Login_URL_STATE_BLACK {
if !utils.ContainsBlackList(blackList, req.Channel) || utils.ContainsWhiteList(list, ip) {
data.State = consts.Login_URL_STATE_NORMAL
} else {
data.State = consts.Login_URL_STATE_Maintenance
}
} else if data.State == consts.Login_URL_STATE_BLACK {
if utils.ContainsBlackList(blackList, req.Channel) || utils.ContainsBlackList(blackList, ip) {
data.Host = consts.DEFAULT_HOST
data.State = consts.Login_URL_STATE_Maintenance
} else {
data.State = consts.Login_URL_STATE_NORMAL
}
}
for _, v1 := range unitData {
@ -353,31 +355,23 @@ func (c *gameLoginUrlImpl) GetServerVersionList(ctx context.Context, req *game.G
}
func (c *gameLoginUrlImpl) ServerUpdateMsg(ctx context.Context, req *game.ServerUpdateMsgReq) (res *game.ServerUpdateMsgRes, err error) {
//url := "https://open.feishu.cn/open-apis/bot/v2/hook/4033c60d-08b4-4d28-8eab-1d4159df98ed"
//url := "https://open.feishu.cn/open-apis/bot/v2/hook/6c2ebace-6815-49a8-9964-eb580ec0a56b"
url := internal.Webhook
if len(url) == 0 {
return nil, errors.New("地址为空!")
}
normal_v2 := map[string]interface{}{"default": "normal", "pc": "normal", "mobile": "heading"}
text_size := map[string]interface{}{"normal_v2": normal_v2}
style := map[string]interface{}{"text_size": text_size}
normalV2 := map[string]interface{}{"default": "normal", "pc": "normal", "mobile": "heading"}
textSize := map[string]interface{}{"normal_v2": normalV2}
style := map[string]interface{}{"text_size": textSize}
config := map[string]interface{}{"update_multi": true, "style": style}
elements := []map[string]interface{}{
{
"tag": "markdown",
"content": req.Content,
"text_align": "left",
"text_size": "normal_v2",
"margin": "0px 0px 0px 0px",
},
}
elements := []map[string]interface{}{{"tag": "markdown", "content": req.Content, "text_align": "left", "text_size": "normal_v2", "margin": "0px 0px 0px 0px"}}
body1 := map[string]interface{}{"direction": "vertical", "padding": "12px 12px 12px 12px", "elements": elements}
title := map[string]interface{}{"tag": "plain_text", "content": req.Title}
subtitle := map[string]interface{}{"tag": "plain_text", "content": req.Subtitle}
header := map[string]interface{}{"title": title, "template": "blue", "subtitle": subtitle, "padding": "12px 12px 12px 12px"}
card := map[string]interface{}{"schema": "2.0", "config": config, "body": body1, "header": header}
body := map[string]interface{}{"msg_type": "interactive", "card": card}
fmt.Println("GetOnlineList - body: ", gjson.MustEncodeString(body))
bytes := g.Client().PostBytes(ctx, url, gjson.MustEncodeString(body))
src := string(bytes)
@ -397,3 +391,30 @@ func (c *gameLoginUrlImpl) ServerUpdateMsg(ctx context.Context, req *game.Server
}
return
}
func (c *gameLoginUrlImpl) ServerReloadDll(ctx context.Context, req *game.ServerReloadDllReq) (res *game.ServerReloadDllRes, err error) {
res = new(game.ServerReloadDllRes)
res.Message = "发送失败"
ip := internal.ServerConfig[fmt.Sprint(req.Server)]
url := "http://" + ip + "/ReloadDll"
bytes := g.Client().GetBytes(ctx, url)
fmt.Println("ServerReloadDll: ", url, bytes)
src := string(bytes)
if g.IsEmpty(src) {
fmt.Println("ServerReloadDll: IsEmpty(src) err", url)
return
}
srcCharset := "UTF-8"
tmp, _ := gcharset.ToUTF8(srcCharset, src)
json, err := gjson.DecodeToJson(tmp)
if err != nil {
fmt.Println("ServerReloadDll: DecodeToJson(tmp) err", url)
return
}
fmt.Println("ReloadDll - json: ", tmp)
if json.Get("Error").Int() == 200 {
res.Message = "发送成功"
}
return
}

1
test/test.go

@ -24,6 +24,7 @@ const link = "mongodb://127.0.0.1:27017/PeachValley"
const notAccount = false
func main() {
//fmt.Println("参数: ", len(os.Args))
var model string

69
test/testMongo.go

@ -0,0 +1,69 @@
package main
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/qiniu/qmgo"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"log"
)
var (
MongoDatabaseList map[string]*qmgo.Database
)
func main() {
ctx := context.Background()
initMongo(ctx)
for k, _ := range MongoDatabaseList {
findUnit(ctx, k)
}
}
func initMongo(ctx context.Context) {
mongoCfg, err := g.Cfg().Get(ctx, "game.mongo")
if err != nil {
return
}
config := mongoCfg.Maps()
MongoDatabaseList = map[string]*qmgo.Database{}
for _, v := range config {
mongoclient, err := qmgo.NewClient(ctx, &qmgo.Config{Uri: v["link"].(string)})
if err != nil {
log.Println("数据库: ", v["id"], ", 创建错误:", err.Error())
continue
}
db := mongoclient.Database(v["name"].(string))
MongoDatabaseList[v["id"].(string)] = db
}
}
func findUnit(ctx context.Context, serverId string) {
query := bson.M{"$and": bson.A{bson.M{"Children.ConfigId": 845}, bson.M{"Children.Amount": bson.M{"$gt": 1000000}}}}
selectStores(ctx, serverId, query)
}
func selectStores(ctx context.Context, serverId string, query bson.M) {
stores := []map[string]interface{}{}
MongoDatabaseList[serverId].Collection("StoreComponent").Find(ctx, query).All(&stores)
if len(stores) == 0 {
log.Printf("服务器编号[%s] 不存在数量!", serverId)
return
}
log.Printf("服务器编号[%s] 搜素长度: %d", serverId, len(stores))
for _, v := range stores {
store := v["Children"].(primitive.A)
for _, v1 := range store {
item := v1.(map[string]interface{})
if item["ConfigId"].(int32) == 845 && item["Amount"].(int32) > 1000000 {
log.Printf("服务器编号: %s, id: %d, 物品: %d, 数量: %d", serverId, v["_id"], item["ConfigId"], item["Amount"])
break
}
}
}
log.Printf("服务器编号[%s] 结束!", serverId)
}
Loading…
Cancel
Save