using Org.BouncyCastle.Ocsp; using ProtoCSStruct; using Sog; using System; namespace Game { public class HomeAdHandler : BasePacketHandler { public override void Dispose() { } public override int GetServiceType() { return GameServiceType.HomeAdHandler; } public override void HandlerClientPacket(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error($"HomeAdHandler.HandlerClientPacket player is null sessionid {playerSession.SessionID}"); return; } switch (packet.MsgID) { case (int)CSGameMsgID.AdGetInfoReq: //获取信息 OnAdGetInfo(player, packet); break; case (int)CSGameMsgID.HomeadAdPassReq: OnHomeadAdPassReq(player, packet); break; case (int)CSGameMsgID.AdStartReq: OnADStart(player, packet); break; case (int)CSGameMsgID.AdEndReq: OnADEnd(player, packet); break; default: break; } } public override void HandlerServerPacket(uint serverID, StructPacket packet) { switch (packet.MsgID) { case (int)SSGameMsgID.HomeAdSendAwardSyn: OnCallBackHomeAdSendAwardSyn(serverID, packet); break; } } private void OnCallBackHomeAdSendAwardSyn(uint serverID, StructPacket packet) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(packet.ObjectID); if (player == null) { TraceLog.Error("HomeAdHandler.OnCallBackHomeAdSendAwardSyn player is null:{0}", packet.ObjectID); return; } var type = player.RoleData.HomeAd.AdvId; OnHomeAdSendAwardSyn(player, type); } private void OnHomeAdSendAwardSyn(PlayerOnGame player, int advId) { //判断次数,冷却 AdvertisementConfigDesc infoDesc = AdvertisementConfigDescMgr.Instance.GetConfigByInternal(advId); if (infoDesc == null) { TraceLog.Error("HomeAdHandler.OnHomeAdSendAwardSyn noConf userId {0} type {1}", player.UserID, advId); return; } int index = -1; for (int i = 0; i < player.RoleData.HomeAd.Infos.Count; i++) { if (player.RoleData.HomeAd.Infos[i].Id == advId) { index = i; break; } } long nowTime = GameServerUtils.GetTimeSecond(); if (index != -1) { var times=HomeAdSvc.GetAdvTimes(player, infoDesc); if (player.RoleData.HomeAd.Infos[index].GetCount >=times) { TraceLog.Error( "HomeAdHandler.OnHomeAdSendAwardSyn adverTimes userId {0} type {1} index {2} AdId {3} GetCount {4} adverTimes {5}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString(), player.RoleData.HomeAd.Infos[index].GetCount, times); return; } if (player.RoleData.HomeAd.Infos[index].ColdTime > nowTime) { TraceLog.Error( "HomeAdHandler.OnHomeAdSendAwardSyn coldTime userId {0} type {1} index {2} AdId {3} ColdTime {4} nowTime {5}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString(), player.RoleData.HomeAd.Infos[index].ColdTime, nowTime); return; } } TraceLog.Trace("HomeAdHandler.OnHomeAdSendAwardSyn into userId {0} type {1} index {2} AdId {3}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString()); //发送广告已经播放完毕的协议 CSHomeAdLoadSyn adEndSyn = new CSHomeAdLoadSyn(); adEndSyn.AdToken.SetString(player.RoleData.HomeAd.AdvToken.GetString()); player.SendToClient((int)CSGameMsgID.HomeadAdLoadSyn, ref adEndSyn); TraceLog.Trace("HomeAdHandler.OnHomeAdSendAwardSyn res userId {0} type {1} index {2} AdId {3}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString()); //添加次数,刷新冷却 if (index == -1) { DBADInfo tempData = new DBADInfo(); tempData.Id = advId; tempData.ColdTime = nowTime + infoDesc.adverCd; tempData.GetCount = 1; player.RoleData.HomeAd.Infos.Add(ref tempData); TraceLog.Trace( "HomeAdHandler.OnHomeAdSendAwardSyn add userId {0} type {1} index {2} AdId {3} GetCount {4} ColdTime {5}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString(), tempData.GetCount, tempData.ColdTime); } else { player.RoleData.HomeAd.Infos[index].ColdTime = nowTime + infoDesc.adverCd; player.RoleData.HomeAd.Infos[index].GetCount += 1; TraceLog.Trace( "HomeAdHandler.OnHomeAdSendAwardSyn add userId {0} type {1} index {2} AdId {3} GetCount {4} ColdTime {5}", player.UserID, advId, index, player.RoleData.HomeAd.AdvToken.GetString(), player.RoleData.HomeAd.Infos[index].GetCount, player.RoleData.HomeAd.Infos[index].ColdTime); } player.RoleData.HomeAd.AdvId = 0; HomeAdSvc.SendAdInfo(player); HomeAdSvc.SendAdvReward(player, infoDesc.InternalId); player.MakeDirty(); } private void OnHomeadAdPassReq(PlayerOnGame player, StructPacket packet) { ref CSHomeAdPassReq req = ref packet.GetMessage(); CSHomeAdPassRes res = new CSHomeAdPassRes(); res.Type = req.Type; //判断次数,冷却 AdvertisementConfigDesc infoDesc = AdvertisementConfigDescMgr.Instance.GetConfigByInternal(req.Type); if (infoDesc == null) return; int index = -1; for (int i = 0; i < player.RoleData.HomeAd.Infos.Count; i++) { if (player.RoleData.HomeAd.Infos[i].Id == req.Type) { index = i; break; } } long nowTime = GameServerUtils.GetTimeSecond(); if (index != -1) { if ((player.RoleData.HomeAd.Infos[index].GetCount >= HomeAdSvc.GetAdvTimes(player,infoDesc)) || (req.Type != 2 && player.RoleData.HomeAd.Infos[index].ColdTime > nowTime)) { res.Type = (int)CSErrCode.Fail; } else { res.Ret = HomeAdSvc.PassAd(player, req.Type); //添加次数 if (res.Ret == (int)CSErrCode.None) { if (req.Type != 2) player.RoleData.HomeAd.Infos[index].ColdTime = nowTime + infoDesc.adverCd; player.RoleData.HomeAd.Infos[index].GetCount += 1; } } } else { res.Ret = CSErrCode.Fail; } HomeAdSvc.SendAdInfo(player); player.SendToClient((int)CSGameMsgID.HomeadAdPassRes, ref res); TraceLog.Trace("HomeAdHandler.OnHomeadAdPassReq userId {0} type {1} index {2}", player.UserID, req.Type, index); } private void OnADStart(PlayerOnGame player, StructPacket packet) { ref CSAdStartReq req = ref packet.GetMessage(); CSAdStartRes res = new CSAdStartRes(); player.RoleData.HomeAd.AdvId = req.AdInternalId; player.RoleData.HomeAd.AdvToken.SetString(req.AdvCode.GetString()); TraceLog.Trace("HomeAdHandler.OnADStart userId {0} type {1} AdID {2}", player.UserID, req.AdInternalId, req.AdvCode); player.SendToClient((int)CSGameMsgID.AdStartRes, ref res); var httpReq = new SSHomeAdSendHttpSyn(); GameServerUtils.GetPacketSender() .SendToWorldServer((int)SSGameMsgID.HomeAdSendHttpSyn, ref httpReq, player.UserID); } private void OnADEnd(PlayerOnGame player, StructPacket packet) { CSAdEndRes res = new CSAdEndRes(); OnHomeAdSendAwardSyn(player, player.RoleData.HomeAd.AdvId); player.SendToClient((int)CSGameMsgID.AdEndRes, ref res); } private void OnAdGetInfo(PlayerOnGame player, StructPacket packet) { ref CSAdGetInfoReq req = ref packet.GetMessage(); HomeAdSvc.SendAdInfo(player, req.Id); //将登录天数逻辑在这里发送,因为在登录时候发送前端无法解析 HomeAdSvc.CheckLoginCount(player); } } }