private ErrorCode DBAsynQueryUserCallBack(GBuffer buffer, DBActiveWrapper db) { CSToDB.QueryUserReq msg = new CSToDB.QueryUserReq(); msg.MergeFrom(buffer.GetBuffer(), 0, ( int )buffer.length); GCToCS.Login login = new GCToCS.Login(); login.MergeFrom(ByteString.CopyFromUtf8(msg.Logininfo)); UserDBData userDbData = new UserDBData(); userDbData.usrDBData.un64ObjIdx = ( ulong )msg.Objid; userDbData.usrDBData.userPlatform = ( UserPlatform )login.Sdk; DBToCS.QueryUser queryUser = new DBToCS.QueryUser(); this.DBAsynQueryUser(userDbData, queryUser, db); using (MemoryStream ms = new MemoryStream()) { Serializer.Serialize(ms, userDbData.usrDBData); queryUser.Db = Encoding.UTF8.GetString(ms.GetBuffer(), 0, ( int )ms.Length); queryUser.Login = msg.Logininfo; queryUser.Gcnetid = msg.Gcnetid; queryUser.Gsid = msg.Gsid; queryUser.Nickname = userDbData.szNickName; } CS.instance.userMgr.EncodeAndSendToLogicThread(queryUser, ( int )DBToCS.MsgID.EQueryUserDbcallBack); return(ErrorCode.Success); }
private async Task <ErrorCode> QueryUserAsync(CSToDB.QueryUserReq queryUser) { ErrorCode errorCode; //若Redis缓存可用,则查询;不可用就直接查询数据库(通过RedisIP配置控制) ConnectionMultiplexer redis = CS.instance.GetUserDBCacheRedisHandler(); if (redis.IsConnected) { errorCode = await redis.GetDatabase().StringGetAsync($"usercache:{queryUser.Objid}").ContinueWith(this.OnRedisQueryUser, queryUser); } else { //todo //查询数据库 //errorCode = GetNowWorkActor().EncodeAndSendToDBThread( *queryUser, queryUser.msgid() ); errorCode = ErrorCode.Success; } return(errorCode); }
private ErrorCode OnRedisQueryUser(Task <RedisValue> task, object state) { CSToDB.QueryUserReq pQueryUser = (CSToDB.QueryUserReq)state; ErrorCode res; do { //这里为什么还要检测一次? UserNetInfo netinfo = new UserNetInfo(pQueryUser.Gsid, ( uint )pQueryUser.Gcnetid); if (this.ContainsUser(netinfo)) { res = ErrorCode.InvalidNetState; break; } GCToCS.Login sLoginMsg = new GCToCS.Login(); sLoginMsg.MergeFrom(ByteString.CopyFromUtf8(pQueryUser.Logininfo)); CSUser pcUser = this.GetUser(( ulong )pQueryUser.Objid); if (null != pcUser) { pcUser.OnOnline(netinfo, sLoginMsg, false, false); return(ErrorCode.Success); } if (task.Result.IsNullOrEmpty || !task.Result.HasValue) { Logger.Error("Null Reply"); res = ErrorCode.RedisReplyNil; break; } UserDBData userDbData; using (MemoryStream ms = new MemoryStream(task.Result)) { userDbData = Serializer.Deserialize <UserDBData>(ms); } userDbData.usrDBData.un64ObjIdx = ( ulong )pQueryUser.Objid; userDbData.szUserName = sLoginMsg.Name; pcUser = new CSUser(); pcUser.LoadDBData(userDbData); //todo //pcUser.GetUserBattleInfoEx().mDebugName = userDbData.szUserName; //pcUser.GetUserDBData().guideSteps.szCSContinueGuide = dbUserCache.guideStr; res = this.AddUser(pcUser); if (res != ErrorCode.Success) { Logger.Error("add user fail!"); return(res); } pcUser.OnOnline(netinfo, sLoginMsg, false, true); this.RemoveUserFromRedisLRU(pcUser); } while (false); if (res != ErrorCode.Success) { Logger.Log("没命中cache,查询数据库"); //todo //GetNowWorkActor().EncodeAndSendToDBThread( pQueryUser, CSToDB.MsgID.EQueryUserDbcallBack ); } return(ErrorCode.Success); }
private ErrorCode UserAskLogin(CSGSInfo csgsInfo, uint gcNetID, GCToCS.Login login) { if (string.IsNullOrEmpty(login.Name) || login.Name.Length > Consts.DEFAULT_NAME_LEN) { return(ErrorCode.InvalidUserName); } UserNetInfo netinfo = new UserNetInfo(csgsInfo.m_n32GSID, gcNetID); if (this.ContainsUser(netinfo)) { return(ErrorCode.InvalidNetState); } ErrorCode errorCode = ErrorCode.Success; UserCombineKey sUserCombineKey = new UserCombineKey(login.Name, login.Sdk); if (this.allUserName2GuidMap.TryGetValue(sUserCombineKey, out ulong guid)) { //老玩家 //如果还在内存里 CSUser user = this.GetUser(guid); if (null != user) { bool bFlag = this.CheckIfInGuideBattle(user); if (bFlag) { Logger.Warn("新手引导玩家不允许顶号"); return(ErrorCode.GuideUserForbit); } user.OnOnline(netinfo, login, false, false); return(ErrorCode.Success); } //异步查询玩家数据 CSToDB.QueryUserReq queryUser = new CSToDB.QueryUserReq { Logininfo = login.ToByteString().ToStringUtf8(), Gsid = csgsInfo.m_n32GSID, Gcnetid = ( int )gcNetID, Csid = ( int )CS.instance.csKernelCfg.unCSId, Objid = ( long )guid }; errorCode = this.QueryUserAsync(queryUser).Result; } else { //新玩家,产生GUID guid = this.CombineGUID(); CSUser pcUser = new CSUser(); UserDBData userDbData = new UserDBData(); userDbData.usrDBData.un64ObjIdx = guid; userDbData.szUserName = login.Name; userDbData.szUserPwd = login.Passwd; userDbData.usrDBData.userPlatform = ( UserPlatform )login.Sdk; userDbData.usrDBData.tRegisteUTCMillisec = TimeUtils.utcTime; //加入全局表 this.allUserName2GuidMap.Add(sUserCombineKey, guid); pcUser.LoadDBData(userDbData); //todo //pcUser.userBattleInfoEx.mDebugName = login.Name; ErrorCode nRet = this.AddUser(pcUser); if (nRet != 0) { return(nRet); } pcUser.OnOnline(netinfo, login, true, true); this.InsertNewUserToMysql(login, pcUser); } //todo //log //{ // string mystream = string.Empty; // mystream << login.name() << LOG_SIGN; // mystream << login.sdk() << LOG_SIGN; // mystream << login.platform() << LOG_SIGN; // mystream << login.equimentid() << LOG_SIGN; // mystream << login.ipaddress(); // CSSGameLogMgr::GetInstance().AddGameLog( eLog_Login, guid, mystream.str() ); //} return(errorCode); }