OpenSim.Region.ScriptEngine.Shared.Api.LSL_Api.llRequestAgentData C# (CSharp) Method

llRequestAgentData() public method

public llRequestAgentData ( string id, int data ) : OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString
id string
data int
return OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString
        public LSL_String llRequestAgentData(string id, int data)
        {
            m_host.AddScriptLPS(1);

            UUID uuid;
            if (UUID.TryParse(id, out uuid))
            {
                PresenceInfo pinfo = null;
                UserAccount account;

                UserInfoCacheEntry ce;
                if (!m_userInfoCache.TryGetValue(uuid, out ce))
                {
                    account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid);
                    if (account == null)
                    {
                        m_userInfoCache[uuid] = null; // Cache negative
                        return UUID.Zero.ToString();
                    }

                    PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() });
                    if (pinfos != null && pinfos.Length > 0)
                    {
                        foreach (PresenceInfo p in pinfos)
                        {
                            if (p.RegionID != UUID.Zero)
                            {
                                pinfo = p;
                            }
                        }
                    }

                    ce = new UserInfoCacheEntry();
                    ce.time = Util.EnvironmentTickCount();
                    ce.account = account;
                    ce.pinfo = pinfo;
                    m_userInfoCache[uuid] = ce;
                }
                else
                {
                    if (ce == null)
                        return UUID.Zero.ToString();

                    account = ce.account;
                    pinfo = ce.pinfo;
                }

                if (Util.EnvironmentTickCount() < ce.time ||
                            (Util.EnvironmentTickCount() - ce.time) >= LlRequestAgentDataCacheTimeoutMs)
                {
                    PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() });
                    if (pinfos != null && pinfos.Length > 0)
                    {
                        foreach (PresenceInfo p in pinfos)
                        {
                            if (p.RegionID != UUID.Zero)
                            {
                                pinfo = p;
                            }
                        }
                    }
                    else
                        pinfo = null;

                    ce.time = Util.EnvironmentTickCount();
                    ce.pinfo = pinfo;
                }

                string reply = String.Empty;

                switch (data)
                {
                    case ScriptBaseClass.DATA_ONLINE: // DATA_ONLINE (0|1)
                        if (pinfo != null && pinfo.RegionID != UUID.Zero)
                            reply = "1";
                        else
                            reply = "0";
                        break;
                    case ScriptBaseClass.DATA_NAME: // DATA_NAME (First Last)
                        reply = account.FirstName + " " + account.LastName;
                        break;
                    case ScriptBaseClass.DATA_BORN: // DATA_BORN (YYYY-MM-DD)
                        DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                        born = born.AddSeconds(account.Created);
                        reply = born.ToString("yyyy-MM-dd");
                        break;
                    case ScriptBaseClass.DATA_RATING: // DATA_RATING (0,0,0,0,0,0)
                        reply = "0,0,0,0,0,0";
                        break;
                    case 7: // DATA_USERLEVEL (integer).  This is not available in LL and so has no constant.
                        reply = account.UserLevel.ToString();
                        break;
                    case ScriptBaseClass.DATA_PAYINFO: // DATA_PAYINFO (0|1|2|3)
                        reply = "0";
                        break;
                    default:
                        return UUID.Zero.ToString(); // Raise no event
                }

                UUID rq = UUID.Random();

                UUID tid = AsyncCommands.
                    DataserverPlugin.RegisterRequest(m_host.LocalId,
                                                 m_item.ItemID, rq.ToString());

                AsyncCommands.
                DataserverPlugin.DataserverReply(rq.ToString(), reply);

                ScriptSleep(m_sleepMsOnRequestAgentData);
                return tid.ToString();
            }
            else
            {
                Error("llRequestAgentData","Invalid UUID passed to llRequestAgentData.");
            }
            return "";
        }

Usage Example

Example #1
0
        public void TestLlRequestAgentDataOnline()
        {
            TestHelpers.InMethod();
//            TestHelpers.EnableLogging();

            UUID userId = TestHelpers.ParseTail(0x1);

            UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, userId);

            SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart;
            TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene.AssetService, part);

            LSL_Api apiGrp1 = new LSL_Api();
            apiGrp1.Initialize(m_engine, part, scriptItem, null);

            // Initially long timeout to test cache
            apiGrp1.LlRequestAgentDataCacheTimeoutMs = 20000;

            // Offline test
            {
                apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE);

                Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID));

                List<EventParams> events = m_engine.PostedEvents[scriptItem.ItemID];
                Assert.That(events.Count, Is.EqualTo(1));
                EventParams eventParams = events[0];
                Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));

                string data = eventParams.Params[1].ToString();
                Assert.AreEqual(0, int.Parse(data));

                m_engine.PostedEvents.Clear();
            }

            // Online test.  Should get the 'wrong' result because of caching.
            ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1);

            {
                apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE);

                Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID));

                List<EventParams> events = m_engine.PostedEvents[scriptItem.ItemID];
                Assert.That(events.Count, Is.EqualTo(1));
                EventParams eventParams = events[0];
                Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));

                string data = eventParams.Params[1].ToString();
                Assert.AreEqual(0, int.Parse(data));

                m_engine.PostedEvents.Clear();
            }

            apiGrp1.LlRequestAgentDataCacheTimeoutMs = 1;

            // Make absolutely sure that we should trigger cache timeout.
            Thread.Sleep(apiGrp1.LlRequestAgentDataCacheTimeoutMs + 1);

            {
                apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE);

                Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID));

                List<EventParams> events = m_engine.PostedEvents[scriptItem.ItemID];
                Assert.That(events.Count, Is.EqualTo(1));
                EventParams eventParams = events[0];
                Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));

                string data = eventParams.Params[1].ToString();
                Assert.AreEqual(1, int.Parse(data));

                m_engine.PostedEvents.Clear();
            }

            m_scene.CloseAgent(userId, false);

            Thread.Sleep(apiGrp1.LlRequestAgentDataCacheTimeoutMs + 1 + 1);

            {
                apiGrp1.llRequestAgentData(userId.ToString(), ScriptBaseClass.DATA_ONLINE);

                Assert.That(m_engine.PostedEvents.ContainsKey(scriptItem.ItemID));

                List<EventParams> events = m_engine.PostedEvents[scriptItem.ItemID];
                Assert.That(events.Count, Is.EqualTo(1));
                EventParams eventParams = events[0];
                Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));

                string data = eventParams.Params[1].ToString();
                Assert.AreEqual(0, int.Parse(data));

                m_engine.PostedEvents.Clear();
            }
        }
LSL_Api