private async ETTask RunAsync(Player player, C2L_UpdateUserEquip message, Action <L2C_UpdateUserEquip> reply)
        {
            L2C_UpdateUserEquip response = new L2C_UpdateUserEquip();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        // 蒐集Log資訊(可一致性,但複雜)
                        var log = new BsonDocument();
                        if (user.playerCharSetting.CharacterId != message.CharSetting.CharacterId)
                        {
                            log["characterId"] = message.CharSetting.CharacterId;
                        }
                        if (user.playerCharSetting.BicycleId != message.CharSetting.BicycleId)
                        {
                            log["bicycleId"] = message.CharSetting.BicycleId;
                        }
                        if (user.playerCharSetting.BodyId != message.CharSetting.BodyId)
                        {
                            log["bodyId"] = message.CharSetting.BodyId;
                        }
                        if (user.playerCharSetting.DecorationId != message.CharSetting.DecorationId)
                        {
                            log["decorationId"] = message.CharSetting.DecorationId;
                        }
                        if (user.playerCharSetting.MedalId != message.CharSetting.MedalId)
                        {
                            log["medalId"] = message.CharSetting.MedalId;
                        }
                        user.playerCharSetting = message.CharSetting;
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserCharacterSetting, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private static async void SaveUserAndBroadcastTarget(MapUnit mapUnit, User user, BsonDocument log)
        {
            await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserRideTotalRecord, log);

            // 如果玩家在線上 告知該玩家異動紀錄
            var    proxy      = Game.Scene.GetComponent <CacheProxyComponent>();
            var    playerSync = proxy.GetMemorySyncSolver <Player>();
            Player selfPlayer = playerSync.Get <Player>(mapUnit.Uid);

            if (selfPlayer != null)
            {
                PlayerRideTotalInfo playerRideTotalInfo = await UserDataHelper.QueryUserRideAllRecord(user);

                G2C_UpdatePlayerRideTotalInfo g2c_UpdatePlayerRideInfo = new G2C_UpdatePlayerRideTotalInfo()
                {
                    TotalInfo = playerRideTotalInfo,
                };
                GateMessageHelper.BroadcastTarget(g2c_UpdatePlayerRideInfo, mapUnit.Uid);
            }
        }
        private async ETTask RunAsync(Player player, C2L_UpdateUserLanguage message, Action <L2C_UpdateUserLanguage> reply)
        {
            L2C_UpdateUserLanguage response = new L2C_UpdateUserLanguage();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        var log = new BsonDocument();
                        if (user.language != message.Language)
                        {
                            log["language"] = message.Language;
                            user.language   = message.Language;
                        }
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserLanguage, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async static ETTask SignInByUid(Session session, User user, R2C_Authentication response, string firebaseDeviceToken, bool isRefreshToken, string signInMethod)
        {
            BsonDocument log = new BsonDocument();

            // 更新user登入資訊
            user.lastOnlineAt   = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            log["lastOnlineAt"] = user.lastOnlineAt; // 最後登入時間
            log["signInMethod"] = signInMethod;      // 登入方式
            if (user.firebaseDeviceToken != firebaseDeviceToken)
            {
                user.firebaseDeviceToken   = firebaseDeviceToken;
                log["firebaseDeviceToken"] = user.firebaseDeviceToken; // 最後更新的FirebaseToken
            }
            if (isRefreshToken)
            {
                user.lastCreateTokenAt   = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                log["lastCreateTokenAt"] = user.lastCreateTokenAt; // 最後更新Token的時間
            }
            log["ip"] = session.RemoteAddress.ToString();          // 登入位址
            await UserDataHelper.UpsertUser(user, DBLog.LogType.SignUserIn, log);

            // 從Realm轉登到Gate並傳給Client用戶資料
            await RealmToGate(session, user, response, isRefreshToken);
        }
Esempio n. 5
0
        private async ETTask RunAsync(Player player, C2L_UpdateUserProfile message, Action <L2C_UpdateUserProfile> reply)
        {
            L2C_UpdateUserProfile response = new L2C_UpdateUserProfile();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        var log = new BsonDocument();
                        if (user.name != message.Name)
                        {
                            log["name"] = message.Name;
                            user.name   = message.Name;
                        }
                        if (user.gender != message.Sex)
                        {
                            log["gender"] = message.Sex;
                            user.gender   = message.Sex;
                        }
                        if (user.location != message.Location)
                        {
                            log["location"] = message.Location;
                            user.location   = message.Location;
                        }
                        if (user.height != message.Height)
                        {
                            log["height"] = message.Height;
                            user.height   = message.Height;
                        }
                        if (user.weight != message.Weight)
                        {
                            log["weight"] = message.Weight;
                            user.weight   = message.Weight;
                        }
                        if (user.birthday != message.Birthday)
                        {
                            log["birthday"] = message.Birthday;
                            user.birthday   = message.Birthday;
                        }
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserProfiler, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        /// <summary>
        /// 重新計算背包數
        /// </summary>
        /// <param name="user"></param>
        /// <param name="equipmentTypes"></param>
        /// <returns></returns>
        private static async ETTask RecalculateBagCount(this User user, List <int> equipmentTypes)
        {
            var userBagCapacity = user.userBagCapacity;

            var results = await dbProxy.Query <Equipment>(entity => entity.uid == user.Id &&
                                                          equipmentTypes.Contains(entity.configType));

            var dict = OtherHelper.Group(results.OfType <Equipment>().ToList(), entity => entity.configType);

            var logBag              = new BsonDocument();
            var logCharSetting      = new BsonDocument();
            var isDecorationExisted = false;

            for (int a = 0; a < equipmentTypes.Count; a++)
            {
                var type          = equipmentTypes[a];
                var equipmentType = (Equipment.EquipmentType)type;
                if (!dict.TryGetValue(type, out var equipments))
                {
                    equipments = new List <Equipment>(0);
                }

                // 初始化
                int usedCount       = 0;
                var usedCountString = GetUsedCountString(equipmentType);

                for (int i = 0; i < equipments.Count; i++)
                {
                    var equipment = equipments[i];
                    if (TryGetEquipmentConfig(equipment.configId, out CharacterConfig characterConfig))
                    {
                        // 不可疊直接++
                        if (!characterConfig.IsStackEquipment())
                        {
                            // 現在的不可疊裝備至少有一件符合(TODO:能裝備的裝備一定要不可疊)
                            // TODO:腳色裝備的記錄改用裝備的_id
                            if (equipment.configId == user.playerCharSetting.DecorationId)
                            {
                                isDecorationExisted = true;
                            }

                            usedCount++;
                        }
                        else
                        {
                            if (characterConfig.MaxCountOnSlot < 0)
                            {
                                usedCount++;
                            }
                            else
                            {
                                var remainder = equipment.count % characterConfig.MaxCountOnSlot;
                                var slotCount = equipment.count / characterConfig.MaxCountOnSlot + (remainder == 0 ? 0 : 1);
                                usedCount += slotCount;
                            }
                        }
                    }
                    else
                    {
                        Log.Error($"Equipment config id:{equipment.configId} is not defined!");
                        continue;
                    }
                }

                if (userBagCapacity[usedCountString] != usedCount)
                {
                    logBag[usedCountString]          = usedCount;
                    userBagCapacity[usedCountString] = usedCount;
                }
            }

            if (!isDecorationExisted)
            {
                user.playerCharSetting.DecorationId = 0;
            }

            await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserBagSlotCount, logBag);
        }