From da5dbaf1d0729b254e1a2123d90f8c11e2c692a3 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 26 Mar 2013 23:02:13 +0000
Subject: Add admin_get_agents xmlrpc method.

This allows one to retrieve information about agents from a particular region (name, id, position, etc.)
Similar to output from "show users"
See http://opensimulator.org/wiki/Remoteadmin:admin_get_agents for more details
---
 .../RemoteController/RemoteAdminPlugin.cs          | 66 ++++++++++++++++++++++
 1 file changed, 66 insertions(+)

(limited to 'OpenSim')

diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index 6983479..5d44b2a 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -137,6 +137,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
                     availableMethods["admin_save_heightmap"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcSaveHeightmapMethod);
 
                     // Agent management
+                    availableMethods["admin_get_agents"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcGetAgentsMethod);
                     availableMethods["admin_teleport_agent"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcTeleportAgentMethod);
 
                     // User management
@@ -1760,6 +1761,71 @@ namespace OpenSim.ApplicationPlugins.RemoteController
             m_log.Info("[RADMIN]: Access List List Request complete");
         }
 
+        private void XmlRpcGetAgentsMethod(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
+        {
+            Hashtable responseData = (Hashtable)response.Value;
+            Hashtable requestData = (Hashtable)request.Params[0];
+
+            bool includeChildren = false;
+
+            if (requestData.Contains("include_children"))
+                bool.TryParse((string)requestData["include_children"], out includeChildren);
+
+            Scene scene;
+            GetSceneFromRegionParams(requestData, responseData, out scene);
+
+            ArrayList xmlRpcRegions = new ArrayList();
+            responseData["regions"] = xmlRpcRegions;
+
+            Hashtable xmlRpcRegion = new Hashtable();
+            xmlRpcRegions.Add(xmlRpcRegion);
+
+            xmlRpcRegion["name"] = scene.Name;
+            xmlRpcRegion["id"] = scene.RegionInfo.RegionID.ToString();
+
+            List<ScenePresence> agents = scene.GetScenePresences();
+            ArrayList xmlrpcAgents = new ArrayList();
+
+            foreach (ScenePresence agent in agents)
+            {
+                if (agent.IsChildAgent && !includeChildren)
+                    continue;
+
+                Hashtable xmlRpcAgent = new Hashtable();
+                xmlRpcAgent.Add("name", agent.Name);
+                xmlRpcAgent.Add("id", agent.UUID.ToString());
+                xmlRpcAgent.Add("type", agent.PresenceType.ToString());
+                xmlRpcAgent.Add("current_parcel_id", agent.currentParcelUUID.ToString());
+
+                Vector3 pos = agent.AbsolutePosition;
+                xmlRpcAgent.Add("pos_x", pos.X.ToString());
+                xmlRpcAgent.Add("pos_y", pos.Y.ToString());
+                xmlRpcAgent.Add("pos_z", pos.Z.ToString());
+
+                Vector3 lookAt = agent.Lookat;
+                xmlRpcAgent.Add("lookat_x", lookAt.X.ToString());
+                xmlRpcAgent.Add("lookat_y", lookAt.Y.ToString());
+                xmlRpcAgent.Add("lookat_z", lookAt.Z.ToString());
+
+                Vector3 vel = agent.Velocity;
+                xmlRpcAgent.Add("vel_x", vel.X.ToString());
+                xmlRpcAgent.Add("vel_y", vel.Y.ToString());
+                xmlRpcAgent.Add("vel_z", vel.Z.ToString());
+
+                xmlRpcAgent.Add("is_flying", agent.Flying.ToString());
+                xmlRpcAgent.Add("is_sat_on_ground", agent.SitGround.ToString());
+                xmlRpcAgent.Add("is_sat_on_object", agent.IsSatOnObject.ToString());
+
+                xmlrpcAgents.Add(xmlRpcAgent);
+            }
+
+            m_log.DebugFormat(
+                "[REMOTE ADMIN]: XmlRpcGetAgents found {0} agents in {1}", xmlrpcAgents.Count, scene.Name);
+
+            xmlRpcRegion["agents"] = xmlrpcAgents;
+            responseData["success"] = true;
+        }
+
         private void XmlRpcTeleportAgentMethod(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
         {
             Hashtable responseData = (Hashtable)response.Value;
-- 
cgit v1.1