public override void HandleMessage(Streams.XmppStream stream, Message msg, XmppHandlerContext context) { User user = (User)msg.SelectSingleElement(typeof(User)); if (user != null) { HandleUserMessage(msg, user, stream); } else { //Groupchat message MucRoomMember member = Room.GetRealMember(msg.From); if (member != null && ReferenceEquals(member.Stream, stream) && member.Role != Role.none) { if (msg.Type == MessageType.groupchat) { if (msg.Subject != null) { Room.ChangeSubject(member, msg.Subject); } else { MessageBroadcast(msg, member); } } else { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorCondition.NotAcceptable); context.Sender.SendTo(stream, msg); } } else { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorCondition.Forbidden); context.Sender.SendTo(stream, msg); } } }
public override void HandlePresence(Streams.XmppStream stream, Presence presence, XmppHandlerContext context) { string userName = presence.To.Resource; if (!string.IsNullOrEmpty(userName) && presence.Type == PresenceType.available) { //New member MucRoomMember member = Room.GetRealMember(presence.From); if (member != null) { if (ReferenceEquals(stream, member.Stream)) { if (!Room.TryNickChange(presence)) { ErrorPresence(presence, ErrorCondition.NotAcceptable); context.Sender.SendTo(stream, presence); } } else { //Conflict. user with this jid already in room ErrorPresence(presence, ErrorCondition.Conflict); context.Sender.SendTo(stream, presence); } } else { //Doesn't exists MucRoomMember newMember = new MucRoomMember(Room, presence.To, presence.From, stream, context); Room.TryEnterRoom(newMember, presence); } } else { ErrorPresence(presence, ErrorCondition.BadRequest); context.Sender.SendTo(stream, presence); } }