コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }