Esempio n. 1
0
        /// <inheritdoc/>
        public ReadOnlyCollection <MixpanelBatchMessageTest> SendTest(IEnumerable <MixpanelMessage> messages)
        {
            var batchMessageWrapper = new BatchMessageWrapper(messages);

            // Concatenate both 'TrackMessages' and 'EngageMessages' in one list
            List <List <MixpanelMessage> > batchMessages =
                (batchMessageWrapper.TrackMessages ?? new List <List <MixpanelMessage> >(0))
                .Concat(batchMessageWrapper.EngageMessages ?? new List <List <MixpanelMessage> >(0))
                .ToList();

            var testMessages = new List <MixpanelBatchMessageTest>(batchMessages.Count);

            foreach (List <MixpanelMessage> batchMessage in batchMessages)
            {
                var batchMessageBuildResult = new BatchMessageBuildResult(batchMessage);
                var testMessage             = new MixpanelBatchMessageTest {
                    Data = batchMessageBuildResult.Message
                };

                try
                {
                    testMessage.Json   = ToJson(testMessage.Data);
                    testMessage.Base64 = ToBase64(testMessage.Json);
                }
                catch (Exception e)
                {
                    testMessage.Exception = e;
                }

                testMessages.Add(testMessage);
            }

            return(testMessages.AsReadOnly());
        }
Esempio n. 2
0
        /// <inheritdoc/>
        public async Task <SendResult> SendAsync(IEnumerable <MixpanelMessage> messages)
        {
            var resultInternal = new SendResultInternal();
            var batchMessage   = new BatchMessageWrapper(messages);

            await SendBatches(MixpanelMessageEndpoint.Track, batchMessage.TrackMessages);
            await SendBatches(MixpanelMessageEndpoint.Engage, batchMessage.EngageMessages);

            return(resultInternal.ToRealSendResult());

            async Task SendBatches(MixpanelMessageEndpoint endpoint, List <List <MixpanelMessage> > batches)
            {
                if (batches == null)
                {
                    return;
                }

                foreach (List <MixpanelMessage> batch in batches)
                {
                    bool success = await SendMessageInternalAsync(
                        endpoint,
                        () => new BatchMessageBuildResult(batch));

                    resultInternal.Update(success, batch);
                }
            }
        }
        /// <summary>
        /// Returns a collection of <see cref="MixpanelBatchMessageTest"/>. Each item represents a
        /// batch that contains all steps (message data, JSON, base64) of building a batch message. 
        /// If some error occurs during the process of creating a batch it can be found in 
        /// <see cref="MixpanelMessageTest.Exception"/> property.
        /// The messages will NOT be sent to Mixpanel.
        /// </summary>
        /// <param name="messages">List of <see cref="MixpanelMessage"/> to test.</param>
        public ReadOnlyCollection<MixpanelBatchMessageTest> SendTest(IEnumerable<MixpanelMessage> messages)
        {
            var batchMessageWrapper = new BatchMessageWrapper(messages);

            // Concatenate both 'TrackMessages' and 'EngageMessages' in one list
            var batchMessages =
                (batchMessageWrapper.TrackMessages ?? new List<List<MixpanelMessage>>(0))
                .Concat(((batchMessageWrapper.EngageMessages ?? new List<List<MixpanelMessage>>(0))))
                .ToList();

            var testMessages = new List<MixpanelBatchMessageTest>(batchMessages.Count);

            foreach (var batchMessage in batchMessages)
            {
                var testMessage = new MixpanelBatchMessageTest { Data = GetBatchMessageData(batchMessage) };

                try
                {
                    testMessage.Json = ToJson(testMessage.Data);
                    testMessage.Base64 = ToBase64(testMessage.Json);
                }
                catch (Exception e)
                {
                    testMessage.Exception = e;
                }

                testMessages.Add(testMessage);
            }

            return testMessages.AsReadOnly();
        }
        /// <summary>
        /// Sends messages passed in <paramref name="messages"/> parameter to Mixpanel.
        /// If <paramref name="messages"/> contains both track (Track and Alias) and engage (People*)
        /// messages then they will be devided in 2 batches and will be sent separately. 
        /// If amount of messages of one type exceeds 50,  then messages will be devided in batches
        /// and will be sent separately.
        /// Returns a <see cref="SendResult"/> object that contains lists uf success and failed batches. 
        /// </summary>
        /// <param name="messages">List of <see cref="MixpanelMessage"/> to send.</param>
        public async Task<SendResult> SendAsync(IEnumerable<MixpanelMessage> messages)
        {
            var resultInternal = new SendResultInernal();
            var batchMessage = new BatchMessageWrapper(messages);

            List<List<MixpanelMessage>> batchTrackMessages = batchMessage.TrackMessages;
            if (batchTrackMessages != null)
            {
                foreach (var trackMessages in batchTrackMessages)
                {
                    var msgs = trackMessages;
                    bool success = await SendMessageInternalAsync(
                        () => GetBatchMessageData(msgs), EndpointTrack, MessageKind.Batch);
                    resultInternal.Update(success, msgs);
                }
            }

            List<List<MixpanelMessage>> batchEngageMessages = batchMessage.EngageMessages;
            if (batchEngageMessages != null)
            {
                foreach (var engageMessages in batchEngageMessages)
                {
                    var msgs = engageMessages;
                    bool success = await SendMessageInternalAsync(
                        () => GetBatchMessageData(msgs), EndpointEngage, MessageKind.Batch);
                    resultInternal.Update(success, msgs);
                }
            }

            return resultInternal.ToRealSendResult();
        }
        public async Task<bool> SendAsync(IEnumerable<MixpanelMessage> messages)
        {
            var batchMessage = new BatchMessageWrapper(messages);

            if (batchMessage.TrackMessages != null)
            {
                foreach (var batchTrackMessage in batchMessage.TrackMessages)
                {
                    List<IDictionary<string, object>> message = batchTrackMessage;
                    if (!(await SendMessageInternalAsync(() => message, EndpointTrack, MessageKind.Batch)))
                    {
                        return false;
                    }
                }
            }

            if (batchMessage.EngageMessages != null)
            {
                foreach (var batchEngageMessage in batchMessage.EngageMessages)
                {
                    List<IDictionary<string, object>> message = batchEngageMessage;
                    if (!(await SendMessageInternalAsync(() => message, EndpointEngage, MessageKind.Batch)))
                    {
                        return false;
                    }
                }
            }

            return true;
        }
        public bool Send(IEnumerable<MixpanelMessage> messages)
        {
            var batchMessage = new BatchMessageWrapper(messages);

            if (batchMessage.TrackMessages != null)
            {
                if (batchMessage.TrackMessages
                    .Any(msg => !SendMessageInternal(() => msg, EndpointTrack, MessageKind.Batch)))
                {
                    return false;
                }
            }

            if (batchMessage.EngageMessages != null)
            {
                if (batchMessage.EngageMessages
                    .Any(msg => !SendMessageInternal(() => msg, EndpointEngage, MessageKind.Batch)))
                {
                    return false;
                }
            }

            return true;
        }