Universe.ScriptEngine.VirtualScript.ScriptProtectionModule.CheckFunctionLimits C# (CSharp) Method

CheckFunctionLimits() private method

private CheckFunctionLimits ( string function, ISceneChildEntity m_host, string API, UUID itemID ) : bool
function string
m_host ISceneChildEntity
API string
itemID UUID
return bool
        bool CheckFunctionLimits(string function, ISceneChildEntity m_host, string API, UUID itemID)
        {
            LimitDef d = null;
            bool isAPI = m_functionsToLimit.TryGetValue(API, out d);
            bool isFunction = m_functionsToLimit.TryGetValue(function, out d); //Function overrides API
            if (m_allowFunctionLimiting && (isAPI || isFunction))
            {
                //Get the list for the given type
                Dictionary<string, LimitReq> functions;
                bool doInsert = false;
                if (d.Type == LimitType.Owner)
                {
                    if (!m_functionLimiting.TryGetValue(m_host.OwnerID, out functions))
                    {
                        doInsert = true;
                        functions = new Dictionary<string, LimitReq>();
                    }
                }
                else if (d.Type == LimitType.Script)
                {
                    if (!m_functionLimiting.TryGetValue(itemID, out functions))
                    {
                        doInsert = true;
                        functions = new Dictionary<string, LimitReq>();
                    }
                }
                else if (d.Type == LimitType.Group)
                {
                    if (!m_functionLimiting.TryGetValue(m_host.ParentEntity.UUID, out functions))
                    {
                        doInsert = true;
                        functions = new Dictionary<string, LimitReq>();
                    }
                }
                else if (d.Type == LimitType.Prim)
                {
                    if (!m_functionLimiting.TryGetValue(m_host.UUID, out functions))
                    {
                        doInsert = true;
                        functions = new Dictionary<string, LimitReq>();
                    }
                }
                else
                    return true;

                LimitReq r;
                if (!functions.TryGetValue(function, out r))
                    r = new LimitReq();

                if (d.MaxNumberOfTimes != 0)
                {
                    if (r.NumberOfTimesFired + 1 > d.MaxNumberOfTimes) //Too Many, kill it
                    {
                        TriggerAlert(function, d,
                                     "You have exceeded the number of times this function (" + function +
                                     ") is allowed to be fired",
                                     m_host);
                        return TriggerAction(d, m_host, itemID);
                    }
                    r.NumberOfTimesFired++;
                }
                if (d.TimeScale != 0)
                {
                    if (r.LastFired != 0 && Util.EnvironmentTickCountSubtract(r.LastFired) < d.TimeScale)
                    {
                        if (r.FunctionsSinceLastFired + 1 > d.FunctionsOverTimeScale)
                        {
                            TriggerAlert(function, d,
                                         "You have fired the given function " + function + " too quickly.", m_host);
                            return TriggerAction(d, m_host, itemID);
                        }
                    }
                    else
                    {
                        r.LastFired = Util.EnvironmentTickCount();
                        r.FunctionsSinceLastFired = 0; //Clear it out again
                    }
                    r.FunctionsSinceLastFired++;
                }
                //Put it back where it came from
                functions[isFunction ? function : API] = r;
                if (doInsert)
                    if (d.Type == LimitType.Owner)
                        m_functionLimiting[m_host.OwnerID] = functions;
                    else if (d.Type == LimitType.Script)
                        m_functionLimiting[itemID] = functions;
                    else if (d.Type == LimitType.Group)
                        m_functionLimiting[m_host.ParentEntity.UUID] = functions;
                    else if (d.Type == LimitType.Prim)
                        m_functionLimiting[m_host.UUID] = functions;
            }
            return true;
        }