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.
 
 
 
 
 
 

865 lines
33 KiB

using System;
using System.Collections.Generic;
using Sog;
using ProtoCSStruct;
namespace Mail
{
public static class MailOp
{
public static int MaxMailCount = 149; //上限150
private static uint DeleteFirstTypeMail(ref DBMailBlob blob, int type)
{
uint delId = 0;
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailType == type)
{
TraceLog.Debug("MailOp.DeleteFirstTypeMail delete mail {0} type {1} for uid {2}"
, mail.MailID, mail.MailType, mail.Uid);
delId = blob.MailList[i].MailID;
blob.MailList.RemoveAt(i);
break;
}
}
return delId;
}
/// <summary>
/// 邮件满了的话删除一些邮件
/// </summary>
/// <param name="blob"></param>
/// <param name="uid"></param>
/// <returns>是否有变化</returns>
private static bool DeleteSomeMailWhenFull(ref DBMailBlob blob, long uid, out List<uint> mailIds)
{
mailIds = new List<uint>();
long nowSecond = MailServerUtils.GetApp().GetTimeSecond();
bool changed = false;
//删除超过14天的过期邮件,不管邮件有没有领取
//var delDay = 14;
for (int i = blob.MailList.Count - 1; i >= 0; i--)
{
var mail = blob.MailList[i];
if (mail.ExpirationTime > 0 && nowSecond > mail.ExpirationTime /*|| nowSecond - mail.SendTime > delDay * 24 * 3600*/)
{
TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout mail {0} for uid {1}", mail.MailID, uid);
mailIds.Add(mail.MailID);
blob.MailList.RemoveAt(i);
changed = true;
continue;
}
if (mail.Status > 0 || mail.GetItemTime > 0)
{
if (mail.GetItemTime > 0 && nowSecond > mail.GetItemTime + AppTime.SECONDS_ADAY)
{
TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout mail {0} for uid {1}", mail.MailID, uid);
mailIds.Add(mail.MailID);
blob.MailList.RemoveAt(i);
changed = true;
continue;
}
}
}
//删除已经删除的邮件
for (int i = blob.MailList.Count - 1; i >= 0; i--)
{
var mail = blob.MailList[i];
if (mail.DeleteTime != 0)
{
TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout DeleteTime mail {0} for uid {1}", mail.MailID, uid);
mailIds.Add(mail.MailID);
blob.MailList.RemoveAt(i);
changed = true;
}
}
//如果还超过100封邮件,尝试删除一些好友送筹码邮件,因为这个不是很重要,最多删除MaxMailCount封邮件
//for (int i = 0; i < MaxMailCount; i++)
//{
// if (blob.MailList.Count > MaxMailCount)
// {
// uint delId = DeleteFirstTypeMail(ref blob, (int)MailType.FriendGiftDaily);
// if (delId > 0)
// {
// mailIds.Add(delId);
// }
// changed = true;
// }
// else
// {
// break;
// }
//}
////删除已经领取完的邮件
//if (blob.MailList.Count >= MaxMailCount)
//{
// for (int i = blob.MailList.Count - 1; i >= 0; i--)
// {
// var mail = blob.MailList[i];
// if (mail.GetItemTime != 0)
// {
// TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout DeleteTime mail {0} for uid {1}", mail.MailID, uid);
// mailIds.Add(mail.MailID);
// blob.MailList.RemoveAt(i);
// changed = true;
// }
// }
//}
////删除没有附件的已读邮件
//if (blob.MailList.Count >= MaxMailCount)
//{
// for (int i = blob.MailList.Count - 1; i >= 0; i--)
// {
// var mail = blob.MailList[i];
// if (mail.Status != 0
// && mail.AddGoods.Count == 0)
// {
// TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout DeleteTime mail {0} for uid {1}", mail.MailID, uid);
// mailIds.Add(mail.MailID);
// blob.MailList.RemoveAt(i);
// changed = true;
// }
// }
//}
////删除没有附件的邮件
//if (blob.MailList.Count >= MaxMailCount)
//{
// for (int i = blob.MailList.Count - 1; i >= 0; i--)
// {
// var mail = blob.MailList[i];
// if ( mail.AddGoods.Count == 0)
// {
// TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete timeout DeleteTime mail {0} for uid {1}", mail.MailID, uid);
// mailIds.Add(mail.MailID);
// blob.MailList.RemoveAt(i);
// changed = true;
// }
// }
//}
//如果还超过MaxMailCount封邮件,则删除最老的
while (blob.MailList.Count >= MaxMailCount)
{
var mail = blob.MailList[0];
TraceLog.Debug("MailOp.DeleteSomeMailWhenFull delete to much mail {0} for uid {1}", mail.MailID, uid);
mailIds.Add(mail.MailID);
blob.MailList.RemoveAt(0);
changed = true;
}
return changed;
}
//有些邮件每日限制
public static bool MailTypeDailyLimited(ref DBMailBlob blob, int newMailType, out bool bChange)
{
bChange = false;
long nowSecond = MailServerUtils.GetTimeSecond();
//reset
if (AppTime.IsSameDay(nowSecond, blob.TodayResetTime) == false)
{
bChange = true;
blob.TodayResetTime = nowSecond;
blob.InviteeSuccessMailCount = 0;
blob.FriendDailyChipMailCount = 0;
}
//好友每天送钱有限制
if (newMailType == (int)MailType.FriendGiftDaily
&& blob.FriendDailyChipMailCount >= 20)
{
return true;
}
return false;
}
public static void OnQueryMailReq(uint remoteAppID, StructPacket packet, MailDBOperator dbOperator)
{
ref SSQueryMailReq req = ref packet.GetMessage<SSQueryMailReq>();
SSQueryMailRes res = new SSQueryMailRes();
DBMailBlob blob = new DBMailBlob();
int ret = dbOperator.QueryMail(req.Uid, ref blob);
if (ret == -1)
{
TraceLog.Error("MailOp.OnQueryMailReq failed uid {0}", req.Uid);
return;
}
//没有记录则创建,其他人有可能立即会往我这里发送邮件
if (ret == 1)
{
blob = new DBMailBlob();
blob.LastSeq = 0;
bool bSuccess = dbOperator.InsertMail(req.Uid, ref blob);
if (bSuccess == false)
{
//系统严重错误,不应该
TraceLog.Error("MailOp.OnQueryMailReq insert mail failed uid {0}", req.Uid);
return;
}
}
else
{
bool changed = DeleteSomeMailWhenFull(ref blob, req.Uid, out List<uint> delIds);
if (changed)
{
bool bSuccess = dbOperator.UpdateMail(req.Uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.OnQueryMailReq update mail failed uid {0}", req.Uid);
return;
}
}
}
res.Uid = req.Uid;
long nowTime = MailServerUtils.GetApp().GetTimeSecond();
bool needUpdateMail = false;
//过滤已经删除的邮件或者过期的邮件
for (int i = 0; i < blob.MailList.Count; i++)
{
ref var mail = ref blob.MailList[i];
if (mail.DeleteTime == 0)
{
if (mail.ExpirationTime > 0 && mail.ExpirationTime <= nowTime)
{
//删除过期但是未删除的邮件
mail.DeleteTime = nowTime;
needUpdateMail = true;
continue;
}
res.MailList.Add(ref mail);
}
}
if (needUpdateMail)
{
bool bSuccess = dbOperator.UpdateMail(req.Uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.OnQueryMailReq delete Expiration mail failed uid {0}", req.Uid);
}
}
//SSQueryMailVersionRes verRes = new SSQueryMailVersionRes
//{
// Uid = req.Uid,
// Version = blob.LastVer,
//};
//MailServerUtils.SendMsgToSelf(remoteAppID,
// (int)SSGameMsgID.QueryMailVersionRes, ref verRes, packet.ObjectID);
MailServerUtils.GetPacketSender().SendToServerByID(remoteAppID,
(int)SSGameMsgID.QueryMailRes, ref res, packet.ObjectID);
}
public static void OnOperationQueryMailReq(uint remoteAppID, StructPacket packet, MailDBOperator dbOperator)
{
ref SSOperationSearchMailReq req = ref packet.GetMessage<SSOperationSearchMailReq>();
SSOperationSearchMailRes res = new SSOperationSearchMailRes();
res.Id = req.Id;
DBMailBlob blob = new DBMailBlob();
int ret = dbOperator.QueryMail(req.Uid, ref blob);
if (ret == -1)
{
res.Ret = ret;
MailServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.OperationMailSearchRes, ref res, packet.ObjectID);
TraceLog.Error("MailOp.OnQueryMailReq failed uid {0}", req.Uid);
return;
}
res.Uid = req.Uid;
long nowTime = MailServerUtils.GetApp().GetTimeSecond();
for (int i = 0; i < blob.MailList.Count; i++)
{
var mail = blob.MailList[i];
if (mail.DeleteTime == 0)
{
if (mail.ExpirationTime > 0 && mail.ExpirationTime <= nowTime)
{
continue;
}
if(res.Mails.Count>=res.Mails.GetMaxCount()){
break;
}
res.Mails.Add(ref mail);
}
}
MailServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.OperationMailSearchRes, ref res, packet.ObjectID);
}
public static void OnQueryMailVersionReq(uint remoteAppID, StructPacket packet, MailDBOperator dbOperator)
{
ref SSQueryMailVersionReq req = ref packet.GetMessage<SSQueryMailVersionReq>();
SSQueryMailVersionRes res = new SSQueryMailVersionRes();
DBMailBlob blob = new DBMailBlob();
int ret = dbOperator.QueryMail(req.Uid, ref blob);
if (ret == -1)
{
TraceLog.Error("MailOp.OnQueryMailVersionReq failed uid {0} ret {1}", req.Uid, ret);
return;
}
res.Uid = req.Uid;
res.Version = blob.LastVer;
MailServerUtils.SendMsgToSelf(remoteAppID,
(int)SSGameMsgID.QueryMailVersionRes, ref res, packet.ObjectID);
}
public static void OnMailOpReq(uint remoteAppID, StructPacket packet, MailDBOperator dbOperator)
{
ref SSMailOpReq req = ref packet.GetMessage<SSMailOpReq>();
long uid = req.Mail.Uid;
long mailID = req.Mail.MailID;
SSMailOpRes res = new SSMailOpRes();
res.AckGameServerID = req.AckGameServerID;
res.ClientOpUid = req.ClientOpUid;
res.Mail = req.Mail;
res.OpType = req.OpType;
res.UniqueID = req.UniqueID;
res.Ret = -1;
res.Seq = req.Seq;
DBMailBlob blob = new DBMailBlob();
int ret = dbOperator.QueryMail(uid, ref blob);
if (ret == -1)
{
TraceLog.Error("MailOp.OnMailOpReq failed uid {0}", uid);
MailServerUtils.GetPacketSender().SendToServerByID(remoteAppID,
(int)SSGameMsgID.MailOpRes, ref res, packet.ObjectID);
return;
}
if (req.OpType == (int)MailOpType.Delete)
{
DoMailDeleteOp(uid, mailID, ref blob, dbOperator, ref res);
}
//新邮件
else if (req.OpType == (int)MailOpType.Insert)
{
//新邮件的话先校验这个类型的邮件能不能再发,某些邮件有数量限制
bool changed = false;
if (MailTypeDailyLimited(ref blob, req.Mail.MailType, out changed))
{
TraceLog.Error("MailOp.OnMailOpReq MailTypeDailyLimited check failed uid {0}, mailType {1}"
, uid, req.Mail.MailType);
if (changed)
{
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.OnMailOpReq update mail failed uid {0}", uid);
return;
}
}
}
else
{
//添加邮件前先尝试删除一些无用邮件
changed = DeleteSomeMailWhenFull(ref blob, uid, out List<uint> delIds);
if (changed)
{
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.OnMailOpReq update mail failed uid {0}", uid);
return;
}
}
if (delIds.Count > 0)
{
//这里应该是直接返回querymailres,哪个服务器来的回哪个服务器,
//但是不知道其他人怎么处理的,有没有bug,先保证game不出问题吧
//毕竟现在出问题的只有game
for(int i=0;i<delIds.Count && i < res.DelFirst.GetMaxCount(); i++)
{
res.DelFirst.Add(delIds[i]);
}
}
DoMailInsertOp(uid, ref blob, dbOperator, ref res, req.MailVerSeq);
}
}
else if (req.OpType == (int)MailOpType.GetItem)
{
DoMailGetItemOp(uid, ref req.Mail, ref blob, dbOperator, ref res);
res.Mail = req.Mail;
}
else if (req.OpType == (int)MailOpType.Read)
{
DoMailReadOp(uid, ref req.Mail, ref blob, dbOperator, ref res);
}
else if (req.OpType == (int)MailOpType.GetItemDel)
{
DoMailGetItemDelOp(uid, ref req.Mail, ref blob, dbOperator, ref res);
}
else if (req.OpType == (int)MailOpType.AllDelete)
{
DoMailAllDelOp(uid, ref req, ref blob, dbOperator, ref res);
}
else if (req.OpType == (int)MailOpType.AllGetItem)
{
DoMailAllGetItemOp(uid, ref req, ref blob, dbOperator, ref res);
}
else if (req.OpType == (int)MailOpType.MailVerChange)
{
DoMailVerChangeOp(uid, ref req, ref blob, dbOperator, ref res);
}
else if (req.OpType == (int)MailOpType.Update)
{
DoMailUpdate(uid, ref req.Mail, ref blob, dbOperator, ref res);
}
if(remoteAppID != MailServerUtils.GetAppID())
{
MailServerUtils.GetPacketSender().SendToServerByID(remoteAppID,
(int)SSGameMsgID.MailOpRes, ref res, packet.ObjectID);
}
//需要到邮件服务器主线程处理一下
res.ClientOpUid = uid;
MailServerUtils.SendMsgToSelf(remoteAppID,
(int)SSGameMsgID.MailOpRes, ref res, packet.ObjectID);
//var data = MailServerUtils.GetMailServerData();
////在这里访问m_playerTable不太合理,但目前没用合适解决方案,先这样吧
//if (data.m_playerTable.ContainsKey(uid))
//{//要转到gameserver去
// if(data.m_playerTable[uid].GameServerID != remoteAppID)
// {
// res.ClientOpUid = uid;
// MailServerUtils.GetPacketSender().SendToServerByID(data.m_playerTable[uid].GameServerID,
// (int)SSGameMsgID.MailOpRes, ref res, packet.ObjectID);
// }
//}
//if(req.MailVerSeq > 0 && res.Ret == 0 && req.OpType == (int)MailOpType.Insert)
//{
// PlayerMailVerSeqSvc.OnPlayerVerChange(uid, req.MailVerSeq);
//}
}
private static void DoMailDeleteOp(long uid, long mailID, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailID == mailID)
{
if (mail.DeleteTime == 0)
{
mail.DeleteTime = AppTime.GetNowSysMs() / 1000;
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailDeleteOp update mail failed uid {0}", uid);
return;
}
}
else
{
TraceLog.Error("MailOp.DoMailDeleteOp delete mail {0} for uid {1},already delete at time {2}"
, mailID, uid, mail.DeleteTime);
}
res.Ret = 0;
return;
}
}
//没有也算成功
res.Ret = 0;
TraceLog.Debug("MailOp.DoMailDeleteOp delete mail {0} for uid {1} success, no mail in maillist already", mailID, uid);
return;
}
private static void DoMailInsertOp(long uid, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res, long mailVer)
{
//避免重复
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.InsertUniqueID != 0 && mail.InsertUniqueID == res.Mail.InsertUniqueID)
{
//也算成功吧
TraceLog.Error("MailOp.DoMailInsertOp insert mail {0} for uid {1},already insert at time {2} InsertUniqueID {3}"
, mail.MailID, uid, mail.SendTime, mail.InsertUniqueID);
res.Ret = 220201;
res.Mail = mail;
return;
}
}
//邀请成功一个新玩家,有每天限制
if (res.Mail.MailType == (int)MailType.InviteeSuccessReward)
{
blob.InviteeSuccessMailCount++;
}
//好友每天送钱有限制
if (res.Mail.MailType == (int)MailType.FriendGiftDaily)
{
blob.FriendDailyChipMailCount++;
}
blob.LastSeq++;
//if(blob.LastVer < mailVer)
//{
// blob.LastVer = mailVer;
//}
res.Mail.MailID = blob.LastSeq;
res.Mail.DeleteTime = 0;
res.Mail.GetItemTime = 0;
//如果创建时间没有的话设置一下
if (res.Mail.SendTime == 0)
{
res.Mail.SendTime = AppTime.GetNowSysSecond();
}
blob.MailList.Add(ref res.Mail);
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailInsertOp update mail failed uid {0}", uid);
//这里应该返回错误吧??
return;
}
TraceLog.Debug("MailOp.DoMailInsertOp update mail success uid {0} mailid {1} lastSeq {2} InviteeSuccessMailCount {3} FriendDailyChipMailCount {4}"
, uid, res.Mail.MailID, blob.LastSeq, blob.InviteeSuccessMailCount, blob.FriendDailyChipMailCount);
res.Ret = 0;
return;
}
private static void DoMailReadOp(long uid, ref DBMail getItemMail, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailID == getItemMail.MailID)
{
if (mail.Status == 1)
{
TraceLog.Error("MailOp.DoMailReadOp status = 1 mail {0} for uid {1} "
, mail.MailID, uid);
}
mail.Status = 1;
if(mail.AddGoods.Count == 0)
{
mail.GetItemTime = AppTime.GetNowSysSecond();
}
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailGetItemOp update mail failed uid {0}", uid);
return;
}
res.Mail = mail;
res.Ret = 0;
TraceLog.Debug("MailOp.DoMailGetItemOp mail {0} for uid {1}"
, mail.MailID, uid);
return;
}
}
res.Ret = 220202;
TraceLog.Error("MailOp.DoMailGetItemOp get mail item {0} for uid {1} failed, no mail exist"
, getItemMail.MailID, uid);
}
private static void DoMailUpdate(long uid, ref DBMail getItemMail, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailID == getItemMail.MailID)
{
//只能更新从addReward到addGoods
if(!mail.AddReward.IsEmpty() && getItemMail.AddReward.IsEmpty()
&& mail.AddGoods.GetCount() ==0 && getItemMail.AddGoods.GetCount() > 0)
{
mail.AddGoods.CopyFrom(ref getItemMail.AddGoods);
mail.AddReward.CopyFrom(ref getItemMail.AddReward);
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailUpdate update mail failed uid {0}", uid);
return;
}
res.Mail = mail;
res.Ret = 0;
TraceLog.Debug("MailOp.DoMailUpdate mail {0} for uid {1}"
, mail.MailID, uid);
}
return;
}
}
res.Ret = 220202;
TraceLog.Error("MailOp.DoMailUpdate get mail item {0} for uid {1} failed, no mail exist"
, getItemMail.MailID, uid);
}
private static void DoMailGetItemOp(long uid, ref DBMail getItemMail, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailID == getItemMail.MailID)
{
//已经领取过了
if (mail.GetItemTime != 0)
{
TraceLog.Error("MailOp.DoMailGetItemOp get item mail {0} for uid {1},already get at time {2} "
, mail.MailID, uid, mail.GetItemTime);
getItemMail = mail;
res.Ret = 0;
return;
}
mail.GetItemTime = AppTime.GetNowSysMs() / 1000;
getItemMail.GetItemTime = mail.GetItemTime;
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailGetItemOp update mail failed uid {0}", uid);
return;
}
getItemMail = mail;
res.Mail = getItemMail;
res.Ret = 0;
TraceLog.Debug("MailOp.DoMailGetItemOp get mail item {0} for uid {1} at time {2}"
, mail.MailID, uid, mail.GetItemTime);
return;
}
}
res.Ret = 220202;
TraceLog.Error("MailOp.DoMailGetItemOp get mail item {0} for uid {1} failed, no mail exist"
, getItemMail.MailID, uid);
}
private static void DoMailAllDelOp(long uid, ref SSMailOpReq req, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
// 一键删除回包都是成功, 实际上根据规则处理
res.Ret = 0;
bool change = false;
long timeNow = AppTime.GetNowSysMs() / 1000;
for (int i = 0; i < blob.MailList.Count; i++)
{
int AddGoodsCount = 0;
ref DBMail mail = ref blob.MailList[i];
for (int k = 0; k < mail.AddGoods.Count; k++)
{
if ((!string.IsNullOrEmpty(mail.AddGoods[k].Id.GetString()) || mail.AddGoods[k].Type > 0) && mail.AddGoods[k].Value > 0)
{
AddGoodsCount++;
}
}
if (req.ListMId.Contains(mail.MailID))
{
if (mail.Status > 0 || mail.GetItemTime > 0)
{
if (mail.GetItemTime > 0)
{
mail.DeleteTime = timeNow;
res.ListMId.Add(mail.MailID);
change = true;
}
else if ( AddGoodsCount == 0)
{
mail.DeleteTime = timeNow;
res.ListMId.Add(mail.MailID);
change = true;
}
}
}
}
if (change)
{
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailAllDelOp update mail failed uid {0}", uid);
return;
}
}
}
private static void DoMailAllGetItemOp(long uid, ref SSMailOpReq req, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
bool change = false;
long getItemTime = AppTime.GetNowSysMs() / 1000;
for (int i = 0; i < blob.MailList.Count; i++)
{
int AddGoodsCount = 0;
ref DBMail mail = ref blob.MailList[i];
for (int k = 0; k < mail.AddGoods.Count; k++)
{
if ((!string.IsNullOrEmpty(mail.AddGoods[k].Id.GetString()) || mail.AddGoods[k].Type > 0) && mail.AddGoods[k].Value > 0 )
{
AddGoodsCount++;
}
}
if (req.ListMId.Contains(mail.MailID))
{
if (mail.GetItemTime == 0 && ( AddGoodsCount != 0))
{
mail.Status = 1;
mail.GetItemTime = getItemTime;
res.ListMId.Add(mail.MailID);
change = true;
}
}
}
if (change)
{
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailAllGetItemOp update mail failed uid {0}", uid);
return;
}
res.Mail.GetItemTime = getItemTime;
res.Ret = 0;
}
else
{
TraceLog.Error("MailOp.DoMailAllGetItemOp update mail failed !!");
res.Ret = -1;
}
}
private static void DoMailGetItemDelOp(long uid, ref DBMail getItemMail, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
for (int i = 0; i < blob.MailList.Count; i++)
{
ref DBMail mail = ref blob.MailList[i];
if (mail.MailID == getItemMail.MailID)
{
//已经领取过了
if (mail.GetItemTime != 0 || mail.DeleteTime != 0)
{
TraceLog.Error("MailOp.DoMailGetItemDelOp get item mail & del {0} for uid {1},already get at time {2} {3}"
, mail.MailID, uid, mail.GetItemTime, mail.DeleteTime);
getItemMail = mail;
res.Ret = 0;
return;
}
mail.GetItemTime = AppTime.GetNowSysMs() / 1000;
getItemMail.GetItemTime = mail.GetItemTime;
mail.DeleteTime = mail.GetItemTime;
getItemMail.DeleteTime = getItemMail.GetItemTime;
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailGetItemOp update mail failed uid {0}", uid);
return;
}
getItemMail = mail;
res.Mail = getItemMail;
res.Ret = 0;
TraceLog.Debug("MailOp.DoMailGetItemOp get mail item {0} for uid {1} at time {2}"
, mail.MailID, uid, mail.GetItemTime);
return;
}
}
res.Ret = 220202;
TraceLog.Error("MailOp.DoMailGetItemOp get mail item {0} for uid {1} failed, no mail exist"
, getItemMail.MailID, uid);
}
private static void DoMailVerChangeOp(long uid, ref SSMailOpReq req, ref DBMailBlob blob, MailDBOperator dbOperator, ref SSMailOpRes res)
{
if(blob.LastVer > req.MailVerSeq)
{
TraceLog.Error("MailOp.DoMailVerChangeOp err uid {0} blob Ver {1} change {2}", uid, blob, req.MailVerSeq);
return;
}
blob.LastVer = req.MailVerSeq;
bool bSuccess = dbOperator.UpdateMail(uid, ref blob);
if (bSuccess == false)
{
TraceLog.Error("MailOp.DoMailVerChangeOp update mail failed uid {0}", uid);
return;
}
res.Ret = 0;
}
}
}