OpenMetaverse.AgentManager.ChatterBoxSessionAgentListReplyHandler C# (CSharp) Method

ChatterBoxSessionAgentListReplyHandler() private method

Someone joined or left group chat
private ChatterBoxSessionAgentListReplyHandler ( string capsKey, OSD osd, Simulator simulator ) : void
capsKey string
osd OSD
simulator Simulator
return void
        private void ChatterBoxSessionAgentListReplyHandler(string capsKey, OSD osd, Simulator simulator)
        {
            // parse the SD
            OSDMap map = (OSDMap)osd;

            // verify sessions exists, if not add it
            UUID sessionID;
            if (map.ContainsKey("session_id"))
            {
                sessionID = map["session_id"].AsUUID();
                lock (GroupChatSessions)
                    if (!GroupChatSessions.ContainsKey(sessionID))
                        GroupChatSessions.Add(sessionID, new List<ChatSessionMember>());
            }
            else
            {
                return;
            }

            //string errormsg = map["error"].AsString();
            //SDMap updates = (SDMap)map["updates"];

            // Handle any agent data updates
            OSDMap agent_updates = (OSDMap)map["agent_updates"];

            foreach (KeyValuePair<string, OSD> kvp in agent_updates)
            {
                UUID agent_key = UUID.Parse(kvp.Key);
                OSDMap record = (OSDMap)kvp.Value;

                // handle joins/parts first
                if (record.ContainsKey("transition"))
                {
                    // find existing record if any
                    ChatSessionMember fndMbr;
                    lock (GroupChatSessions.Dictionary)
                    {
                        fndMbr = GroupChatSessions[sessionID].Find(delegate(ChatSessionMember member)
                           {
                               return member.AvatarKey == agent_key;
                           });
                    }

                    // handle joins
                    if (record["transition"].AsString().Equals("ENTER"))
                    {
                        if (fndMbr.AvatarKey == UUID.Zero)
                        {
                            fndMbr = new ChatSessionMember();
                            fndMbr.AvatarKey = agent_key;

                            lock (GroupChatSessions.Dictionary)
                                GroupChatSessions[sessionID].Add(fndMbr);

                            if (OnChatSessionMemberAdded != null)
                            {
                                try { OnChatSessionMemberAdded(sessionID, agent_key); }
                                catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                            }
                        }

                    }
                    // handle parts
                    else if (record["transition"].AsString().Equals("LEAVE"))
                    {
                        if (fndMbr.AvatarKey != UUID.Zero)
                            lock (GroupChatSessions.Dictionary)
                                GroupChatSessions[sessionID].Remove(fndMbr);

                        if (OnChatSessionMemberLeft != null)
                        {
                            try { OnChatSessionMemberLeft(sessionID, agent_key); }
                            catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                        }

                        if (agent_key == Client.Self.AgentID)
                        {
                            try { OnGroupChatLeft(sessionID); }
                            catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                        }

                        // no need to process anything else in this record
                        continue;
                    }
                    // this should only fire if LL adds a new transition but doesn't tell anyone
                    else
                    {
                        Logger.Log("Unknown transition action " + record["transition"], Helpers.LogLevel.Warning, Client);
                    }
                }

                // Handle any updates

                // search for member to update
                ChatSessionMember update_member = GroupChatSessions.Dictionary[sessionID].Find(delegate(ChatSessionMember m)
                {
                    return m.AvatarKey == agent_key;
                });

                OSDMap record_info = (OSDMap)record["info"];

                lock (GroupChatSessions.Dictionary)
                {

                    if (record_info.ContainsKey("mutes"))
                    {
                        OSDMap mutes = (OSDMap)record_info["mutes"];
                        foreach (KeyValuePair<string, OSD> muteEntry in mutes)
                        {
                            if (muteEntry.Key == "text")
                            {
                                update_member.MuteText = muteEntry.Value.AsBoolean();
                            }
                            else if (muteEntry.Key == "voice")
                            {
                                update_member.MuteVoice = muteEntry.Value.AsBoolean();
                            }
                        }
                    }

                    if (record_info.ContainsKey("can_voice_chat"))
                    {
                        update_member.CanVoiceChat = record_info["can_voice_chat"].AsBoolean();
                    }

                    if (record_info.ContainsKey("is_moderator"))
                    {
                        update_member.IsModerator = record_info["is_moderator"].AsBoolean();
                    }
                }

                // replace existing member record
                lock (GroupChatSessions.Dictionary)
                {
                    int found = GroupChatSessions.Dictionary[sessionID].FindIndex(delegate(ChatSessionMember m)
                    {
                        return m.AvatarKey == agent_key;
                    });

                    if (found >= 0)
                        GroupChatSessions.Dictionary[sessionID][found] = update_member;
                }

            }

            //foreach (KeyValuePair<string, SD> kvp in updates)
            //{
            //    if (kvp.Value.Equals("ENTER"))
            //    {
            //        lock (GroupChatSessions.Dictionary)
            //        {
            //            if (!GroupChatSessions.Dictionary[sessionID].Contains((UUID)kvp.Key))
            //                GroupChatSessions.Dictionary[sessionID].Add((UUID)kvp.Key);
            //        }
            //    }
            //    else if (kvp.Value.Equals("LEAVE"))
            //    {
            //        lock (GroupChatSessions.Dictionary)
            //        {
            //            if (GroupChatSessions.Dictionary[sessionID].Contains((UUID)kvp.Key))
            //                GroupChatSessions.Dictionary[sessionID].Remove((UUID)kvp.Key);

            //            // we left session, remove from dictionary
            //            if (kvp.Key.Equals(Client.Self.id) && OnGroupChatLeft != null)
            //            {
            //                GroupChatSessions.Dictionary.Remove(sessionID);
            //                OnGroupChatLeft(sessionID);
            //            }
            //        }
            //    }
            //}
        }