using System; using System.Collections.Generic; using proto; namespace MoleMole { public class FriendModule : BaseModule { public enum FriendSortType { Friend_NEW = 0, Request_NEW = 1, Level_DESC = 2, Level_ASC = 3, Star_DESC = 4, Star_ASC = 5, Combat_DESC = 6, Combat_ASC = 7 } public List friendsList; private Dictionary _friendsBriefInfoDict; private Dictionary> _playerBriefInfoCacheDict; private Dictionary> _playerDetialInfoCacheDict; public List askingList; private Dictionary _askingDict; public List recommandedPlayerList; public List helperStrangerList; private Dictionary _helperFrozenMap; private HashSet _requestAddPlayerUIDSet; public Dictionary sortTypeMap; public Dictionary> sortComparisionMap; public FriendModule() { Singleton.Instance.RegisterModule(this); friendsList = new List(); _friendsBriefInfoDict = new Dictionary(); _playerBriefInfoCacheDict = new Dictionary>(); _playerDetialInfoCacheDict = new Dictionary>(); askingList = new List(); _askingDict = new Dictionary(); recommandedPlayerList = new List(); helperStrangerList = new List(); _helperFrozenMap = new Dictionary(); _requestAddPlayerUIDSet = new HashSet(); InitForSort(); } private void InitForSort() { sortTypeMap = new Dictionary(); sortComparisionMap = new Dictionary>(); string[] tAB_KEY = FriendOverviewPageContext.TAB_KEY; foreach (string text in tAB_KEY) { if (text == "FriendListTab") { sortTypeMap.Add(text, FriendSortType.Friend_NEW); } else if (text == "RequestListTab") { sortTypeMap.Add(text, FriendSortType.Request_NEW); } else { sortTypeMap.Add(text, FriendSortType.Level_DESC); } } sortComparisionMap.Add(FriendSortType.Friend_NEW, FriendBriefDataItem.CompareToFriendNew); sortComparisionMap.Add(FriendSortType.Request_NEW, FriendBriefDataItem.CompareToRequestNew); sortComparisionMap.Add(FriendSortType.Level_DESC, FriendBriefDataItem.CompareToLevelDesc); sortComparisionMap.Add(FriendSortType.Level_ASC, FriendBriefDataItem.CompareToLevelAsc); sortComparisionMap.Add(FriendSortType.Star_DESC, FriendBriefDataItem.CompareToAvatarStarDesc); sortComparisionMap.Add(FriendSortType.Star_ASC, FriendBriefDataItem.CompareToAvatarStarAsc); sortComparisionMap.Add(FriendSortType.Combat_DESC, FriendBriefDataItem.CompareToAvatarCombatDesc); sortComparisionMap.Add(FriendSortType.Combat_ASC, FriendBriefDataItem.CompareToAvatarCombatAsc); } public override bool OnPacket(NetPacketV1 pkt) { switch (pkt.getCmdId()) { case 73: return OnGetPlayerDetailDataRsp(pkt.getData()); case 65: return OnGetFriendListRsp(pkt.getData()); case 67: return OnAddFriendRsp(pkt.getData()); case 71: return OnGetAskAddFriendListRsp(pkt.getData()); case 77: return OnGetRecommandFriendListRsp(pkt.getData()); case 80: return OnDelFriendNotify(pkt.getData()); case 101: return OnGetAssistantFrozenListRsp(pkt.getData()); default: return false; } } private bool OnGetPlayerDetailDataRsp(GetPlayerDetailDataRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode == 0) { PlayerDetailData detail = rsp.detail; FriendDetailDataItem value = new FriendDetailDataItem(detail); _playerDetialInfoCacheDict[(int)detail.uid] = new CacheData(value); } return false; } private bool OnGetFriendListRsp(GetFriendListRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode == 0) { if (rsp.is_whole_dataSpecified && rsp.is_whole_data) { _friendsBriefInfoDict.Clear(); friendsList.Clear(); } for (int i = 0; i < rsp.friend_list.Count; i++) { PlayerFriendBriefData briefData = rsp.friend_list[i]; FriendBriefDataItem friendBriefDataItem = new FriendBriefDataItem(briefData); if (_friendsBriefInfoDict.ContainsKey(friendBriefDataItem.uid)) { friendsList.Remove(_friendsBriefInfoDict[friendBriefDataItem.uid]); friendsList.Insert(0, friendBriefDataItem); } else { friendsList.Add(friendBriefDataItem); } _friendsBriefInfoDict[friendBriefDataItem.uid] = friendBriefDataItem; _playerBriefInfoCacheDict[friendBriefDataItem.uid] = new CacheData(friendBriefDataItem); } } return false; } private bool OnAddFriendRsp(AddFriendRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode == 0) { int target_uid = (int)rsp.target_uid; Singleton.Instance.LocalData.OldRequestUIDSet.Remove(target_uid); Singleton.Instance.Save(); } return false; } private bool OnDelFriendRsp(DelFriendRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode == 0) { } return false; } private bool OnGetAskAddFriendListRsp(GetAskAddFriendListRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode == 0) { bool flag = _askingDict.Count <= 0; for (int i = 0; i < rsp.ask_list.Count; i++) { PlayerFriendBriefData briefData = rsp.ask_list[i]; FriendBriefDataItem friendBriefDataItem = new FriendBriefDataItem(briefData); if (_askingDict.ContainsKey(friendBriefDataItem.uid)) { askingList.Remove(_askingDict[friendBriefDataItem.uid]); askingList.Insert(0, friendBriefDataItem); } else { askingList.Add(friendBriefDataItem); } _askingDict[friendBriefDataItem.uid] = friendBriefDataItem; _playerBriefInfoCacheDict[friendBriefDataItem.uid] = new CacheData(friendBriefDataItem); } if (flag) { HashSet hashSet = new HashSet(); foreach (int item in Singleton.Instance.LocalData.OldRequestUIDSet) { if (_askingDict.ContainsKey(item)) { hashSet.Add(item); } } if (hashSet.Count > 0) { Singleton.Instance.LocalData.OldRequestUIDSet.ExceptWith(hashSet); Singleton.Instance.Save(); } } } return false; } private bool OnGetRecommandFriendListRsp(GetRecommendFriendListRsp rsp) { recommandedPlayerList.Clear(); helperStrangerList.Clear(); for (int i = 0; i < rsp.recommend_list.Count; i++) { PlayerFriendBriefData val = rsp.recommend_list[i]; if (!_friendsBriefInfoDict.ContainsKey((int)val.uid)) { FriendBriefDataItem friendBriefDataItem = new FriendBriefDataItem(val); if (i < MiscData.Config.BasicConfig.RecommendFriendListNum) { recommandedPlayerList.Add(friendBriefDataItem); } else { helperStrangerList.Add(friendBriefDataItem); } _playerBriefInfoCacheDict[friendBriefDataItem.uid] = new CacheData(friendBriefDataItem); } } if (helperStrangerList.Count == 0) { helperStrangerList.AddRange(recommandedPlayerList); } return false; } private bool OnDelFriendNotify(DelFriendNotify rsp) { int target_uid = (int)rsp.target_uid; FriendBriefDataItem friendBriefDataItem = null; foreach (FriendBriefDataItem friends in friendsList) { if (friends.uid == target_uid) { friendBriefDataItem = friends; break; } } if (friendBriefDataItem != null) { friendsList.Remove(friendBriefDataItem); } _friendsBriefInfoDict.Remove((int)rsp.target_uid); return false; } private bool OnGetAssistantFrozenListRsp(GetAssistantFrozenListRsp rsp) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)rsp.retcode != 0) { return false; } foreach (AssistantFrozen item in rsp.frozen_list) { int uid = (int)item.uid; DateTime value = TimeUtil.Now.AddSeconds((int)item.left_frozen_time); _helperFrozenMap[uid] = value; } return false; } public FriendDetailDataItem TryGetFriendDetailInfo(int uid) { CacheData value; _playerDetialInfoCacheDict.TryGetValue(uid, out value); if (value != null && value.CacheValid) { return value.Value; } return null; } public void RemoveFriendInfo(FriendOverviewPageContext.FriendTab friendType, int targetUid) { switch (friendType) { case FriendOverviewPageContext.FriendTab.FriendListTab: _friendsBriefInfoDict.Remove(targetUid); friendsList.RemoveAll((FriendBriefDataItem x) => x.uid == targetUid); break; case FriendOverviewPageContext.FriendTab.AddFriendTab: recommandedPlayerList.RemoveAll((FriendBriefDataItem x) => x.uid == targetUid); break; case FriendOverviewPageContext.FriendTab.RequestListTab: _askingDict.Remove(targetUid); askingList.RemoveAll((FriendBriefDataItem x) => x.uid == targetUid); break; } } public bool IsMyFriend(int targetUid) { return _friendsBriefInfoDict.ContainsKey(targetUid); } public FriendBriefDataItem TryGetFriendBriefData(int targetUid) { if (_playerBriefInfoCacheDict.ContainsKey(targetUid) && _playerBriefInfoCacheDict[targetUid].CacheValid) { return _playerBriefInfoCacheDict[targetUid].Value; } foreach (FriendBriefDataItem friends in friendsList) { if (friends.uid == targetUid) { return friends; } } return null; } public FriendDetailDataItem TryGetFriendDetailData(int targetUid) { if (_playerDetialInfoCacheDict.ContainsKey(targetUid) && _playerDetialInfoCacheDict[targetUid].CacheValid) { return _playerDetialInfoCacheDict[targetUid].Value; } return null; } public string TryGetPlayerNickName(int targetUid) { if (_playerBriefInfoCacheDict.ContainsKey(targetUid) && _playerBriefInfoCacheDict[targetUid].CacheValid) { return _playerBriefInfoCacheDict[targetUid].Value.nickName; } if (_playerDetialInfoCacheDict.ContainsKey(targetUid) && _playerDetialInfoCacheDict[targetUid].CacheValid) { return _playerDetialInfoCacheDict[targetUid].Value.nickName; } FriendBriefDataItem friendBriefDataItem = recommandedPlayerList.Find((FriendBriefDataItem x) => x.uid == targetUid); if (friendBriefDataItem != null) { return friendBriefDataItem.nickName; } return targetUid.ToString(); } public bool isHelperFrozen(int uid) { DateTime helperNextAvaliableTime = GetHelperNextAvaliableTime(uid); return helperNextAvaliableTime > TimeUtil.Now; } public DateTime GetHelperNextAvaliableTime(int uid) { if (_helperFrozenMap.ContainsKey(uid)) { return _helperFrozenMap[uid]; } return TimeUtil.Now; } public FriendBriefDataItem GetOneStrangeHelper() { FriendBriefDataItem friendBriefDataItem = helperStrangerList.Find((FriendBriefDataItem x) => !isHelperFrozen(x.uid) && !_friendsBriefInfoDict.ContainsKey(x.uid)); if (friendBriefDataItem == null) { Singleton.Instance.RequestRecommandFriendList(); } return friendBriefDataItem; } public bool IsOldFriend(int friendUID) { return Singleton.Instance.LocalData.OldFriendUIDSet.Contains(friendUID); } public void MarkFriendAsOld(int friendUID) { Singleton.Instance.LocalData.OldFriendUIDSet.Add(friendUID); Singleton.Instance.Save(); } public void MarkAllFriendsAsOld() { MarkFriendsAsOld(friendsList); } public void MarkFriendsAsOld(List friends) { foreach (FriendBriefDataItem friend in friends) { Singleton.Instance.LocalData.OldFriendUIDSet.Add(friend.uid); } Singleton.Instance.Save(); } public bool HasNewFriend() { foreach (FriendBriefDataItem friends in friendsList) { if (!IsOldFriend(friends.uid)) { return true; } } return false; } public bool IsOldRequest(int friendUID) { return Singleton.Instance.LocalData.OldRequestUIDSet.Contains(friendUID); } public void MarkRequestAsOld(int friendUID) { Singleton.Instance.LocalData.OldRequestUIDSet.Add(friendUID); Singleton.Instance.Save(); } public void MarkAllRequestsAsOld() { MarkRequestsAsOld(askingList); } public void MarkRequestsAsOld(List requests) { foreach (FriendBriefDataItem request in requests) { Singleton.Instance.LocalData.OldRequestUIDSet.Add(request.uid); } Singleton.Instance.Save(); } public bool HasNewRequest() { foreach (FriendBriefDataItem asking in askingList) { if (!IsOldRequest(asking.uid)) { return true; } } return false; } public void RecordRequestAddFriend(int friendUID) { _requestAddPlayerUIDSet.Add(friendUID); } public bool IsRequestAddOnce(int friendUID) { return _requestAddPlayerUIDSet.Contains(friendUID); } public List GetRecommandFriendList() { List list = new List(); foreach (FriendBriefDataItem recommandedPlayer in recommandedPlayerList) { if (!_friendsBriefInfoDict.ContainsKey(recommandedPlayer.uid) && !_requestAddPlayerUIDSet.Contains(recommandedPlayer.uid)) { list.Add(recommandedPlayer); } } return list; } } }