public bool IsSimilarToContent(AbstractChatContent otherContent) { if (this.Source == otherContent.Source && this.Type == otherContent.Type && this.IsOutgoing == otherContent.IsOutgoing) { TimeSpan span = otherContent.Date.Subtract(this.Date); return(span.TotalSeconds < 300); } return(false); }
protected virtual void OnNewContent(AbstractChatContent content) { var handler = NewContent; if (NewContent != null) { NewContent(this, content); } else { lock (m_ContentQueue) { m_ContentQueue.Enqueue(content); } } }
public bool IsSimilarToContent(AbstractChatContent otherContent) { if (this.Source == otherContent.Source && this.Type == otherContent.Type && this.IsOutgoing == otherContent.IsOutgoing) { TimeSpan span = otherContent.Date.Subtract(this.Date); return (span.TotalSeconds < 300); } return false; }
public bool IsFromSameDayAsContent(AbstractChatContent otherContent) { // FIXME: throw new NotImplementedException(); }
string TemplateForContent(AbstractChatContent content, bool contentIsSimilar) { string template = null; if (content.Type == ChatContentType.Message || content.Type == ChatContentType.Notification) { if (content.IsOutgoing) { template = (contentIsSimilar ? m_NextContentOutHtml : m_ContentOutHtml); } else { template = (contentIsSimilar ? m_NextContentInHtml : m_ContentInHtml); } } else if (content.Type == ChatContentType.Context) { if (content.IsOutgoing) { template = (contentIsSimilar ? m_NextContextOutHtml : m_ContextOutHtml); } else { template = (contentIsSimilar ? m_NextContextInHtml : m_ContextInHtml); } } else if (content.Type == ChatContentType.FileTransfer) { template = m_FileTransferHtml; } else { template = m_StatusHtml; } if (String.IsNullOrEmpty(template)) { throw new Exception("Failed to get template for content: " + content.Type); } return template; }
string ScriptForAppendingContent(AbstractChatContent content, bool contentIsSimilar, bool willAddMoreContentObjects, bool replaceLastContent) { string newHTML = null; string script; if (!m_CombineConsecutive) contentIsSimilar = false; newHTML = TemplateForContent(content, contentIsSimilar); newHTML = FillKeywords(newHTML, content, contentIsSimilar); if (!m_UsingCustomTemplateHtml || m_StyleVersion >= 4) { if (replaceLastContent) script = REPLACE_LAST_MESSAGE; else if (willAddMoreContentObjects) { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE_NO_SCROLL : APPEND_MESSAGE_NO_SCROLL); } else { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE : APPEND_MESSAGE); } } else if (m_StyleVersion >= 3) { if (willAddMoreContentObjects) { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE_NO_SCROLL : APPEND_MESSAGE_NO_SCROLL); } else { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE : APPEND_MESSAGE); } } else if (m_StyleVersion >= 1) { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE : APPEND_MESSAGE); } else { if (m_UsingCustomTemplateHtml && content is ChatContentStatus) { script = APPEND_MESSAGE_WITH_SCROLL; } else { script = (contentIsSimilar ? APPEND_NEXT_MESSAGE_WITH_SCROLL : APPEND_MESSAGE_WITH_SCROLL); } } return String.Format(script, Util.EscapeJavascript(newHTML)); }
string FillKeywords(string inString, AbstractChatContent content, bool contentIsSimilar) { if (inString == null) throw new ArgumentNullException("inString"); if (content == null) throw new ArgumentNullException("content"); inString = inString.Replace("%time%", content.Date.ToShortTimeString()); inString = inString.Replace("%shortTime%", content.Date.ToString("%h:%m")); string senderStatusIcon = (content.Source != null) ? String.Format("avatar:/{0}", AvatarManager.GetAvatarHash(content.Source.Bare)) : String.Empty; inString = inString.Replace("%senderStatusIcon%", senderStatusIcon); // FIXME do %localized{x}% replacements inString = inString.Replace("%messageClasses%", (contentIsSimilar ? "consecutive " : "") + String.Join(" ", content.DisplayClasses)); // FIXME: sender colors inString = inString.Replace("%messageDirection%", inString.Contains("<DIV dir=\"rtl\">") ? "rtl" : "ltr"); Regex regex = new Regex(@"%time\{(.*)\}%"); inString = regex.Replace(inString, delegate (Match match) { string pattern = match.Groups[1].Value; return Util.Strftime(pattern, content.Date); }); if (content is ChatContentMessage) { string userIconPath = null; if (ShowUserIcons) { userIconPath = String.Format("avatar:/{0}", AvatarManager.GetAvatarHash(content.Source.Bare)); } else { userIconPath = (content.IsOutgoing) ? "Outgoing/buddy_icon.png" : "Incoming/buddy_icon.png"; } inString = inString.Replace("%userIconPath%", userIconPath); inString = inString.Replace("%senderScreenName%", content.Source.ToString()); inString = inString.Replace("%sender%", content.SourceDisplayName); inString = inString.Replace("%senderDisplayName%", content.SourceDisplayName); inString = inString.Replace("%service%", String.Empty); // FIXME: %textbackgroundcolor{ // FIXME: File transfers } else if (content is ChatContentStatus) { inString = inString.Replace("%status%", ((ChatContentStatus)content).StatusType); inString = inString.Replace("%statusSender%", (content.Source != null) ? content.Source.ToString() : String.Empty); // FIXME: %statusPhrase% } inString = inString.Replace("%message%", content.MessageHtml); return inString; }
public void AppendContent(AbstractChatContent content, bool contentIsSimilar, bool willAddMoreContentObjects, bool replaceLastContent) { if (content == null) throw new ArgumentNullException("content"); if (!m_ThemeLoaded) throw new Exception("Call LoadTheme() first!"); var js = ScriptForAppendingContent(content, contentIsSimilar, willAddMoreContentObjects, replaceLastContent); Page().MainFrame().EvaluateJavaScript(js); }
void HandleNewContent(IChatHandler handler, AbstractChatContent content) { if (content is ChatContentTyping) { var typingContent = (ChatContentTyping)content; if (m_Handler is ChatHandler) { var chatHandler = (ChatHandler)m_Handler; if (!chatHandler.IsMucMessage) { string title = null; if (typingContent.TypingState != TypingState.None && typingContent.TypingState != TypingState.Active) { title = String.Format("{0} ({1})", chatHandler.Account.GetDisplayName(chatHandler.Jid), typingContent.TypingState.ToString()); } else { title = chatHandler.Account.GetDisplayName(chatHandler.Jid); } QApplication.Invoke(delegate { Gui.TabbedChatsWindow.SetTabTitle(this, title); }); } } } else { bool isSimilar = (!(content is ChatContentStatus)) && m_PreviousContent != null && content.IsSimilarToContent(m_PreviousContent); //bool replaceLast = m_PreviousContent is ChatContentStatus && // content is ChatContentStatus && // ((ChatContentStatus)m_PreviousContent).CoalescingKey == ((ChatContentStatus)content).CoalescingKey; bool replaceLast = m_PreviousContent is ChatContentTyping; m_PreviousContent = content; QApplication.Invoke(delegate { m_ConversationWidget.AppendContent(content, isSimilar, false, replaceLast); if (content is ChatContentMessage && !IsActive) { UrgencyHint = true; if (m_Notification == null) { try { string plainText = HtmlSanitizer.ToPlainText(((ChatContentMessage)content).MessageHtml); // Only show notifications for MUC messages that contain your name. if (m_Handler is ChatHandler || (m_Handler is MucHandler && plainText.Contains(((MucHandler)m_Handler).Room.Nickname))) { if (m_Handler is MucHandler) { Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource("internet-group-chat__32.png"); string roomName = ((MucHandler)m_Handler).Room.JID.Bare; m_Notification = new Notification(String.Format("Message from {0} in {1}", content.SourceDisplayName, roomName), plainText, pixbuf); } else { // FIXME: Too much logic outside of AvatarManager. Gdk.Pixbuf pixbuf = null; string fileName = AvatarManager.GetAvatarFileName(content.Source.BareJID); if (System.IO.File.Exists(fileName)) { pixbuf = new Gdk.Pixbuf(fileName); } else { pixbuf = Gdk.Pixbuf.LoadFromResource("default-avatar.png"); } m_Notification = new Notification(String.Format("Message from {0}", content.SourceDisplayName), plainText, pixbuf); } m_Notification.Show(); m_Notification.Closed += delegate { m_Notification = null; }; } } catch (Exception ex) { Console.WriteLine("FAILED TO DISPLAY NOTIFICATION: " + ex); m_Notification = null; } } } if (m_Handler is ChatHandler) { if (content is ChatContentMessage && (content.Source.Bare == ((ChatHandler)m_Handler).Jid.Bare)) { // Select this resource so our replies go to it. int i = m_ToComboBox.FindData(((ChatContentMessage)content).Source.Resource); m_ToComboBox.CurrentIndex = (i > -1) ? i : 0; } } }); } }