/* Sog 游戏基础库 2016 by zouwei */ using Sog; using ProtoCSStruct; using Sog.IO; namespace Account { public class GmCmdSvc : BaseReloadableService { public override int GetServiceType() { return AccountServiceType.GmCmdSvc; } //销毁的时候清空指令注册 public override void Dispose() { GmCommandMgr.Instance.ClearAll(); } //构造的时候注册所有指令 public GmCmdSvc() { RegisterAllGmCmd(); } public void Tick(long nowMs) { TickForAccountInfoTest(nowMs); } private void RegisterAllGmCmd() { //清空所有帐号 GmCommandMgr.Instance.Register("ClearAllHttpQueryTime", "ClearAllHttpQueryTime", ClearAllHttpQueryTime,GMBroadCastType.GMBroadCastType_MustBroad); //改变一个帐号关联的uid GmCommandMgr.Instance.Register("ChangeAccountUid", "ChangeAccountUid type accountid realm uid", ChangeAccountUid, GMBroadCastType.GMBroadCastType_CanNotBroad); GmCommandMgr.Instance.Register("CreateFakeAccount", "CreateFakeAccount", CreateFakeAccount); GmCommandMgr.Instance.Register("PrintAllAccount", "PrintAllAccount", PrintAllAccount); // gm批量创建account任务, 可以预估一下处理上限,配置ticknum GmCommandMgr.Instance.Register("AccountInfoTest", "param: type ticknum", this.AccountInfoTest); //注册广播事件 GmCommandMgr.Instance.NotifyWorldBroadCastGMCmdToServer = NotifyWorldBroadCastGMCmdToServer; } //广播来的指令 public static void OnWorldNotifyDealGmCmd(StructPacket packet) { ref SSNotifyServerDealGMCmd gmCmd = ref packet.GetMessage(); string[] splitStr = gmCmd.CmdParams.GetString().Split(' '); GmCommandMgr.Instance.HandlerGmCommand(gmCmd.GmCmd.GetString(), gmCmd.UserId, splitStr, false); } private int ClearAllHttpQueryTime(long userid, string[] cmdParams) { TraceLog.Debug("GmCmdSvc.ClearAllHttpQueryTime begin"); AccountTable table = AccountServerUtils.GetAccountTable(); foreach (var accountInfo in table.m_accountTable.Values) { accountInfo.LastQueryHttpSnsFriendTime = 0; accountInfo.LastQueryHttpUserInfoTime = 0; } TraceLog.Debug("GmCmdSvc.ClearAllHttpQueryTime success"); return 0; } private int ChangeAccountUid(long userid, string[] cmdParams) { if (cmdParams.Length != 4) { TraceLog.Error("GmCmdSvc.ChangeAccountUid invalid param count {0}, need type, accountId, new uid", cmdParams.Length); return -1; } int accountType = 0, realmId = 0, uid = 0; if (! int.TryParse(cmdParams[0], out accountType) || ! int.TryParse(cmdParams[2], out realmId) || ! int.TryParse(cmdParams[3], out uid)) { TraceLog.Error("GmCmdSvc.ChangeAccountUid invalid accountType {0} or realmId {1} uid {2}" , cmdParams[0], cmdParams[2], cmdParams[3]); return -1; } string accountId = cmdParams[1]; SSChangeFacebookUidDbReq req = new SSChangeFacebookUidDbReq(); req.AccountID.SetString(accountId); req.AccountType = accountType; req.RealmId = realmId; // realmId不要填错了 req.Uid = uid; uint iDBServerID = DBServerSelect.GetDBServerID(req.AccountType, accountId); AccountServerUtils.GetPacketSender().SendToServerByID(iDBServerID, (int)SSMsgID.ChangeFacebookUidDbReq, ref req, 0); return 0; } //如果是需要广播的,通知下world进行广播 public void NotifyWorldBroadCastGMCmdToServer(long userId, string gmCmd, string cmdParams) { SSNotifyWorldBroadCastGMCmd notify = new SSNotifyWorldBroadCastGMCmd(); notify.UserId = userId; notify.GmCmd.SetString(gmCmd); notify.CmdParams.SetString(cmdParams); notify.OnlyBroadCastSpec = userId > 0; //如果到了这里,userId又大于0 则是需要指定广播了 AccountServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.NotifyworldBroadcastgmcmd, ref notify, 0, 0); } private int CreateFakeAccount(long userid, string[] cmdParams) { if (cmdParams.Length < 1) { TraceLog.Error("GmCmdSvc.CreateFakeAccount invalid param, need account num"); return -1; } int.TryParse(cmdParams[0], out int num); long nowSec = AccountServerUtils.GetTimeSecond(); for (int i = 0; i < num; i++) { AccountServerUtils.GetAccountTableOp().CreateAccountInfo(1, "test_" + nowSec + "_" + i); } return 0; } private int PrintAllAccount(long userid, string[] cmdParams) { var table = AccountServerUtils.GetAccountTable().m_accountTable; foreach (AccountInfoOnAccountServer info in table.Values) { TraceLog.Trace("GmCmdSvc.PrintAllAccount rid {0} accountId {1} dataSeq {2} saveSeq {3}" , info.GetRuntimeId(), info.AccountID, info.DataSeq, info.SavedSuccessSeq); } return 0; } public int AccountInfoTest(long userid, string[] cmdParams) { if (cmdParams.Length < 3) { TraceLog.Error("GmCmdSvc.AccountInfoTest no param"); return -1; } if (!int.TryParse(cmdParams[0], out var opType) || !int.TryParse(cmdParams[1], out var tickNum) || !int.TryParse(cmdParams[2], out var total)) { return -2; } AccountInfoTest_OpType = opType; AccountInfoTest_TickNum = tickNum; AccountInfoTest_Total = total; return 0; } private int AccountInfoTest_OpType = 0; // 发送类型 1 查询并插入 private int AccountInfoTest_TickNum = 0; // 每帧发送数量 private int AccountInfoTest_Total = 0; // 总量 private long AccountInfoTest_nextTickMs = 0; private void TickForAccountInfoTest(long nowMs) { if (nowMs < AccountInfoTest_nextTickMs) { return; } AccountInfoTest_nextTickMs = nowMs + 100; if (AccountInfoTest_OpType <= 0 || AccountInfoTest_TickNum <= 0 || AccountInfoTest_Total <= 0) { return; } for (int i = 0; i < AccountInfoTest_TickNum; i++) { RandomAccountQuery(AccountInfoTest_Total--); if (AccountInfoTest_Total <= 0) { return; } } } private void RandomAccountQuery(int index) { var accountID = string.Format("{0}_accountId", index); var accountType = index % 10; SSQueryAccountInfoDB queryAccountInfodb = new SSQueryAccountInfoDB(); queryAccountInfodb.CSAccountAuthReq.Account.AccountType = accountType; queryAccountInfodb.CSAccountAuthReq.Account.AccountID.SetString(accountID); queryAccountInfodb.CSAccountAuthReq.Account.AccountToken.SetString(accountID); queryAccountInfodb.CSAccountAuthReq.DeviceId.SetString("account test"); queryAccountInfodb.CSAccountAuthReq.Ip.SetString("127.0.0.1"); queryAccountInfodb.Nick.SetString("NickNickNickNickNickNick"); queryAccountInfodb.Gender = index % 2; queryAccountInfodb.Icon.SetString("IconIconIconIconIconIcon"); queryAccountInfodb.Email.SetString("emailemailemailemailemailemail"); queryAccountInfodb.UserType = index % 2; queryAccountInfodb.OpenId.SetString("OpenIdOpenIdOpenIdOpenIdOpenIdOpenId"); queryAccountInfodb.AccountIpAddr = NetUtils.IpAddrToNum("127.0.0.1"); queryAccountInfodb.ExData.Channel.SetString("ChannelChannelChannelChannelChannel"); queryAccountInfodb.ExData.ChannelId = index % 5; queryAccountInfodb.CreateIfNotExist = true; uint iDBServerID = DBServerSelect.GetDBServerID(accountType, accountID); AccountServerUtils.GetPacketSender().SendToServerByID(iDBServerID, (int)SSMsgID.QueryAccountDb, ref queryAccountInfodb, 0); } } }