Example #1
0
        /// <summary>
        /// Инициализировать приложение.
        /// </summary>
        public static void Initialize(string tileId, bool restored = false)
        {
            if (restored)
            {
                (ServiceLocator.Current.GetInstance <SidebarViewModel>()).Activate();
                ServiceHelper.VKLongPollService.StartLongPolling();
                ServiceLocator.Current.GetInstance <IAppMessagesService>().StartAndRestore();
                ServiceLocator.Current.GetInstance <IPromoService>().Update();
                ProcessTile(tileId);
                return;
            }

            var message = new NavigateToPageMessage {
                Operation = NavigationType.New
            };

            if (ServiceLocator.Current.GetInstance <SettingsService>().AccessToken == null)
            {
                message.Page = AppViews.LoginView;
            }
            else
            {
                message.Page = AppViews.NewsView;
                (ServiceLocator.Current.GetInstance <SidebarViewModel>()).Activate();
                ServiceHelper.VKLongPollService.StartLongPolling();
                ServiceLocator.Current.GetInstance <IAppMessagesService>().StartAndRestore();
                ServiceLocator.Current.GetInstance <IPromoService>().Update();
            }

            if (!ProcessTile(tileId))
            {
                Messenger.Default.Send(message);
            }
        }
        /// <summary>
        /// Отправляет Push-уведомление внутри приложения.
        /// </summary>
        /// <param name="conversation">Беседа, уведомление для которой нужно отправить.</param>
        /// <param name="message">Сообщение для отправки.</param>
        private void SendPush(IConversation conversation, VKMessage message)
        {
            if ((message.Type & VKMessageType.Sent) == VKMessageType.Sent)
            {
                return;
            }

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

            string title = null;

            if (message.IsChatMessage)
            {
                title = String.Format("{0}\n{1}", message.Sender.FullName, conversation.Title);
            }
            else
            {
                title = message.Sender.FullName;
            }

            CoreHelper.SendInAppPush(message.Body,
                                     title, PopupMessageType.Default,
                                     message.Sender.Photo50, parameter: navParameter);
        }
        private object ReceiveMessage(NavigateToPageMessage action)
        {
            var page = string.Format("/Views/{0}View.xaml", action.PageName);

            NavigationService.Navigate(new System.Uri(page, System.UriKind.Relative));
            return(null);
        }
Example #4
0
        private void OnNavigateToPage(NavigateToPageMessage message)
        {
            string[] parameters = message.Page.Split(new Char[] { '|' });
            message.Page = parameters[0];
            Type type;

            if (message.Page.StartsWith("/MainView"))
            {
                string TotalPath = "VKClientFinalW8MVVM." + message.Page.Substring(1);
                type = Type.GetType(TotalPath, false);
            }
            else
            {
                string TotalPath = "VKClient.Views." + message.Page.Substring(1);
                //string TotalPath = "VKClientFinalW8MVVM.Views." + message.Page.Substring(1);
                type = Type.GetType(TotalPath, false);
            }
            if (type == null)
            {
                if (Debugger.IsAttached)
                {
                    Debugger.Break();
                }
                return;
            }
            if (typeof(Page).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
            {
                Frame frame = (Frame)Window.Current.Content;
                frame.Navigate(type, parameters);
                return;
            }
            //DialogService.DisplayPopup(type, message.Parameters, null);
        }
        private object ReceiveNavigationMessage(NavigateToPageMessage message)
        {
            StringBuilder sb = new StringBuilder("/Views/");

            sb.Append(message.PageName);
            sb.Append(".xaml");
            NavigationService.Navigate(
                new System.Uri(sb.ToString(),
                               System.UriKind.Relative));

            return(null);
        }
        private void OnNavigateToPage(NavigateToPageMessage message)
        {
            Type type = Type.GetType("Meridian.View." + message.Page.Substring(1), false);

            if (type == null)
            {
                if (Debugger.IsAttached)
                {
                    Debugger.Break();
                }
                return;
            }

            var frame = Application.Current.MainWindow.GetVisualDescendents().OfType <Frame>().FirstOrDefault();

            if (frame == null)
            {
                return;
            }

            if (Settings.Instance.SendStats)
            {
                YandexMetrica.ReportEvent("page" + message.Page);
            }

            if (typeof(Layout.PageBase).IsAssignableFrom(type))
            {
                var page = (Layout.PageBase)Activator.CreateInstance(type);
                page.NavigationContext.Parameters = message.Parameters;
                frame.Navigate(page);
            }
            else if (typeof(PageBase).IsAssignableFrom(type))
            {
                var page = (PageBase)Activator.CreateInstance(type);
                page.NavigationContext.Parameters = message.Parameters;
                frame.Navigate(page);
            }
            else if (typeof(Page).IsAssignableFrom(type))
            {
                frame.Navigate(Activator.CreateInstance(type));
            }

            UpdateCanGoBack();
        }
Example #7
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());
        }
Example #8
0
        private void OnNavigateToPage(NavigateToPageMessage message)
        {
            Type type = Type.GetType("Meridian.View." + message.Page.Substring(1), false);
            if (type == null)
            {
                if (Debugger.IsAttached)
                    Debugger.Break();
                return;
            }

            var frame = Application.Current.MainWindow.GetVisualDescendents().OfType<Frame>().FirstOrDefault();
            if (frame == null)
                return;

            if (Settings.Instance.SendStats)
                Counter.ReportEvent("page" + message.Page);

            if (typeof(PageBase).IsAssignableFrom(type))
            {
                var page = (PageBase)Activator.CreateInstance(type);
                page.NavigationContext.Parameters = message.Parameters;
                frame.Navigate(page);
            }
            else if (typeof(Page).IsAssignableFrom(type))
            {
                frame.Navigate(Activator.CreateInstance(type));
            }

            UpdateCanGoBack();
        }
Example #9
0
        /// <summary>
        /// Отправляет внутренее всплывающее уведомление.
        /// </summary>
        /// <param name="content">Содержимое уведомления.</param>
        /// <param name="title">Заголовок уведомления.</param>
        /// <param name="type">Тип уведомления.</param>
        /// <param name="imageUrl">Путь к картинке уведомления.</param>
        /// <param name="duration">Длительность уведомления.</param>
        /// <param name="parameter">Параметр навигации для уведомления.</param>
        /// <param name="actionToDo">Делегат для выполнения при нажатии уведомления.</param>
        public static void SendInAppPush(string content, string title = null, PopupMessageType type = PopupMessageType.Default,
                                         string imageUrl = null, TimeSpan duration = default(TimeSpan), NavigateToPageMessage parameter = null, Action actionToDo = null)
        {
            var pop = new PopupMessage()
            {
                Title      = title,
                Content    = content,
                Type       = type,
                ImageUrl   = imageUrl,
                Parameter  = parameter,
                ActionToDo = actionToDo
            };

            if (duration != default(TimeSpan))
            {
                pop.Duration = duration;
            }

            Messenger.Default.Send(pop);
        }