void OnGroupChatMessage(Message msg)
{
string group_jid = msg.From.Bare;
XmppGroupChatModel groupChat = (XmppGroupChatModel) Session.GetChat(group_jid, ChatType.Group, this);
if (groupChat == null) {
var builder = CreateMessageBuilder();
builder.AppendEventPrefix();
builder.AppendErrorText(_("Received a groupchat message from {0} but there's no corresponding chat window: {1}"), msg.From, msg.Body);
Session.AddMessageToChat(NetworkChat, builder.ToMessage());
return;
}
// resource can be empty for room messages
var sender_id = msg.From.Resource ?? msg.From.Bare;
var person = groupChat.GetPerson(sender_id);
if (person == null) {
// happens in case of a delayed message if the participant has left meanwhile
// TODO: or in case of a room message?
person = new PersonModel(sender_id,
sender_id,
NetworkID, Protocol, this);
}
// XXX maybe only a Google Talk bug requires this:
if (msg.XDelay != null) {
var stamp = msg.XDelay.Stamp;
if (stamp > groupChat.LatestSeenStamp) {
groupChat.LatestSeenStamp = stamp;
} else {
return; // already seen newer delayed message
}
if (groupChat.SeenNewMessages) {
return; // already seen newer messages
}
} else {
groupChat.SeenNewMessages = true;
}
// mark highlights only for received messages
MessageModel message;
if (person.ID == groupChat.OwnNickname) {
message = CreateEchoGroupChatMessage(groupChat, msg);
} else {
message = CreateGroupChatMessage(groupChat, person, msg);
}
Session.AddMessageToChat(groupChat, message);
OnMessageReceived(
new MessageEventArgs(groupChat, message, msg.From, groupChat.ID)
);
}