/* Sog 游戏基础库 2016 by zouwei */ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.IO; using Sog; using ProtoCSStruct; using Sog.IO; namespace Friend { public class GmCmdSvc : BaseReloadableService { public override int GetServiceType() { return FriendServiceType.GmCmdSvc; } //销毁的时候清空指令注册 public override void Dispose() { GmCommandMgr.Instance.ClearAll(); } //构造的时候注册所有指令 public GmCmdSvc() { RegisterAllGmCmd(); } private void RegisterAllGmCmd() { GmCommandMgr.Instance.Register("LogErrIconCount", "LogErrIconCount ;", this.LogErrIconCount); GmCommandMgr.Instance.Register("ClearErrIconCount", "ClearErrIconCount ;", this.ClearErrIconCount); GmCommandMgr.Instance.Register("LogUserFriend", "LogUserFriend ;", this.LogUserFriend); GmCommandMgr.Instance.Register("AddFakePlayer", "AddFakePlayer", this.AddFakePlayer); GmCommandMgr.Instance.Register("DeleteFriendCache", "DeleteFriendCache", this.DeleteFriendCache); GmCommandMgr.Instance.Register("LogMemOnStop", "LogMemOnStop", this.LogMemOnStop); } public static void OnDealGmCmd(StructPacket packet) { ref SSNotifyServerDealGMCmd gmCmd = ref packet.GetMessage(); string[] splitStr = gmCmd.CmdParams.GetString().Split(' '); GmCommandMgr.Instance.HandlerGmCommand(gmCmd.GmCmd.GetString(), gmCmd.UserId, splitStr, false); } public int LogErrIconCount(long userid, string[] cmdParams) { var cache = FriendServerUtils.GetFriendInfoCacheTable(); if (cache != null) { TraceLog.Error("GmCmdSvc.LogErrIconCount ErrIconCount {0}", cache.ErrIconCount); TraceLog.Stat("GmCmdSvc.LogErrIconCount ErrIconCount {0}", cache.ErrIconCount); } return 0; } public int ClearErrIconCount(long userid, string[] cmdParams) { var cache = FriendServerUtils.GetFriendInfoCacheTable(); if (cache != null) { cache.ErrIconCount = 0; } return 0; } public int LogUserFriend(long userid, string[] cmdParams) { TraceLog.Stat("GmCmdSvc.LogUserFriend begin uid {0}", userid); var player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(userid); if (player != null) { if (player.roleBase.Uid == 0) { TraceLog.Stat("GmCmdSvc.LogUserFriend player uid {0} icon {1}", player.UserID, player.roleBase.Icon); } if (player.accountInfo.AccountID.Count == 0) { TraceLog.Stat("GmCmdSvc.LogUserFriend accountType {0} accountId {1}", player.accountInfo.AccountType, player.accountInfo.AccountID); } } TraceLog.Stat("GmCmdSvc.LogUserFriend end uid {0}", userid); return 0; } public int AddFakePlayer(long userid, string[] cmdParams) { if (cmdParams.Length < 2) { TraceLog.Error("GmCmdSvc.AddFakePlayer no param, need uid"); return -1; } int.TryParse(cmdParams[0], out int uid); if (uid >= 1000) { TraceLog.Error("GmCmdSvc.AddFakePlayer invalid uid {0}", uid); return -1; } int.TryParse(cmdParams[1], out int worldSvcId); if (worldSvcId <= 0) { return -1; } PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if (player != null) { TraceLog.Error("GmCmdSvc.AddFakePlayer uid {0} exist", uid); return -1; } player = new PlayerInfoFriend { UserID = uid, WorldServerID = (uint)worldSvcId }; player.roleBase.Uid = uid; player.LoginTime = FriendServerUtils.GetTimeSecond(); player.IsOnline = true; FriendServerUtils.GetPlayerTableOp().AddPlayerInfo(player); TraceLog.Trace("GmCmdSvc.AddFakePlayer uid {0} succ", uid); return 0; } public int DeleteFriendCache(long userid, string[] cmdParams) { TraceLog.Trace("GmCmdSvc.DeleteFriendCache"); if (cmdParams.Length < 1) { TraceLog.Error("GmCmdSvc.DeleteFriendCache no param, need 0/1"); return -1; } int.TryParse(cmdParams[0], out int flag); FriendOp.GMDeleteFriendCache = flag != 0; return 0; } public int LogMemOnStop(long userid, string[] cmdParams) { TraceLog.Error("GmCmdSvc.LogMemOnStop"); if (!FriendServerUtils.GetApp().IsStopping) { TraceLog.Error("GmCmdSvc.LogMemOnStop server not stopping"); return -1; } TraceLog.Error("GmCmdSvc.LogMemOnStop WaitAckStructRequestSender {0}", WaitAckStructRequestSender.Instance.IsEmpty()); TraceLog.Error("GmCmdSvc.LogMemOnStop m_selfIDMap {0}", FriendInfoCache.m_selfIDMap.Count); // 打印在m_selfIDMap中的friendInfo foreach (KeyValuePair kvp in FriendInfoCache.m_selfIDMap) { TraceLog.Error("GmCmdSvc.LogMemOnStop uid {0} pos {1}", kvp.Key, kvp.Value); ref FriendCacheInfoStruct friendInfo = ref FriendOp.GetFriendInfoByUid(kvp.Key); if (friendInfo.IsNull()) { TraceLog.Error("GmCmdSvc.LogMemOnStop uid {0} no FriendCacheInfo", kvp.Key); continue; } var seq = friendInfo.GetDataSeqSave(); TraceLog.Error("GmCmdSvc.LogMemOnStop uid {0} dataSeq {1} saveSeq {2} lastSaveTime {3} waitSaveTime {4} NeedSave {5}" , friendInfo.Self.Uid, seq.DataSeq, seq.SavedSuccessSeq, seq.LastSaveDBReqTime , seq.SaveReqWaitAckTimeout, friendInfo.NeedSave); } // 打印还在内存中的friendInfo int count = 0; int usedIdx = FriendInfoCache.m_cacheStructFriendInfo.GetUsedIndex(1); while (usedIdx > 0 && count < 1000) { // 以防万一, 最多打印1000个 count++; ref FriendCacheInfoStruct friendInfo = ref FriendInfoCache.m_cacheStructFriendInfo.GetByIndex(usedIdx); if (! friendInfo.IsNull()) { var seq = friendInfo.GetDataSeqSave(); TraceLog.Error("GmCmdSvc.LogMemOnStop used FriendCacheInfo, uid {0} dataSeq {1} saveSeq {2} lastSaveTime {3} waitSaveTime {4} NeedSave {5}" , friendInfo.Self.Uid, seq.DataSeq, seq.SavedSuccessSeq, seq.LastSaveDBReqTime , seq.SaveReqWaitAckTimeout, friendInfo.NeedSave); } usedIdx = FriendInfoCache.m_cacheStructFriendInfo.GetUsedIndex(usedIdx + 1); } return 0; } } }