Example #1
0
        private string OnChatSessionRequest(UUID Agent, OSDMap rm)
        {
            string method = rm["method"].AsString();

            UUID sessionid = UUID.Parse(rm["session-id"].AsString());

            IScenePresence SP = findScenePresence(Agent);
            IEventQueueService eq = SP.Scene.RequestModuleInterface<IEventQueueService>();

            if (method == "start conference")
            {
                //Create the session.
                CreateSession(new ChatSession
                                  {
                                      Members = new List<ChatSessionMember>(),
                                      SessionID = sessionid,
                                      Name = SP.Name + " Conference"
                                  });

                OSDArray parameters = (OSDArray) rm["params"];
                //Add other invited members.
                foreach (OSD param in parameters)
                {
                    AddDefaultPermsMemberToSession(param.AsUUID(), sessionid);
                }

                //Add us to the session!
                AddMemberToGroup(new ChatSessionMember
                                     {
                                         AvatarKey = Agent,
                                         CanVoiceChat = true,
                                         IsModerator = true,
                                         MuteText = false,
                                         MuteVoice = false,
                                         HasBeenAdded = true
                                     }, sessionid);


                //Inform us about our room
                ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                    new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                        {
                            AgentID = Agent,
                            CanVoiceChat = true,
                            IsModerator = true,
                            MuteText = false,
                            MuteVoice = false,
                            Transition = "ENTER"
                        };
                eq.ChatterBoxSessionAgentListUpdates(sessionid, new[] {block}, Agent, "ENTER",
                                                     findScene(Agent).RegionInfo.RegionHandle);

                ChatterBoxSessionStartReplyMessage cs = new ChatterBoxSessionStartReplyMessage
                                                            {
                                                                VoiceEnabled = true,
                                                                TempSessionID = UUID.Random(),
                                                                Type = 1,
                                                                Success = true,
                                                                SessionID = sessionid,
                                                                SessionName = SP.Name + " Conference",
                                                                ModeratedVoice = true
                                                            };

                return cs.Serialize().ToString();
            }
            else if (method == "accept invitation")
            {
                //They would like added to the group conversation
                List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us =
                    new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();
                List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents =
                    new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();

                ChatSession session = GetSession(sessionid);
                if (session != null)
                {
                    ChatSessionMember thismember = FindMember(sessionid, Agent);
                    //Tell all the other members about the incoming member
                    foreach (ChatSessionMember sessionMember in session.Members)
                    {
                        ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                            new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                {
                                    AgentID = sessionMember.AvatarKey,
                                    CanVoiceChat = sessionMember.CanVoiceChat,
                                    IsModerator = sessionMember.IsModerator,
                                    MuteText = sessionMember.MuteText,
                                    MuteVoice = sessionMember.MuteVoice,
                                    Transition = "ENTER"
                                };
                        if (sessionMember.AvatarKey == thismember.AvatarKey)
                            Us.Add(block);
                        else
                        {
                            if (sessionMember.HasBeenAdded)
                                // Don't add not joined yet agents. They don't want to be here.
                                NotUsAgents.Add(block);
                        }
                    }
                    thismember.HasBeenAdded = true;
                    foreach (ChatSessionMember member in session.Members)
                    {
                        eq.ChatterBoxSessionAgentListUpdates(session.SessionID,
                                                             member.AvatarKey == thismember.AvatarKey
                                                                 ? NotUsAgents.ToArray()
                                                                 : Us.ToArray(),
                                                             member.AvatarKey, "ENTER",
                                                             findScene(Agent).RegionInfo.RegionHandle);
                    }
                    return "Accepted";
                }
                else
                    return ""; //not this type of session
            }
            else if (method == "mute update")
            {
                //Check if the user is a moderator
                Hashtable responsedata = new Hashtable();
                if (!CheckModeratorPermission(Agent, sessionid))
                {
                    return "";
                }

                OSDMap parameters = (OSDMap) rm["params"];
                UUID AgentID = parameters["agent_id"].AsUUID();
                OSDMap muteInfoMap = (OSDMap) parameters["mute_info"];

                ChatSessionMember thismember = FindMember(sessionid, AgentID);
                if (muteInfoMap.ContainsKey("text"))
                    thismember.MuteText = muteInfoMap["text"].AsBoolean();
                if (muteInfoMap.ContainsKey("voice"))
                    thismember.MuteVoice = muteInfoMap["voice"].AsBoolean();

                ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                    new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                        {
                            AgentID = thismember.AvatarKey,
                            CanVoiceChat = thismember.CanVoiceChat,
                            IsModerator = thismember.IsModerator,
                            MuteText = thismember.MuteText,
                            MuteVoice = thismember.MuteVoice,
                            Transition = "ENTER"
                        };

                // Send an update to the affected user
                eq.ChatterBoxSessionAgentListUpdates(sessionid, new[] {block}, AgentID, "",
                                                     findScene(Agent).RegionInfo.RegionHandle);

                return "Accepted";
            }
            else
            {
                MainConsole.Instance.Warn("ChatSessionRequest : " + method);
                return "";
            }
        }
        public string ChatSessionRequest(IRegionClientCapsService caps, OSDMap req)
        {
            string method = req["method"].AsString();

            UUID sessionid = UUID.Parse(req["session-id"].AsString());

            switch (method)
            {
                case "start conference":
                    {
                        if (SessionExists(sessionid))
                            return ""; //No duplicate sessions
                        //Create the session.
                        CreateSession(new ChatSession
                                          {
                                              Members = new List<ChatSessionMember>(),
                                              SessionID = sessionid,
                                              Name = caps.ClientCaps.AccountInfo.Name + " Conference"
                                          });

                        OSDArray parameters = (OSDArray) req["params"];
                        //Add other invited members.
                        foreach (OSD param in parameters)
                        {
                            AddDefaultPermsMemberToSession(param.AsUUID(), sessionid);
                        }

                        //Add us to the session!
                        AddMemberToGroup(new ChatSessionMember
                                             {
                                                 AvatarKey = caps.AgentID,
                                                 CanVoiceChat = true,
                                                 IsModerator = true,
                                                 MuteText = false,
                                                 MuteVoice = false,
                                                 HasBeenAdded = true,
                                                 RequestedRemoval = false
                                             }, sessionid);

                        //Inform us about our room
                        ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                            new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                {
                                    AgentID = caps.AgentID,
                                    CanVoiceChat = true,
                                    IsModerator = true,
                                    MuteText = false,
                                    MuteVoice = false,
                                    Transition = "ENTER"
                                };
                        m_eventQueueService.ChatterBoxSessionAgentListUpdates(sessionid, new[] {block}, caps.AgentID,
                                                                              "ENTER",
                                                                              caps.RegionID);

                        ChatterBoxSessionStartReplyMessage cs = new ChatterBoxSessionStartReplyMessage
                                                                    {
                                                                        VoiceEnabled = true,
                                                                        TempSessionID = sessionid,
                                                                        Type = 1,
                                                                        Success = true,
                                                                        SessionID = sessionid,
                                                                        SessionName =
                                                                            caps.ClientCaps.AccountInfo.Name +
                                                                            " Conference",
                                                                        ModeratedVoice = true
                                                                    };
                        return OSDParser.SerializeLLSDXmlString(cs.Serialize());
                    }
                case "accept invitation":
                    {
                        //They would like added to the group conversation
                        List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us =
                            new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();
                        List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents =
                            new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();

                        ChatSession session = GetSession(sessionid);
                        if (session != null)
                        {
                            ChatSessionMember thismember = FindMember(sessionid, caps.AgentID);
                            //Tell all the other members about the incoming member
                            foreach (ChatSessionMember sessionMember in session.Members)
                            {
                                ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                                    new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                        {
                                            AgentID = sessionMember.AvatarKey,
                                            CanVoiceChat = sessionMember.CanVoiceChat,
                                            IsModerator = sessionMember.IsModerator,
                                            MuteText = sessionMember.MuteText,
                                            MuteVoice = sessionMember.MuteVoice,
                                            Transition = "ENTER"
                                        };
                                if (sessionMember.AvatarKey == thismember.AvatarKey)
                                {
                                    Us.Add(block);
                                    NotUsAgents.Add(block);
                                }
                                else
                                {
                                    if (sessionMember.HasBeenAdded)
                                        // Don't add not joined yet agents. They don't want to be here.
                                        NotUsAgents.Add(block);
                                }
                            }
                            thismember.HasBeenAdded = true;
                            foreach (ChatSessionMember member in session.Members)
                            {
                                if (member.HasBeenAdded) //Only send to those in the group
                                {
                                    UUID regionID = FindRegionID(member.AvatarKey);
                                    if (regionID != UUID.Zero)
                                    {
                                        m_eventQueueService.ChatterBoxSessionAgentListUpdates(session.SessionID,
                                                                                              member.AvatarKey ==
                                                                                              thismember.AvatarKey
                                                                                                  ? NotUsAgents.ToArray()
                                                                                                  : Us.ToArray(),
                                                                                              member.AvatarKey, "ENTER",
                                                                                              regionID);
                                    }
                                }
                            }
                            return "Accepted";
                        }
                        else
                            return ""; //no session exists?
                    }
                case "mute update":
                    {
                        //Check if the user is a moderator
                        if (!CheckModeratorPermission(caps.AgentID, sessionid))
                            return "";

                        OSDMap parameters = (OSDMap) req["params"];
                        UUID AgentID = parameters["agent_id"].AsUUID();
                        OSDMap muteInfoMap = (OSDMap) parameters["mute_info"];

                        ChatSessionMember thismember = FindMember(sessionid, AgentID);
                        if (muteInfoMap.ContainsKey("text"))
                            thismember.MuteText = muteInfoMap["text"].AsBoolean();
                        if (muteInfoMap.ContainsKey("voice"))
                            thismember.MuteVoice = muteInfoMap["voice"].AsBoolean();

                        ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                            new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                {
                                    AgentID = thismember.AvatarKey,
                                    CanVoiceChat = thismember.CanVoiceChat,
                                    IsModerator = thismember.IsModerator,
                                    MuteText = thismember.MuteText,
                                    MuteVoice = thismember.MuteVoice,
                                    Transition = "ENTER"
                                };

                        ChatSession session = GetSession(sessionid);
                        // Send an update to all users so that they show the correct permissions
                        foreach (ChatSessionMember member in session.Members)
                        {
                            if (member.HasBeenAdded) //Only send to those in the group
                            {
                                UUID regionID = FindRegionID(member.AvatarKey);
                                if (regionID != UUID.Zero)
                                {
                                    m_eventQueueService.ChatterBoxSessionAgentListUpdates(sessionid, new[] {block},
                                                                                          member.AvatarKey, "",
                                                                                          regionID);
                                }
                            }
                        }

                        return "Accepted";
                    }
                case "call":
                    {
                        //Implement voice chat for conferences...

                        IVoiceService voiceService = m_registry.RequestModuleInterface<IVoiceService>();
                        if (voiceService == null)
                            return "";

                        OSDMap resp = voiceService.GroupConferenceCallRequest(caps, sessionid);
                        return OSDParser.SerializeLLSDXmlString(resp);
                    }
                default:
                    MainConsole.Instance.Warn("ChatSessionRequest : " + method);
                    return "";
            }
        }
Example #3
0
        /// <summary>
        ///   Remove the member from this session
        /// </summary>
        /// <param name = "client"></param>
        /// <param name = "im"></param>
        public void DropMemberFromSession(IClientAPI client, GridInstantMessage im)
        {
            ChatSession session;
            ChatSessions.TryGetValue(im.imSessionID, out session);
            if (session == null)
                return;
            ChatSessionMember member = new ChatSessionMember {AvatarKey = UUID.Zero};
#if (!ISWIN)
            foreach (ChatSessionMember testmember in session.Members)
            {
                if (testmember.AvatarKey == im.fromAgentID)
                {
                    member = testmember;
                }
            }
#else
            foreach (ChatSessionMember testmember in session.Members.Where(testmember => testmember.AvatarKey == im.fromAgentID))
            {
                member = testmember;
            }
#endif

            if (member.AvatarKey != UUID.Zero)
                session.Members.Remove(member);

            if (session.Members.Count == 0)
            {
                ChatSessions.Remove(session.SessionID);
                return;
            }

            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                    {
                        AgentID = member.AvatarKey,
                        CanVoiceChat = member.CanVoiceChat,
                        IsModerator = member.IsModerator,
                        MuteText = member.MuteText,
                        MuteVoice = member.MuteVoice,
                        Transition = "LEAVE"
                    };
            IEventQueueService eq = client.Scene.RequestModuleInterface<IEventQueueService>();
            foreach (ChatSessionMember sessionMember in session.Members)
            {
                eq.ChatterBoxSessionAgentListUpdates(session.SessionID, new[] {block}, sessionMember.AvatarKey, "LEAVE",
                                                     findScene(sessionMember.AvatarKey).RegionInfo.RegionHandle);
            }
        }
        public void CreateGroupChat(UUID AgentID, GridInstantMessage im)
        {
            if (m_doRemoteOnly)
            {
                DoRemoteCallPost(true, "InstantMessageServerURI", AgentID, im);
                return;
            }

            UUID GroupID = im.SessionID;

            GroupRecord groupInfo = m_groupData.GetGroupRecord(AgentID, GroupID, null);

            if (groupInfo != null)
            {
                if (!GroupPermissionCheck(AgentID, GroupID, GroupPowers.JoinChat))
                    return; //They have to be able to join to create a group chat
                //Create the session.
                if (!SessionExists(GroupID))
                {
                    CreateSession(new ChatSession
                                      {
                                          Members = new List<ChatSessionMember>(),
                                          SessionID = GroupID,
                                          Name = groupInfo.GroupName
                                      });
                    AddMemberToGroup(new ChatSessionMember
                                         {
                                             AvatarKey = AgentID,
                                             CanVoiceChat = false,
                                             IsModerator =
                                                 GroupPermissionCheck(AgentID, GroupID, GroupPowers.ModerateChat),
                                             MuteText = false,
                                             MuteVoice = false,
                                             HasBeenAdded = true
                                         }, GroupID);

                    foreach (
                        GroupMembersData gmd in
                            m_groupData.GetGroupMembers(AgentID, GroupID)
                                       .Where(gmd => gmd.AgentID != AgentID)
                                       .Where(
                                           gmd =>
                                           (gmd.AgentPowers & (ulong) GroupPowers.JoinChat) ==
                                           (ulong) GroupPowers.JoinChat))
                    {
                        AddMemberToGroup(new ChatSessionMember
                                             {
                                                 AvatarKey = gmd.AgentID,
                                                 CanVoiceChat = false,
                                                 IsModerator =
                                                     GroupPermissionCheck(gmd.AgentID, GroupID, GroupPowers.ModerateChat),
                                                 MuteText = false,
                                                 MuteVoice = false,
                                                 HasBeenAdded = false
                                             }, GroupID);
                    }
                    //Tell us that it was made successfully
                    m_eventQueueService.ChatterBoxSessionStartReply(groupInfo.GroupName, GroupID,
                                                                    AgentID, FindRegionID(AgentID));
                }
                else
                {
                    ChatSession thisSession = GetSession(GroupID);
                    //A session already exists
                    //Add us
                    AddMemberToGroup(new ChatSessionMember
                                         {
                                             AvatarKey = AgentID,
                                             CanVoiceChat = false,
                                             IsModerator =
                                                 GroupPermissionCheck(AgentID, GroupID, GroupPowers.ModerateChat),
                                             MuteText = false,
                                             MuteVoice = false,
                                             HasBeenAdded = true
                                         }, GroupID);

                    //Tell us that we entered successfully
                    m_eventQueueService.ChatterBoxSessionStartReply(groupInfo.GroupName, GroupID,
                                                                    AgentID, FindRegionID(AgentID));
                    List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us =
                        new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();
                    List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents =
                        new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();

                    foreach (ChatSessionMember sessionMember in thisSession.Members)
                    {
                        ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                            new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                {
                                    AgentID = sessionMember.AvatarKey,
                                    CanVoiceChat = sessionMember.CanVoiceChat,
                                    IsModerator = sessionMember.IsModerator,
                                    MuteText = sessionMember.MuteText,
                                    MuteVoice = sessionMember.MuteVoice,
                                    Transition = "ENTER"
                                };
                        if (AgentID == sessionMember.AvatarKey)
                            Us.Add(block);
                        if (sessionMember.HasBeenAdded)
                            // Don't add not joined yet agents. They don't want to be here.
                            NotUsAgents.Add(block);
                    }
                    foreach (ChatSessionMember member in thisSession.Members)
                    {
                        if (member.HasBeenAdded) //Only send to those in the group
                        {
                            UUID regionID = FindRegionID(member.AvatarKey);
                            if (regionID != UUID.Zero)
                            {
                                if (member.AvatarKey == AgentID)
                                {
                                    //Tell 'us' about all the other agents in the group
                                    m_eventQueueService.ChatterBoxSessionAgentListUpdates(GroupID, NotUsAgents.ToArray(),
                                                                                          member.AvatarKey,
                                                                                          "ENTER", regionID);
                                }
                                else
                                {
                                    //Tell 'other' agents about the new agent ('us')
                                    m_eventQueueService.ChatterBoxSessionAgentListUpdates(GroupID, Us.ToArray(),
                                                                                          member.AvatarKey,
                                                                                          "ENTER", regionID);
                                }
                            }
                        }
                    }
                }

                ChatSessionMember agentMember = FindMember(GroupID, AgentID);

                //Tell us that we entered
                ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock ourblock =
                    new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                        {
                            AgentID = AgentID,
                            CanVoiceChat = agentMember.CanVoiceChat,
                            IsModerator = agentMember.IsModerator,
                            MuteText = agentMember.MuteText,
                            MuteVoice = agentMember.MuteVoice,
                            Transition = "ENTER"
                        };
                m_eventQueueService.ChatterBoxSessionAgentListUpdates(GroupID, new[] {ourblock}, AgentID, "ENTER",
                                                                      FindRegionID(AgentID));
            }
        }
        public void DropMemberFromSession(UUID agentID, GridInstantMessage im)
        {
            if (m_doRemoteOnly)
            {
                DoRemoteCallPost(true, "InstantMessageServerURI", agentID, im);
                return;
            }

            ChatSession session;
            ChatSessions.TryGetValue(im.SessionID, out session);
            if (session == null)
                return;
            ChatSessionMember member = null;
            foreach (
                ChatSessionMember testmember in
                    session.Members.Where(testmember => testmember.AvatarKey == im.FromAgentID))
                member = testmember;

            if (member == null)
                return;

            member.HasBeenAdded = false;
            member.RequestedRemoval = true;

            if (session.Members.Count(mem => mem.HasBeenAdded) == 0) //If a member hasn't been added, kill this anyway
            {
                ChatSessions.Remove(session.SessionID);
                return;
            }

            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                    {
                        AgentID = member.AvatarKey,
                        CanVoiceChat = member.CanVoiceChat,
                        IsModerator = member.IsModerator,
                        MuteText = member.MuteText,
                        MuteVoice = member.MuteVoice,
                        Transition = "LEAVE"
                    };
            foreach (ChatSessionMember sessionMember in session.Members)
            {
                if (sessionMember.HasBeenAdded) //Only send to those in the group
                {
                    UUID regionID = FindRegionID(sessionMember.AvatarKey);
                    if (regionID != UUID.Zero)
                    {
                        m_eventQueueService.ChatterBoxSessionAgentListUpdates(session.SessionID, new[] {block},
                                                                              sessionMember.AvatarKey, "LEAVE",
                                                                              regionID);
                    }
                }
            }
        }
        /// <summary>
        ///   Remove the member from this session
        /// </summary>
        /// <param name = "client"></param>
        /// <param name = "im"></param>
        public void DropMemberFromSession(IClientAPI client, GridInstantMessage im, bool forwardOn)
        {
            ChatSession session = m_groupData.GetSession(im.imSessionID);
            if (session == null)
                return;
            ChatSessionMember member = new ChatSessionMember {AvatarKey = UUID.Zero};
#if (!ISWIN)
            foreach (ChatSessionMember testmember in session.Members)
            {
                if (testmember.AvatarKey == im.fromAgentID)
                {
                    member = testmember;
                }
            }
#else
            foreach (ChatSessionMember testmember in session.Members.Where(testmember => testmember.AvatarKey == im.fromAgentID))
            {
                member = testmember;
            }
#endif

            if (member.AvatarKey != UUID.Zero)
            {
                member.HasBeenAdded = false;
            }

            if (GetMemeberCount(session) == 0)
            {
                m_groupData.RemoveSession(session.SessionID); //Noone is left!
                return;
            }

            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                    {
                        AgentID = member.AvatarKey,
                        CanVoiceChat = member.CanVoiceChat,
                        IsModerator = member.IsModerator,
                        MuteText = member.MuteText,
                        MuteVoice = member.MuteVoice,
                        Transition = "LEAVE"
                    };
            List<UUID> usersToForwardTo = new List<UUID>();
            IEventQueueService eq = client.Scene.RequestModuleInterface<IEventQueueService>();
            foreach (ChatSessionMember sessionMember in session.Members)
            {
                IClientAPI user = GetActiveClient(sessionMember.AvatarKey);
                if (user != null)
                    eq.ChatterBoxSessionAgentListUpdates(session.SessionID, new[] {block}, sessionMember.AvatarKey,
                                                         "LEAVE", user.Scene.RegionInfo.RegionHandle);
                else
                    usersToForwardTo.Add(sessionMember.AvatarKey);
            }
            if (forwardOn)
            {
                im.dialog = 212; //Don't keep forwarding on other sims
                m_msgTransferModule.SendInstantMessages(im, usersToForwardTo);
            }
        }
        private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
        {
            IScenePresence presence;
            if ((presence = remoteClient.Scene.GetScenePresence(remoteClient.AgentId)) == null || presence.IsChildAgent)
                return; //Must exist and not be a child
            if (m_debugEnabled)
            {
                MainConsole.Instance.DebugFormat("[GROUPS-MESSAGING]: {0} called", MethodBase.GetCurrentMethod().Name);

                DebugGridInstantMessage(im);
            }

            // Start group IM session
            if ((im.dialog == (byte) InstantMessageDialog.SessionGroupStart))
            {
                if (m_debugEnabled)
                    MainConsole.Instance.InfoFormat("[GROUPS-MESSAGING]: imSessionID({0}) toAgentID({1})", im.imSessionID, im.toAgentID);

                UUID GroupID = im.imSessionID;
                UUID AgentID = im.fromAgentID;

                GroupRecord groupInfo = m_groupData.GetGroupRecord(AgentID, GroupID, null);

                if (groupInfo != null)
                {
                    if (!m_groupsModule.GroupPermissionCheck(AgentID, GroupID, GroupPowers.JoinChat))
                        return; //They have to be able to join to create a group chat
                    //Create the session.
                    IEventQueueService queue = remoteClient.Scene.RequestModuleInterface<IEventQueueService>();
                    if (m_groupData.CreateSession(new ChatSession
                                                      {
                                                          Members = new List<ChatSessionMember>(),
                                                          SessionID = GroupID,
                                                          Name = groupInfo.GroupName
                                                      }))
                    {
                        m_groupData.AddMemberToGroup(new ChatSessionMember
                                                         {
                                                             AvatarKey = AgentID,
                                                             CanVoiceChat = false,
                                                             IsModerator = GetIsModerator(AgentID, GroupID),
                                                             MuteText = false,
                                                             MuteVoice = false,
                                                             HasBeenAdded = true
                                                         }, GroupID);

#if (!ISWIN)
                        foreach (GroupMembersData gmd in m_groupData.GetGroupMembers(AgentID, GroupID))
                        {
                            if (gmd.AgentID != AgentID)
                            {
                                if ((gmd.AgentPowers & (ulong) GroupPowers.JoinChat) == (ulong) GroupPowers.JoinChat)
                                {
                                    m_groupData.AddMemberToGroup(new ChatSessionMember
                                                                     {
                                                                         AvatarKey = gmd.AgentID,
                                                                         CanVoiceChat = false,
                                                                         IsModerator =
                                                                             GetIsModerator(gmd.AgentID, GroupID),
                                                                         MuteText = false,
                                                                         MuteVoice = false,
                                                                         HasBeenAdded = false
                                                                     }, GroupID);
                                }
                            }
                        }
#else
                        foreach (GroupMembersData gmd in m_groupData.GetGroupMembers(AgentID, GroupID).Where(gmd => gmd.AgentID != AgentID).Where(gmd => (gmd.AgentPowers & (ulong) GroupPowers.JoinChat) == (ulong) GroupPowers.JoinChat))
                        {
                            m_groupData.AddMemberToGroup(new ChatSessionMember
                                                             {
                                                                 AvatarKey = gmd.AgentID,
                                                                 CanVoiceChat = false,
                                                                 IsModerator =
                                                                     GetIsModerator(gmd.AgentID, GroupID),
                                                                 MuteText = false,
                                                                 MuteVoice = false,
                                                                 HasBeenAdded = false
                                                             }, GroupID);
                        }
#endif
                        //Tell us that it was made successfully
                        ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID);
                    }
                    else
                    {
                        ChatSession thisSession = m_groupData.GetSession(GroupID);
                        //A session already exists
                        //Add us
                        m_groupData.AddMemberToGroup(new ChatSessionMember
                                                         {
                                                             AvatarKey = AgentID,
                                                             CanVoiceChat = false,
                                                             IsModerator = GetIsModerator(AgentID, GroupID),
                                                             MuteText = false,
                                                             MuteVoice = false,
                                                             HasBeenAdded = true
                                                         }, GroupID);

                        //Tell us that we entered successfully
                        ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID);
                        List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us =
                            new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();
                        List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents =
                            new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();

                        foreach (ChatSessionMember sessionMember in thisSession.Members)
                        {
                            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                                new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                    {
                                        AgentID = sessionMember.AvatarKey,
                                        CanVoiceChat = sessionMember.CanVoiceChat,
                                        IsModerator = sessionMember.IsModerator,
                                        MuteText = sessionMember.MuteText,
                                        MuteVoice = sessionMember.MuteVoice,
                                        Transition = "ENTER"
                                    };
                            if (AgentID == sessionMember.AvatarKey)
                                Us.Add(block);
                            if (sessionMember.HasBeenAdded)
                                // Don't add not joined yet agents. They don't want to be here.
                                NotUsAgents.Add(block);
                        }
                        foreach (ChatSessionMember member in thisSession.Members)
                        {
                            if (member.AvatarKey == AgentID)
                            {
                                //Tell 'us' about all the other agents in the group
                                queue.ChatterBoxSessionAgentListUpdates(GroupID, NotUsAgents.ToArray(), member.AvatarKey,
                                                                        "ENTER",
                                                                        remoteClient.Scene.RegionInfo.RegionHandle);
                            }
                            else
                            {
                                //Tell 'other' agents about the new agent ('us')
                                IClientAPI otherAgent = GetActiveClient(member.AvatarKey);
                                if (otherAgent != null) //Local, so we can send it directly
                                    queue.ChatterBoxSessionAgentListUpdates(GroupID, Us.ToArray(), member.AvatarKey,
                                                                            "ENTER",
                                                                            otherAgent.Scene.RegionInfo.RegionHandle);
                                else
                                {
                                    ISyncMessagePosterService amps =
                                        m_sceneList[0].RequestModuleInterface<ISyncMessagePosterService>();
                                    if (amps != null)
                                    {
                                        OSDMap message = new OSDMap();
                                        message["Method"] = "GroupSessionAgentUpdate";
                                        message["AgentID"] = AgentID;
                                        message["Message"] = ChatterBoxSessionAgentListUpdates(GroupID, Us.ToArray(),
                                                                                               "ENTER");
                                        amps.PostToServer(message);
                                    }
                                }
                            }
                        }
                    }

                    //Tell us that we entered
                    ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock ourblock =
                        new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                            {
                                AgentID = AgentID,
                                CanVoiceChat = true,
                                IsModerator = true,
                                MuteText = false,
                                MuteVoice = false,
                                Transition = "ENTER"
                            };
                    queue.ChatterBoxSessionAgentListUpdates(GroupID, new[] {ourblock}, AgentID, "ENTER",
                                                            remoteClient.Scene.RegionInfo.RegionHandle);
                }
            }
                // Send a message from locally connected client to a group
            else if ((im.dialog == (byte) InstantMessageDialog.SessionSend) && im.message != "")
            {
                UUID GroupID = im.imSessionID;
                UUID AgentID = im.fromAgentID;

                if (m_debugEnabled)
                    MainConsole.Instance.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}",
                                      GroupID, im.imSessionID.ToString());

                ChatSessionMember memeber = m_groupData.FindMember(im.imSessionID, AgentID);
                if (memeber == null || memeber.MuteText)
                    return; //Not in the chat or muted
                SendMessageToGroup(im, GroupID);
            }
            else if (im.dialog == (byte) InstantMessageDialog.SessionDrop)
                DropMemberFromSession(remoteClient, im, true);
            else if (im.dialog == 212) //Forwarded sessionDrop
                DropMemberFromSession(remoteClient, im, false);
        }
        private void MuteUser(UUID sessionid, IEventQueueService eq, UUID AgentID, ChatSessionMember thismember,
                              bool forward)
        {
            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                    {
                        AgentID = thismember.AvatarKey,
                        CanVoiceChat = thismember.CanVoiceChat,
                        IsModerator = thismember.IsModerator,
                        MuteText = thismember.MuteText,
                        MuteVoice = thismember.MuteVoice,
                        Transition = "ENTER"
                    };

            // Send an update to the affected user
            IClientAPI affectedUser = GetActiveClient(thismember.AvatarKey);
            if (affectedUser != null)
                eq.ChatterBoxSessionAgentListUpdates(sessionid, new[] {block}, AgentID, "ENTER",
                                                     affectedUser.Scene.RegionInfo.RegionHandle);
            else if (forward)
                SendMutedUserIM(thismember, sessionid);
        }
        private string OnChatSessionRequest(UUID Agent, OSDMap rm)
        {
            string method = rm["method"].AsString();

            UUID sessionid = UUID.Parse(rm["session-id"].AsString());

            IClientAPI SP = GetActiveClient(Agent);
            IEventQueueService eq = SP.Scene.RequestModuleInterface<IEventQueueService>();

            if (method == "accept invitation")
            {
                //They would like added to the group conversation
                List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us =
                    new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();
                List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents =
                    new List<ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>();

                ChatSession session = m_groupData.GetSession(sessionid);
                if (session != null)
                {
                    ChatSessionMember thismember = m_groupData.FindMember(sessionid, Agent);
                    if (thismember == null)
                        return ""; //No user with that session
                    //Tell all the other members about the incoming member
                    thismember.HasBeenAdded = true;
                    foreach (ChatSessionMember sessionMember in session.Members)
                    {
                        ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block =
                            new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock
                                {
                                    AgentID = sessionMember.AvatarKey,
                                    CanVoiceChat = sessionMember.CanVoiceChat,
                                    IsModerator = sessionMember.IsModerator,
                                    MuteText = sessionMember.MuteText,
                                    MuteVoice = sessionMember.MuteVoice,
                                    Transition = "ENTER"
                                };
                        if (Agent == sessionMember.AvatarKey)
                            Us.Add(block);
                        if (sessionMember.HasBeenAdded) // Don't add not joined yet agents. They don't want to be here.
                            NotUsAgents.Add(block);
                    }
                    foreach (ChatSessionMember member in session.Members)
                    {
                        if (member.AvatarKey == thismember.AvatarKey)
                        {
                            //Tell 'us' about all the other agents in the group
                            eq.ChatterBoxSessionAgentListUpdates(session.SessionID, NotUsAgents.ToArray(),
                                                                 member.AvatarKey, "ENTER",
                                                                 SP.Scene.RegionInfo.RegionHandle);
                        }
                        else
                        {
                            //Tell 'other' agents about the new agent ('us')
                            IClientAPI otherAgent = GetActiveClient(member.AvatarKey);
                            if (otherAgent != null) //Local, so we can send it directly
                                eq.ChatterBoxSessionAgentListUpdates(session.SessionID, Us.ToArray(), member.AvatarKey,
                                                                     "ENTER", otherAgent.Scene.RegionInfo.RegionHandle);
                            else
                            {
                                ISyncMessagePosterService amps =
                                    m_sceneList[0].RequestModuleInterface<ISyncMessagePosterService>();
                                if (amps != null)
                                {
                                    OSDMap message = new OSDMap();
                                    message["Method"] = "GroupSessionAgentUpdate";
                                    message["AgentID"] = thismember.AvatarKey;
                                    message["Message"] = ChatterBoxSessionAgentListUpdates(session.SessionID,
                                                                                           Us.ToArray(), "ENTER");
                                    amps.PostToServer(message);
                                }
                            }
                        }
                    }
                    return "Accepted";
                }
                else
                    return ""; //not this type of session
            }
            else if (method == "mute update")
            {
                //Check if the user is a moderator
                if (!GetIsModerator(Agent, sessionid))
                    return "";

                OSDMap parameters = (OSDMap) rm["params"];
                UUID AgentID = parameters["agent_id"].AsUUID();
                OSDMap muteInfoMap = (OSDMap) parameters["mute_info"];

                ChatSessionMember thismember = m_groupData.FindMember(sessionid, AgentID);
                if (muteInfoMap.ContainsKey("text"))
                    thismember.MuteText = muteInfoMap["text"].AsBoolean();
                if (muteInfoMap.ContainsKey("voice"))
                    thismember.MuteVoice = muteInfoMap["voice"].AsBoolean();
                MuteUser(sessionid, eq, AgentID, thismember, true);

                return "Accepted";
            }
            else
            {
                MainConsole.Instance.Warn("ChatSessionRequest : " + method);
                return "";
            }
        }
        public void ChatterBoxSessionAgentListUpdatesMessage()
        {
            ChatterBoxSessionAgentListUpdatesMessage s = new ChatterBoxSessionAgentListUpdatesMessage();
            s.SessionID = UUID.Random();
            s.Updates = new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock[1];

            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block1 = new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock();
            block1.AgentID = UUID.Random();
            block1.CanVoiceChat = true;
            block1.IsModerator = true;
            block1.MuteText = true;
            block1.MuteVoice = true;
            block1.Transition = "ENTER";

            ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block2 = new ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock();
            block2.AgentID = UUID.Random();
            block2.CanVoiceChat = true;
            block2.IsModerator = true;
            block2.MuteText = true;
            block2.MuteVoice = true;
            block2.Transition = "LEAVE";

            s.Updates[0] = block1;

            OSDMap map = s.Serialize();

            ChatterBoxSessionAgentListUpdatesMessage t = new ChatterBoxSessionAgentListUpdatesMessage();
            t.Deserialize(map);

            Assert.AreEqual(s.SessionID, t.SessionID);
            for (int i = 0; i < t.Updates.Length; i++)
            {
                Assert.AreEqual(s.Updates[i].AgentID, t.Updates[i].AgentID);
                Assert.AreEqual(s.Updates[i].CanVoiceChat, t.Updates[i].CanVoiceChat);
                Assert.AreEqual(s.Updates[i].IsModerator, t.Updates[i].IsModerator);
                Assert.AreEqual(s.Updates[i].MuteText, t.Updates[i].MuteText);
                Assert.AreEqual(s.Updates[i].MuteVoice, t.Updates[i].MuteVoice);
                Assert.AreEqual(s.Updates[i].Transition, t.Updates[i].Transition);
            }
        }