You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.4 KiB

package serviceGame
import (
"context"
"encoding/json"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"tyj_admin/api/v1/game"
"tyj_admin/internal/dao"
"tyj_admin/internal/model/do"
"tyj_admin/internal/model/entity"
"tyj_admin/internal/serviceGame/internal"
"tyj_admin/library/libUtils"
"tyj_admin/library/liberr"
)
type IGameNotice interface {
GetNotice(ctx context.Context, req *game.GetNoticeReq) (res *game.GetNoticeRes, err error)
AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error)
PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error)
GetGameNotice(ctx context.Context, req *game.GetGameNoticeReq) (res *game.GetGameNoticeRes, err error)
}
type gameNoticeImpl struct {
}
var gameNoticeService = gameNoticeImpl{}
func GameNotice() IGameNotice {
return &gameNoticeService
}
func (c *gameNoticeImpl) GetNotice(ctx context.Context, req *game.GetNoticeReq) (res *game.GetNoticeRes, err error) {
internal.GetWhiteList(ctx)
res = new(game.GetNoticeRes)
g.Try(ctx, func(ctx context.Context) {
model := dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", req.Channel)
var noticeList []*entity.GameNotice
err = model.Scan(&noticeList)
if len(noticeList) >= 1 {
res.Content = noticeList[0].Content
res.Status = noticeList[0].Status
res.Id = noticeList[0].Id
} else {
return
}
if res.Status == 2 {
//ip := libUtils.GetClientIp(ctx)
//whiteIps := internal.GetWhiteList(ctx)
//res.Status = 3
//for _, v := range whiteIps {
// if v == ip {
// res.Status = 1
// break
// }
//}
}
})
return
}
func (c *gameNoticeImpl) GetGameNotice(ctx context.Context, req *game.GetGameNoticeReq) (res *game.GetGameNoticeRes, err error) {
res = new(game.GetGameNoticeRes)
g.Try(ctx, func(ctx context.Context) {
model := dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", req.Channel)
var noticeList []*entity.GameNotice
var count int
count, err = model.Count()
if count == 0 {
model = dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", 0)
}
err = model.Scan(&noticeList)
if len(noticeList) > 1 {
for _, v := range noticeList {
if v.Channel == req.Channel {
res.Content = v.Content
res.Status = v.Status
break
}
}
} else if len(noticeList) == 1 {
res.Content = noticeList[0].Content
res.Status = noticeList[0].Status
res.Id = noticeList[0].Id
} else if len(noticeList) == 0 {
res.Content = ""
res.Status = 1
res.Id = 0
}
if res.Status == 2 {
ip := libUtils.GetClientIp(ctx)
whiteIps, e := internal.GetWhiteList(ctx)
g.Log().Debugf(ctx, "ip"+ip, len(whiteIps), e)
for _, v := range whiteIps {
g.Log().Debugf(ctx, "whiteIps"+v)
}
res.Status = 3
for _, v := range whiteIps {
if v == ip {
res.Status = 1
break
}
}
}
})
return
}
func (c *gameNoticeImpl) AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error) {
if req.Id > 0 {
err = g.Try(ctx, func(ctx context.Context) {
_, e := dao.GameNotice.Ctx(ctx).Where("id=", req.Id).Data(&do.GameNotice{
Status: req.Status,
Content: req.Content,
}).Update()
liberr.ErrIsNil(ctx, e, "修改通知失败")
})
} else {
err = g.Try(ctx, func(ctx context.Context) {
_, e := dao.GameNotice.Ctx(ctx).Where("id=", req.Id).Insert(&do.GameNotice{
Status: req.Status,
Content: req.Content,
NoticeType: req.NoticeType,
Channel: req.Channel,
})
liberr.ErrIsNil(ctx, e, "插入通知失败")
})
}
return
}
func (c *gameNoticeImpl) PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error) {
mqttNotice := internal.MqttNotice{}
mqttNotice.Body.Uid = req.Uids
mqttNotice.Body.ModuleType = "broadcastMessage"
mqttNotice.Body.Content = req.Content
mqttNotice.Body.Time = 0
mqttNotice.Body.Type = req.Type
mqttNotice.ModuleId = "webadmin"
mqttNotice.ReqId = 1
var js []byte
js, err = json.Marshal(mqttNotice)
connectCh := make(chan bool)
server := "192.168.2.100:3005"
defer close(connectCh)
internal.SendMqtt(js, connectCh, server)
var result bool
for {
select {
case result = <-connectCh:
if result == false {
err = gerror.New("失败")
return
} else {
return
}
}
}
}