// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created :
//
// Last Modified By : Kimch
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
namespace G
{
using F;
using F.Network;
using System.Collections.Generic;
using UnityEngine;
///
/// 邮件系统管理器
///
public class MailProxy : F.GameProxy
{
#region FIELD
private readonly Dictionary _serverMails = new Dictionary();
private readonly Dictionary _localMails = new Dictionary();
private readonly List _mails = new List();
#endregion
#region PROPERTY
///
/// 系统邮件
///
public IList allMails
{
get
{
_mails.Clear();
_mails.AddRange(_localMails.Values);
_mails.AddRange(_serverMails.Values);
return _mails;
}
}
public bool hasEmail
{
get { return _localMails.Count > 0 || _serverMails.Count > 0; }
}
#endregion
#region METHOD
///
/// 客户端向服务器拉取邮件列表
///
///
public void GetMails(Callback2 callback)
{
ServerProxy.Instance.PullMails(callback);
}
///
///
///
///
///
private void OnGetMails(int error, string message)
{
}
///
/// 客户端向服务器设置邮件已读标志
///
///
///
public void Read(Mail mail, Callback callback)
{
if (!mail.isLocal && mail.status == 0)
{
mail.status = 1;
}
}
///
/// 客户端向服务器发送删除邮件请求
///
///
///
public void Delete(Mail mail, Callback2 callback)
{
if (mail.isLocal)
{
_localMails.Remove(mail.id);
}
else
{
ServerProxy.Instance.DeleteMails(new string[] { mail.mailKey },
(error, message) =>
{
});
}
}
public void DeleteAll(Callback2 callback)
{
_localMails.Clear();
_serverMails.Clear();
callback?.Invoke(0, null);
}
///
/// 客户端向服务器发送领取附件的请求
///
///
///
public void GetAttach(Mail mail, Callback2 callback)
{
if (mail.status < 2)
{
mail.status = 2;
if (mail.isLocal)
{
if (mail.giveItems != null && mail.giveItems.Length > 0)
{
RewardProxy.Instance.GetRewardsWithUI(mail.giveItems, callback);
}
_localMails.Remove(mail.id);
SaveLocalMail();
}
else
{
ServerProxy.Instance.DeleteMails(new string[] { mail.mailKey },
(error, message) =>
{
if (error == 0)
{
if (mail.giveItems != null && mail.giveItems.Length > 0)
{
RewardProxy.Instance.GetRewardsWithUI(mail.giveItems, (err, mes) =>
{
if (err == 0)
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED, "email");
}
});
}
_serverMails.Remove(mail.id);
}
callback?.Invoke(error, message);
});
}
}
}
public void GetAllAttach(Callback2 callback)
{
bool flag = false;
if (_serverMails.Count > 0)
{
var mailIdList = F.ListPool.Get();
foreach (var mail in _serverMails.Values)
{
if (mail.status < 2)
{
mailIdList.Add(mail.mailKey);
}
}
if (mailIdList.Count > 0)
{
flag = true;
ServerProxy.Instance.DeleteMails(mailIdList.ToArray(),
(error, message) =>
{
if (error == 0)
{
var rewardList = F.ListPool.Get();
foreach (var mail in _serverMails.Values)
{
if (mail.status < 2)
{
mail.status = 2;
if (mail.giveItems != null)
{
rewardList.AddRange(mail.giveItems);
}
}
}
_serverMails.Clear();
if (rewardList.Count > 0)
{
flag = true;
RewardProxy.Instance.GetRewardsWithUI(rewardList,(err, mes) =>
{
if (err == 0)
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED, "email");
}
});
}
F.ListPool.Release(rewardList);
}
callback?.Invoke(error, message);
});
//KPlatform.Instance.AckMail(mailIdList.ToArray());
}
F.ListPool.Release(mailIdList);
}
if (_localMails.Count > 0)
{
var rewardList = F.ListPool.Get();
foreach (var mail in _localMails.Values)
{
if (mail.status < 2)
{
mail.status = 2;
if (mail.giveItems != null)
{
rewardList.AddRange(mail.giveItems);
}
}
}
_localMails.Clear();
if (rewardList.Count > 0)
{
flag = true;
RewardProxy.Instance.GetRewardsWithUI(rewardList, callback);
SaveLocalMail();
}
F.ListPool.Release(rewardList);
}
if (!flag)
PostNotification(GlobalDefine.EVENT_SHOW_TOAST, "暂无可领取的邮件");
}
private void OnGetAllAttach()
{
}
///
///
///
///
public int GetRedPoint1()
{
if (_serverMails.Count > 0)
{
foreach (var mail in _serverMails.Values)
{
if (mail.status < 2)
{
return 1;
}
}
}
if (_localMails.Count > 0)
{
foreach (var mail in _localMails.Values)
{
if (mail.status < 2)
{
return 1;
}
}
}
return 0;
}
int GenerateLocalId()
{
return Random.Range(100000000, 999999999);
}
public void PostLocalMail(int id)
{
var mail = CreateLocalMail(id, Launch.Timestamp);
if (mail != null)
{
_localMails[mail.id] = mail;
SaveLocalMail();
}
}
public void PostLocalMail(int id, int itemId, int multiple)
{
var mail = CreateLocalMail(id, itemId, Launch.Timestamp);
if (mail != null)
{
mail.multiple = multiple;
if (mail.id > 0)
_localMails[mail.id] = mail;
else
{
int count = 7;
do
{
mail.id = GenerateLocalId();
Debug.Log("GenerateLocalId");
if (!_localMails.ContainsKey(mail.id))
{
_localMails.Add(mail.id, mail);
break;
}
} while (count-- > 0);
}
SaveLocalMail();
}
}
private Mail CreateLocalMail(int id, int timestamp)
{
var mailItem = ItemProxy.Instance.GetStaticItem(id);
if (mailItem != null)
return new Mail
{
isLocal = true,
id = id,
itemId = id,
status = 0,
startTimestamp = timestamp,
endTimestamp = timestamp + mailItem.life,
title = mailItem.title,
content = mailItem.content,
giveItems = mailItem.rewardInfos,
sender = mailItem.sender,
isForever = mailItem.forever != 0,
};
return null;
}
private Mail CreateLocalMail(int id, int itemId, int timestamp)
{
var mailItem = ItemProxy.Instance.GetStaticItem(itemId);
if (mailItem != null)
return new Mail
{
isLocal = true,
id = id,
itemId = itemId,
status = 0,
startTimestamp = timestamp,
endTimestamp = timestamp + mailItem.life,
title = mailItem.title,
content = mailItem.content,
giveItems = mailItem.rewardInfos,
sender = mailItem.sender,
isForever = mailItem.forever != 0,
};
return null;
}
private const string ARCHIVE_KEY = "mails";
private const string ARCHIVE_KEY_V1 = "mail_v1";
private void LoadLocalMail()
{
_localMails.Clear();
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
while (index < dataList.Count)
{
int mailId = dataList[index++];
int mailItemId = dataList[index++];
int mailTimestamp = dataList[index++];
int multiple = dataList[index++];
var mail = CreateLocalMail(mailId, mailItemId, mailTimestamp);
if (mail != null)
{
mail.multiple = multiple;
_localMails.Add(mail.id, mail);
}
}
}
else
{
dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
while (index < dataList.Count)
{
int mailId = dataList[index++];
int mailTimestamp = dataList[index++];
var mail = CreateLocalMail(mailId, mailTimestamp);
if (mail != null)
_localMails.Add(mail.id, mail);
}
}
ArchiveProxy.Instance.RemoveIntList(ARCHIVE_KEY);
}
}
private void SaveLocalMail()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null)
{
dataList.Clear();
foreach (var mail in _localMails.Values)
{
if (!mail.isForever && mail.status != 2)
{
dataList.Add(mail.id);
dataList.Add(mail.itemId);
dataList.Add(mail.startTimestamp);
dataList.Add(mail.multiple);
}
}
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList);
}
}
#endregion
#region Proxy
public static MailProxy Instance => GetInstance();
public override void InitCompleted()
{
KFramework.GameFacade.RegisterResp(GlobalDefine.PACKET_ID_MAIL_GET_ALL, this);
//KFramework.GameFacade.RegisterResp(101, this);
}
public override void LoadCompleted()
{
var mailItems = ItemProxy.Instance.GetStaticItems();
for (int i = 0; i < mailItems.Count; i++)
{
if (mailItems[i].forever > 0)
{
var mail = CreateLocalMail(mailItems[i].id, Launch.Timestamp);
if (mail != null)
_localMails.Add(mail.id, mail);
}
}
}
public override void ReadArchive()
{
LoadLocalMail();
}
public override void Recv(IPacket packet)
{
var gp = packet as GamePacket;
if (gp.error != GamePacket.ERROR_CODE_OK)
{
PostNotification(GlobalDefine.EVENT_SHOW_TOAST, gp.data as string);
return;
}
if (packet.id == GlobalDefine.PACKET_ID_MAIL_GET_ALL)
{
_serverMails.Clear();
var list = gp.data as IList