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.
 
 
 
 
 
 

1529 lines
59 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using ProtoCSStruct;
namespace Friend
{
class FriendOp
{
#region 通过玩家保存的 对应的数组索引 获取数据
/// <summary>
/// 通过数组下标index获取selfuid用户里面的指定FriendStranger
/// </summary>
/// <param name="selfUid"></param>
/// <param name="index"></param>
/// <returns>ref DBFriendStrangerOneStruct</returns>
public static unsafe ref DBFriendStrangerOneStruct GetFriendStrangerByIndex(ref FriendCacheInfoStruct infoStruct, int index)
{
if (index >= infoStruct.FriendOpData.StrangerCount || index < 0)
{
return ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(0);
}
long posIndex = infoStruct.FriendOpData.StrangerList[index];
return ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(posIndex);
}
/// <summary>
/// 通关玩家UID 和 数组下标 获取指定其中一个好友
/// </summary>
/// <param name="selfUid"></param>
/// <param name="index"></param>
/// <returns></returns>
public static unsafe ref DBFriendOneStruct GetFriendOneByIndex(ref FriendCacheInfoStruct infoStruct, int index)
{
if (index >= infoStruct.FriendList.iCount || index < 0)
{
return ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(0);
}
long posIndex = infoStruct.FriendList.DBFriendOneID[index];
return ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(posIndex);
}
/// <summary>
/// 通过数组下标index获取selfuid用户里面的指定chat
/// </summary>
/// <param name="selfUid"></param>
/// <param name="index"></param>
/// <returns>ref DBFriendChatOneStruct</returns>
public static unsafe ref DBFriendChatOneStruct GetFriendChatByIndex(ref FriendCacheInfoStruct infoStruct, int index)
{
if (index >= infoStruct.FriendOpData.ChatCount || index < 0)
{
return ref FriendInfoCache.m_cacheStructFriendChat.GetByIndex(0);
}
long posIndex = infoStruct.FriendOpData.ChatList[index];
return ref FriendInfoCache.m_cacheStructFriendChat.GetByIndex(posIndex);
}
/// <summary>
/// 通过数组下标index获取selfuid用户里面的指定Op
/// </summary>
/// <param name="selfUid"></param>
/// <param name="index"></param>
/// <returns>ref DBFriendOpDataStruct</returns>
public static unsafe ref DBFriendOneOpStruct GetFriendOpByIndex(ref FriendCacheInfoStruct infoStruct, int index)
{
if (index >= infoStruct.FriendOpData.OpCount || index < 0)
{
return ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(0);
}
long posIndex = infoStruct.FriendOpData.OpList[index];
return ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(posIndex);
}
#endregion
#region 通过玩家UID获取 指定数据
/// <summary>
/// 通过玩家UID获取Friendinfo
/// </summary>
/// <param name="selfUid"></param>
/// <returns></returns>
public static unsafe ref FriendCacheInfoStruct GetFriendInfoByUid(long selfUid)
{
FriendInfoCache.m_selfIDMap.TryGetValue(selfUid, out long posIndex);
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(posIndex);
}
/// <summary>
/// 获取我的好友中,指定UID的好友
/// </summary>
/// <param name="selfUid"></param>
/// <param name="Uid"></param>
/// <returns></returns>
public static unsafe ref DBFriendOneStruct GetFriendOneByUid(long selfUid, long Uid)
{
ref FriendCacheInfoStruct selfInfoStruct = ref FriendOp.GetFriendInfoByUid(selfUid);
if (selfInfoStruct.IsNull())
{
return ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(0);
}
for (int i = 0; i < selfInfoStruct.FriendList.iCount; i++)
{
ref var oneStruct = ref GetFriendOneByIndex(ref selfInfoStruct, i);
if (oneStruct.oneFriend.Uid == Uid)
{
return ref oneStruct;
}
}
return ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(0);
}
public static unsafe ref DBFriendStrangerOneStruct GetStrangerByUid(long selfUid, long StrangerUid)
{
ref FriendCacheInfoStruct info =ref GetFriendInfoByUid(selfUid);
if (info.IsNull())
{
return ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(0);
}
for (int i = 0; i < info.FriendOpData.StrangerCount; i++)
{
ref DBFriendStrangerOneStruct one =ref GetFriendStrangerByIndex(ref info, i);
if (one.IsNull())
{
continue;
}
ref var friendone = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
if (friendone.oneFriend.Uid == StrangerUid)
{
return ref one;
}
}
return ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(0);
}
/// <summary>
/// 找到其中一个操作,比如其他玩家邀请加我为好友
/// </summary>
/// <param name="selfUid"></param>
/// <param name="opUid"></param>
/// <returns></returns>
public static unsafe ref DBFriendOneOpStruct GetFriendOpByUid(long selfUid, long opUid, int opType)
{
ref FriendCacheInfoStruct info = ref GetFriendInfoByUid(selfUid);
for (int i = 0; i < info.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct one =ref GetFriendOpByIndex(ref info, i);
if (one.IsNull())
{
continue;
}
ref var friendone = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
if (friendone.oneFriend.Uid == opUid && one.OpType == opType)
{
return ref one;
}
}
return ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(0);
}
#endregion
#region 删除玩家的好友相关信息
/// <summary>
/// 删除一个好友通过好友UID
/// </summary>
/// <param name="infoStruct"></param>
/// <param name="Uid"></param>
public static unsafe void DoDeleteFriendList(ref FriendCacheInfoStruct infoStruct, long Uid)
{
if (infoStruct.IsNull())
{
return;
}
int arrayIndex = -1;
for (int i = 0; i < infoStruct.FriendList.iCount; i++)
{
ref var oneStruct = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(infoStruct.FriendList.DBFriendOneID[i]);
if (oneStruct.oneFriend.Uid == Uid)
{
arrayIndex = i;
DoFreeFriendOneByIndex(infoStruct.FriendList.DBFriendOneID[i]);
break;
}
}
if (arrayIndex >= 0)
{
//1:首先把最后一个的关联缓存索引赋值给删除的这个(好友前端排序就好了,所以这里的顺序不重要)
infoStruct.FriendList.DBFriendOneID[arrayIndex] =
infoStruct.FriendList.DBFriendOneID[infoStruct.FriendList.iCount - 1];
//2:然后将最后一个置0
infoStruct.FriendList.DBFriendOneID[infoStruct.FriendList.iCount - 1] = 0;
//3:好友数量 --
infoStruct.FriendList.iCount--;
infoStruct.SetNeedSave(true);
}
}
/// <summary>
/// 通过索引删除一个好友操作
/// </summary>
/// <param name="infoStruct"></param>
/// <param name="index"></param>
public static unsafe void DoDeleteFriendOP(ref FriendCacheInfoStruct infoStruct, long posIndex)
{
ref DBFriendOneOpStruct opStruct = ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(posIndex);
if (opStruct.IsNull())
{
return;
}
int arrayIndex = -1;
for (int i = 0; i < infoStruct.FriendOpData.OpCount; i++)
{
if (infoStruct.FriendOpData.OpList[i] == posIndex)
{
arrayIndex = i;
DoFreeFriendOPByIndex(posIndex);
break;
}
}
if (arrayIndex >= 0)
{
//1:首先把最后一个的关联缓存索引赋值给删除的这个(好友前端排序就好了,所以这里的顺序不重要)
infoStruct.FriendOpData.OpList[arrayIndex] = infoStruct.FriendOpData.OpList[infoStruct.FriendOpData.OpCount - 1];
//2:然后将最后一个置0
infoStruct.FriendOpData.OpList[infoStruct.FriendOpData.OpCount - 1] = 0;
//3:数量 --
infoStruct.FriendOpData.OpCount--;
infoStruct.SetNeedSave(true);
}
}
public static unsafe void DoDeleteFriendOp(ref FriendCacheInfoStruct selfInfo, long opUid, int opType)
{
int arrayIndex = -1;
for (int i = 0; i < selfInfo.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct friendOpStruct = ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(selfInfo.FriendOpData.OpList[i]);
ref var oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(friendOpStruct.DBFriendOneID);
if (!oneFriend.IsNull() && oneFriend.oneFriend.Uid == opUid && friendOpStruct.OpType == opType)
{
arrayIndex = i;
DoFreeFriendOPByIndex(friendOpStruct.GetObjectID());
break;
}
}
if (arrayIndex >= 0)
{
selfInfo.FriendOpData.OpList[arrayIndex] = selfInfo.FriendOpData.OpList[selfInfo.FriendOpData.OpCount - 1];
selfInfo.FriendOpData.OpList[selfInfo.FriendOpData.OpCount - 1] = 0;
selfInfo.FriendOpData.OpCount--;
selfInfo.SetNeedSave(true);
}
}
public static unsafe void DoDeleteFriendOpByType(ref FriendCacheInfoStruct selfInfo, int opType)
{
for (int i = selfInfo.FriendOpData.OpCount - 1; i >= 0; i--)
{
long posIndex = selfInfo.FriendOpData.OpList[i];
ref DBFriendOneOpStruct oneOp = ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(posIndex);
if (oneOp.IsNull())
{
continue;
}
if (oneOp.OpType == opType)
{
DoFreeFriendOPByIndex(posIndex);
selfInfo.FriendOpData.OpList[i] = selfInfo.FriendOpData.OpList[selfInfo.FriendOpData.OpCount - 1];
selfInfo.FriendOpData.OpList[selfInfo.FriendOpData.OpCount - 1] = 0;
selfInfo.FriendOpData.OpCount--;
selfInfo.SetNeedSave(true);
}
}
}
/// <summary>
/// 通过数组下标删除(说明:聊天这个顺序好像有作用,聊天消息满了从第一个开始删除的,这个之后改下看看)
/// </summary>
/// <param name="infoStruct"></param>
/// <param name="index"></param>
public static unsafe void DoDeleteFriendChat(ref FriendCacheInfoStruct infoStruct, int arrayIndex)
{
if (arrayIndex < 0 || arrayIndex >= infoStruct.FriendOpData.ChatCount)
{
return;
}
DoFreeChatListByIndex(infoStruct.FriendOpData.ChatList[arrayIndex]);
//聊天的保留顺序
for (int i = arrayIndex + 1; i < infoStruct.FriendOpData.ChatCount; i++)
{
infoStruct.FriendOpData.ChatList[i - 1] = infoStruct.FriendOpData.ChatList[i];
}
infoStruct.FriendOpData.ChatList[infoStruct.FriendOpData.ChatCount - 1] = 0;
infoStruct.FriendOpData.ChatCount--;
infoStruct.SetNeedSave(true);
}
public static unsafe void DoDeleteAllChat(ref FriendCacheInfoStruct infoStruct)
{
TraceLog.Trace("FriendOp.DoDeleteAllChat uid {0} chat count {1}"
, infoStruct.Self.Uid, infoStruct.FriendOpData.ChatCount);
for (int i = 0; i < infoStruct.FriendOpData.ChatCount; i++)
{
DoFreeChatListByIndex(infoStruct.FriendOpData.ChatList[i]);
}
infoStruct.FriendOpData.ChatCount = 0;
infoStruct.SetNeedSave(true);
}
public static unsafe void DoDeleteStranger(ref FriendCacheInfoStruct selfInfo, long targetUid)
{
int arrayIndex = -1;
for (int i = 0; i < selfInfo.FriendOpData.StrangerCount; i++)
{
ref DBFriendStrangerOneStruct strangerOneStruct = ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(selfInfo.FriendOpData.StrangerList[i]);
ref var oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(strangerOneStruct.DBFriendOneID);
if (! oneFriend.IsNull() && oneFriend.oneFriend.Uid == targetUid)
{
arrayIndex = i;
DoFreeStrangerByIndex(strangerOneStruct.GetObjectID());
break;
}
}
if (arrayIndex >= 0)
{
selfInfo.FriendOpData.StrangerList[arrayIndex] = selfInfo.FriendOpData.StrangerList[selfInfo.FriendOpData.StrangerCount - 1];
selfInfo.FriendOpData.StrangerList[selfInfo.FriendOpData.StrangerCount - 1] = 0;
selfInfo.FriendOpData.StrangerCount--;
selfInfo.SetNeedSave(true);
}
}
public static bool GMDeleteFriendCache = false;
/// <summary>
/// 以后实现逻辑,可以暂时不管(逻辑上问题,这个之后估计要废弃,缓存数据将跟随PlayerInfoFriend创建而创建,PlayerInfoFriend销毁而销毁)
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public static bool CanDeleteFriendCacheInfo(long uid)
{
ref FriendCacheInfoStruct info = ref GetFriendInfoByUid(uid);
//数据需要保存
if (info.GetNeedSave())
{
return false;
}
// 停服时存盘后直接删除, 不用等超时
if (FriendServerUtils.GetApp().IsStopping)
{
return true;
}
//在线玩家不删除
PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(uid);
if (player != null && player.IsOnline)
{
return false;
}
// GM测试
//if (GMDeleteFriendCache)
//{
// return true;
//}
//配置的超时时间
if (FriendServerUtils.GetTimeSecond() - info.LastAccessTime < FriendConfig.GetFriendCacheTimeout())
{
return false;
}
return true;
}
/// <summary>
/// 清除一个玩家的数据,注意现在好像没有删除PlayerInfoFriend player的逻辑
/// </summary>
/// <param name="uid"></param>
public static unsafe void DeleteFriendCacheInfo(long uid)
{
ref FriendCacheInfoStruct info = ref GetFriendInfoByUid(uid);
if (! info.IsNull())
{
DeleteFriendCacheInfo(ref info);
}
}
private static bool logEx = false;
public static unsafe void DeleteFriendCacheInfo(ref FriendCacheInfoStruct info)
{
// 外网好像在这里core了, 没有log, catch看看是不是core这里了
try
{
for (int i = 0; i < info.FriendList.iCount; i++)
{
FriendInfoCache.m_cacheStructFriendOne.Free(info.FriendList.DBFriendOneID[i]);
}
info.FriendList.iCount = 0;
for (int i = 0; i < info.FriendOpData.OpCount; i++)
{
DoFreeFriendOPByIndex(info.FriendOpData.OpList[i]);
}
info.FriendOpData.OpCount = 0;
for (int i = 0; i < info.FriendOpData.ChatCount; i++)
{
FriendInfoCache.m_cacheStructFriendChat.Free(info.FriendOpData.ChatList[i]);
}
info.FriendOpData.ChatCount = 0;
for (int i = 0; i < info.FriendOpData.StrangerCount; i++)
{
DoFreeStrangerByIndex(info.FriendOpData.StrangerList[i]);
}
info.FriendOpData.StrangerCount = 0;
FriendInfoCache.m_cacheStructFriendInfo.Free(info.GetObjectID());
FriendInfoCache.m_selfIDMap.Remove(info.Self.Uid);
}
catch (Exception e)
{
if (! logEx)
{
TraceLog.Exception(e);
logEx = true;
}
}
TraceLog.Trace("FriendCacheOp.DeleteFriendCacheInfo FriendInfoCache used {0} free {1}"
, FriendInfoCache.m_cacheStructFriendInfo.GetUsedCount()
, FriendInfoCache.m_cacheStructFriendInfo.GetFreeCount());
TraceLog.Trace("FriendCacheOp.DeleteFriendCacheInfo FriendOp used {0} free {1}"
, FriendInfoCache.m_cacheStructFriendOneOp.GetUsedCount()
, FriendInfoCache.m_cacheStructFriendOneOp.GetFreeCount());
TraceLog.Trace("FriendCacheOp.DeleteFriendCacheInfo FriendChat used {0} free {1}"
, FriendInfoCache.m_cacheStructFriendChat.GetUsedCount()
, FriendInfoCache.m_cacheStructFriendChat.GetFreeCount());
TraceLog.Trace("FriendCacheOp.DeleteFriendCacheInfo FriendOne used {0} free {1}"
, FriendInfoCache.m_cacheStructFriendOne.GetUsedCount()
, FriendInfoCache.m_cacheStructFriendOne.GetFreeCount());
//TraceLog.Trace("FriendCacheOp.DeleteFriendCacheInfo FriendStranger used {0} free {1}"
// , FriendInfoCache.m_cacheStructFriendStranger.GetUsedCount()
// , FriendInfoCache.m_cacheStructFriendStranger.GetFreeCount());
}
#endregion
#region 一些辅助操作函数
public static unsafe ref DBFriendOneOpStruct GetOpStructByTypeAndTargeid(long selfUid, long Uid, int type)
{
ref FriendCacheInfoStruct info = ref GetFriendInfoByUid(selfUid);
for (int i = 0; i < info.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct op = ref GetFriendOpByIndex(ref info, i);
if (op.IsNull())
{
continue;
}
ref DBFriendOneStruct oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(op.DBFriendOneID);
if (oneFriend.IsNull())
{
continue;
}
if (op.OpType == type && oneFriend.oneFriend.Uid == Uid)
{
return ref op;
}
}
return ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(0);
}
public static unsafe long GetFriendOpIndex(ref FriendCacheInfoStruct infoStruct, long Uid, int opType)
{
ref var aa = ref GetOpStructByTypeAndTargeid(infoStruct.Self.Uid, Uid, opType);
return aa.GetObjectID();
}
public static unsafe void UpdateSelfInfoTOFriendOne(ref DBFriendSelf self, ref DBFriendOneStruct one)
{
FriendUtils.CopySelfToFriendOne(ref self, ref one.oneFriend);
}
/// <summary>
/// -1: error
/// 0: 不是好友,也不在stranger里面
/// 1:是好友
/// 2:stranger里面已经有了
/// </summary>
public static unsafe int ISAlreadyBeenFriend(long self, long stranger)
{
ref FriendCacheInfoStruct selfinfo = ref GetFriendInfoByUid(self);
if (selfinfo.IsNull())
{
return -1;
}
return IsAlreadyBeenFriend(ref selfinfo, stranger);
}
/// <summary>
/// 0: 不是好友,也不在stranger里面
/// 1:是好友
/// 2:stranger里面已经有了
/// </summary>
public static unsafe int IsAlreadyBeenFriend(ref FriendCacheInfoStruct selfinfo, long stranger)
{
//是不是已经是好友了
for (int i = 0; i < selfinfo.FriendList.iCount; i++)
{
ref var oneStruct = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(selfinfo.FriendList.DBFriendOneID[i]);
if (! oneStruct.IsNull() && oneStruct.oneFriend.Uid == stranger)
{
return 1;
}
}
//陌生人列表里面有没有
for (int i = 0; i < selfinfo.FriendOpData.StrangerCount; i++)
{
//获取陌生人
ref DBFriendStrangerOneStruct strangerOneStruct = ref FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(selfinfo.FriendOpData.StrangerList[i]);
//获取陌生人指向的DBFriendOneStruct
ref var oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(strangerOneStruct.DBFriendOneID);
if (! oneFriend.IsNull() && oneFriend.oneFriend.Uid == stranger)
{
return 2;
}
}
return 0;
}
/// <summary>
/// 是不是已经存在该好友的op操作
/// </summary>
public static unsafe bool AlreadyExistOp(ref FriendCacheInfoStruct info, long opUid, DBFriendOpType opType)
{
for (int i = 0; i < info.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct opStruct = ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(info.FriendOpData.OpList[i]);
ref var oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(opStruct.DBFriendOneID);
if (oneFriend.IsNull())
{
continue;
}
if ((oneFriend.oneFriend.Uid == opUid) && (opStruct.OpType == (int)opType))
{
return true;
}
}
return false;
}
#endregion
#region 好友进行操作时变化缓存结构数据
/// <summary>
/// 添加好友到我的Friendlist
/// </summary>
public static unsafe int DoAddFriendOneToMySelf(ref FriendCacheInfoStruct selfInfo, long friendUid, bool isSelfSubmit)
{
for (int i = 0; i < selfInfo.FriendList.iCount; i++)
{
ref var oneStruct = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(selfInfo.FriendList.DBFriendOneID[i]);
// 已经是好友了
if (! oneStruct.IsNull() && oneStruct.oneFriend.Uid == friendUid)
{
return 0;
}
}
// 好友列表已满
if (FriendSvc.IsFriendListFull(ref selfInfo))
{
return isSelfSubmit ? (int) CSErrCode.SelfFriendListIsFull : (int) CSErrCode.TargetFriendListIsFull;
}
long posIndex = AddFriendOneToCache(friendUid);
// 新增FriendOne失败, 预先分配的空间不够了
if (posIndex <= 0)
{
return -1;
}
// 赠送礼物后删除好友, 重新添加后设置赠送时间
if (selfInfo.Self.TodaySendGiftUid.Contains(friendUid))
{
ref DBFriendOneStruct friendOne = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(posIndex);
friendOne.oneFriend.LastSendGiftTime = (int)FriendServerUtils.GetTimeSecond();
}
// 加入好友列表
selfInfo.FriendList.DBFriendOneID[selfInfo.FriendList.iCount] = posIndex;
selfInfo.FriendList.iCount++;
// 检查陌生人列表, 如果有则删除
DoDeleteStranger(ref selfInfo, friendUid);
// 检查Op列表, 如果有邀请则删除
DoDeleteFriendOp(ref selfInfo, friendUid, (int)DBFriendOpType.Invite);
selfInfo.SetNeedSave(true);
return 0;
}
public static unsafe void AddOrUpdateRemoteFriendOne(ref DBFriendOne friend, ref RepeatedDBFriendHeroOne_8 heroList)
{
if (FriendInfoCache.m_remoteFriendIDMap.TryGetValue(friend.Uid, out long index))
{
ref RemoteFriendOneStruct remoteFriend = ref FriendInfoCache.m_remoteFriendOneCache.GetByIndex(index);
if (remoteFriend.IsNull())
{
FriendInfoCache.m_remoteFriendOneCache.Free(index);
FriendInfoCache.m_remoteFriendIDMap.Remove(friend.Uid);
}
else
{
// 更新数据
FriendUtils.CopyDBFriendToRemoteFriend(ref friend, ref heroList, ref remoteFriend);
return;
}
}
if (FriendInfoCache.m_remoteFriendOneCache.m_freeQueue.Count == 0)
{
TraceLog.Error("FriendOp.AddOrUpdateRemoteFriendOne FriendInfoCache.m_remoteFriendOneCache not enough space");
return;
}
FriendInfoCache.m_remoteFriendIDMap.Add(friend.Uid, FriendInfoCache.m_remoteFriendOneCache.m_freeQueue.Peek());
ref RemoteFriendOneStruct friendData = ref FriendInfoCache.m_remoteFriendOneCache.Malloc();
FriendUtils.CopyDBFriendToRemoteFriend(ref friend, ref heroList, ref friendData);
TraceLog.Debug("FriendOp.AddOrUpdateRemoteFriendOne add uid {0} succ", friend.Uid);
}
public static unsafe void AddOrUpdateRemoteFriendOne(ref DBFriendSelf self)
{
if (FriendInfoCache.m_remoteFriendIDMap.TryGetValue(self.Uid, out long index))
{
ref RemoteFriendOneStruct remoteFriend = ref FriendInfoCache.m_remoteFriendOneCache.GetByIndex(index);
if (remoteFriend.IsNull())
{
FriendInfoCache.m_remoteFriendOneCache.Free(index);
FriendInfoCache.m_remoteFriendIDMap.Remove(self.Uid);
}
else
{
FriendUtils.CopySelfToRemoteFriend(ref self, ref remoteFriend);
return;
}
}
if (FriendInfoCache.m_remoteFriendOneCache.m_freeQueue.Count == 0)
{
TraceLog.Error("FriendOp.AddOrUpdateRemoteFriendOne FriendInfoCache.m_remoteFriendOneCache not enough space");
return;
}
FriendInfoCache.m_remoteFriendIDMap.Add(self.Uid, FriendInfoCache.m_remoteFriendOneCache.m_freeQueue.Peek());
ref RemoteFriendOneStruct friendData = ref FriendInfoCache.m_remoteFriendOneCache.Malloc();
FriendUtils.CopySelfToRemoteFriend(ref self, ref friendData);
TraceLog.Debug("FriendOp.AddOrUpdateRemoteFriendOne add uid {0} succ", self.Uid);
}
public static unsafe ref RemoteFriendOneStruct GetRemoteFriendOneByUid(long uid)
{
FriendInfoCache.m_remoteFriendIDMap.TryGetValue(uid, out long posIndex);
return ref FriendInfoCache.m_remoteFriendOneCache.GetByIndex(posIndex);
}
public static void DeleteRemoteFriendOne(long uid)
{
if (FriendInfoCache.m_remoteFriendIDMap.TryGetValue(uid, out long index))
{
TraceLog.Debug("FriendOp.DeleteRemoteFriendOne uid {0}", uid);
FriendInfoCache.m_remoteFriendOneCache.Free(index);
FriendInfoCache.m_remoteFriendIDMap.Remove(uid);
}
}
public static unsafe int DoAddBlackList(ref FriendCacheInfoStruct selfInfo, long targetUid)
{
ref var blacklist = ref selfInfo.Self.BlackList;
if(blacklist.Count >= FriendConfig.GetMaxBlacklistCount())
{
return (int)CSErrCode.MaxLimitSys;
}
if(blacklist.Contains(targetUid))
{
return (int)CSErrCode.InSelfBlacklist;
}
blacklist.Add(targetUid);
return 0;
}
public static unsafe int DoDelBlackList(ref FriendCacheInfoStruct selfInfo, long targetUid)
{
ref var blacklist = ref selfInfo.Self.BlackList;
for(int i = 0; i < blacklist.Count; i++)
{
if(blacklist[i] == targetUid)
{
blacklist.RemoveAt(i);
return 0;
}
}
return (int)CSErrCode.NotBlacklist;
}
public static unsafe bool IsFriend(ref FriendCacheInfoStruct selfInfo, long friendUid)
{
for (int i = 0; i < selfInfo.FriendList.iCount; i++)
{
ref var oneStruct = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(selfInfo.FriendList.DBFriendOneID[i]);
// 已经是好友了
if (!oneStruct.IsNull() && oneStruct.oneFriend.Uid == friendUid)
{
return true;
}
}
return false;
}
/// <summary>
/// 添加聊天信息到我的聊天记录中
/// </summary>
/// <param name="SelfUid"></param>
/// <param name="chatRes"></param>
public static unsafe long DoAddNewFriendChatToMySelf(long SelfUid, ref CSChatRes chatRes)
{
FriendInfoCache.m_selfIDMap.TryGetValue(SelfUid, out long index);
ref FriendCacheInfoStruct selfStruct = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(index);
if (selfStruct.IsNull())
{
return 0;
}
//删除第一条聊天信息
while (selfStruct.FriendOpData.ChatCount >= FriendConfig.GetChatListCountMax())
{
FriendInfoCache.m_cacheStructFriendChat.Free(selfStruct.FriendOpData.ChatList[0]);
for (int i = 1; i < selfStruct.FriendOpData.ChatCount; i++)
{
selfStruct.FriendOpData.ChatList[i - 1] = selfStruct.FriendOpData.ChatList[i];
}
selfStruct.FriendOpData.ChatCount--;
}
selfStruct.FriendOpData.LastChatSeq++;
long posIndex = AddFriendChatOneToCache(ref chatRes, selfStruct.FriendOpData.LastChatSeq);
if (posIndex > 0)
{
selfStruct.FriendOpData.ChatList[selfStruct.FriendOpData.ChatCount] = posIndex;
selfStruct.FriendOpData.ChatCount++;
}
TraceLog.Trace("DoAddNewFriendChatToMySelf uid {0} curr chatSeq {1} count {2}", selfStruct.Self.Uid
, selfStruct.FriendOpData.LastChatSeq, selfStruct.FriendOpData.ChatCount);
selfStruct.SetNeedSave(true);
return posIndex;
}
/// <summary>
/// 好友操作,比如某人邀请我加入
/// </summary>
/// <param name="selfUid"></param>
/// <param name="opUid"></param>
/// <param name="opType"></param>
public static unsafe ref DBFriendOneOpStruct DoAddNewFriendOpToMySelf(long selfUid, long opUid, int opType)
{
ref DBFriendOneOpStruct empty = ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(0);
if (!FriendInfoCache.m_selfIDMap.TryGetValue(selfUid, out long index))
{
return ref empty;
}
ref FriendCacheInfoStruct infoStruct = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(index);
if (AlreadyExistOp(ref infoStruct, opUid, (DBFriendOpType)opType))
{
return ref empty;
}
if (FriendSvc.IsFriendOpListFull(ref infoStruct))
{
return ref empty;
}
//判断操作者信息
if (!FriendInfoCache.m_selfIDMap.TryGetValue(opUid, out long opIndex))
{
return ref empty;
}
ref FriendCacheInfoStruct opInfoStruct = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(opIndex);
if (opInfoStruct.IsNull())
{
return ref empty;
}
//生成一个op
DBFriendOneOp newOp = new DBFriendOneOp();
newOp.OpType = opType;
newOp.OpSeq = ++infoStruct.FriendOpData.LastOpSeq;
FriendUtils.CopySelfToFriendOne(ref opInfoStruct.Self, ref newOp.Friend);
//注意这个里面的一环套了一环DBFriendOne
long opPosIndex = AddFriendOneOpToCache(ref newOp);
if (opPosIndex > 0)
{
infoStruct.FriendOpData.OpList[infoStruct.FriendOpData.OpCount] = opPosIndex;
infoStruct.FriendOpData.OpCount++;
infoStruct.SetNeedSave(true);
return ref FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(opPosIndex);
}
return ref empty;
}
/// <summary>
/// 将好友操作加入到我的FriendOp列表, 比如某人申请加我为好友
/// </summary>
public static unsafe int DoAddNewFriendOpToMySelf(ref FriendCacheInfoStruct selfInfo, long opUid, int opType)
{
if (AlreadyExistOp(ref selfInfo, opUid, (DBFriendOpType)opType))
{
return 0;
}
if (FriendSvc.IsFriendOpListFull(ref selfInfo))
{
return (int)CSErrCode.FriendOpListIsFull;
}
//注意这个里面的一环套了一环DBFriendOne
long opPosIndex = AddFriendOneOpToCache(opUid, opType, ++selfInfo.FriendOpData.LastOpSeq);
if (opPosIndex > 0)
{
selfInfo.FriendOpData.OpList[selfInfo.FriendOpData.OpCount] = opPosIndex;
selfInfo.FriendOpData.OpCount++;
selfInfo.SetNeedSave(true);
return 0;
}
return -1;
}
/// <summary>
/// 通过缓存中的info解析出self, friendList, opData
/// </summary>
/// <param name="friendInfo"></param>
/// <param name="self"></param>
/// <param name="friendList"></param>
/// <param name="opData"></param>
public static unsafe bool TransFriendCacheInfoStruct(ref FriendCacheInfoStruct friendInfo,
ref DBFriendSelf self, ref DBFriendList friendList, ref DBFriendOpData opData)
{
if (friendInfo.IsNull())
{
TraceLog.Error("FriendOp.TransFriendCacheInfoStruct friendCacheInfo is null");
return false;
}
//拷贝DBFriendSelf 信息
self.CopyFrom(ref friendInfo.Self);
//拷贝DBFriendList 信息
for (int i = 0; i < friendInfo.FriendList.iCount; i++)
{
ref DBFriendOneStruct one = ref GetFriendOneByIndex(ref friendInfo, i);
if (! one.IsNull())
{
friendList.AllFriends.Add(ref one.oneFriend);
}
}
//拷贝DBFriendOpData 操作信息
opData.LastOpSeq = friendInfo.FriendOpData.LastOpSeq;
for (int i = 0; i < friendInfo.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct one = ref GetFriendOpByIndex(ref friendInfo, i);
if (! one.IsNull())
{
DBFriendOneOp oneOp = new DBFriendOneOp();
oneOp.OpType = one.OpType;
oneOp.OpSeq = one.OpSeq;
ref DBFriendOneStruct oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
oneOp.Friend.CopyFrom(ref oneFriend.oneFriend);
opData.OpList.Add(ref oneOp);
}
}
//拷贝DBFriendOpData 聊天信息
opData.LastChatSeq = friendInfo.FriendOpData.LastChatSeq;
for (int i = 0; i < friendInfo.FriendOpData.ChatCount; i++)
{
ref DBFriendChatOneStruct one = ref GetFriendChatByIndex(ref friendInfo, i);
if (! one.IsNull())
{
opData.ChatList.Add(ref one.oneFriendChat);
}
}
//拷贝DBFriendOpData 陌生人信息
for (int i = 0; i < friendInfo.FriendOpData.StrangerCount; i++)
{
ref DBFriendStrangerOneStruct one = ref GetFriendStrangerByIndex(ref friendInfo, i);
if (! one.IsNull())
{
DBFriendStrangerOne oneStranger = new DBFriendStrangerOne();
oneStranger.PlayTogetherCount = one.PlayTogetherCount;
oneStranger.LastUpdateTime = one.LastUpdateTime;
ref DBFriendOneStruct oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
oneStranger.Data.CopyFrom(ref oneFriend.oneFriend);
opData.StrangerList.Add(ref oneStranger);
}
}
friendInfo.LastAccessTime = FriendServerUtils.GetTimeSecond();
return true;
}
// 从FriendInfoCache中获取FriendOpData
public static unsafe void GetOpDataFromFriendCacheInfo(long selfUid, ref DBFriendOpData opData, bool needChat)
{
if (FriendInfoCache.m_selfIDMap.TryGetValue(selfUid, out long posIndex) == false)
{
TraceLog.Error("FriendOp.GetOpDataFromFriendCacheInfo not find selfUid {0} in FriendInfoCache.m_selfIDMap", selfUid);
return ;
}
ref FriendCacheInfoStruct myInfo = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(posIndex);
if (myInfo.IsNull())
{
TraceLog.Error("FriendOp.GetOpDataFromFriendCacheInfo not find FriendCacheInfoStruct uid {0},index {1}", selfUid, posIndex);
return ;
}
//拷贝DBFriendOpData 操作信息
opData.LastOpSeq = myInfo.FriendOpData.LastOpSeq;
for (int i = 0; i < myInfo.FriendOpData.OpCount; i++)
{
ref DBFriendOneOpStruct one = ref GetFriendOpByIndex(ref myInfo, i);
if (! one.IsNull())
{
DBFriendOneOp oneOp = new DBFriendOneOp();
oneOp.OpType = one.OpType;
oneOp.OpSeq = one.OpSeq;
ref DBFriendOneStruct oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
oneOp.Friend.CopyFrom(ref oneFriend.oneFriend);
opData.OpList.Add(ref oneOp);
}
}
// chat要走chatsvr单独下发, 拉取好友数据时不下发
if (needChat)
{
//拷贝DBFriendOpData 聊天信息
opData.LastChatSeq = myInfo.FriendOpData.LastChatSeq;
for (int i = 0; i < myInfo.FriendOpData.ChatCount; i++)
{
ref DBFriendChatOneStruct one = ref GetFriendChatByIndex(ref myInfo, i);
if (! one.IsNull())
{
opData.ChatList.Add(ref one.oneFriendChat);
}
}
}
//拷贝DBFriendOpData 陌生人信息
for (int i = 0; i < myInfo.FriendOpData.StrangerCount; i++)
{
ref DBFriendStrangerOneStruct one = ref GetFriendStrangerByIndex(ref myInfo, i);
if (! one.IsNull())
{
DBFriendStrangerOne oneStranger = new DBFriendStrangerOne();
oneStranger.PlayTogetherCount = one.PlayTogetherCount;
oneStranger.LastUpdateTime = one.LastUpdateTime;
ref DBFriendOneStruct oneFriend = ref FriendInfoCache.m_cacheStructFriendOne.GetByIndex(one.DBFriendOneID);
oneStranger.Data.CopyFrom(ref oneFriend.oneFriend);
opData.StrangerList.Add(ref oneStranger);
}
}
myInfo.LastAccessTime = FriendServerUtils.GetTimeSecond();
}
public static unsafe void FillBlacklistInfo(ref FriendCacheInfoStruct info, ref SSQueryBlacklistRes res)
{
ref var blacklist = ref info.Self.BlackList;
for (int i = 0; i < blacklist.Count; i++)
{
if (FriendUtils.IsPlayerBelongThisServer(blacklist[i]))
{
ref FriendCacheInfoStruct friendInfo = ref FriendOp.GetFriendInfoByUid(blacklist[i]);
if (!friendInfo.IsNull())
{
DBFriendOne friendOne = new DBFriendOne();
FriendUtils.CopySelfToFriendOne(ref friendInfo.Self, ref friendOne);
res.Blacklist.Add(ref friendOne);
}
}
else
{
ref RemoteFriendOneStruct friendInfo = ref FriendOp.GetRemoteFriendOneByUid(blacklist[i]);
if (!friendInfo.IsNull())
{
DBFriendOne friendOne = new DBFriendOne();
FriendUtils.CopyRemoteFriendToDBFriend(ref friendInfo, ref friendOne);
res.Blacklist.Add(ref friendOne);
}
}
}
}
/// <summary>
/// 增加一个玩家的FriendcacheInfoStruct 到内存中
/// </summary>
/// <param name="self"></param>
/// <param name="friendList"></param>
/// <param name="opData"></param>
public static unsafe ref FriendCacheInfoStruct AddFriendCacheInfoStruct(ref DBFriendSelf self,
ref DBFriendList friendList, ref DBFriendOpData opData)
{
//玩家正好自己登陆,或者有人调用好友信息
if (FriendInfoCache.m_selfIDMap.TryGetValue(self.Uid, out long index))
{
ref FriendCacheInfoStruct info = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(index);
if (!info.IsNull())
{
return ref info;
}
// index存在但是数据不存在?
FriendInfoCache.m_cacheStructFriendInfo.Free(index);
FriendInfoCache.m_selfIDMap.Remove(self.Uid);
}
if (FriendInfoCache.m_cacheStructFriendInfo.m_freeQueue.Count == 0)
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct FriendInfoCache.m_cacheStructFriendInfo not enough space");
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(0);
}
ref FriendCacheInfoStruct infoStruct = ref FriendInfoCache.m_cacheStructFriendInfo.Malloc();
// 拷贝DBFriendSelf 信息
infoStruct.Self.CopyFrom(ref self);
// 设置realm信息
if (infoStruct.Self.RealmId == 0 || infoStruct.Self.RealmName.Length == 0)
{
var player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(self.Uid);
if (player != null)
{
if (infoStruct.Self.RealmId == 0)
{
infoStruct.Self.RealmId = player.realmId;
}
if (infoStruct.Self.RealmName.Length == 0)
{
var realm = FriendServerUtils.GetRealmBriefInfo(player.realmId);
if (realm != null)
{
infoStruct.Self.RealmName.SetString(realm.realmName);
}
}
}
}
// 防止运营期间修改参数, 正常情况不会出现
if (friendList.AllFriends.Count > FriendConfig.GetFriendListCountMax())
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} friendNum {1} > friendMax {2}"
, self.Uid, friendList.AllFriends.Count, FriendConfig.GetFriendListCountMax());
}
//拷贝DBFriendList 信息
infoStruct.FriendList.iCount = 0;
for (int i = 0; i < friendList.AllFriends.Count; i++)
{
long posIndex = AddFriendOneToCache(ref friendList.AllFriends[i]);
if (posIndex == 0)
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} add friendOne {1} failed"
, self.Uid, friendList.AllFriends[i].Uid);
DeleteFriendCacheInfo(ref infoStruct);
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(0);
}
infoStruct.FriendList.DBFriendOneID[i] = posIndex;
infoStruct.FriendList.iCount++;
}
// 防止运营期间修改参数, 正常情况不会出现
if (opData.OpList.Count > FriendConfig.GetFriendOpListCountMax())
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} friendOpNum {1} > friendOpMax {2}"
, self.Uid, opData.OpList.Count, FriendConfig.GetFriendOpListCountMax());
}
//拷贝DBFriendOpData 操作信息
infoStruct.FriendOpData.LastOpSeq = opData.LastOpSeq;
infoStruct.FriendOpData.OpCount = 0;
for (int i = 0; i < opData.OpList.Count; i++)
{
long posIndex = AddFriendOneOpToCache(ref opData.OpList[i]);
if (posIndex == 0)
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} add friendOp failed", self.Uid);
DeleteFriendCacheInfo(ref infoStruct);
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(0);
}
infoStruct.FriendOpData.OpList[i] = posIndex;
infoStruct.FriendOpData.OpCount++;
}
// 防止运营期间修改参数, 正常情况不会出现
if (opData.ChatList.Count > FriendConfig.GetChatListCountMax())
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} chatNum {1} > chatMax {2}"
, self.Uid, opData.ChatList.Count, FriendConfig.GetChatListCountMax());
}
//拷贝DBFriendOpData 聊天信息
infoStruct.FriendOpData.LastChatSeq = opData.LastChatSeq;
infoStruct.FriendOpData.ChatCount = 0;
for (int i = 0; i < opData.ChatList.Count; i++)
{
long posIndex = AddFriendChatOneToCache(ref opData.ChatList[i]);
if (posIndex == 0)
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} add chat failed", self.Uid);
DeleteFriendCacheInfo(ref infoStruct);
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(0);
}
infoStruct.FriendOpData.ChatList[i] = posIndex;
infoStruct.FriendOpData.ChatCount++;
}
// 防止运营期间修改参数, 正常情况不会出现
if (opData.StrangerList.Count > FriendConfig.GetFriendStrangerListCountMax())
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} strangerNum {1} > strangerMax {2}"
, self.Uid, opData.StrangerList.Count, FriendConfig.GetFriendStrangerListCountMax());
}
//拷贝DBFriendOpData 陌生人信息
infoStruct.FriendOpData.StrangerCount = 0;
for (int i = 0; i < opData.StrangerList.Count; i++)
{
long posIndex = AddFriendStrangerOneToCache(ref opData.StrangerList[i]);
if (posIndex == 0)
{
TraceLog.Error("FriendOp.AddFriendCacheInfoStruct uid {0} add stranger failed", self.Uid);
DeleteFriendCacheInfo(ref infoStruct);
return ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(0);
}
infoStruct.FriendOpData.StrangerList[i] = posIndex;
infoStruct.FriendOpData.StrangerCount++;
}
infoStruct.LastAccessTime = FriendServerUtils.GetTimeSecond();
// 最后加入哈希表
FriendInfoCache.m_selfIDMap.Add(self.Uid, infoStruct.GetObjectID());
TraceLog.Trace("FriendOp.AddFriendCacheInfoStruct uid {0} succ", infoStruct.Self.Uid);
AlertUsedPercent();
return ref infoStruct;
}
private static void AlertUsedPercent()
{
int usedRate = FriendInfoCache.m_cacheStructFriendInfo.GetUsedPercent();
if (usedRate > 80)
{
string str = $"warning: friendInfo used {usedRate}% > 80%";
FriendServerUtils.GetApp().Alerter.AlertMsg(str, 3600);
}
usedRate = FriendInfoCache.m_cacheStructFriendOne.GetUsedPercent();
if (usedRate > 80)
{
string str = $"warning: friendOne used {usedRate}% > 80%";
FriendServerUtils.GetApp().Alerter.AlertMsg(str, 3600);
}
usedRate = FriendInfoCache.m_cacheStructFriendOneOp.GetUsedPercent();
if (usedRate > 80)
{
string str = $"warning: friendOp used {usedRate}% > 80%";
FriendServerUtils.GetApp().Alerter.AlertMsg(str, 3600);
}
usedRate = FriendInfoCache.m_cacheStructFriendChat.GetUsedPercent();
if (usedRate > 80)
{
string str = $"warning: friendChat used {usedRate}% > 80%";
FriendServerUtils.GetApp().Alerter.AlertMsg(str, 3600);
}
usedRate = FriendInfoCache.m_remoteFriendOneCache.GetUsedPercent();
if (usedRate > 80)
{
string str = $"warning: remote friendOne used {usedRate}% > 80%";
FriendServerUtils.GetApp().Alerter.AlertMsg(str, 3600);
}
}
#endregion
#region 从数据库拉取时添加
// 该接口只是个简单封装, 调用前必须保证friendUid相关数据在FriendInfoCache.DBFriendSelf或RemoteFriendOne.DBFriendOne中
private static long AddFriendOneToCache(long friendUid)
{
if (FriendUtils.IsPlayerBelongThisServer(friendUid))
{
ref FriendCacheInfoStruct friendCache = ref GetFriendInfoByUid(friendUid);
if (! friendCache.IsNull())
{
return AddFriendOneToCache(ref friendCache.Self);
}
TraceLog.Error("AddFriendOneToCache error, local uid {0} no FriendCacheInfoStruct", friendUid);
}
else
{
ref RemoteFriendOneStruct remoteFriend = ref GetRemoteFriendOneByUid(friendUid);
if (!remoteFriend.IsNull())
{
return AddFriendOneToCache(ref remoteFriend);
}
TraceLog.Error("AddFriendOneToCache error, remote uid {0} no RemoteFriendOneStruct", friendUid);
}
return 0;
}
/// <summary>
/// 添加一个新的DBFriendOne到缓存中,返回添加后的 索引位置
/// 所有添加到缓存中的操作请通过这个接口
/// </summary>
/// <param name="oneFriend"></param>
/// <returns></returns>
private static long AddFriendOneToCache(ref DBFriendOne oneFriend)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendOneToCache error, m_freeQueue.Count not enough");
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Peek();
ref DBFriendOneStruct one = ref FriendInfoCache.m_cacheStructFriendOne.Malloc();
one.oneFriend.CopyFrom(ref oneFriend);
return cacheIndex;
}
private static long AddFriendOneToCache(ref DBFriendSelf self)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendOneToCache error, m_freeQueue.Count not enough");
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Peek();
ref DBFriendOneStruct one = ref FriendInfoCache.m_cacheStructFriendOne.Malloc();
FriendUtils.CopySelfToFriendOne(ref self, ref one.oneFriend);
return cacheIndex;
}
private static long AddFriendOneToCache(ref RemoteFriendOneStruct remoteFriend)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendOneToCache error, m_freeQueue.Count not enough");
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendOne.m_freeQueue.Peek();
ref DBFriendOneStruct one = ref FriendInfoCache.m_cacheStructFriendOne.Malloc();
FriendUtils.CopyRemoteFriendToDBFriend(ref remoteFriend, ref one.oneFriend);
return cacheIndex;
}
/// <summary>
/// 添加一条聊天信息到缓存中
/// </summary>
/// <param name="chatone"></param>
/// <returns></returns>
private static long AddFriendChatOneToCache(ref DBFriendChatOne chatone)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendChat.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendChatOneToCache error FriendInfoCache.m_cacheStructFriendChat.m_freeQueue.Count not enough");
return 0;
}
ref DBFriendChatOneStruct chatOneStruct = ref FriendInfoCache.m_cacheStructFriendChat.Malloc();
chatOneStruct.oneFriendChat.CopyFrom(ref chatone);
return chatOneStruct.GetObjectID();
}
private static long AddFriendChatOneToCache(ref CSChatRes chatRes, int seq)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendChat.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendChatOneToCache error FriendInfoCache.m_cacheStructFriendChat.m_freeQueue.Count not enough");
return 0;
}
ref DBFriendChatOneStruct chatOneStruct = ref FriendInfoCache.m_cacheStructFriendChat.Malloc();
chatOneStruct.oneFriendChat.SenderUid = chatRes.Uid;
chatOneStruct.oneFriendChat.SenderNick = chatRes.Nick;
chatOneStruct.oneFriendChat.SenderIcon = chatRes.Icon;
chatOneStruct.oneFriendChat.SenderGender = chatRes.Gender;
chatOneStruct.oneFriendChat.Message = chatRes.Message;
chatOneStruct.oneFriendChat.SendTime = chatRes.SendTime;
chatOneStruct.oneFriendChat.ChatSeq = seq;
chatOneStruct.oneFriendChat.TargetUid = chatRes.TargetUid;
chatOneStruct.oneFriendChat.IconFrameId = chatRes.IconFrameId;
return chatOneStruct.GetObjectID();
}
/// <summary>
/// 添加一条操作到缓存中(注意不是添加到玩家中,返回的位置索引再关联到玩家)
/// </summary>
/// <param name="oneOp"></param>
/// <returns></returns>
private static long AddFriendOneOpToCache(ref DBFriendOneOp oneOp)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendOneOp.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendOneOpToCache error FriendInfoCache.m_cacheStructFriendOneOp.m_freeQueue.Count not enough");
return 0;
}
//1:先判断能不能添加一个好友信息到缓存
long oneFriendindex = AddFriendOneToCache(ref oneOp.Friend);
if (oneFriendindex == 0)
{
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendOneOp.m_freeQueue.Peek();
ref DBFriendOneOpStruct oneOpStruct = ref FriendInfoCache.m_cacheStructFriendOneOp.Malloc();
oneOpStruct.OpSeq = oneOp.OpSeq;
oneOpStruct.OpType = oneOp.OpType;
oneOpStruct.DBFriendOneID = oneFriendindex;
oneOpStruct.FriendUid = oneOp.Friend.Uid;
return cacheIndex;
}
// 调用前必须保证submit的信息在FriendCache或者RemoteFriendOne中
private static long AddFriendOneOpToCache(long submitUid, int opType, int opSeq)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendOneOp.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendOneOpToCache error FriendInfoCache.m_cacheStructFriendOneOp not enough space");
return 0;
}
// 先判断能不能添加一个好友信息到缓存
long oneFriendindex = AddFriendOneToCache(submitUid);
if (oneFriendindex <= 0)
{
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendOneOp.m_freeQueue.Peek();
ref DBFriendOneOpStruct oneOpStruct = ref FriendInfoCache.m_cacheStructFriendOneOp.Malloc();
oneOpStruct.OpType = opType;
oneOpStruct.OpSeq = opSeq;
oneOpStruct.DBFriendOneID = oneFriendindex;
oneOpStruct.FriendUid = submitUid;
return cacheIndex;
}
/// <summary>
/// 添加一个陌生人到缓存中(注意不是添加到玩家中,返回的位置索引再关联到玩家)
/// </summary>
/// <param name="strangerOne"></param>
/// <returns></returns>
private static long AddFriendStrangerOneToCache(ref DBFriendStrangerOne strangerOne)
{
//不够时操作,一旦到这里问题就大了,前面之后一定要添加目前已经使用多少缓存的警告,如果超过要及时停服维护扩充
if (FriendInfoCache.m_cacheStructFriendStranger.m_freeQueue.Count == 0)
{
TraceLog.Error("AddFriendStrangerOneToCache error FriendInfoCache.m_cacheStructFriendStranger.m_freeQueue.Count not enough");
return 0;
}
//1:先判断能不能添加一个好友信息到缓存
long oneFriendindex = AddFriendOneToCache(ref strangerOne.Data);
if (oneFriendindex == 0)
{
return 0;
}
long cacheIndex = FriendInfoCache.m_cacheStructFriendStranger.m_freeQueue.Peek();
ref DBFriendStrangerOneStruct oneStruct = ref FriendInfoCache.m_cacheStructFriendStranger.Malloc();
oneStruct.PlayTogetherCount = strangerOne.PlayTogetherCount;
oneStruct.LastUpdateTime = strangerOne.LastUpdateTime;
oneStruct.DBFriendOneID = oneFriendindex;
return cacheIndex;
}
#endregion
#region 释放缓存
public static void DoFreeFriendOPByIndex(long index)
{
DBFriendOneOpStruct oneOpStruct = FriendInfoCache.m_cacheStructFriendOneOp.GetByIndex(index);
if (oneOpStruct.IsNull())
{
return;
}
DoFreeFriendOneByIndex(oneOpStruct.DBFriendOneID);
FriendInfoCache.m_cacheStructFriendOneOp.Free(index);
}
private static void DoFreeStrangerByIndex(long index)
{
DBFriendStrangerOneStruct oneStruct = FriendInfoCache.m_cacheStructFriendStranger.GetByIndex(index);
if (oneStruct.IsNull())
{
return;
}
DoFreeFriendOneByIndex(oneStruct.DBFriendOneID);
FriendInfoCache.m_cacheStructFriendStranger.Free(index);
}
private static void DoFreeChatListByIndex(long index)
{
DBFriendChatOneStruct chatOneStruct = FriendInfoCache.m_cacheStructFriendChat.GetByIndex(index);
if (chatOneStruct.IsNull())
{
return;
}
FriendInfoCache.m_cacheStructFriendChat.Free(index);
}
private static void DoFreeFriendOneByIndex(long index)
{
DBFriendOneStruct one = FriendInfoCache.m_cacheStructFriendOne.GetByIndex(index);
if (one.IsNull())
{
return;
}
FriendInfoCache.m_cacheStructFriendOne.Free(index);
}
#endregion
}
}