예제 #1
0
        private static Activity CreateBaseDeliveryReportActivity(InfobipIncomingResult response)
        {
            var activity = ConvertToEvent(response);

            activity.Name      = InfobipReportTypes.DELIVERY;
            activity.Timestamp = response.DoneAt;
            return(activity);
        }
예제 #2
0
 private void VerifyResultCoreProperties(InfobipIncomingResult result, Activity activity)
 {
     Assert.Equal(result.MessageId, activity.Id);
     Assert.Equal(result.From, activity.From.Id);
     Assert.Equal(result.To, activity.Recipient.Id);
     Assert.Equal(result.From, activity.Conversation.Id);
     Assert.Equal(result, activity.ChannelData);
     Assert.Equal(result.ReceivedAt, activity.Timestamp);
 }
예제 #3
0
        public static Activity Convert(InfobipIncomingResult result)
        {
            var activity = ConvertToMessage(result);

            activity.ChannelId  = InfobipChannel.Sms;
            activity.Text       = result.CleanText;
            activity.TextFormat = TextFormatTypes.Plain;

            return(activity);
        }
        private static void HandleCallbackData(InfobipIncomingResult response, Activity activity)
        {
            if (string.IsNullOrWhiteSpace(response.CallbackData))
            {
                return;
            }
            var serialized = JsonConvert.DeserializeObject <Dictionary <string, string> >(response.CallbackData);

            activity.AddInfobipCallbackData(serialized);
        }
        private static void VerifyResultCoreProperties(InfobipIncomingResult result, Activity activity)
        {
            var timestamp = result.SeenAt ?? result.DoneAt;

            Assert.Equal(result.MessageId, activity.Id);
            Assert.Equal(result.From, activity.From.Id);
            Assert.Equal(result.To, activity.Recipient.Id);
            Assert.Equal(result.To, activity.Conversation.Id);
            Assert.Equal(result, activity.ChannelData);
            Assert.Equal(timestamp, activity.Timestamp);
        }
        private async Task <IActivity> ConvertMessageToMessageActivity(InfobipIncomingResult response)
        {
            var activity = Activity.CreateMessageActivity();

            activity.Id          = response.MessageId;
            activity.ChannelId   = InfobipConstants.ChannelName;
            activity.ChannelData = response;
            activity.Recipient   = new ChannelAccount {
                Id = response.To
            };
            activity.From = new ChannelAccount {
                Id = response.From
            };
            activity.Conversation = new ConversationAccount {
                IsGroup = false, Id = response.From
            };
            activity.Timestamp = response.ReceivedAt;

            if (response.Message.Type == InfobipIncomingMessageTypes.Text)
            {
                activity.Text       = response.Message.Text;
                activity.TextFormat = TextFormatTypes.Plain;
            }
            else if (response.Message.Type == InfobipIncomingMessageTypes.Location)
            {
                activity.Entities.Add(new GeoCoordinates
                {
                    Latitude  = response.Message.Latitude,
                    Longitude = response.Message.Longitude
                });
            }
            else if (response.Message.IsMedia())
            {
                var contentType = await _infobipClient.GetContentTypeAsync(response.Message.Url.AbsoluteUri).ConfigureAwait(false);

                activity.Attachments = new List <Attachment>
                {
                    new Attachment
                    {
                        ContentType = contentType,
                        ContentUrl  = response.Message.Url.AbsoluteUri,
                        Name        = response.Message.Caption
                    }
                };
            }
            else
            {
                _logger.Log(LogLevel.Information, $"Received MO message: {response.MessageId} has unsupported message type");
                return(null);
            }

            return(activity);
        }
예제 #7
0
        protected static Activity ConvertToEvent(InfobipIncomingResult result)
        {
            var activity = Convert(result);

            activity.Type         = ActivityTypes.Event;
            activity.Conversation = new ConversationAccount {
                Id = result.To
            };
            activity.Text = null;

            return(activity);
        }
        private void VerifyResultCoreProperties(InfobipIncomingResult result, Activity activity, bool isEvent = false, string overrideFromId = null)
        {
            var conversationId = isEvent ? result.To : result.From;
            var timestamp      = isEvent ? (result.SeenAt ?? result.DoneAt) : result.ReceivedAt;

            Assert.Equal(result.MessageId, activity.Id);
            Assert.Equal(overrideFromId ?? result.From, activity.From.Id);
            Assert.Equal(result.To, activity.Recipient.Id);
            Assert.Equal(conversationId, activity.Conversation.Id);
            Assert.Equal(result, activity.ChannelData);
            Assert.Equal(timestamp, activity.Timestamp);
        }
예제 #9
0
        public static Activity Convert(InfobipIncomingResult result)
        {
            var activity = ConvertToEvent(result);

            activity.Name      = InfobipReportTypes.SEEN;
            activity.Timestamp = result.SeenAt;
            activity.ChannelId = InfobipChannel.WhatsApp;
            activity.From      = new ChannelAccount {
                Id = result.From
            };

            return(activity);
        }
예제 #10
0
 private static Activity Convert(InfobipIncomingResult result)
 {
     return(new Activity
     {
         Id = result.MessageId,
         Recipient = new ChannelAccount {
             Id = result.To
         },
         ChannelData = result,
         Entities = new List <Entity>(),
         Attachments = new List <Attachment>()
     });
 }
예제 #11
0
        protected static Activity ConvertToMessage(InfobipIncomingResult result)
        {
            var activity = Convert(result);

            activity.Type = ActivityTypes.Message;
            activity.From = new ChannelAccount {
                Id = result.From
            };
            activity.Conversation = new ConversationAccount {
                IsGroup = false, Id = result.From
            };
            activity.Timestamp = result.ReceivedAt;

            return(activity);
        }
예제 #12
0
        public static async Task <Activity> Convert(InfobipIncomingResult result, IInfobipClient infobipClient)
        {
            var activity = ConvertToMessage(result);

            activity.ChannelId = InfobipChannel.WhatsApp;

            if (result.Message.Type == InfobipIncomingMessageTypes.Text)
            {
                activity.Text       = result.Message.Text;
                activity.TextFormat = TextFormatTypes.Plain;
            }
            else if (result.Message.Type == InfobipIncomingMessageTypes.Location)
            {
                activity.Entities.Add(new GeoCoordinates
                {
                    Latitude  = result.Message.Latitude,
                    Longitude = result.Message.Longitude
                });
            }
            else if (result.Message.IsMedia())
            {
                var contentType = await infobipClient.GetContentTypeAsync(result.Message.Url.AbsoluteUri).ConfigureAwait(false);

                activity.Attachments = new List <Attachment>
                {
                    new Attachment
                    {
                        ContentType = contentType,
                        ContentUrl  = result.Message.Url.AbsoluteUri,
                        Name        = result.Message.Caption
                    }
                };
            }
            else
            {
                return(null);
            }

            return(activity);
        }
예제 #13
0
        public static Activity Convert(InfobipIncomingResult result, InfobipAdapterOptions adapterOptions)
        {
            var activity = CreateBaseDeliveryReportActivity(result);
            var channel  = GetInfobipChannelFromDeliveryReportMessage(result.Channel);

            switch (channel)
            {
            case InfobipChannel.Sms:
                activity.ChannelId = InfobipChannel.Sms;
                activity.From      = new ChannelAccount {
                    Id = adapterOptions.InfobipSmsNumber
                };
                break;

            case InfobipChannel.WhatsApp:
                activity.ChannelId = InfobipChannel.WhatsApp;
                activity.From      = new ChannelAccount {
                    Id = adapterOptions.InfobipWhatsAppNumber
                };
                break;
            }

            return(activity);
        }
        private async Task <Activity> ConvertToActivity(InfobipIncomingResult response)
        {
            if (response.Error != null)
            {
                //error codes - https://dev-old.infobip.com/getting-started/response-status-and-error-codes
                if (response.Error.Id > 0)
                {
                    throw new Exception($"{response.Error.Name} {response.Error.Description}");
                }
            }

            if (response.IsDeliveryReport())
            {
                _logger.Log(LogLevel.Debug, $"Received DLR notification: MessageId={response.MessageId}, " +
                            $"DoneAt={response.DoneAt}, SentAt={response.SentAt}");

                var activity = new Activity
                {
                    Type         = ActivityTypes.Event,
                    Id           = response.MessageId,
                    Name         = InfobipReportTypes.DELIVERY,
                    Timestamp    = response.DoneAt,
                    ChannelId    = InfobipConstants.ChannelName,
                    Conversation = new ConversationAccount {
                        Id = response.To
                    },
                    From = new ChannelAccount {
                        Id = _adapterOptions.InfobipWhatsAppNumber
                    },
                    Recipient = new ChannelAccount {
                        Id = response.To
                    },
                    Text        = null,
                    ChannelData = response,
                    Entities    = new List <Entity>()
                };

                if (!string.IsNullOrWhiteSpace(response.CallbackData))
                {
                    var serialized = JsonConvert.DeserializeObject <Dictionary <string, string> >(response.CallbackData);
                    activity.Entities.Add(new InfobipCallbackData(serialized));
                }

                return(activity);
            }

            if (response.IsSeenReport())
            {
                _logger.Log(LogLevel.Debug, $"Received SEEN notification: MessageId={response.MessageId}, " +
                            $"SeenAt={response.SeenAt}, SentAt={response.SentAt}");

                return(new Activity
                {
                    Type = ActivityTypes.Event,
                    Id = response.MessageId,
                    Name = InfobipReportTypes.SEEN,
                    Timestamp = response.SeenAt,
                    ChannelId = InfobipConstants.ChannelName,
                    Conversation = new ConversationAccount {
                        Id = response.To
                    },
                    From = new ChannelAccount {
                        Id = response.From
                    },
                    Recipient = new ChannelAccount {
                        Id = response.To
                    },
                    Text = null,
                    ChannelData = response
                });
            }

            if (response.IsMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType={response.IntegrationType}, " +
                            $"receivedAt={response.ReceivedAt}");

                // handle any type of WA message sent by subscriber, can be: TEXT, IMAGE, DOCUMENT, LOCATION, CONTACT, VIDEO
                // - https://dev-old.infobip.com/whatsapp-business-messaging/incoming-whatsapp-messages
                return((Activity) await ConvertMessageToMessageActivity(response));
            }

            throw new Exception("Unsupported message received - not DLR, SEEN or MO message: \n" +
                                JsonConvert.SerializeObject(response, Formatting.Indented));
        }
        private async Task <Activity> ConvertToActivity(InfobipIncomingResult response)
        {
            if (response.Error != null)
            {
                //error codes - https://dev-old.infobip.com/getting-started/response-status-and-error-codes
                if (response.Error.Id > 0)
                {
                    throw new Exception($"{response.Error.Name} {response.Error.Description}");
                }
            }

            if (response.IsDeliveryReport())
            {
                _logger.Log(LogLevel.Debug, $"Received DLR notification: MessageId={response.MessageId}, " +
                            $"DoneAt={response.DoneAt}, SentAt={response.SentAt}, Channel={response.Channel}");

                var activity = InfobipDeliveryReportToActivity.Convert(response, _adapterOptions);
                if (string.IsNullOrEmpty(activity.ChannelId))
                {
                    _logger.Log(LogLevel.Error, $"{response.Channel} is not supported channel");
                }
                HandleCallbackData(response, activity);

                return(activity);
            }

            if (response.IsSeenReport())
            {
                _logger.Log(LogLevel.Debug, $"Received SEEN notification: MessageId={response.MessageId}, " +
                            $"SeenAt={response.SeenAt}, SentAt={response.SentAt}");

                return(InfobipSeenReportToActivity.Convert(response));
            }

            if (response.IsSmsMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType=SMS, " +
                            $"receivedAt={response.ReceivedAt}");

                var activity = InfobipSmsToActivity.Convert(response);
                HandleCallbackData(response, activity);

                return(activity);
            }

            if (response.IsWhatsAppMessage())
            {
                _logger.Log(LogLevel.Debug, $"MO message received: MessageId={response.MessageId}, " +
                            $"IntegrationType={response.IntegrationType}, " +
                            $"receivedAt={response.ReceivedAt}");

                var activity = await InfobipWhatsAppToActivity.Convert(response, _infobipClient);

                if (activity == null)
                {
                    _logger.Log(LogLevel.Information, $"Received MO message: {response.MessageId} has unsupported message type");
                    return(null);
                }

                HandleCallbackData(response, activity);

                return(activity);
            }

            throw new Exception("Unsupported message received - not DLR, SEEN or MO message: \n" +
                                JsonConvert.SerializeObject(response, Formatting.Indented));
        }