package serviceGame import ( "context" "errors" "fmt" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" "log" "time" "tyj_admin/api/v1/game" "tyj_admin/internal/consts" "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) GetNoticeList(ctx context.Context, req *game.GetNoticeListReq) (res *game.GetNoticeListRes, err error) AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error) DelNoticeLog(ctx context.Context, req *game.DelNoticeLogReq) (res *game.DelNoticeLogRes, err error) DelNoticeList(ctx context.Context, req *game.DelNoticeListReq) (res *game.DelNoticeListRes, 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) GetGameNoticeList(ctx context.Context, req *game.GetGameNoticeListReq) (res *game.GetGameNoticeListRes, err error) GetGameNoticeLog(ctx context.Context, req *game.GetGameNoticeLogReq) (res *game.GetGameNoticeLogRes, err error) GetNoticeModel(ctx context.Context, req *game.GetNoticeModelReq) (res *game.GetNoticeModelRes, err error) AddNoticeModel(ctx context.Context, req *game.AddNoticeModelReq) (res *game.AddNoticeModelRes, err error) DelNoticeModel(ctx context.Context, req *game.DelNoticeModelReq) (res *game.DelNoticeModelRes, 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(¬iceList) if len(noticeList) >= 1 { res.Content = noticeList[0].Content res.Status = noticeList[0].Status res.Id = noticeList[0].Id } else { return } //if res.Status == consts.Notice_White_List { // ip := libUtils.GetClientIp(ctx) // count := GameWhiteList().GetWhiteList(ctx, ip) // res.Status = consts.Notice_Maintenance // if count == consts.White_List_Belong { // res.Status = consts.Notice_Normal // } //} }) return } func (c *gameNoticeImpl) GetNoticeList(ctx context.Context, req *game.GetNoticeListReq) (res *game.GetNoticeListRes, err error) { res = new(game.GetNoticeListRes) err = g.Try(ctx, func(ctx context.Context) { model := dao.GameNotice.Ctx(ctx) if req.NoticeType != 0 { model = model.Where("notice_type=?", req.NoticeType) } err = model.Page(req.PageNum, req.PageSize).Scan(&res.List) res.Total, err = model.Count() return }) 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) ip := libUtils.GetClientIp(ctx) fmt.Println("ip: ", ip) var ipList []*entity.GameNotice err = model.Where("channel=?", ip).Scan(&ipList) if len(ipList) > 0 { res.TimeStamp = int32(ipList[0].CDate) res.Content = ipList[0].Content res.Status = ipList[0].Status g.Log().Debugf(ctx, "ipList GetGameNotice ip: "+ip, "NoticeType: "+fmt.Sprint(req.NoticeType), "res: "+fmt.Sprint(res.Status)) return } if req.NoticeType == consts.Notice_Type_Pop { model = model.Where("server=? ", req.ServerId) } else { 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) if req.NoticeType == consts.Notice_Type_Pop { model = model.Where("server=? ", 0) } else { model = model.Where("channel=? ", "") } } err = model.Scan(¬iceList) if len(noticeList) > 1 { for _, v := range noticeList { if v.Channel == req.Channel { res.TimeStamp = int32(v.CDate) res.Content = v.Content res.Status = v.Status break } } } else if len(noticeList) == 1 { res.TimeStamp = int32(noticeList[0].CDate) res.Content = noticeList[0].Content res.Status = noticeList[0].Status } else if len(noticeList) == 0 { res.TimeStamp = 0 res.Content = "" res.Status = consts.Notice_Normal } if req.NoticeType == consts.Notice_Type_Pop { } else { if res.Status == consts.Notice_White_List { whiteIps, e := internal.GetWhiteList(ctx) g.Log().Debugf(ctx, "GetGameNotice ip"+ip, len(whiteIps), e) res.Status = consts.Notice_Maintenance for _, v := range whiteIps { if v.Ip == ip { res.Status = consts.Notice_Normal break } } } if req.NoticeType != consts.Notice_Type_Maintenance { res.Status = consts.Notice_Normal } } g.Log().Debugf(ctx, "GetGameNotice ip: "+ip, "NoticeType: "+fmt.Sprint(req.NoticeType), "res: "+fmt.Sprint(res.Status)) }) return } func (c *gameNoticeImpl) GetGameNoticeList(ctx context.Context, req *game.GetGameNoticeListReq) (res *game.GetGameNoticeListRes, err error) { res = new(game.GetGameNoticeListRes) g.Try(ctx, func(ctx context.Context) { req1 := new(game.GetGameNoticeReq) req1.NoticeType = consts.Notice_Type_Login req1.Channel = req.Channel res1, _ := c.GetGameNotice(ctx, req1) res.List = append(res.List, game.Notice{Content: res1.Content, Status: res1.Status, TimeStamp: res1.TimeStamp, NoticeType: consts.Notice_Type_Login}) req1.NoticeType = consts.Notice_Type_Preview req1.Channel = req.Channel res2, _ := c.GetGameNotice(ctx, req1) res.List = append(res.List, game.Notice{Content: res2.Content, Status: res2.Status, TimeStamp: res2.TimeStamp, NoticeType: consts.Notice_Type_Preview}) log.Printf("GetGameNotice res: %s", gjson.MustEncodeString(res.List)) }) return } func (c *gameNoticeImpl) GetGameNoticeLog(ctx context.Context, req *game.GetGameNoticeLogReq) (res *game.GetGameNoticeLogRes, err error) { res = new(game.GetGameNoticeLogRes) g.Try(ctx, func(ctx context.Context) { model := dao.GameNoticeLog.Ctx(ctx) if req.NoticeType != 0 { model = model.Where("notice_type=", req.NoticeType) } if req.Content != "" { model = model.Where("content LIKE ?", "%"+req.Content+"%") } if req.BeginTime != 0 { model = model.Where("c_date >", gtime.NewFromTimeStamp(req.BeginTime)) } if req.EndTime != 0 { model = model.Where("c_date <", gtime.NewFromTimeStamp(req.EndTime)) } //log.Printf("1model ", req, model) res.Total, err = model.Count() if res.Total != 0 { model = model.Page(req.PageNum, req.PageSize) //log.Printf("model ", req, model) err = model.OrderDesc("c_date").Scan(&res.NoticeLog) } }) return } func (c *gameNoticeImpl) AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error) { SendTime := req.SendTime data := do.GameNoticeLog{ Status: req.Status, Content: req.Content, NoticeType: req.NoticeType, NoticeId: req.NoticeId, Channel: req.Channel, SendTime: SendTime, } cron := entity.GameNoticeLog{ Id: req.Id, Status: req.Status, Content: req.Content, NoticeType: req.NoticeType, NoticeId: req.NoticeId, Channel: req.Channel, SendTime: SendTime, } if req.Id > 0 { err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNoticeLog.Ctx(ctx).Where("id=", req.Id).Data(&data).Update() if e != nil { liberr.ErrIsNil(ctx, e, "更新通知失败") return } if SendTime > time.Now().UnixMilli() { GameCron().AddCron(cron) } fmt.Println("req >>>>>>>>>> ", req) return }) } else { err = g.Try(ctx, func(ctx context.Context) { logId, e := dao.GameNoticeLog.Ctx(ctx).Insert(&data) if e != nil { liberr.ErrIsNil(ctx, e, "插入通知日志失败") return } id, e := logId.LastInsertId() if e != nil { liberr.ErrIsNil(ctx, e, "插入通知日志失败") return } cron.Id = id fmt.Println("logId >>>>>>>>>> ", logId) if SendTime <= time.Now().UnixMilli() { noticeModel := dao.GameNotice.Ctx(ctx) noticeList := []entity.GameNotice{} noticeModel.Where("notice_type=?", req.NoticeType).Where("channel=?", req.Channel).Scan(¬iceList) if len(noticeList) > 0 { _, e = noticeModel.Where("id=?", noticeList[0].Id).Data(&do.GameNotice{ Status: req.Status, Content: req.Content, CDate: time.Now().Unix(), }).Update() } else { _, e = noticeModel.Insert(&do.GameNotice{ Status: req.Status, Content: req.Content, NoticeType: req.NoticeType, Channel: req.Channel, CDate: time.Now().Unix(), }) } } else { GameCron().AddCron(cron) fmt.Println("logId >>>>>>>>>> ", cron.Id, e) } liberr.ErrIsNil(ctx, e, "插入通知失败") }) } return } func (c *gameNoticeImpl) DelNoticeLog(ctx context.Context, req *game.DelNoticeLogReq) (res *game.DelNoticeLogRes, err error) { if req.Id == 0 { err = errors.New("错误的id") return } err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNoticeLog.Ctx(ctx).Where("id=", req.Id).Delete() if e != nil { liberr.ErrIsNil(ctx, e, "删除通知失败") return } GameCron().DelCron(req.Id) }) return } func (c *gameNoticeImpl) DelNoticeList(ctx context.Context, req *game.DelNoticeListReq) (res *game.DelNoticeListRes, err error) { if req.Id == 0 { err = errors.New("错误的id") return } err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNotice.Ctx(ctx).Where("id=", req.Id).Delete() if e != nil { liberr.ErrIsNil(ctx, e, "删除通知失败") return } GameCron().DelCron(req.Id) }) return } func (c *gameNoticeImpl) PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error) { err = g.Try(ctx, func(ctx context.Context) { if req.PopTo == 1 || req.Type == consts.Notice_Pop_Roll || req.Type == consts.Notice_Pop_Roll_Del { req.Uids = "" } _, e := dao.GameNoticeLog.Ctx(ctx).Insert(&do.GameNoticeLog{ Status: 0, ServerId: req.ServerId, Uids: req.Uids, PopType: req.Type, Content: req.Content, NoticeType: consts.Notice_Type_Pop, NoticeId: 0, Channel: "", SendTime: 0, }) if e != nil { liberr.ErrIsNil(ctx, e, "插入通知日志失败") return } err = internal.BackStageMessage(ctx, req.ServerId, req.Uids, req.Content, req.Type) if err == nil && req.Type == consts.Notice_Pop_Roll { dao.GameNotice.Ctx(ctx).Delete(do.GameNotice{NoticeType: consts.Notice_Type_Pop, ServerId: req.ServerId}) dao.GameNotice.Ctx(ctx).Insert(&do.GameNotice{ Status: 1, Content: req.Content, Channel: "", NoticeType: consts.Notice_Type_Pop, ServerId: req.ServerId, CDate: time.Now().Unix(), }) } if err == nil && req.Type == consts.Notice_Pop_Roll_Del { dao.GameNotice.Ctx(ctx).Delete(do.GameNotice{NoticeType: consts.Notice_Type_Pop, ServerId: req.ServerId}) } }) return } func (c *gameNoticeImpl) GetNoticeModel(ctx context.Context, req *game.GetNoticeModelReq) (res *game.GetNoticeModelRes, err error) { res = new(game.GetNoticeModelRes) g.Try(ctx, func(ctx context.Context) { model := dao.GameNoticeModel.Ctx(ctx) model = model.Where("notice_type = ?", req.NoticeType) err = model.Scan(&res.NoticeModel) }) return } func (c *gameNoticeImpl) AddNoticeModel(ctx context.Context, req *game.AddNoticeModelReq) (res *game.AddNoticeModelRes, err error) { if req.Id > 0 { err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNoticeModel.Ctx(ctx).Where("id=", req.Id).Data(&do.GameNoticeModel{ Title: req.Title, Content: req.Content, }).Update() liberr.ErrIsNil(ctx, e, "修改通知失败") }) } else { err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNoticeModel.Ctx(ctx).Data(&do.GameNoticeModel{ Title: req.Title, Content: req.Content, NoticeType: req.NoticeType, ModelType: req.ModelType, }).Insert() liberr.ErrIsNil(ctx, e, "插入通知失败") }) } return } func (c *gameNoticeImpl) DelNoticeModel(ctx context.Context, req *game.DelNoticeModelReq) (res *game.DelNoticeModelRes, err error) { if req.Id > 0 { err = g.Try(ctx, func(ctx context.Context) { _, e := dao.GameNoticeModel.Ctx(ctx).Where("id=", req.Id).Delete() liberr.ErrIsNil(ctx, e, "删除通知失败") }) } else { return res, errors.New("删除通知失败") } return }