protected void SetNormalProperties(IDictionary<string, object> obj, MessageData messageData)
 {
     foreach (var prop in messageData.Props)
     {
         obj[prop.Key] = prop.Value;
     }
 }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData);

            // $ip, $time and $ignore_time
            SetSpecialProperties(msg, messageData, new Dictionary<string, Func<object, object>>
            {
                { MixpanelProperty.PeopleIp, null },
                { MixpanelProperty.PeopleTime, ConvertToUnixTime },
                { MixpanelProperty.PeopleIgnoreTime, null }
            });

            // $set
            var set = new Dictionary<string, object>();
            msg[MixpanelProperty.PeopleSet] = set;

            SetSpecialProperties(set, messageData, new Dictionary<string, Func<object, object>>
            {
                { MixpanelProperty.PeopleFirstName, null },
                { MixpanelProperty.PeopleLastName, null },
                { MixpanelProperty.PeopleName, null },
                { MixpanelProperty.PeopleCreated, null },
                { MixpanelProperty.PeopleEmail, null },
                { MixpanelProperty.PeoplePhone, null },
            });

            SetNormalProperties(set, messageData);

            return msg;
        }
 protected void SetSpecialProperties(
     IDictionary<string, object> obj, MessageData messageData,
     IDictionary<string, Func<object, object>> propNames)
 {
     foreach (var propName in propNames)
     {
         SetSpecialProperty(obj, messageData, propName.Key, propName.Value);
     }
 }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData, 3);

            // $unset
            SetSpecialRequiredProperty(msg, messageData, MixpanelProperty.PeopleUnset);

            return msg;
        }
 protected void SetSpecialProperty(
     IDictionary<string, object> obj, MessageData messageData, string propName,
     Func<object, object> convertFn = null)
 {
     var val = messageData.GetSpecialProp(propName, convertFn);
     if (val != null)
     {
         obj[propName] = val;
     }
 }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData, 3);

            var add = new Dictionary<string, object>();
            msg[MixpanelProperty.PeopleAdd] = add;

            SetNormalProperties(add, messageData);

            return msg;
        }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData, 3);

            var union = new Dictionary<string, object>();
            msg[MixpanelProperty.PeopleUnion] = union;

            SetNormalProperties(union, messageData);

            return msg;
        }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData);

            var append = new Dictionary<string, object>(1);
            msg[MixpanelProperty.PeopleAppend] = append;

            var transactions = new Dictionary<string, object>(2);
            append[MixpanelProperty.PeopleTransactions] = transactions;

            SetSpecialRequiredProperty(transactions, messageData, MixpanelProperty.PeopleTime);
            SetSpecialRequiredProperty(transactions, messageData, MixpanelProperty.PeopleAmount);

            return msg;
        }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            var msg = GetCoreMessageObject(messageData);
            var properties = (IDictionary<string, object>)msg[MixpanelProperty.TrackProperties];

            // distinct_id, ip and time
            SetSpecialProperties(properties, messageData, new Dictionary<string, Func<object, object>>
            {
                { MixpanelProperty.TrackDistinctId, x => x.ToString() },
                { MixpanelProperty.TrackIp, x => x.ToString() },
                { MixpanelProperty.TrackTime, ConvertToUnixTime }
            });

            SetNormalProperties(properties, messageData);

            return msg;
        }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            IDictionary<string, object> msg = GetCoreMessageObject(messageData);

            // $ignore_time
            SetSpecialProperties(msg, messageData, new Dictionary<string, Func<object, object>>
            {
                { MixpanelProperty.PeopleIgnoreTime, null }
            });

            // $set_once
            var setOnce = new Dictionary<string, object>();
            msg[MixpanelProperty.PeopleSetOnce] = setOnce;

            SetNormalProperties(setOnce, messageData);

            return msg;
        }
        /// <summary>
        /// Creates core people message object that can be used as base for
        /// building other people messages. Sets $token and $distinct_id properties.
        /// </summary>
        /// <param name="messageData">Parsed message data.</param>
        /// <param name="messageItemsCount">
        /// If set then message dictionary will be initialized with this value as capacity.
        /// </param>
        protected IDictionary<string, object> GetCoreMessageObject(
            MessageData messageData, int? messageItemsCount = null)
        {
            var msg = messageItemsCount == null
                ? new Dictionary<string, object>()
                : new Dictionary<string, object>(messageItemsCount.Value);

            // $token
            SetSpecialRequiredProperty(msg, messageData, MixpanelProperty.PeopleToken,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.PeopleToken),
                x => x.ToString());

            // $distinct_id
            SetSpecialRequiredProperty(msg, messageData, MixpanelProperty.PeopleDistinctId,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.PeopleDistinctId),
                x => x.ToString());

            return msg;
        }
        protected IDictionary<string, object> GetCoreMessageObject(MessageData messageData)
        {
            var msg = new Dictionary<string, object>(2);

            // event
            SetSpecialRequiredProperty(msg, messageData, MixpanelProperty.TrackEvent,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.TrackEvent),
                x => x.ToString());

            var properties = new Dictionary<string, object>();
            msg[MixpanelProperty.TrackProperties] = properties;

            // token
            SetSpecialRequiredProperty(properties, messageData, MixpanelProperty.TrackToken,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.TrackToken),
                x => x.ToString());

            return msg;
        }
        public override IDictionary<string, object> GetMessageObject(MessageData messageData)
        {
            messageData.SetProperty(MixpanelProperty.TrackEvent, MixpanelProperty.TrackCreateAlias);

            var msg = GetCoreMessageObject(messageData);
            var properties = (IDictionary<string, object>)msg[MixpanelProperty.TrackProperties];

            // distinct_id
            SetSpecialRequiredProperty(properties, messageData, MixpanelProperty.TrackDistinctId,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.TrackDistinctId),
                x => x.ToString());

            // alias
            SetSpecialRequiredProperty(properties, messageData, MixpanelProperty.TrackAlias,
                x => ThrowIfPropertyIsNullOrEmpty(x, MixpanelProperty.TrackAlias),
                x => x.ToString());

            return msg;
        }
 public void SetUp()
 {
     MixpanelConfig.Global.Reset();
     _builder = new PeopleSetMessageBuilder();
     _od = new MessageData(_builder.SpecialPropsBindings);
 }
 public override IDictionary<string, object> GetMessageObject(MessageData messageData)
 {
     IDictionary<string, object> msg = GetCoreMessageObject(messageData, 3);
     msg[MixpanelProperty.PeopleDelete] = string.Empty;
     return msg;
 }
 public void SetUp()
 {
     MixpanelConfig.Global.Reset();
     _builder = new PeopleSetMessageBuilder();
     _md = new MessageData(
         _builder.SpecialPropsBindings,
         _builder.DistinctIdPropsBindings,
         _builder.MessagePropetiesRules,
         _builder.SuperPropertiesRules);
 }
        /// <summary>
        /// Returns dictionary that contains Mixpanel message and is ready to be serialized. 
        /// </summary>
        /// <param name="builder">
        /// An override of <see cref="MessageBuilderBase"/> to use to generate message data.
        /// </param>
        /// <param name="userProperties">Object that contains user defined properties.</param>
        /// <param name="extraProperties">
        /// Object created by calling method. Usually contains properties that are passed to calling method
        /// as arguments.
        /// </param>
        private IDictionary<string, object> GetMessageObject(
            MessageBuilderBase builder, object userProperties, object extraProperties)
        {
            var md = new MessageData(
                builder.SpecialPropsBindings,
                builder.DistinctIdPropsBindings,
                builder.MessagePropetiesRules,
                builder.SuperPropertiesRules,
                _config);
            md.SetProperty(MixpanelProperty.Token, _token);
            md.ParseAndSetSuperProperties(_superProperties);
            md.ParseAndSetProperties(userProperties);
            md.ParseAndSetPropertiesIfNotNull(extraProperties);

            return builder.GetMessageObject(md);
        }
 public abstract IDictionary<string, object> GetMessageObject(MessageData messageData);
 protected void SetSpecialRequiredProperty(
     IDictionary<string, object> obj, MessageData messageData, string propName,
     Action<object> validateFn = null, Func<object, object> convertFn = null)
 {
     obj[propName] = messageData.GetSpecialRequiredProp(propName, validateFn, convertFn);
 }
        /// <summary>
        /// Returns dictionary that contains Mixpanel message and is ready to be serialized. 
        /// </summary>
        /// <param name="builder">
        /// An override of <see cref="MessageBuilderBase"/> to use to generate message data.
        /// </param>
        /// <param name="userProperties">Object that contains user defined properties.</param>
        /// <param name="extraProperties">
        /// Object created by calling method. Usually contains properties that are passed to calling method
        /// as arguments.
        /// </param>
        /// <param name="propetyRules">
        /// Additional rules that will be appended to user defined properties.
        /// </param>
        private IDictionary<string, object> GetMessageObject(
            MessageBuilderBase builder, object userProperties, object extraProperties,
            MessagePropetyRules propetyRules = MessagePropetyRules.None)
        {
            var od = new MessageData(builder.SpecialPropsBindings, propetyRules, _config);
            od.ParseAndSetProperties(userProperties);
            od.SetProperty(MixpanelProperty.Token, _token);
            od.ParseAndSetPropertiesIfNotNull(extraProperties);
            od.ParseAndSetProperties(_superProperties);

            return builder.GetMessageObject(od);
        }
 public void SetUp()
 {
     _md = new MessageData(new Dictionary<string, string>
     {
         {MixpanelProperty.Token, MixpanelProperty.Token},
         {MixpanelProperty.DistinctId, MixpanelProperty.DistinctId},
         {"distinctid", MixpanelProperty.DistinctId},
         {MixpanelProperty.Event, MixpanelProperty.Event}
     });
 }