Ejemplo n.º 1
0
        /// <summary>
        /// Устанавливает пользователей для коллекции сообщений.
        /// </summary>
        /// <param name="messages">Коллекция сообщений.</param>
        /// <exception cref="ArgumentException"/>
        /// <exception cref="CacheConversationException"/>
        /// <exception cref="AuthorizationRequiredException"/>
        public async Task SetUsers(IEnumerable <VKMessage> messages)
        {
            if (conversationsService == null)
            {
                conversationsService = ServiceLocator.Current.GetInstance <IConversationsService>();
            }
            if (cacheService == null)
            {
                cacheService = ServiceLocator.Current.GetInstance <IMessagesCacheService>();
            }

            var firstMsg = messages.First();

            if (!messages.All(m => m.ChatID == firstMsg.ChatID || m.UserID == firstMsg.UserID))
            {
                throw new ArgumentException("Все сообщения должны принадлежать одному чату или одному отправителю.");
            }

            if (firstMsg.IsChatMessage)
            {
                await WorkOnChat(firstMsg.ChatID, messages);
            }
            else
            {
                await WorkOnDialog(firstMsg.UserID, messages);
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Остановить сервис сообщений и сохранить состояние.
 /// </summary>
 public void StopAndSave()
 {
     longPollService.MessagesReceived -= LongPollService_MessagesReceived;
     messagesCacheService              = null;
     messagesUsersService              = null;
     dialogsService  = null;
     longPollService = null;
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Запустить сервис сообщений и восстановить состояние.
        /// </summary>
        public void StartAndRestore()
        {
            messagesCacheService = ServiceLocator.Current.GetInstance <IMessagesCacheService>();
            messagesUsersService = ServiceLocator.Current.GetInstance <IMessagesUsersService>();
            dialogsService       = ServiceLocator.Current.GetInstance <IDialogsCacheService>();
            longPollService      = ServiceLocator.Current.GetInstance <VKLongPollService>();

            longPollService.MessagesReceived += LongPollService_MessagesReceived;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Загружает диалог по указанному идентификатору пользователя и возвращает его.
        /// </summary>
        /// <param name="userID">Идентификатор пользователя.</param>
        /// <exception cref="CacheConversationException"/>
        /// <exception cref="AuthorizationRequiredException"/>
        public Task <IDialog> GetDialog(ulong userID)
        {
            return(dialogsTasks.GetOrAdd(userID, async id =>
            {
                if (cacheService == null)
                {
                    cacheService = ServiceLocator.Current.GetInstance <IMessagesCacheService>();
                }

                Task <IDialog> completedTask = null; var request = new GetUsersRequest {
                    UserID = id
                };
                for (int i = 0; i < 5; i++)
                {
                    var response = await request.ExecuteAsync();

                    if (response.Error.ErrorType == VKErrors.AccessDenied || response.Error.ErrorType == VKErrors.AuthorizationFailed)
                    {
                        dialogsTasks.TryRemove(id, out completedTask);
                        throw new AuthorizationRequiredException("Запрос провалился из-за необходимости выполнить авторизацию.");
                    }
                    if (response.Error.ErrorType != VKErrors.None)
                    {
                        if (i + 1 < 5)
                        {
                            await Task.Delay(1000);
                        }
                        continue;
                    }

                    var respUser = response.Response[0];

                    IDialog dialog = new Dialog();
                    dialog.UserID = respUser.ID;
                    dialog.User = new VKProfileShort
                    {
                        ID = respUser.ID,
                        FirstName = respUser.FirstName,
                        LastName = respUser.LastName,
                        Online = respUser.Online,
                        Photo50 = respUser.Photo50,
                        Sex = respUser.Sex
                    };
                    dialog.Title = respUser.FullName;
                    dialog.Messages = new MessagesCollection(respUser.ID);
                    await cacheService.CacheConversation(dialog);

                    dialogsTasks.TryRemove(id, out completedTask);
                    return dialog;
                }

                dialogsTasks.TryRemove(id, out completedTask);
                throw new CacheConversationException("Не удалось загрузить информацию о диалоге.");
            }));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Загружает чат по указанному идентификатору и возвращает его.
        /// </summary>
        /// <param name="chatID">Идентификатор чата.</param>
        /// <exception cref="CacheConversationException"/>
        /// <exception cref="AuthorizationRequiredException"/>
        public Task <IChat> GetChat(uint chatID)
        {
            return(chatsTasks.GetOrAdd(chatID, async id =>
            {
                if (cacheService == null)
                {
                    cacheService = ServiceLocator.Current.GetInstance <IMessagesCacheService>();
                }

                Task <IChat> completedTask = null;
                var request = new GetChatRequest
                {
                    ChatID = id,
                    Fields = new List <VKUserFields> {
                        VKUserFields.photo_50, VKUserFields.sex, VKUserFields.online
                    }
                };

                for (int i = 0; i < MAX_ATTEMPTS_NUMBER; i++)
                {
                    var response = await request.ExecuteAsync();

                    if (response.Error.ErrorType == VKErrors.AccessDenied || response.Error.ErrorType == VKErrors.AuthorizationFailed)
                    {
                        chatsTasks.TryRemove(id, out completedTask);
                        throw new AuthorizationRequiredException("Запрос провалился из-за необходимости выполнить авторизацию.");
                    }
                    if (response.Error.ErrorType != VKErrors.None)
                    {
                        if (i + 1 < MAX_ATTEMPTS_NUMBER)
                        {
                            await Task.Delay(1000);
                        }
                        continue;
                    }

                    IChat chat = new Chat();
                    chat.AdminID = response.Response.AdminID;
                    chat.ChatID = response.Response.ID;
                    chat.Title = response.Response.Title;
                    chat.Messages = new MessagesCollection(response.Response.ID);
                    chat.Users = new ObservableCollection <VKProfileChat>(response.Response.Users);

                    await cacheService.CacheConversation(chat);

                    chatsTasks.TryRemove(id, out completedTask);
                    return chat;
                }

                chatsTasks.TryRemove(id, out completedTask);
                throw new CacheConversationException("Не удалось загрузить информацию о чате.");
            }));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Возвращает пользователей указанной беседы.
        /// </summary>
        /// <param name="convID">Идентификатор беседы.</param>
        /// <exception cref="CacheConversationException"/>
        /// <exception cref="AuthorizationRequiredException"/>
        public async Task <IEnumerable <VKProfileShort> > GetConversationUsers(long convID)
        {
            if (conversationsService == null)
            {
                conversationsService = ServiceLocator.Current.GetInstance <IConversationsService>();
            }
            if (cacheService == null)
            {
                cacheService = ServiceLocator.Current.GetInstance <IMessagesCacheService>();
            }

            IConversation conversation = null;

            try { conversation = await cacheService.GetConversation(convID); }
            catch (Exception) { }

            if (conversation == null)
            {
                if (convID < 0)
                {
                    conversation = await conversationsService.GetChat((uint)-convID);
                }
                else
                {
                    conversation = await conversationsService.GetDialog((ulong)convID);
                }
            }

            if (convID < 0)
            {
                return(((IChat)conversation).Users);
            }
            else
            {
                return new List <VKProfileShort> {
                           ((IDialog)conversation).User
                }
            };
        }