Example #1
0
 private void DoCache(CustomUser u)
 {
     lock (this)
     {
         HttpRuntime.Cache.Add(u, u.Login, CacheItemPriority.High, OnRemovedFromCache);
         CachedUsers.Add(u);
     }
 }
Example #2
0
        /// <summary>
        /// 获取缓存用户实例。
        /// </summary>
        /// <param name="id">用户Id。</param>
        /// <returns>返回缓存用户实例对象。</returns>
        public virtual CachedUser GetCachedUser(int id)
        {
            if (CachedUsers.TryGetValue(id, out var user))
            {
                return(user);
            }

            user = CachedQueryable.Where(x => x.Id == id).FirstOrDefault(Converter);
            CachedUsers.TryAdd(id, user);
            return(user);
        }
Example #3
0
        /// <summary>
        /// 获取缓存用户实例。
        /// </summary>
        /// <param name="id">用户Id。</param>
        /// <returns>返回缓存用户实例对象。</returns>
        public virtual async Task <CachedUser> GetCachedUserAsync(int id)
        {
            if (CachedUsers.TryGetValue(id, out var user))
            {
                return(user);
            }

            user = await CachedQueryable.Where(x => x.Id == id).FirstOrDefaultAsync(Converter);

            CachedUsers.TryAdd(id, user);
            return(user);
        }
Example #4
0
        private void OnRemovedFromCache(string key, object value, CacheItemRemovedReason reason)
        {
            string ck = CacheUtility.GetKey <CustomUser>(key);

            lock (this)
            {
                var ind = CachedUsers.FindIndex(u => u.Login == ck);
                if (ind >= 0)
                {
                    CachedUsers.RemoveAt(ind);
                }
            }
        }
Example #5
0
        /// <summary>
        /// 获取缓存用户实例列表。
        /// </summary>
        /// <param name="ids">用户Id。</param>
        /// <returns>返回缓存用户实例对象列表。</returns>
        public virtual IEnumerable <CachedUser> GetCachedUsers(int[] ids)
        {
            var users   = CachedUsers.Values.Where(x => ids.Contains(x.Id)).ToList();
            var cacheds = users.Select(x => x.Id);

            ids = ids.Where(x => !cacheds.Contains(x)).ToArray();
            if (ids.Length > 0)
            {
                var current = CachedQueryable.Where(x => x.Included(ids)).AsEnumerable(Converter);
                foreach (var cachedUser in current)
                {
                    CachedUsers.TryAdd(cachedUser.Id, cachedUser);
                }
                users.AddRange(current);
            }

            return(users);
        }
Example #6
0
        /// <summary>
        /// Вызывается при получении новых сообщений через LongPoll.
        /// </summary>
        private async void VKLongPollService_MessagesReceived(object sender, MessagesReceivedEventArgs e)
        {
            var ids = new ulong[e.Messages.Count];

            for (int i = 0; i < e.Messages.Count; i++)
            {
                ids[i] = e.Messages[i].MessageID;
            }

            List <VKMessage> resultMessages = null;

            bool success      = false;
            byte numOfRetries = 0;

            while (!success && numOfRetries <= 3)
            {
                var request = new GetByIDRequest {
                    MessageIDs = ids.ToList()
                };
                var response = await request.ExecuteAsync();

                if (response.Error.ErrorType == VKErrors.None)
                {
                    success        = true;
                    resultMessages = response.Response.Items;
                }
                else
                {
                    numOfRetries++;
                    CoreHelper.SendInAppPush(
                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                        null, PopupMessageType.Warning);
                    await Task.Delay(3000 *numOfRetries);
                }
            }

            if (!success)
            {
                CoreHelper.SendInAppPush(
                    "Не удалось получить подробные сообщения",
                    "LongPoll", PopupMessageType.Error);
                return;
            }

            var unknownUsers = new Dictionary <ulong, List <VKMessage> >();

            var conversations = new Dictionary <long, List <VKMessage> >();

            foreach (var msg in resultMessages)
            {
                long key = msg.IsChatMessage ? -msg.ChatID : (long)msg.UserID;
                if (conversations.ContainsKey(key))
                {
                    conversations[key].Add(msg);
                }
                else
                {
                    var list = new List <VKMessage>();
                    list.Add(msg);
                    conversations[key] = list;
                }

                if (CachedUsers.ContainsKey(msg.UserID))
                {
                    msg.Sender = CachedUsers[msg.UserID];
                }
                else
                {
                    if (unknownUsers.ContainsKey(msg.UserID))
                    {
                        unknownUsers[msg.UserID].Add(msg);
                    }
                    else
                    {
                        var list = new List <VKMessage>();
                        list.Add(msg);
                        unknownUsers[msg.UserID] = list;
                    }
                }
            }

            success      = unknownUsers.Count == 0;
            numOfRetries = 0;
            while (!success && numOfRetries <= 3)
            {
                var usersRequest = new GetUsersRequest()
                {
                    UserIDs = unknownUsers.Keys.ToList()
                };
                var usersResponse = await usersRequest.ExecuteAsync();

                if (usersResponse.Error.ErrorType == VKErrors.None)
                {
                    success = true;
                    foreach (var user in usersResponse.Response)
                    {
                        var sUser = new VKProfileChat()
                        {
                            ID        = user.ID,
                            FirstName = user.FirstName,
                            LastName  = user.LastName,
                            Online    = user.Online,
                            Photo50   = user.Photo50
                        };

                        var list = unknownUsers[user.ID];
                        for (int i = 0; i < list.Count; i++)
                        {
                            list[i].Sender = sUser;
                        }

                        CachedUsers[sUser.ID] = sUser;
                    }
                }
                else
                {
                    numOfRetries++;
                    CoreHelper.SendInAppPush(
                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                        null, PopupMessageType.Warning);
                    await Task.Delay(3000 *numOfRetries);
                }
            }

            if (!success)
            {
                CoreHelper.SendInAppPush(
                    "Не удалось получить информацию о пользователях сообщений",
                    null, PopupMessageType.Error);
            }

            foreach (long convID in conversations.Keys)
            {
                var msgsList   = conversations[convID];
                var cachedConv = Conversations.Keys.FirstOrDefault(c => c.ID == convID);

                if (cachedConv != null)
                {
                    var list = Conversations[cachedConv];
                    foreach (var msg in msgsList)
                    {
                        list.Insert(0, msg);
                    }
                }
                else
                {
                    MessagesCollection list = null;
                    if (convID < 0)
                    {
                        list = new MessagesCollection((uint)-convID);
                    }
                    else
                    {
                        list = new MessagesCollection((ulong)convID);
                    }

                    cachedConv = await ServiceHelper.MessagesCacheService.GetConversationFromCache(convID);

                    if (cachedConv != null)
                    {
                        foreach (var msg in cachedConv.CachedMessages)
                        {
                            list.Add(msg);
                        }
                    }
                    else
                    {
                        if (convID < 0)
                        {
                            success      = false;
                            numOfRetries = 0;
                            while (!success && numOfRetries <= 3)
                            {
                                var request = new GetChatRequest()
                                {
                                    ChatID   = -convID,
                                    IsSingle = true,
                                    Fields   = new List <VKUserFields> {
                                        VKUserFields.photo_50, VKUserFields.online, VKUserFields.sex
                                    }
                                };
                                var response = await request.ExecuteAsync();

                                if (response.Error.ErrorType == VKErrors.None)
                                {
                                    success    = true;
                                    cachedConv = new CachedConversationOld
                                    {
                                        ID             = convID,
                                        Title          = response.Response.Title,
                                        Users          = new ObservableCollection <VKProfileChat>(response.Response.Users),
                                        CachedMessages = msgsList,
                                        AdminID        = response.Response.AdminID
                                    };
                                    Conversations[cachedConv] = list;

                                    foreach (var user in cachedConv.Users)
                                    {
                                        CachedUsers[user.ID] = user;
                                    }
                                }
                                else
                                {
                                    numOfRetries++;
                                    CoreHelper.SendInAppPush(
                                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                                        null, PopupMessageType.Warning);
                                    await Task.Delay(3000 *numOfRetries);
                                }
                            }
                        }
                        else
                        {
                            success      = false;
                            numOfRetries = 0;
                            while (!success && numOfRetries <= 3)
                            {
                                var request = new GetUsersRequest {
                                    UserID = (ulong)convID
                                };
                                var response = await request.ExecuteAsync();

                                if (response.Error.ErrorType == VKErrors.None)
                                {
                                    success = true;
                                    var user = response.Response[0];
                                    cachedConv = new CachedConversationOld
                                    {
                                        ID    = convID,
                                        Title = user.FullName,
                                        Users = new ObservableCollection <VKProfileChat>
                                        {
                                            new VKProfileChat
                                            {
                                                ID        = user.ID,
                                                LastName  = user.LastName,
                                                FirstName = user.FirstName,
                                                Photo50   = user.Photo50,
                                                Online    = user.Online
                                            }
                                        }
                                    };
                                    CachedUsers[user.ID] = cachedConv.Users[0];
                                }
                                else
                                {
                                    numOfRetries++;
                                    CoreHelper.SendInAppPush(
                                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                                        null, PopupMessageType.Warning);
                                    await Task.Delay(3000 *numOfRetries);
                                }
                            }
                        }
                    }

                    foreach (var msg in msgsList)
                    {
                        list.Insert(0, msg);
                    }

                    //list.UpdateSimilar();
                    Conversations[cachedConv] = list;
                }

                await CacheConversation(cachedConv.ID);

                WorkOnDialog(msgsList.Last());

                var lastMsg = msgsList.LastOrDefault(m => m.Type == VKMessageType.Received);
                if (lastMsg == null)
                {
                    continue;
                }

                var navParameter = new NavigateToPageMessage
                {
                    Page      = AppViews.ConversationView,
                    Parameter = convID
                };

                CoreHelper.SendInAppPush(lastMsg.Body,
                                         cachedConv.Title, PopupMessageType.Default,
                                         lastMsg.Sender.Photo50, parameter: navParameter);
            }

            await ServiceHelper.MessagesCacheService.CacheDialogs(Dialogs.Take(20).ToList());
        }