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);
// }
// }
// }
//}
}