Exemple #1
0
        private void OnMessage(object sender, Message msg)
        {
            if (msg.Body == null)
            {
                return;
            }

            var    delay = msg["delay"];
            string stamp = null;

            if (delay != null)
            {
                stamp = delay.Attributes["stamp"].Value;
            }
            bool display = true;

            ChatModel   chat   = null;
            PersonModel person = null;

            if (msg.Type != XmppMessageType.groupchat)
            {
                string jid      = msg.From.Bare;
                var    contact  = _RosterManager[jid];
                string nickname = null;
                if (contact == null || String.IsNullOrEmpty(contact.Nickname))
                {
                    nickname = jid;
                }
                else
                {
                    nickname = contact.Nickname;
                }
                PersonChatModel personChat = (PersonChatModel)Session.GetChat(jid, ChatType.Person, this);
                if (personChat == null)
                {
                    person = new PersonModel(jid, nickname, NetworkID,
                                             Protocol, this);
                    personChat = Session.CreatePersonChat(
                        person, jid, nickname, this
                        );
                    Session.AddChat(personChat);
                    Session.SyncChat(personChat);
                }
                else
                {
                    person = personChat.Person;
                }
                chat = personChat;
            }
            else
            {
                string             group_jid  = msg.From.Bare;
                string             group_name = group_jid;
                string             sender_jid = msg.From.ToString();
                XmppGroupChatModel groupChat  = (XmppGroupChatModel)Session.GetChat(group_jid, ChatType.Group, this);
                if (groupChat == null)
                {
                    // FIXME shouldn't happen?
                    groupChat = Session.CreateChat <XmppGroupChatModel>(
                        group_jid, group_name, this
                        );
                    Session.AddChat(groupChat);
                    Session.SyncChat(groupChat);
                }
                person = groupChat.GetPerson(msg.From.Resource);
                if (person == null)
                {
                    // happens in case of a delayed message if the participant has left meanwhile
                    person = new PersonModel(msg.From.Resource,
                                             msg.From.Resource,
                                             NetworkID, Protocol, this);
                }

                // XXX maybe only a Google Talk bug requires this:
                if (stamp != null)
                {
                    // XXX can't use > because of seconds precision :-(
                    if (stamp.CompareTo(groupChat.LatestSeenStamp) >= 0)
                    {
                        groupChat.LatestSeenStamp = stamp;
                    }
                    else
                    {
                        display = false; // already seen newer delayed message
                    }
                    if (groupChat.SeenNewMessages)
                    {
                        display = false; // already seen newer messages
                    }
                }
                else
                {
                    groupChat.SeenNewMessages = true;
                }

                chat = groupChat;
            }

            if (display)
            {
                var builder = CreateMessageBuilder();
                if (msg.Type != XmppMessageType.error)
                {
                    builder.AppendMessage(person, msg.Body);
                }
                else
                {
                    // TODO: nicer formatting
                    builder.AppendMessage(msg.Error.ToString());
                }
                if (stamp != null)
                {
                    string format = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern.Replace(" ", "T");
                    builder.TimeStamp = DateTime.ParseExact(stamp, format, null);
                }
                Session.AddMessageToChat(chat, builder.ToMessage());
            }
        }