예제 #1
0
 public void TryEnterRoom(MucRoomMember member, Presence presence)
 {
     if (MucHelpers.IsJoinRequest(presence))
     {
         if (CanEnterRoom(member, presence))
         {
             if (RoomSettings.IsNew)
             {
                 member.Affiliation = Affiliation.owner;
                 member.Role        = Role.moderator;
             }
             //enter
             members.Add(member);
             RoomSettings.UpdateMemberInfo(member.RealJid, member.Affiliation, member.Role);                    //Update settings on enter
             //subscribe to events
             SetMemberEvents(member);
             MemberEnter(member);
         }
     }
     else
     {
         ErrorPresence(presence, ErrorCondition.BadRequest);
         member.Send(presence);
     }
 }
예제 #2
0
        public void InviteUser(Message msg, User user, XmppStream stream)
        {
            if (RoomSettings.CanInvite)
            {
                Message inviteMsg   = new Message(user.Invite.To, Jid, MessageType.normal, null);
                User    userElement = new User();
                userElement.Invite = new Invite();

                MucRoomMember member = GetRealMember(msg.From);
                userElement.Invite.From   = member == null ? msg.From : member.Jid;
                userElement.Invite.Reason = user.Invite.Reason;
                inviteMsg.RemoveAllChildNodes();
                inviteMsg.AddChild(userElement);

                if (!Send(inviteMsg))
                {
                    // Return error
                    msg.SwitchDirection();
                    msg.Type  = MessageType.error;
                    msg.Error = new Error(ErrorType.cancel, ErrorCondition.ItemNotFound);
                    Sender.SendTo(stream, msg);
                }
            }
            else
            {
                msg.SwitchDirection();
                msg.Type  = MessageType.error;
                msg.Error = new Error(ErrorType.cancel, ErrorCondition.NotAllowed);
                Sender.SendTo(stream, msg);
            }
        }
예제 #3
0
        public void OwnerCommand(IQ iq, MucRoomMember member)
        {
            Owner owner = iq.Query as Owner;

            // look for destroy
            if (owner != null)
            {
                Destroy destroy = owner.SelectSingleElement(typeof(Destroy)) as Destroy;
                if (destroy != null)
                {
                    DestroyRoom(destroy);
                    return;
                }

                if (!owner.HasChildElements)
                {
                    // Return config
                    owner.AddChild(RoomSettings.GetDataForm(member.Jid));
                }

                Data dataSubmit = (Data)owner.SelectSingleElement(typeof(Data));

                // form config
                if (dataSubmit != null && dataSubmit.Type == XDataFormType.submit)
                {
                    RoomSettings.SubmitForm(dataSubmit);
                    SettingsSave();
                    iq.Query.RemoveAllChildNodes();
                }
            }

            iq.Type = IqType.result;
            iq.SwitchDirection();
        }
예제 #4
0
 private void SetMemberEvents(MucRoomMember member)
 {
     member.PresenceBroadcasted += MemberPresenceBroadcasted;
     member.PresenceChanged     += MemberPresenceChanged;
     member.AddressChanged      += MemberAddressChanged;
     member.Unavailible         += MemberUnavailible;
     member.RoleChanged         += MemberRoleChanged;
     member.AffilationChanged   += MemberAffilationChanged;
 }
예제 #5
0
 void members_MemberRemoved(MucRoomMember member)
 {
     member.PresenceType = PresenceType.unavailable;
     if (members.Count == 0 && !RoomSettings.Persistent)
     {
         //Say goodbuy to our room
         DestroyRoom(new Destroy("temporary room is empty"));
     }
 }
예제 #6
0
        private bool CanEnterRoom(MucRoomMember member, Presence presence)
        {
            if (RoomSettings.PasswordProtected)
            {
                string password = MucHelpers.GetPassword(presence);
                if (!RoomSettings.Password.Equals(password, StringComparison.Ordinal))
                {
                    // Return error
                    ErrorPresence(presence, ErrorCondition.NotAuthorized, 401);
                    member.Send(presence);
                    return(false);
                }
            }

            if (RoomSettings.UserNamesOnly)
            {
                if (!presence.From.User.Equals(presence.To.Resource))
                {
                    // username tries to enter with not his username
                    ErrorPresence(presence,
                                  ErrorCondition.Conflict, 406);
                    member.Send(presence);
                    return(false);
                }
            }

            // Check member
            if (RoomSettings.IsMember(presence.From))
            {
                // Add new
                member.Affiliation = RoomSettings.GetMemeberAffilation(presence.From);
                member.Role        = RoomSettings.GetMemeberRole(member.Affiliation);

                if (member.Affiliation == Affiliation.outcast)
                {
                    ErrorPresence(presence, ErrorCondition.Conflict, 403);
                    member.Send(presence);
                    return(false);
                }
                if (member.Role == Role.none)
                {
                    ErrorPresence(presence,
                                  ErrorCondition.Conflict, 403);
                    member.Send(presence);
                    return(false);
                }
            }
            else
            {
                // Return error
                ErrorPresence(presence, ErrorCondition.RegistrationRequired, 407);
                member.Send(presence);
                return(false);
            }
            return(true);
        }
예제 #7
0
 public void BroadcastMessage(Message msg, MucRoomMember member)
 {
     msg.From = member.Jid;
     //store
     if (RoomSettings.Logging)
     {
         mucService.MucStorage.AddMucMessages(Jid, msg);
     }
     Broadcast(member, true, msg);
 }
예제 #8
0
 void BroadcastPresencesToMember(MucRoomMember member)
 {
     //Send all ocupant presence to new
     foreach (MucRoomMember existingMember in members)
     {
         if (!ReferenceEquals(member, existingMember))
         {
             member.Send(existingMember.Presence);
         }
     }
 }
예제 #9
0
 void MemberAffilationChanged(MucRoomMember member)
 {
     if (member.Affiliation == Affiliation.none || member.Affiliation == Affiliation.outcast)
     {
         //remove
         members.Remove(member);
     }
     else
     {
         BroadcastPresence(member, true);
     }
 }
예제 #10
0
 void MemberRoleChanged(MucRoomMember member)
 {
     //Broadcast presence
     if (member.Role == Role.none)
     {
         //remove
         members.Remove(member);
     }
     else
     {
         BroadcastPresence(member, true);
     }
 }
예제 #11
0
        public bool TryNickChange(Presence presence)
        {
            MucRoomMember member = members.FindByRealJid(presence.From);

            if (!presence.To.Resource.Equals(member.Nick))
            {
                if (!RoomSettings.UserNamesOnly)
                {
                    //Nick change
                    member.Nick = presence.To.Resource;
                    return(true);
                }
            }
            return(false);
        }
예제 #12
0
 private void Broadcast(MucRoomMember member, bool includeSender, Stanza stanza)
 {
     foreach (MucRoomMember existingMember in members)
     {
         if (!ReferenceEquals(member, existingMember) || includeSender)
         {
             existingMember.Send(stanza);
         }
     }
     //send to self if was removed already
     if (!members.Contains(member) && includeSender)
     {
         member.Send(stanza);
     }
 }
예제 #13
0
        private void MemberEnter(MucRoomMember member)
        {
            member.EnterRoom(RoomSettings.GetEnterStatusCodes());

            //Send history
            if (RoomSettings.Logging)
            {
                foreach (var msg in mucService.MucStorage.GetMucMessages(Jid, RoomSettings.HistoryCountOnEnter))
                {
                    member.Send(msg);
                }
            }
            //Send subject
            member.Send(new Message()
            {
                From = Jid, Subject = RoomSettings.Subject
            });
        }
예제 #14
0
        private MucRoomMemberInfo FindMemberInfo(Core.protocol.x.muc.iq.admin.Item item)
        {
            MucRoomMemberInfo memberToModify = null;

            if (item.Jid != null)
            {
                memberToModify = GetMemberinfo(item.Jid);
            }
            else if (item.Nickname != null)
            {
                MucRoomMember roomMember = members.FindByNick(item.Nickname);
                if (roomMember != null && roomMember.RealJid != null)
                {
                    memberToModify = GetMemberinfo(roomMember.RealJid);
                }
            }
            return(memberToModify);
        }
        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);
                }
            }
        }
예제 #16
0
 public void ChangeSubject(MucRoomMember member, string subject)
 {
     if (RoomSettings.CanChangeSubject)
     {
         RoomSettings.Subject = subject;
         Message msg = new Message();
         msg.From    = member.Jid;
         msg.Type    = MessageType.groupchat;
         msg.Subject = subject;
         Broadcast(member, true, msg);
     }
     else
     {
         Message msg = new Message();
         msg.From  = Jid;
         msg.Type  = MessageType.error;
         msg.Error = new Error(ErrorCondition.NotAllowed);
         member.Send(msg);
     }
 }
예제 #17
0
        public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context)
        {
            //Admins iq

            //New member
            MucRoomMember member = Room.GetRealMember(iq.From);

            if (member != null)
            {
                if (iq.Query != null)
                {
                    if (iq.Query is Admin && (member.Affiliation == Affiliation.admin || member.Affiliation == Affiliation.owner))
                    {
                        Room.AdminCommand(iq, member);
                    }
                    else if (iq.Query is Owner && (member.Affiliation == Affiliation.owner))
                    {
                        Room.OwnerCommand(iq, member);
                    }
                    else
                    {
                        XmppStanzaError.ToForbidden(iq);
                    }
                }
                else
                {
                    XmppStanzaError.ToBadRequest(iq);
                }
            }
            else
            {
                XmppStanzaError.ToForbidden(iq);
            }
            if (!iq.Switched)
            {
                iq.SwitchDirection();
            }
            iq.From = Room.Jid;
            return(iq);
        }
        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);
            }
        }
예제 #19
0
		private void BroadcastPresence(MucRoomMember member, bool includeSender)
		{
			Broadcast(member, includeSender, member.Presence);
		}
예제 #20
0
		private bool CanEnterRoom(MucRoomMember member, Presence presence)
		{
			if (RoomSettings.PasswordProtected)
			{
				string password = MucHelpers.GetPassword(presence);
				if (!RoomSettings.Password.Equals(password, StringComparison.Ordinal))
				{
					// Return error
					ErrorPresence(presence, ErrorCondition.NotAuthorized, 401);
					member.Send(presence);
					return false;
				}
			}

			if (RoomSettings.UserNamesOnly)
			{
				if (!presence.From.User.Equals(presence.To.Resource))
				{
					// username tries to enter with not his username
					ErrorPresence(presence,
								  ErrorCondition.Conflict, 406);
					member.Send(presence);
					return false;
				}
			}

			// Check member
			if (RoomSettings.IsMember(presence.From))
			{
				// Add new
				member.Affiliation = RoomSettings.GetMemeberAffilation(presence.From);
				member.Role = RoomSettings.GetMemeberRole(member.Affiliation);

				if (member.Affiliation == Affiliation.outcast)
				{
					ErrorPresence(presence, ErrorCondition.Conflict, 403);
					member.Send(presence);
					return false;
				}
				if (member.Role == Role.none)
				{
					ErrorPresence(presence,
							  ErrorCondition.Conflict, 403);
					member.Send(presence);
					return false;
				}
			}
			else
			{
				// Return error
				ErrorPresence(presence, ErrorCondition.RegistrationRequired, 407);
				member.Send(presence);
				return false;
			}
			return true;
		}
예제 #21
0
		private void MemberPresenceBroadcasted(MucRoomMember member)
		{
			MemberPresenceBroadcasted(member, member.Presence);
		}
예제 #22
0
		void MemberPresenceChanged(MucRoomMember member)
		{
			//Send new ocupant presence to all
			BroadcastPresence(member);
		}
예제 #23
0
		void MemberAffilationChanged(MucRoomMember member)
		{
			if (member.Affiliation == Affiliation.none || member.Affiliation == Affiliation.outcast)
			{
				//remove
				members.Remove(member);
			}
			else
			{
                BroadcastPresence(member, true);
			}
		}
예제 #24
0
		void MemberUnavailible(MucRoomMember member)
		{
			members.Remove(member);
		}
예제 #25
0
 void MemberUnavailible(MucRoomMember member)
 {
     members.Remove(member);
 }
예제 #26
0
		void members_MemberRemoved(MucRoomMember member)
		{
			member.PresenceType = PresenceType.unavailable;
            if (members.Count==0 && !RoomSettings.Persistent)
            {
                //Say goodbuy to our room
                DestroyRoom(new Destroy("temporary room is empty"));
            }
		}
예제 #27
0
        public void AdminCommand(IQ iq, MucRoomMember member)
        {
            Admin admin       = iq.Query as Admin;
            Admin returnAdmin = new Admin();

            if (admin != null)
            {
                if (iq.Type == IqType.get)
                {
                    foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems())
                    {
                        if (item.Actor == null && item.Affiliation != Affiliation.none)
                        {
                            foreach (MucRoomMemberInfo mucRoomMember in RoomSettings.Members)
                            {
                                if (mucRoomMember.Affiliation == item.Affiliation)
                                {
                                    returnAdmin.AddItem(
                                        new Core.protocol.x.muc.iq.admin.Item(mucRoomMember.Affiliation,
                                                                              mucRoomMember.Role,
                                                                              mucRoomMember.Jid));
                                }
                            }
                        }
                    }
                    iq.Query = returnAdmin;
                    iq.Type  = IqType.result;
                }
                else if (iq.Type == IqType.set)
                {
                    // Change affilation
                    foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems())
                    {
                        if (item.Actor == null)
                        {
                            Actor actor = new Actor()
                            {
                                Jid = iq.From
                            };
                            MucRoomMemberInfo memberToModify = FindMemberInfo(item);
                            if (memberToModify != null)
                            {
                                //Get member
                                if ((int)item.Affiliation != -1)
                                {
                                    if (RoomSettings.CanChangeAffilation(memberToModify.Affiliation,
                                                                         item.Affiliation,
                                                                         member.Affiliation))
                                    {
                                        memberToModify.Affiliation = item.Affiliation;
                                        //Try notify online
                                        MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid);
                                        if (onlineMember != null)
                                        {
                                            onlineMember.Affiliation = item.Affiliation;
                                        }
                                    }
                                    else
                                    {
                                        // Error!
                                        XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed));
                                        return;
                                    }
                                }

                                if ((int)item.Role != -1)
                                {
                                    if (RoomSettings.CanChangeRole(memberToModify.Role,
                                                                   item.Role,
                                                                   member.Role,
                                                                   member.Affiliation))
                                    {
                                        memberToModify.Role = item.Role;
                                        MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid);
                                        if (onlineMember != null)
                                        {
                                            if (item.Role != Role.none)
                                            {
                                                onlineMember.Role = item.Role;
                                            }
                                            else
                                            {
                                                //Role == none it's a kick
                                                onlineMember.Kick(actor, item.Reason);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        // Error!
                                        XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed));
                                        return;
                                    }
                                }
                            }
                        }
                    }
                    SettingsSave();
                    iq.RemoveAllChildNodes();
                    iq.Type = IqType.result;
                }
            }
        }
예제 #28
0
 void MemberAddressChanged(MucRoomMember member, Jid newAddress)
 {
     members.RebindAddress(member, newAddress);
 }
예제 #29
0
 private void MemberPresenceBroadcasted(MucRoomMember member)
 {
     MemberPresenceBroadcasted(member, member.Presence);
 }
예제 #30
0
 void MemberPresenceBroadcasted(MucRoomMember member, Presence presence)
 {
     Broadcast(member, true, presence);
 }
예제 #31
0
 void MemberPresenceChanged(MucRoomMember member)
 {
     //Send new ocupant presence to all
     BroadcastPresence(member);
 }
예제 #32
0
		public void ChangeSubject(MucRoomMember member, string subject)
		{
			if (RoomSettings.CanChangeSubject)
			{
				RoomSettings.Subject = subject;
				Message msg = new Message();
				msg.From = member.Jid;
				msg.Type = MessageType.groupchat;
				msg.Subject = subject;
				Broadcast(member, true, msg);
			}
			else
			{
				Message msg = new Message();
				msg.From = Jid;
				msg.Type = MessageType.error;
				msg.Error = new Error(ErrorCondition.NotAllowed);
				member.Send(msg);
			}
		}
예제 #33
0
 public Vcard GetMemberVcard(MucRoomMember member)
 {
     return(mucService.VcardStorage.GetVCard(member.RealJid));
 }
예제 #34
0
		public void OwnerCommand(IQ iq, MucRoomMember member)
		{
			Owner owner = iq.Query as Owner;

			// look for destroy
			if (owner != null)
			{
				Destroy destroy = owner.SelectSingleElement(typeof(Destroy)) as Destroy;
				if (destroy != null)
				{
					DestroyRoom(destroy);
					return;
				}

				if (!owner.HasChildElements)
				{
					// Return config
					owner.AddChild(RoomSettings.GetDataForm(member.Jid));
				}

				Data dataSubmit = (Data)owner.SelectSingleElement(typeof(Data));

				// form config
				if (dataSubmit != null && dataSubmit.Type == XDataFormType.submit)
				{
					RoomSettings.SubmitForm(dataSubmit);
					SettingsSave();
					iq.Query.RemoveAllChildNodes();
				}
			}

			iq.Type = IqType.result;
			iq.SwitchDirection();
		}
 internal MucRoomMemberStanzaHandler(MucRoomMember member)
 {
     Member = member;
 }
예제 #36
0
 private void BroadcastPresence(MucRoomMember member)
 {
     Broadcast(member, true, member.Presence);
 }
예제 #37
0
 internal void MemberReenter(MucRoomMember member)
 {
     MemberEnter(member);
     BroadcastPresencesToMember(member);
 }
예제 #38
0
		void MemberRoleChanged(MucRoomMember member)
		{
			//Broadcast presence
			if (member.Role == Role.none)
			{
				//remove
				members.Remove(member);
			}
			else
			{
                BroadcastPresence(member, true);
			}
		}
 private void MessageBroadcast(Message msg, MucRoomMember member)
 {
     Room.BroadcastMessage(msg, member);
 }
예제 #40
0
		void MemberAddressChanged(MucRoomMember member, Jid newAddress)
		{
			members.RebindAddress(member, newAddress);
		}
        public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context)
        {
            //Admins iq

            //New member
            MucRoomMember member = Room.GetRealMember(iq.From);

            if (member != null)
            {
                if (iq.Query != null)
                {
                    if (iq.Query is Admin && (member.Affiliation == Affiliation.admin || member.Affiliation == Affiliation.owner))
                    {
                        Room.AdminCommand(iq, member);
                    }
                    else if (iq.Query is Owner && (member.Affiliation == Affiliation.owner))
                    {
                        Room.OwnerCommand(iq, member);
                    }
                    else if (iq.Query is Core.protocol.x.tm.history.History && iq.Type == IqType.get)
                    {
                        Jid jid        = iq.To;
                        var mucStore   = new DbMucStore();
                        var properties = new Dictionary <string, string>(1)
                        {
                            { "connectionStringName", "core" }
                        };
                        mucStore.Configure(properties);

                        var history = (Core.protocol.x.tm.history.History)iq.Query;

                        foreach (var msg in mucStore.GetMucMessages(jid, history.Count, history.StartIndex))
                        {
                            if (msg == null)
                            {
                                continue;
                            }

                            history.AddChild(HistoryItem.FromMessage(msg));
                        }
                        iq.Type = IqType.result;
                        iq.SwitchDirection();
                        return(iq);
                    }
                    else
                    {
                        XmppStanzaError.ToForbidden(iq);
                    }
                }
                else
                {
                    XmppStanzaError.ToBadRequest(iq);
                }
            }
            else
            {
                XmppStanzaError.ToForbidden(iq);
            }
            if (!iq.Switched)
            {
                iq.SwitchDirection();
            }
            iq.From = Room.Jid;
            return(iq);
        }
예제 #42
0
		void MemberPresenceBroadcasted(MucRoomMember member, Presence presence)
		{
			Broadcast(member, true, presence);
		}
 private void MessageBroadcast(Message msg, MucRoomMember member)
 {
     Room.BroadcastMessage(msg, member);
 }
예제 #44
0
		private void BroadcastPresence(MucRoomMember member)
		{
			Broadcast(member, true, member.Presence);
		}
 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);
     }
 }
예제 #46
0
		private void Broadcast(MucRoomMember member, bool includeSender, Stanza stanza)
		{
            foreach (MucRoomMember existingMember in members)
			{
				if (!ReferenceEquals(member, existingMember) || includeSender)
				{
					existingMember.Send(stanza);
				}
			}
            //send to self if was removed already
            if (!members.Contains(member) && includeSender)
            {
                member.Send(stanza);
            }
		}
예제 #47
0
		void BroadcastPresencesToMember(MucRoomMember member)
		{
			//Send all ocupant presence to new
			foreach (MucRoomMember existingMember in members)
			{
				if (!ReferenceEquals(member, existingMember))
				{
					member.Send(existingMember.Presence);
				}
			}

		}
예제 #48
0
		public void BroadcastMessage(Message msg, MucRoomMember member)
		{
			msg.From = member.Jid;
			//store
			if (RoomSettings.Logging)
			{
                mucService.MucStorage.AddMucMessages(Jid, msg);
			}
			Broadcast(member, true, msg);
		}
예제 #49
0
		public void TryEnterRoom(MucRoomMember member, Presence presence)
		{
			if (MucHelpers.IsJoinRequest(presence))
			{
				if (CanEnterRoom(member, presence))
				{
					if (RoomSettings.IsNew)
					{
						member.Affiliation = Affiliation.owner;
						member.Role = Role.moderator;
					}
					//enter
					members.Add(member);
					RoomSettings.UpdateMemberInfo(member.RealJid, member.Affiliation, member.Role);//Update settings on enter
					//subscribe to events
					SetMemberEvents(member);
					MemberEnter(member);
				}
			}
			else
			{
				ErrorPresence(presence, ErrorCondition.BadRequest);
				member.Send(presence);
			}
		}
예제 #50
0
		public void AdminCommand(IQ iq, MucRoomMember member)
		{
			Admin admin = iq.Query as Admin;
			Admin returnAdmin = new Admin();
			if (admin != null)
			{
				if (iq.Type == IqType.get)
				{
					foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems())
					{
						if (item.Actor == null && item.Affiliation != Affiliation.none)
						{

							foreach (MucRoomMemberInfo mucRoomMember in RoomSettings.Members)
							{
								if (mucRoomMember.Affiliation == item.Affiliation)
								{
									returnAdmin.AddItem(
										new Core.protocol.x.muc.iq.admin.Item(mucRoomMember.Affiliation,
																		 mucRoomMember.Role,
																		 mucRoomMember.Jid));
								}

							}
						}
					}
					iq.Query = returnAdmin;
					iq.Type = IqType.result;
				}
				else if (iq.Type == IqType.set)
				{
					// Change affilation
					foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems())
					{
						if (item.Actor == null)
						{
                            Actor actor = new Actor(){Jid = iq.From};
							MucRoomMemberInfo memberToModify = FindMemberInfo(item);
							if (memberToModify != null)
							{
								//Get member
								if ((int)item.Affiliation != -1)
								{
									if (RoomSettings.CanChangeAffilation(memberToModify.Affiliation,
																		 item.Affiliation,
																		 member.Affiliation))
									{
										memberToModify.Affiliation = item.Affiliation;
										//Try notify online 
										MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid);
										if (onlineMember != null)
										{
											onlineMember.Affiliation = item.Affiliation;
										}
									}
									else
									{
										// Error!
										XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed));
										return;
									}
								}

								if ((int)item.Role != -1)
								{
									if (RoomSettings.CanChangeRole(memberToModify.Role,
																   item.Role,
																   member.Role,
																   member.Affiliation))
									{
										memberToModify.Role = item.Role;
										MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid);
										if (onlineMember != null)
										{
                                            if (item.Role != Role.none)
                                            {
                                                onlineMember.Role = item.Role;
                                            }
                                            else
                                            {
                                                //Role == none it's a kick
                                                onlineMember.Kick(actor,item.Reason);
                                            }
                                        }
									}
									else
									{
										// Error!
										XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed));
										return;
									}
								}
							}
						}
					}
					SettingsSave();
					iq.RemoveAllChildNodes();
					iq.Type = IqType.result;
				}
			}


		}
예제 #51
0
	    private void MemberEnter(MucRoomMember member)
	    {
	        member.EnterRoom(RoomSettings.GetEnterStatusCodes());

	        //Send history
	        if (RoomSettings.Logging)
	        {
	            foreach (var msg in mucService.MucStorage.GetMucMessages(Jid, RoomSettings.HistoryCountOnEnter))
	            {
	                member.Send(msg);
	            }
	        }
	        //Send subject
	        member.Send(new Message() { From = Jid, Subject = RoomSettings.Subject });
	    }
예제 #52
0
		public Vcard GetMemberVcard(MucRoomMember member)
		{
			return mucService.VcardStorage.GetVCard(member.RealJid);
		}
예제 #53
0
	    private void SetMemberEvents(MucRoomMember member)
		{
			member.PresenceBroadcasted += MemberPresenceBroadcasted;
			member.PresenceChanged += MemberPresenceChanged;
			member.AddressChanged += MemberAddressChanged;
			member.Unavailible += MemberUnavailible;
			member.RoleChanged += MemberRoleChanged;
			member.AffilationChanged += MemberAffilationChanged;
		}
예제 #54
0
 internal void MemberReenter(MucRoomMember member)
 {
     MemberEnter(member);
     BroadcastPresencesToMember(member);
 }
예제 #55
0
 private void BroadcastPresence(MucRoomMember member, bool includeSender)
 {
     Broadcast(member, includeSender, member.Presence);
 }