Example #1
0
 /// <summary>
 /// Records an event using the GameEvent class.
 /// </summary>
 /// <param name="gameEvent">Event to record.</param>
 /// <returns><see cref="EventAction"/> for this event</returns>
 /// <exception cref="System.Exception">Thrown if the SDK has not been started.</exception>
 public EventAction RecordEvent <T>(T gameEvent) where T : GameEvent <T>
 {
     return(delegated.RecordEvent(gameEvent));
 }
        internal virtual bool Evaluate(GameEvent evnt)
        {
            if (evnt.Name != eventName)
            {
                return(false);
            }

            var parameters = evnt.parameters.AsDictionary();
            var stack      = new Stack <object>();

            foreach (var token in condition)
            {
                if (token.ContainsKey("o"))
                {
                    string op = (string)token["o"];
                    op = op.ToLower();
                    object right = stack.Pop();
                    object left  = stack.Pop();

                    try{
                        if (right is bool)
                        {
                            if (left is bool)
                            {
                                stack.Push(BOOLS[op]((bool)left, (bool)right));
                            }
                            else
                            {
                                Logger.LogWarning(
                                    left + " and " + right + " have mismatched types");
                                return(false);
                            }
                        }
                        else if (right is long)
                        {
                            if (left is int)
                            {
                                stack.Push(LONGS[op]((int)left, (long)right));
                            }
                            else if (left is long)
                            {
                                stack.Push(LONGS[op]((long)left, (long)right));
                            }
                            else
                            {
                                Logger.LogWarning(
                                    left + " and " + right + " have mismatched types");
                                return(false);
                            }
                        }
                        else if (right is double)
                        {
                            if (left is float)
                            {
                                stack.Push(DOUBLES[op]((float)left, (double)right));
                            }
                            else if (left is double)
                            {
                                stack.Push(DOUBLES[op]((double)left, (double)right));
                            }
                            else
                            {
                                Logger.LogWarning(
                                    left + " and " + right + " have mismatched types");
                                return(false);
                            }
                        }
                        else if (right is string)
                        {
                            if (left is string)
                            {
                                stack.Push(STRINGS[op]((string)left, (string)right));
                            }
                            else
                            {
                                Logger.LogWarning(
                                    left + " and " + right + " have mismatched types");
                                return(false);
                            }
                        }
                        else if (right is DateTime)
                        {
                            if (left is string)
                            {
                                stack.Push(DATES[op](
                                               DateTime.ParseExact(
                                                   (string)left,
                                                   Settings.EVENT_TIMESTAMP_FORMAT,
                                                   System.Globalization.CultureInfo.InvariantCulture),
                                               (DateTime)right));
                            }
                            else
                            {
                                Logger.LogWarning(
                                    left + " and " + right + " have mismatched types");
                                return(false);
                            }
                        }
                        else
                        {
                            Logger.LogWarning("Unexpected type for " + right);
                            return(false);
                        }
                    }
                    catch (KeyNotFoundException) {
                        Logger.LogWarning(string.Format(
                                              "Failed to find operation {0} for {1} and {2}",
                                              op,
                                              left,
                                              right));
                        return(false);
                    }
                    catch (FormatException) {
                        Logger.LogWarning("Failed converting parameter " + left + " to DateTime");
                        return(false);
                    }
                }
                else if (token.ContainsKey("p"))
                {
                    var param = (string)token["p"];
                    if (parameters.ContainsKey(param))
                    {
                        stack.Push(parameters[param]);
                    }
                    else
                    {
                        Logger.LogWarning("Failed to find " + param + " in event params");
                        return(false);
                    }
                }
                else if (token.ContainsKey("b"))
                {
                    stack.Push((bool)token["b"]);
                }
                else if (token.ContainsKey("i"))
                {
                    // ints are double precision in JSON
                    stack.Push((long)token["i"]);
                }
                else if (token.ContainsKey("f"))
                {
                    var value = token["f"];
                    // serialiser inserts a whole double as a long
                    if (value is long)
                    {
                        stack.Push((double)(long)token["f"]);
                    }
                    else
                    {
                        // floats are double precision in JSON
                        stack.Push((double)token["f"]);
                    }
                }
                else if (token.ContainsKey("s"))
                {
                    stack.Push((string)token["s"]);
                }
                else if (token.ContainsKey("t"))
                {
                    try{
                        stack.Push(DateTime.Parse((string)token["t"], null));
                    }
                    catch (FormatException) {
                        Logger.LogWarning("Failed converting " + token["t"] + " to DateTime");
                        return(false);
                    }
                }
                else
                {
                    stack.Push(token);
                }
            }



            var result = stack.Count == 0 || (stack.Pop() as bool? ?? false);

            if (result)
            {
                // Default to true if no conditions exist
                bool triggerConditionsReached = campaignTriggerConditions.Count == 0;

                // Only one condition needs to be true to flip conditions to true
                this.executionCountManager.incrementExecutionCount(this.variantId);
                foreach (TriggerCondition campaignTriggerCondition in campaignTriggerConditions)
                {
                    if (campaignTriggerCondition.CanExecute())
                    {
                        triggerConditionsReached = true;
                    }
                }

                // If none reached return false
                if (!triggerConditionsReached)
                {
                    return(false);
                }
                if (limit != -1 && runs >= limit)
                {
                    return(false);
                }

                runs++;
                var eventTriggeredActionEvent = new GameEvent("ddnaEventTriggeredAction")
                                                .AddParam("ddnaEventTriggeredCampaignID", campaignId)
                                                .AddParam("ddnaEventTriggeredCampaignPriority", priority)
                                                .AddParam("ddnaEventTriggeredVariantID", variantId)
                                                .AddParam("ddnaEventTriggeredActionType", GetAction())
                                                .AddParam("ddnaEventTriggeredSessionCount", runs);

                if (campaignName != null)
                {
                    eventTriggeredActionEvent.AddParam("ddnaEventTriggeredCampaignName", campaignName);
                }

                if (variantName != null)
                {
                    eventTriggeredActionEvent.AddParam("ddnaEventTriggeredVariantName", variantName);
                }

                ddna.RecordEvent(eventTriggeredActionEvent);
            }

            return(result);
        }
Example #3
0
 /// <summary>
 /// Records an event using the GameEvent class.
 /// </summary>
 /// <param name="gameEvent">Event to record.</param>
 /// <exception cref="System.Exception">Thrown if the SDK has not been started.</exception>
 public void RecordEvent <T>(T gameEvent) where T : GameEvent <T>
 {
     delegated.RecordEvent(gameEvent);
 }