/// <summary> /// Add this member to the friend conference /// </summary> /// <param name="member"></param> /// <param name="SessionID"></param> public void AddMemberToGroup(ChatSessionMember member, UUID SessionID) { ChatSession session; ChatSessions.TryGetValue(SessionID, out session); session.Members.Add(member); }
void UpdateParticipantList() { if (InvokeRequired) { if (!instance.MonoRuntime || IsHandleCreated) { BeginInvoke(new MethodInvoker(UpdateParticipantList)); } return; } try { lock (AvatarListSyncRoot) { Participants.BeginUpdate(); Participants.Items.Clear(); List <ChatSessionMember> participants; if (client.Self.GroupChatSessions.TryGetValue(SessionId, out participants)) { ChatSessionMember[] members = participants.ToArray(); for (int i = 0; i < members.Length; i++) { ChatSessionMember participant = members[i]; ListViewItem item = new ListViewItem(); item.Name = participant.AvatarKey.ToString(); item.Text = instance.Names.Get(participant.AvatarKey); item.Tag = participant.AvatarKey; if (participant.IsModerator) { item.Font = new Font(item.Font, FontStyle.Bold); } Participants.Items.Add(item); } } Participants.Sort(); Participants.EndUpdate(); } } catch (Exception) { Participants.EndUpdate(); } }
/// <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(UUID.Parse(im.imSessionID.ToString()), out session); if (session == null) { return; } ChatSessionMember member = new ChatSessionMember() { AvatarKey = UUID.Zero }; foreach (ChatSessionMember testmember in session.Members) { if (member.AvatarKey == UUID.Parse(im.fromAgentID.ToString())) { member = testmember; } } if (member.AvatarKey != UUID.Zero) { session.Members.Remove(member); } if (session.Members.Count == 0) { ChatSessions.Remove(session.SessionID); return; } OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block = new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock(); block.AgentID = member.AvatarKey; block.CanVoiceChat = member.CanVoiceChat; block.IsModerator = member.IsModerator; block.MuteText = member.MuteText; block.MuteVoice = member.MuteVoice; block.Transition = "LEAVE"; IEventQueueService eq = client.Scene.RequestModuleInterface <IEventQueueService>(); foreach (ChatSessionMember sessionMember in session.Members) { eq.ChatterBoxSessionAgentListUpdates(session.SessionID, new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock[] { block }, sessionMember.AvatarKey, "LEAVE", findScene(sessionMember.AvatarKey).RegionInfo.RegionHandle); } }
/// <summary> /// Add the agent to the in-memory session lists and give them the default permissions /// </summary> /// <param name="AgentID"></param> /// <param name="SessionID"></param> private void AddDefaultPermsMemberToSession(UUID AgentID, UUID SessionID) { ChatSession session; ChatSessions.TryGetValue(SessionID, out session); ChatSessionMember member = new ChatSessionMember() { AvatarKey = AgentID, CanVoiceChat = true, IsModerator = false, MuteText = false, MuteVoice = false, HasBeenAdded = false }; session.Members.Add(member); }
/// <summary> /// Check whether the user has moderator permissions /// </summary> /// <param name="Agent"></param> /// <param name="sessionid"></param> /// <returns></returns> public bool CheckModeratorPermission(UUID Agent, UUID sessionid) { ChatSession session; ChatSessions.TryGetValue(sessionid, out session); ChatSessionMember thismember = new ChatSessionMember() { AvatarKey = UUID.Zero }; foreach (ChatSessionMember testmember in session.Members) { if (testmember.AvatarKey == Agent) { thismember = testmember; } } if (thismember == null) { return(false); } return(thismember.IsModerator); }
/// <summary> /// Find the member from X sessionID /// </summary> /// <param name="sessionid"></param> /// <param name="Agent"></param> /// <returns></returns> private ChatSessionMember FindMember(UUID sessionid, UUID Agent) { ChatSession session; ChatSessions.TryGetValue(sessionid, out session); if (session == null) { return(null); } ChatSessionMember thismember = new ChatSessionMember() { AvatarKey = UUID.Zero }; foreach (ChatSessionMember testmember in session.Members) { if (testmember.AvatarKey == Agent) { thismember = testmember; } } return(thismember); }
/// <summary> /// Find the member from X sessionID /// </summary> /// <param name="sessionid"></param> /// <param name="Agent"></param> /// <returns></returns> private ChatSessionMember FindMember(UUID sessionid, UUID Agent) { ChatSession session; ChatSessions.TryGetValue(sessionid, out session); if (session == null) return null; ChatSessionMember thismember = new ChatSessionMember() { AvatarKey = UUID.Zero }; foreach (ChatSessionMember testmember in session.Members) { if (testmember.AvatarKey == Agent) thismember = testmember; } return thismember; }
/// <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 }; foreach (ChatSessionMember testmember in session.Members) { if (member.AvatarKey == im.fromAgentID) member = testmember; } if (member.AvatarKey != UUID.Zero) session.Members.Remove(member); if (session.Members.Count == 0) { ChatSessions.Remove(session.SessionID); return; } OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block = new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock(); block.AgentID = member.AvatarKey; block.CanVoiceChat = member.CanVoiceChat; block.IsModerator = member.IsModerator; block.MuteText = member.MuteText; block.MuteVoice = member.MuteVoice; block.Transition = "LEAVE"; IEventQueueService eq = client.Scene.RequestModuleInterface<IEventQueueService>(); foreach (ChatSessionMember sessionMember in session.Members) { eq.ChatterBoxSessionAgentListUpdates(session.SessionID, new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock[] { block }, sessionMember.AvatarKey, "LEAVE", findScene(sessionMember.AvatarKey).RegionInfo.RegionHandle); } }
/// <summary> /// Check whether the user has moderator permissions /// </summary> /// <param name="Agent"></param> /// <param name="sessionid"></param> /// <returns></returns> public bool CheckModeratorPermission(UUID Agent, UUID sessionid) { ChatSession session; ChatSessions.TryGetValue(sessionid, out session); ChatSessionMember thismember = new ChatSessionMember() { AvatarKey = UUID.Zero }; foreach (ChatSessionMember testmember in session.Members) { if (testmember.AvatarKey == Agent) thismember = testmember; } if (thismember == null) return false; return thismember.IsModerator; }
private Hashtable ProcessChatSessionRequest(Hashtable mDhttpMethod, UUID Agent) { OSDMap rm = (OSDMap)OSDParser.DeserializeLLSDXml((string)mDhttpMethod["requestbody"]); 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 OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block = new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock(); block.AgentID = Agent; block.CanVoiceChat = true; block.IsModerator = true; block.MuteText = false; block.MuteVoice = false; block.Transition = "ENTER"; eq.ChatterBoxSessionAgentListUpdates(sessionid, new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock[] { block }, Agent, "ENTER", findScene(Agent).RegionInfo.RegionHandle); OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage cs = new OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage(); cs.VoiceEnabled = true; cs.TempSessionID = UUID.Random(); cs.Type = 1; cs.Success = true; cs.SessionID = sessionid; cs.SessionName = SP.Name + " Conference"; cs.ModeratedVoice = true; Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; OSDMap map = cs.Serialize(); responsedata["str_response_string"] = map.ToString(); return(responsedata); } else if (method == "accept invitation") { //They would like added to the group conversation List <OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> Us = new List <OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock>(); List <OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock> NotUsAgents = new List <OpenMetaverse.Messages.Linden.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) { OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block = new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock(); block.AgentID = sessionMember.AvatarKey; block.CanVoiceChat = sessionMember.CanVoiceChat; block.IsModerator = sessionMember.IsModerator; block.MuteText = sessionMember.MuteText; block.MuteVoice = sessionMember.MuteVoice; block.Transition = "ENTER"; if (sessionMember.AvatarKey == thismember.AvatarKey) { Us.Add(block); } else { if (sessionMember.HasBeenAdded) // Don't add not joined yet agents. They don't watn to be here. { NotUsAgents.Add(block); } } } thismember.HasBeenAdded = true; 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", findScene(Agent).RegionInfo.RegionHandle); } else { //Tell 'other' agents about the new agent ('us') eq.ChatterBoxSessionAgentListUpdates(session.SessionID, Us.ToArray(), member.AvatarKey, "ENTER", findScene(Agent).RegionInfo.RegionHandle); } } } Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = "Accepted"; return(responsedata); } else if (method == "mute update") { //Check if the user is a moderator Hashtable responsedata = new Hashtable(); if (!CheckModeratorPermission(Agent, sessionid)) { responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = "Accepted"; return(responsedata); } OSDMap parameters = (OSDMap)rm["params"]; UUID AgentID = parameters["agent_id"].AsUUID(); OSDMap muteInfoMap = (OSDMap)parameters["mute_info"]; ChatSessionMember thismember = FindMember(sessionid, Agent); if (muteInfoMap.ContainsKey("text")) { thismember.MuteText = muteInfoMap["text"].AsBoolean(); } if (muteInfoMap.ContainsKey("voice")) { thismember.MuteVoice = muteInfoMap["voice"].AsBoolean(); } OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock block = new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock(); block.AgentID = thismember.AvatarKey; block.CanVoiceChat = thismember.CanVoiceChat; block.IsModerator = thismember.IsModerator; block.MuteText = thismember.MuteText; block.MuteVoice = thismember.MuteVoice; block.Transition = "ENTER"; // Send an update to the affected user eq.ChatterBoxSessionAgentListUpdates(sessionid, new OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock[] { block }, AgentID, "", findScene(Agent).RegionInfo.RegionHandle); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = "Accepted"; return(responsedata); } else { m_log.Warn("ChatSessionRequest : " + method); Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = "Accepted"; return(responsedata); } }