public void AddStatus(StatusViewModel statusView, bool insertAtBeginning) { Dispatcher.Invoke( new Action<StatusViewModel>( delegate(StatusViewModel status) { var currentList = lstbStatusList.ItemsSource as IList<StatusViewModel>; //currentList.Insert(0, status); if(insertAtBeginning) { currentList.Insert(0, status); } else { currentList.Add(status); } //todo:to tak testowo FlashMainWindow(Window.GetWindow(this.Parent), true); }), statusView); }
/// <summary> /// Dodaje status do listy w widoku /// </summary> /// <param name="statusView">status</param> /// <param name="insertAtBeginning">czy dodać na początek czy na koniec listy</param> public void AddStatus(StatusViewModel statusView, bool insertAtBeginning) { Dispatcher.Invoke( new Action<StatusViewModel>( delegate(StatusViewModel status) { var currentList = lstbStatusList.ItemsSource as IList<StatusViewModel>; //currentList.Insert(0, status); //jeśli zawiera już ten status to //go nie dodajemy ponownie, czasami pobierze podwójnie //ten sam wpis //if(currentList.Contains(status)) //{ // return; //} if (currentList != null) { if (insertAtBeginning) { currentList.Insert(0, status); } else { currentList.Add(status); } } //todo:testowo zmiana ikony w tray'u Window parentWindows = Window.GetWindow(Parent); if (parentWindows is HostWindow) { ((HostWindow) parentWindows).StatusAdded(); } //todo:to tak testowo FlashMainWindow(Window.GetWindow(Parent), true); }), statusView); }
/// <summary> /// tworzy początek wiadomości, który zaczyna się od loginu(loginów) użytkownika /// </summary> /// <param name="mainTextBlock"></param> /// <param name="s"></param> private static void CreateUsersBegining(StatusBindableTextBlock mainTextBlock, StatusViewModel s) { Hyperlink hypUserLogin = CreateUserHyperLink(s.UserLogin, string.Format(userLinkFormat, s.UserLogin), string.Format(userProfileFormat, s.UserLogin), mainTextBlock); //dodajemy link użytkownka mainTextBlock.Inlines.Add(hypUserLogin); //tworzymy link odbiorcy wiadomośći if ((s.StatusType == "DirectedMessage") || (s.StatusType == "PrivateMessage")) { string mark = (s.StatusType == "DirectedMessage") ? " > " : " >> "; //Run r = CreateRun(mark); mainTextBlock.Inlines.Add(mark); //tworzymy link użytkownika odbiorcy wiadomości Hyperlink hypRecipientLogin = CreateUserHyperLink(s.RecipientLogin, string.Format(userLinkFormat, s.RecipientLogin), string.Format(userProfileFormat, s.RecipientLogin), mainTextBlock); //dodajemy link użytkownka mainTextBlock.Inlines.Add(hypRecipientLogin); } //Run rr = CreateRun(": "); mainTextBlock.Inlines.Add(": "); }
/// <summary> /// Pomocna metoda do mapowania Entities do ViewEntities /// </summary> /// <param name="iList"></param> /// <returns></returns> public static StatusViewModel MapToViewStatus(BlipFace.Service.Entities.BlipStatus status) { StatusViewModel st = new StatusViewModel(); try { //todo: trzeba uważać bo gdy nie ma recipient to //rzuca wyjątekiem nullreference string reciptientAvatar = string.Empty; string reciptientLogin = string.Empty; //czasami data nie jest ustawiana przez Blipa - dziwne string creationDate = string.Empty; string avatarUrl = status.User.Avatar == null ? "http://static1.blip.pl/images/nn_nano.png?1240395130" : status.User.Avatar.Url50; st.StatusId = status.Id; st.UserId = status.User.Id; st.Content = status.Content; st.UserAvatar50 = avatarUrl; st.RecipientAvatar50 = reciptientAvatar; st.RecipientLogin = reciptientLogin; st.CreationDate = creationDate; st.UserLogin = status.User.Login; } catch (Exception e) { throw; } return st; }
/// <summary> /// Callback do zdarzenia gdy statusy zostają zaktualizowane /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void BlpComStatusesUpdated(object sender, StatusesLoadingEventArgs e) { IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); lock (lockLastStatus) { //pierwszy status jest najnowszy if(sts.Count>0) newestStatus = sts[0]; } //RetriveBlipHyperlinks(sts); //blokujemy kolejką gdy dodajemy do niej nowe statusy, lock (lockQueue) { //dodajemy statusy od końca for (int i = sts.Count - 1; i >= 0; i--) { statusQueue.Enqueue(sts[i]); } //foreach (var st in sts) //{ // statusQueue.Enqueue(st); //} } //pobierz z kolejki dodane wyżej statusu i przetworz je AddStatusesWithHyperlinks(true); //foreach (var st in sts) //{ // RetriveStatusHyperlinks(st); //} //view.UpdateStatuses(sts); //view.Statuses = statuses.Concat(view.Statuses).ToList(); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); // view.Statuses.Insert(0, statuses[0]); updateStatusTimer.Start(); }
private void RetriveStatusHyperlinks(StatusViewModel status) { var linkMatches = linkRegex.Matches(status.Content); if (linkMatches.Count > 0) { for (int i = 0; i < linkMatches.Count; i++) { var url = linkMatches[i].Value; int index = url.LastIndexOf("/"); int indexOfHash = url.IndexOf("#", index); //code to co mamy na końcu linka albo w rdir.pl/code lub blip.pl/s/code string code; if (indexOfHash > index) { int len = indexOfHash - 1 - index; code = url.Substring(index + 1, len); } else { code = url.Substring(index + 1); } if (url.Contains("blip.pl")) { //gdy mamy do czynienia z blipnięciem cytowaniem //http://blip.pl/s/11552391 BlipStatus blpStat = blpCom.GetUpdate(code); if (blpStat != null) { if (status.Cites == null) { status.Cites = new Dictionary<string, string>(); } string blipContent = blpStat.User.Login + ": " + blpStat.Content; status.Cites.Add(url, blipContent); } } else if (url.Contains("rdir.pl")) { string originalLink = blpCom.GetShortLink(code); if (!string.IsNullOrEmpty(originalLink)) { //url skrócony if (status.Links == null) { status.Links = new Dictionary<string, string>(); } status.Links.Add(url, originalLink); } } else { if (status.Links == null) { status.Links = new Dictionary<string, string>(); } //url nie skrócony np. do youtube.com status.Links.Add(url, url); } } } }
/// <summary> /// calback do zdarzenia gdy statusy zostają załadowane od nowa /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void BlpComStatusesLoaded(object sender, StatusesLoadingEventArgs e) { //view.Statuses = IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); lock (lockLastStatus) { //pierwszy status jest najnowszy if (sts.Count > 0) { newestStatus = sts[0]; //informacja że załadowano statusy statusesLoaded = true; } } lock (lockQueue) { //tu nie musimy odwracać bo i tak dodajemy na koniec statusy //dodajemy do kolejki od razu, lecz od drugiego statusu dopiero, pierwszy o indeksie 0 //w celu złudzenia przyspieszenia dodajemy od razu for (int i = 1; i < sts.Count; i++) { statusQueue.Enqueue(sts[i]); } //foreach (var st in sts) //{ // statusQueue.Enqueue(st); //} } //jak najszybciej ustawiamy pierwszy status na liście, aby użytkownik nie czekał //aż zostaną przetworzone wszystkie statusy var oneStatusList = new ObservableCollection<StatusViewModel>(); StatusViewModel initStatus = sts[0]; RetriveStatusHyperlinks(initStatus); oneStatusList.Add(initStatus); //inicjujemy listę statusów tylko jednym statusem, pozostałe będą dodawanie //kolejno view.Statuses = oneStatusList; //chyba to już nie potrzebne będzie //sts.RemoveAt(0); //parametr false - dodajemy na koniec statusy AddStatusesWithHyperlinks(false); //view.Statuses = new List<StatusViewModel>(sts); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); //uruchamiamy z normalnym czasem timer StartListeningForUpdates(UpdateTime); }
/// <summary> /// Konstruje format wiadomość prywatnej /// </summary> /// <param name="status">status na któego użytkownik chce odpowiedzieć prywatnie</param> /// <param name="messageText">dotychczasowa treść wiadomości</param> public void MakePrivateMessage(StatusViewModel status, string messageText) { string userFormat = string.Format(">>{0}:", status.UserLogin); //uwaga to wyrażenie łapie dwa typy tekstu // z jednym znakiem > //oraz z dwoma znakami >> //dlatego dobrze działa i zamienia gdy drugi raz klikniemy wiadomość prywatna //a dotychczasowa wiadomość jest już prywatna Regex regex = new Regex(@"^>.*?:"); string blipMessage; if (regex.IsMatch(messageText)) { blipMessage = regex.Replace(messageText, userFormat); } else { blipMessage = messageText.Insert(0, userFormat); } //string blipMessage = Regex.Replace(messageText, @"^>.*:", userFormat, RegexOptions.IgnoreCase); view.TextMessage = blipMessage; }
/// <summary> /// Konstruje format wiadomości skierowanej /// </summary> /// <param name="status">cały satus na którego użytkownik chce odpowiedzieć</param> /// <param name="messageText">dotychczasowa treść wiadomości</param> public void MakeDirectMessage(StatusViewModel status, string messageText) { //format wiadomości dla zwykłej odpowiedzia string userFormat = string.Format(">{0}:", status.UserLogin); //regex wyszukujące czy wiadomość nie rozpoczyna się jak prywatana Regex regexPrivateMessage = new Regex(@"^>>.*?:"); //regex wyszukujące czy wiadomośc nie rozpoczyna się jak skierowana Regex regexDirectMessage = new Regex(@"^>.*:?"); string blipMessage; if (regexPrivateMessage.IsMatch(messageText)) { //jesli rozpoczyna się jak prywatna to zamień na kierowaną blipMessage = regexPrivateMessage.Replace(messageText, userFormat); } else if (regexDirectMessage.IsMatch(messageText)) { //jeśli ropoczyna się jak kierowana to zamień z powrotem na kierowaną //może się wydawać bez sensu, lecz przydaje się gdy bedziemy chcieli //wysłać do innej osoby niż jest już ustawione blipMessage = regexDirectMessage.Replace(messageText, userFormat); } else { //jeżeli nie jest do nikogo to wstaw na początek blipMessage = messageText.Insert(0, userFormat); } //string blipMessage = Regex.Replace(messageText, @"^>.*:", userFormat, RegexOptions.IgnoreCase); view.TextMessage = blipMessage; //string userFormat = string.Format(">{0}: ", status.UserLogin); //string blipMessage = Regex.Replace(messageText, @"^>>.*:", userFormat, RegexOptions.IgnoreCase); //view.TextMessage = blipMessage; }
/// <summary> /// Tworzy treść wiadomości do cytowania /// </summary> /// <param name="status"></param> /// <param name="text"></param> /// <param name="position"></param> public void MakeCitation(StatusViewModel status, string text, int position) { StringBuilder blipLink = new StringBuilder("http://blip.pl", 26); if (status.Type == "DirectedMessage") { blipLink.Append("/dm/"); } else { blipLink.Append("/s/"); } blipLink.Append(status.StatusId); view.TextMessage = text.Insert(position, blipLink.ToString()); }
/// <summary> /// Konstruje format wiadomość prywatnej /// </summary> /// <param name="status">status na któego użytkownik chce odpowiedzieć prywatnie</param> /// <param name="messageText">dotychczasowa treść wiadomości</param> public void MakePrivateMessage(StatusViewModel status, string messageText) { //todo: do zasobów przenieść string userFormat = string.Format(">>{0}:", status.UserLogin); //uwaga to wyrażenie łapie dwa typy tekstu // z jednym znakiem > //oraz z dwoma znakami >> //dlatego dobrze działa i zamienia gdy drugi raz klikniemy wiadomość prywatna //a dotychczasowa wiadomość jest już prywatna string blipMessage; if (BlipRegExp.DirectStart.IsMatch(messageText)) { blipMessage = BlipRegExp.DirectStart.Replace(messageText, userFormat); } else { blipMessage = messageText.Insert(0, userFormat); } view.TextMessage = blipMessage; }