using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Linq; using System.Threading.Tasks; using Sog; using ProtoCSStruct; namespace Friend { /// /// 好友相关的发包,通知客户端,通知gameserver等 /// public static class FriendNotify { private static CSFriendOpRes m_CSFriendOpRes = new CSFriendOpRes(); // op列表发生变化 private static CSFriendOpListChgNotify m_CSFriendOpListChgNotify = new CSFriendOpListChgNotify(); // 好友列表发生变化 private static CSFriendListChgNotify m_CSFriendListChgNotify = new CSFriendListChgNotify(); // DBFriendSelf发生变化时通知其他服务器 private static SSFriendSelfChgNotify m_SSFriendSelfChgNotify = new SSFriendSelfChgNotify(); private static CSFriendSendGiftNotify m_CSFriendSendGiftNotify = new CSFriendSendGiftNotify(); private static CSFriendSelfChgNotify m_CSFriendSelfChgNotify = new CSFriendSelfChgNotify(); //在线的才通知 public static void NotifyPlayerFriendSelfChg(ref FriendCacheInfoStruct info) { PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(info.Self.Uid); if (player == null || ! player.IsOnline) { return; } m_CSFriendSelfChgNotify.Self.CopyFrom(ref info.Self); FriendServerUtils.GetPacketSender().SendToServerByID( player.WorldServerID, (int)CSGameMsgID.FriendSelfChgNotify, ref m_CSFriendSelfChgNotify, player.UserID); } public static void NotifyPlayerFriendOpListChg(long uid, ref DBFriendOneOpStruct chgOp, ref DBFriendOneStruct friend) { PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if (player == null || ! player.IsOnline) { return; } TraceLog.Trace("FriendNotify.NotifyPlayerFriendOpListChg uid {0} opType {1} seq {2} submit {3}" , player.UserID, chgOp.OpType, chgOp.OpSeq, friend.oneFriend.Uid); m_CSFriendOpListChgNotify.IsDelete = 0; m_CSFriendOpListChgNotify.ChgOp.OpSeq = chgOp.OpSeq; m_CSFriendOpListChgNotify.ChgOp.OpType = chgOp.OpType; m_CSFriendOpListChgNotify.ChgOp.Friend.CopyFrom(ref friend.oneFriend); FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendOpListChgNotify, ref m_CSFriendOpListChgNotify, player.UserID); } public static void NotifyPlayerFriendListChg(PlayerInfoFriend player, ref DBFriendOneStruct friend) { // 如果出现不在线但是没有登出时间的情况, 打个错误日志查下 if (friend.oneFriend.IsOnline == false && friend.oneFriend.LastLogoutTime == 0) { TraceLog.Error("FriendNotify.NotifyPlayerFriendListChg uid {0} online false, logout time 0", friend.oneFriend.Uid); } m_CSFriendListChgNotify.Friend.CopyFrom(ref friend.oneFriend); FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendListChgNotify, ref m_CSFriendListChgNotify, player.UserID); } // 转给玩家所在FriendSvr public static void NotifyOtherFriendSvrFriendSelfChg(ref DBFriendSelf self) { m_SSFriendSelfChgNotify.Self.CopyFrom(ref self); uint[] serverIDs = FriendServerUtils.GetApp().GetCluster().GetRemoteAppID((int) ServerType.Friend); foreach (uint svrId in serverIDs) { FriendServerUtils.GetPacketSender().SendToServerByID(svrId, (int)SSGameMsgID.FriendSelfChgNotify, ref m_SSFriendSelfChgNotify, 0); } } public static void NotifyOtherSvrFriendSendGift(long friendUid, long sendUid, int sendTime) { m_CSFriendSendGiftNotify.SendUid = sendUid; m_CSFriendSendGiftNotify.SendTime = sendTime; FriendServerUtils.GetPacketSender().SendToFriendServer((int)CSGameMsgID.FriendSendGiftNotify, ref m_CSFriendSendGiftNotify, friendUid, FriendServerUtils.GetAppID()); } public static void NotifyPlayerFriendSendGift(long friendUid, long sendUid) { PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(friendUid); if (player != null && player.IsOnline) { m_CSFriendSendGiftNotify.SendUid = sendUid; m_CSFriendSendGiftNotify.SendTime = FriendServerUtils.GetTimeSecond(); FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendSendGiftNotify, ref m_CSFriendSendGiftNotify, player.UserID); } } public static void NotifySubmitOnFriendOpEnd(long submitUid, int opType, long targetUid, int opFinalRet) { TraceLog.Trace("FriendNotify.NotifySubmitOnFriendOpEnd submit {0} opType {1} targetUid {2} opFinalRet {3}" , submitUid, opType, targetUid, opFinalRet); PlayerInfoFriend submitPlayer = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(submitUid); if (submitPlayer == null || ! submitPlayer.IsOnline) { return; } SendSubmitFriendOpRes(submitPlayer, opType, targetUid, opFinalRet); if (opFinalRet == 0) { if (opType == (int)DBFriendOpType.Invite || opType == (int)DBFriendOpType.AgreeAdd) { NotifyPlayerAddFriendSucc(submitPlayer, targetUid); } else if (opType == (int)DBFriendOpType.Delete || opType == (int)DBFriendOpType.AddBlacklist) { NotifyPlayerDeleteFriendSucc(submitPlayer, targetUid); } else if (opType == (int) DBFriendOpType.Refuse) { // 删除对方的申请 } // 如果有对方的好友申请则删除 NotifyPlayerDeleteFriendOp(submitPlayer, (int)DBFriendOpType.Invite, targetUid); } } public static void NotifyTargetOnFriendOpEnd(long submitUid, int opType, long targetUid, int opFinalRet) { TraceLog.Trace("FriendNotify.NotifyTargetOnFriendOpEnd submit {0} opType {1} targetUid {2} opFinalRet {3}" , submitUid, opType, targetUid, opFinalRet); PlayerInfoFriend targetPlayer = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(targetUid); if (targetPlayer == null || ! targetPlayer.IsOnline) { return; } if (opFinalRet == 0) { if (opType == (int)DBFriendOpType.Invite || opType == (int)DBFriendOpType.AgreeAdd) { NotifyPlayerAddFriendSucc(targetPlayer, submitUid); // 如果有对方的好友申请则删除 NotifyPlayerDeleteFriendOp(targetPlayer, (int)DBFriendOpType.Invite, submitUid); } else if (opType == (int)DBFriendOpType.Delete || opType == (int)DBFriendOpType.AddBlacklist) { NotifyPlayerDeleteFriendSucc(targetPlayer, submitUid); // 如果有对方的好友申请则删除 NotifyPlayerDeleteFriendOp(targetPlayer, (int)DBFriendOpType.Invite, submitUid); } } else if (opFinalRet == (int)CSErrCode.InsertFriendOpList) { // 通知target收到好友申请 NotifyPlayerAddFriendOp(targetPlayer, (int)DBFriendOpType.Invite, submitUid); } } public static void NotifyPlayerAddFriendSucc(PlayerInfoFriend player, long friendUid) { DBFriendOneStruct friendOne = FriendOp.GetFriendOneByUid(player.UserID, friendUid); if (friendOne.IsNull()) { TraceLog.Error("FriendNotify.NotifyPlayerAddFriendSucc uid {0} not in cache", player.UserID); return; } m_CSFriendListChgNotify.IsDelete = 0; m_CSFriendListChgNotify.Friend.CopyFrom(ref friendOne.oneFriend); FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendListChgNotify, ref m_CSFriendListChgNotify, player.UserID); } public static void NotifyPlayerDeleteFriendSucc(PlayerInfoFriend player, long friendUid) { m_CSFriendListChgNotify.Clear(); m_CSFriendListChgNotify.IsDelete = 1; m_CSFriendListChgNotify.Friend.Uid = friendUid; FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendListChgNotify, ref m_CSFriendListChgNotify, player.UserID); } public static void NotifyPlayerAddFriendOp(PlayerInfoFriend player, int opType, long submitUid) { ref DBFriendOneOpStruct addOp = ref FriendOp.GetFriendOpByUid(player.UserID, submitUid, opType); if (addOp.IsNull()) { TraceLog.Error("FriendNotify.NotifyPlayerAddFriendOp submit {0} opType {1} no Op in target {2} list" , submitUid, opType, player.UserID); return; } m_CSFriendOpListChgNotify.IsDelete = 0; m_CSFriendOpListChgNotify.ChgOp.OpType = addOp.OpType; m_CSFriendOpListChgNotify.ChgOp.OpSeq = addOp.OpSeq; if (FriendUtils.IsPlayerBelongThisServer(submitUid)) { ref FriendCacheInfoStruct submitInfo = ref FriendOp.GetFriendInfoByUid(submitUid); if (submitInfo.IsNull()) { TraceLog.Error("FriendNotify.NotifyPlayerAddFriendOp submit {0} not in cache", submitUid); return; } FriendUtils.CopySelfToFriendOne(ref submitInfo.Self, ref m_CSFriendOpListChgNotify.ChgOp.Friend); } else { ref RemoteFriendOneStruct submitInfo = ref FriendOp.GetRemoteFriendOneByUid(submitUid); if (submitInfo.IsNull()) { TraceLog.Error("FriendNotify.NotifyPlayerAddFriendOp submit {0} not in remote cache", submitUid); return; } FriendUtils.CopyRemoteFriendToDBFriend(ref submitInfo, ref m_CSFriendOpListChgNotify.ChgOp.Friend); } FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendOpListChgNotify, ref m_CSFriendOpListChgNotify, player.UserID); } public static void NotifyPlayerDeleteFriendOp(long uid, int opType, long friendUid) { PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if (player == null || ! player.IsOnline) { return; } NotifyPlayerDeleteFriendOp(player, opType, friendUid); } public static void NotifyPlayerDeleteFriendOp(PlayerInfoFriend player, int opType, long friendUid) { m_CSFriendOpListChgNotify.Clear(); m_CSFriendOpListChgNotify.IsDelete = 1; m_CSFriendOpListChgNotify.ChgOp.OpType = opType; m_CSFriendOpListChgNotify.ChgOp.Friend.Uid = friendUid; FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendOpListChgNotify, ref m_CSFriendOpListChgNotify, player.UserID); } public static void SendSubmitFriendOpRes(long submitUid, int opType, long targetUid, int opFinalRet) { PlayerInfoFriend submitPlayer = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(submitUid); if (submitPlayer == null || !submitPlayer.IsOnline) { return; } SendSubmitFriendOpRes(submitPlayer, opType, targetUid, opFinalRet); } public static void SendSubmitFriendOpRes(PlayerInfoFriend player, int opType, long targetUid, int opFinalRet) { m_CSFriendOpRes.TargetUid = targetUid; m_CSFriendOpRes.OpType = opType; m_CSFriendOpRes.Ret = opFinalRet; m_CSFriendOpRes.OpSeq = 0; FriendServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendOpRes, ref m_CSFriendOpRes, player.UserID); } public static void NotifyPlayerFriendStrangerListChg(long uid, DBFriendStrangerOneStruct stranger) { //不通知客户端,改成客户端点开的时候查询,这个客户端不需要实时知道变化 #if false //不在线 PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if (player == null) { TraceLog.Debug("FriendNotify.NotifyPlayerFriendStrangerListChg can not find player uid {0}", uid); return; } if (player.IsOnline == false) { TraceLog.Debug("FriendNotify.NotifyPlayerFriendStrangerListChg player uid {0} not online", uid); return; } TraceLog.Trace("FriendNotify.NotifyPlayerFriendStrangerListChg uid {0} stranger {1}" , player.UserID, stranger.Data.Uid); CSFriendStrangerListChgNotify notify = new CSFriendStrangerListChgNotify(); notify.Stranger = stranger; WorldServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendStrangerListChgNotify, notify, player.UserID); #endif } public static void NotifyPlayerFriendStrangerListDelete(long uid, long strangerUid) { //不通知客户端,改成客户端点开的时候查询,这个客户端不需要实时知道变化 #if false //不在线 PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if (player == null) { TraceLog.Debug("FriendNotify.NotifyPlayerFriendStrangerListDelete can not find player uid {0}", uid); return; } if (player.IsOnline == false) { TraceLog.Debug("FriendNotify.NotifyPlayerFriendStrangerListDelete player uid {0} not online", uid); return; } TraceLog.Trace("FriendNotify.NotifyPlayerFriendStrangerListDelete uid {0} strangerUid {1}" , player.UserID, strangerUid); CSFriendStrangerListDeleteNotify notify = new CSFriendStrangerListDeleteNotify(); notify.StrangerUid = strangerUid; WorldServerUtils.GetPacketSender().SendToServerByID(player.WorldServerID, (int)CSGameMsgID.FriendStrangerListDeleteNotify, notify, player.UserID); #endif } } }