using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Sog; using ProtoCSStruct; namespace Friend { //Facebook好友处理逻辑 public static class FriendSnsSvc { /// /// 向account服务器发送查询sns好友信息列表的请求 /// 这个请通过world转,或者通过httpproxyworld查询也可以,以后再说 /// /// public static void SendAccountQuerySnsFriendList(PlayerInfoFriend player) { SSQuerySnsFriendAccountReq req = new SSQuerySnsFriendAccountReq(); req.Uid = player.UserID; req.AccountType = player.accountInfo.AccountType; req.AccountID = player.accountInfo.AccountID; //FriendServerUtils.GetPacketSender().SendToAccountServer((int)SSMsgID.QuerySnsFriendAccountReq, req, player.UserID); } public static void OnQuerySnsFriendAccountRes(uint remoteAppID, StructPacket packet) { ref SSQuerySnsFriendAccountRes res = ref packet.GetMessage(); PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(res.Uid); if (player == null) { TraceLog.Error("FriendSnsSvc.QuerySnsFriendAccountRes can not find player uid {0}", res.Uid); return; } player.SnsFriendList.Clear(); // todo 拉取到的sns好友是登录过游戏的? OnAccountSnsFriendQueryFinish(player); } private static bool IsInMySnsFriendList(PlayerInfoFriend player, long friendUid) { foreach(var snsFriend in player.SnsFriendList) { if(snsFriend.Uid == friendUid) { return true; } } return false; } /// /// account回应sns好友列表成功,处理自己的sns好友和游戏好友从数据库里拉取信息 /// 同步sns好db好友信息,比如好友类型,从sns好友变成游戏好友或者从游戏好友变成sns好友 /// /// public static unsafe void OnAccountSnsFriendQueryFinish(PlayerInfoFriend player) { TraceLog.Trace("FriendSnsSvc.OnAccountSnsFriendQueryFinish uid {0}", player.UserID); ref FriendCacheInfoStruct info = ref FriendOp.GetFriendInfoByUid(player.UserID); if (info.IsNull()) { TraceLog.Error("FriendSnsSvc.OnAccountSnsFriendQueryFinish can not find player uid {0} friendInfo from cache" , player.UserID); return; } //遍历所有好友列表,从cache里更新最新数据,如果cache里没有,需要去数据库里查(sns qq 微信的好友暂时不处理) FriendSvc.CheckFriendListStruct(ref info); FriendSvc.CheckPlayerFriendDataSynFromDBFinishAckGame(player.UserID); } public static void OnQueryFriendInfoCacheResFromDB(ref SSQueryFriendInfoCacheRes res) { if (! FriendUtils.IsPlayerBelongThisServer(res.FromUid)) { FriendServerUtils.GetPacketSender().SendToFriendServer((int) SSGameMsgID.QueryFriendInfoCacheRes, ref res, res.FromUid); return; } PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(res.FromUid); if (player == null) { TraceLog.Error("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB can not find player uid {0}" , res.FromUid); return; } //先统一处理sns列表 if (res.Reason == QueryFriendInfoCacheReason.LoginQuerySnsFriend) { //标记sns好友数据 foreach (var snsFriend in player.SnsFriendList) { if (snsFriend.Uid == res.Uid) { if (res.Self.Uid == 0) { // snsFriend.DbQueryResult = -1; } else { //snsFriend.DbQueryResult = 1; } break; } } } // 好友的DBFriendSelf if (res.Self.Uid == 0) { //这种情况按理说是不可能发生的 if (res.Reason != QueryFriendInfoCacheReason.LoginQuerySnsFriend) { TraceLog.Error("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB uid {0} fromuid {1} forSns == false, but not friend data in db, logic error!" , res.Uid, res.FromUid); } // LoginQuerySnsFriend,发起查询的sns好友肯定是有uid的,有uid但是没有tbfriend信息 // 目前只有一种情况,建立了account后没有login游戏,有uid没有roleData,也就没有tbfriend // LoginQueryDbfriend,对方在自己的好友列表里面,但是对方的好友信息不存在? // A、B成为好友后,A数据落地成功,B数据落地失败,停服没成功?没问题,游戏好友手动再加一次,sns好友下次上线自己添加 //facebook好友里有,但是游戏数据库里没有,情况1,数据库会删除重建,情况2,建立了account但是没有建立游戏帐号,也正常(概率应该不高) TraceLog.Trace("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB can not find friendInfo from db uid {0} fromuid {1}" , res.Uid, res.FromUid); } else { //sns好友db信息查询成功,那么添加这个好友到我的好友列表 if (res.Reason == QueryFriendInfoCacheReason.LoginQuerySnsFriend) { //添加好友信息到列表 ref FriendCacheInfoStruct friendInfo = ref FriendOp.GetFriendInfoByUid(player.UserID); if (friendInfo.IsNull()) { TraceLog.Error("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB uid {0} no cache" , res.Uid); return; } if(FriendSvc.CanAddNewToFriendList(friendInfo.Self.Uid, res.Self.Uid)) { DBFriendOne newOne = new DBFriendOne(); FriendUtils.CopySelfToFriendOne(ref res.Self, ref newOne); newOne.FriendType = 1; // 主动添加自己的sns好友 FriendOp.DoAddFriendOneToMySelf(ref friendInfo, newOne.Uid, true); TraceLog.Trace("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB player uid {0} add one friend uid {1}" , player.UserID, newOne.Uid); } else { if (FriendSvc.IsFriendListFull(ref friendInfo)) { TraceLog.Error("FriendSnsSvc.OnQueryFriendInfoCacheResFromDB player uid {0} friend list full" , player.UserID); } } } } if(res.Reason == QueryFriendInfoCacheReason.QueryBlacklist) { FriendSvc.CheckPlayerBlacklistSynFromDBFinishAckGame(res.FromUid); return; } FriendSvc.CheckPlayerFriendDataSynFromDBFinishAckGame(res.FromUid); } } }