public GridInstantMessage[] GetOfflineMessages(UUID PrincipalID) { OSDMap map = new OSDMap(); map["PrincipalID"] = PrincipalID; map["Method"] = "getofflinemessages"; List<GridInstantMessage> Messages = new List<GridInstantMessage>(); try { List<string> urls = m_registry.RequestModuleInterface<IConfigurationService>().FindValueOf(PrincipalID.ToString(), "RemoteServerURI"); foreach (string url in urls) { OSDMap result = WebUtils.PostToService(url + "osd", map, true, false); OSDArray array = (OSDArray) OSDParser.DeserializeJson(result["_RawResult"]); foreach (OSD o in array) { GridInstantMessage message = new GridInstantMessage(); message.FromOSD((OSDMap) o); Messages.Add(message); } } return Messages.ToArray(); } catch (Exception e) { MainConsole.Instance.DebugFormat("[AuroraRemoteOfflineMessagesConnector]: Exception when contacting server: {0}", e); } return Messages.ToArray(); }
public GridInstantMessage[] GetOfflineMessages(UUID PrincipalID) { List<GridInstantMessage> Messages = new List<GridInstantMessage>(); Dictionary<string, OSDMap> Maps = new Dictionary<string, OSDMap>(); foreach (string m_ServerURI in m_ServerURIs) { if (SimianUtils.GetGenericEntries(PrincipalID, "OfflineMessages", m_ServerURI, out Maps)) { GridInstantMessage baseMessage = new GridInstantMessage(); foreach (OSDMap map in Maps.Values) { baseMessage.FromOSD(map); Messages.Add(baseMessage); } } } return Messages.ToArray(); }
protected OSDMap OnMessageReceived(OSDMap message) { if (!message.ContainsKey("Method")) return null; if (message["Method"] == "FriendGrantRights") { UUID Requester = message["Requester"].AsUUID(); UUID Target = message["Target"].AsUUID(); int MyFlags = message["MyFlags"].AsInteger(); int Rights = message["Rights"].AsInteger(); LocalGrantRights(Requester, Target, MyFlags, Rights); } else if (message["Method"] == "FriendTerminated") { UUID Requester = message["Requester"].AsUUID(); UUID ExFriend = message["ExFriend"].AsUUID(); LocalFriendshipTerminated(ExFriend, Requester); } else if (message["Method"] == "FriendshipOffered") { //UUID Requester = message["Requester"].AsUUID(); UUID Friend = message["Friend"].AsUUID(); GridInstantMessage im = new GridInstantMessage(); im.FromOSD((OSDMap) message["Message"]); LocalFriendshipOffered(Friend, im); } else if (message["Method"] == "FriendshipDenied") { UUID Requester = message["Requester"].AsUUID(); string ClientName = message["ClientName"].AsString(); UUID FriendID = message["FriendID"].AsUUID(); LocalFriendshipDenied(Requester, ClientName, FriendID); } else if (message["Method"] == "FriendshipApproved") { UUID Requester = message["Requester"].AsUUID(); string ClientName = message["ClientName"].AsString(); UUID FriendID = message["FriendID"].AsUUID(); LocalFriendshipApproved(Requester, ClientName, null, FriendID); } return null; }
/// <summary> /// Process a XMLRPC Grid Instant Message /// </summary> /// <param name = "request">XMLRPC parameters /// </param> /// <param name="remoteClient"> </param> /// <returns>Nothing much</returns> protected virtual XmlRpcResponse processXMLRPCGridInstantMessage(XmlRpcRequest request, IPEndPoint remoteClient) { bool successful = false; GridInstantMessage gim = new GridInstantMessage(); Hashtable requestData = (Hashtable) request.Params[0]; if (requestData.ContainsKey("message")) { try { //Deserialize it gim.FromOSD((OSDMap) OSDParser.DeserializeJson(requestData["message"].ToString())); } catch { UUID fromAgentID = UUID.Zero; UUID toAgentID = UUID.Zero; UUID imSessionID = UUID.Zero; uint timestamp = 0; string fromAgentName = ""; string message = ""; byte dialog = (byte) 0; bool fromGroup = false; byte offline = 0; uint ParentEstateID = 0; Vector3 Position = Vector3.Zero; UUID RegionID = UUID.Zero; byte[] binaryBucket = new byte[0]; float pos_x = 0; float pos_y = 0; float pos_z = 0; if (requestData.ContainsKey("from_agent_id") && requestData.ContainsKey("to_agent_id") && requestData.ContainsKey("im_session_id") && requestData.ContainsKey("timestamp") && requestData.ContainsKey("from_agent_name") && requestData.ContainsKey("message") && requestData.ContainsKey("dialog") && requestData.ContainsKey("from_group") && requestData.ContainsKey("offline") && requestData.ContainsKey("parent_estate_id") && requestData.ContainsKey("position_x") && requestData.ContainsKey("position_y") && requestData.ContainsKey("position_z") && requestData.ContainsKey("region_id") && requestData.ContainsKey("binary_bucket")) { // Do the easy way of validating the UUIDs UUID.TryParse((string) requestData["from_agent_id"], out fromAgentID); UUID.TryParse((string) requestData["to_agent_id"], out toAgentID); UUID.TryParse((string) requestData["im_session_id"], out imSessionID); UUID.TryParse((string) requestData["region_id"], out RegionID); try { timestamp = (uint) Convert.ToInt32((string) requestData["timestamp"]); } catch (ArgumentException) { } catch (FormatException) { } catch (OverflowException) { } fromAgentName = (string) requestData["from_agent_name"]; message = (string) requestData["message"]; if (message == null) message = string.Empty; // Bytes don't transfer well over XMLRPC, so, we Base64 Encode them. string requestData1 = (string) requestData["dialog"]; if (string.IsNullOrEmpty(requestData1)) { dialog = 0; } else { byte[] dialogdata = Convert.FromBase64String(requestData1); dialog = dialogdata[0]; } if ((string) requestData["from_group"] == "TRUE") fromGroup = true; string requestData2 = (string) requestData["offline"]; if (String.IsNullOrEmpty(requestData2)) { offline = 0; } else { byte[] offlinedata = Convert.FromBase64String(requestData2); offline = offlinedata[0]; } try { ParentEstateID = (uint) Convert.ToInt32((string) requestData["parent_estate_id"]); } catch (ArgumentException) { } catch (FormatException) { } catch (OverflowException) { } try { pos_x = (uint) Convert.ToInt32((string) requestData["position_x"]); } catch (ArgumentException) { } catch (FormatException) { } catch (OverflowException) { } try { pos_y = (uint) Convert.ToInt32((string) requestData["position_y"]); } catch (ArgumentException) { } catch (FormatException) { } catch (OverflowException) { } try { pos_z = (uint) Convert.ToInt32((string) requestData["position_z"]); } catch (ArgumentException) { } catch (FormatException) { } catch (OverflowException) { } Position = new Vector3(pos_x, pos_y, pos_z); string requestData3 = (string) requestData["binary_bucket"]; binaryBucket = string.IsNullOrEmpty(requestData3) ? new byte[0] : Convert.FromBase64String(requestData3); // Create a New GridInstantMessageObject the the data gim.fromAgentID = fromAgentID; gim.fromAgentName = fromAgentName; gim.fromGroup = fromGroup; gim.imSessionID = imSessionID; gim.RegionID = UUID.Zero; // RegionID.Guid; gim.timestamp = timestamp; gim.toAgentID = toAgentID; gim.message = message; gim.dialog = dialog; gim.offline = 0; gim.ParentEstateID = ParentEstateID; gim.Position = Position; gim.binaryBucket = binaryBucket; } } if (gim.dialog == (byte) InstantMessageDialog.GodLikeRequestTeleport) gim.dialog = (byte) InstantMessageDialog.RequestTeleport; // Trigger the Instant message in the scene. foreach (IScene scene in m_Scenes) { IScenePresence user; if (scene.TryGetScenePresence(gim.toAgentID, out user)) { if (!user.IsChildAgent) { scene.EventManager.TriggerIncomingInstantMessage(gim); successful = true; } } } if (!successful) { // If the message can't be delivered to an agent, it // is likely to be a group IM. On a group IM, the // imSessionID = toAgentID = group id. Raise the // unhandled IM event to give the groups module // a chance to pick it up. We raise that in a random // scene, since the groups module is shared. // m_Scenes[0].EventManager.TriggerUnhandledInstantMessage(gim); } } //Send response back to region calling if it was successful // calling region uses this to know when to look up a user's location again. XmlRpcResponse resp = new XmlRpcResponse(); Hashtable respdata = new Hashtable(); if (successful) respdata["success"] = "TRUE"; else respdata["success"] = "FALSE"; resp.Value = respdata; return resp; }
public byte[] AddOfflineMessage(OSDMap request) { GridInstantMessage message = new GridInstantMessage(); message.FromOSD(request); OSDMap map = new OSDMap(); map["Result"] = OfflineMessagesConnector.AddOfflineMessage(message); string xmlString = OSDParser.SerializeJsonString(map); UTF8Encoding encoding = new UTF8Encoding(); return encoding.GetBytes(xmlString); }