Esempio n. 1
0
    public async Task Voice_OK()
    {
        // arrange
        var twilioRest = new Mock <ITwilioRestClient>();
        var twilioHttp = new Mock <HttpClient>();

        twilioRest.Setup(m => m.HttpClient).Returns(twilioHttp.Object);
        twilioRest.Setup(m => m.RequestAsync(It.IsAny <Request>())).ReturnsAsync(new Response(HttpStatusCode.OK, ""));

        var options = new OptionsWrapper <SmsSettings>(new SmsSettings
        {
            From     = "+447974000000",
            Username = "******",
            Password = "******"
        });
        var svc = new TwilioSmsSender(options, new NullLogger <TwilioSmsSender>(), twilioRest.Object);

        // act
        await svc.SendVoiceAsync("+447974000000", "https://test.com/api/voice");

        // assert
        // we can't actually assert that much meaningful actually happens, just satisfy ourselves that the twilio bits are called
        svc.SupportsVoice.ShouldBeTrue();
        twilioRest.Verify(m => m.AccountSid);
        twilioRest.Verify(m => m.RequestAsync(It.IsAny <Request>()));
        twilioRest.VerifyNoOtherCalls();
    }
        public SubscriptionModel Subscribe(SubscribeModel model)
        {
            var n            = Environment.NewLine;
            var subscription = _handler.Insert(model.Subscriber, model.Location);
            var title        = _settings.Get(SettingName.Title);
            var subject      = $"{title} subscription to {model.Location} confirmed";
            var protocol     = HttpContext.Request.Host.Value.Contains("localhost") ? "http" : "https";
            var message      = $"{title} thanks you! You will receive one notification in the morning when we will be at {model.Location}.{n}";

            message += $"{n}unsubscribe from this location: {Url.Action("Unsubscribe", "System", new { subscriberLocation = $"{subscription.Subscriber}{subscriptionDelimeter}{subscription.Location}" }, protocol)}";
            message += $"{n}unsubscribe from all locations: {Url.Action("Unsubscribe", "System", new { subscriberLocation = subscription.Subscriber }, protocol)}";

            if (subscription.Type == Subscription.Types.Email)
            {
                var from = _settings.Get(SettingName.ContactEmail);
                EmailSender.Send(_azureSettings.SendgridApiKey, subject, message, subscription.Subscriber, from);
            }
            else if (subscription.Type == Subscription.Types.Text)
            {
                var twilio = new TwilioHelper(_settings.Get(SettingName.TwilioAuthToken), _settings.Get(SettingName.TwilioSid), _settings.Get(SettingName.TwilioPhoneNumber));
                if (!twilio.IsValid)
                {
                    throw new Exception("Twilio is not properly set up");
                }

                ISmsSender smsSender = new TwilioSmsSender(twilio);
                smsSender.Send(twilio.Phone, $"+1{subscription.Subscriber}", message);
            }
            else
            {
                throw new NotImplementedException($"Subscription.Type of {subscription.Type} is not implemented yet");
            }

            return(subscription);
        }
Esempio n. 3
0
 private static void NotificationText(AdminAppSettings settings, OrderModel order)
 {
     if (!string.IsNullOrWhiteSpace(order.Phone) && settings.IsTwilioValid)
     {
         ISmsSender smsSender = new TwilioSmsSender(settings.TwilioSid, settings.TwilioAuthToken);
         smsSender.Send(settings.TwilioPhoneNumber, order.Phone, ReadyText(settings));
     }
 }
Esempio n. 4
0
        /// <summary>
        /// Sends the SMS and if sent saves it in DB.
        /// </summary>
        /// <param name="phoneNumber">The phone number.</param>
        /// <param name="message">The message.</param>
        /// <param name="country">The country.</param>
        /// <param name="errors">The errors.</param>
        /// <returns></returns>
        private async Task <bool> SendSmsAndSave(string phoneNumber, string message, CountryName country, InfoAccumulator errors)
        {
            //validate phone number
            if (string.IsNullOrEmpty(phoneNumber))
            {
                String errorMessage = "attempt to send sms to an empty phone number";
                Log.Error(errorMessage);
                errors.AddError(errorMessage);
                return(false);
            }

            //validate debug mode
            if (IsInDebugMode(phoneNumber))
            {
                return(true);
            }

            string toPhoneNumber = NormalizePhoneNumber(phoneNumber, country);

            //validate message
            if (string.IsNullOrEmpty(message))
            {
                errors.AddInfo("not sending empty message");
                Log.Warn("attempt to send empty message to phone number: " + toPhoneNumber + " . SMS was not send");
                return(false);
            }

            Log.InfoFormat("Sending sms to phone number: {0}, message: {1}", toPhoneNumber, message);

            //send sms
            TwilioSendSmsCommandResponse twilioResponse = await TwilioSmsSender.SendAsync(ThirdPartyService.Address, new TwilioSendSmsCommand {
                Message     = message,
                PhoneNumber = toPhoneNumber
            });

            if (twilioResponse.Sms == null)
            {
                return(false);
            }

            //save sms in DB
            if (!MobilePhoneQueries.SaveTwilioSms(twilioResponse.Sms))
            {
                string errorMsg = String.Format("Failed to save Twilio SMS response to DB: {0}", message);
                Log.Error(errorMsg);
                errors.AddError(errorMsg);
                return(false);
            }

            return(true);
        }
Esempio n. 5
0
        public async Task SendSmsNotification()
        {
            var smsSender  = new TwilioSmsSender(_smsConfiguration.Configuration, _smsConfiguration.TwilioRestClient);
            var smsService = new SmsNotificationService(smsSender);
            var recipients = new List <string>()
            {
                _smsConfiguration.RecipientPhoneNumber
            };
            var sms = new BaseSmsNotification()
            {
                Text = SmsText, RecipientPhoneNumbers = recipients
            };

            await smsService.SendAsync(sms);
        }
        private void ConfirmationText(Data.Models.Payment.Order order, SystemModel settings, string name, bool isCustomer = true)
        {
            try
            {
                var twilio = new TwilioHelper(settings.Get(SettingName.TwilioAuthToken), settings.Get(SettingName.TwilioSid), settings.Get(SettingName.TwilioPhoneNumber));

                if (twilio.IsValid)
                {
                    ISmsSender smsSender = new TwilioSmsSender(twilio.Sid, twilio.AuthToken);
                    if (isCustomer && !string.IsNullOrWhiteSpace(order.Phone))
                    {
                        smsSender.Send(twilio.Phone, order.Phone, GetBody(order, name, settings, true));
                    }

                    if (!isCustomer)
                    {
                        var phoneNumbersString = settings.Get(SettingName.OrderNotificationPhoneNumbers);
                        if (!string.IsNullOrWhiteSpace(phoneNumbersString))
                        {
                            var phoneNumbers = phoneNumbersString.Split(new[] { ',', ' ', ';' }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Length == 10 && x.All(c => char.IsDigit(c)));
                            foreach (var phoneNumber in phoneNumbers)
                            {
                                try { smsSender.Send(twilio.Phone, $"+1{phoneNumber}", GetBody(order, name, settings, false)); }
                                catch (Exception ex) { Log(ex); }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                if (isCustomer)
                {
                    throw new Exception("Order placed successfully but there was an error sending confirmation text - don't worry, your food will be ready!");
                }
            }
        }
Esempio n. 7
0
        public async Task SendSmsAsync(
            ISiteSettings site,
            string phoneNumber,
            string message)
        {
            if (string.IsNullOrEmpty(phoneNumber))
            {
                throw new ArgumentException("toPhoneNumber was not provided");
            }

            if (string.IsNullOrEmpty(message))
            {
                throw new ArgumentException("message was not provided");
            }

            var credentials = GetCredentials(site);

            if (credentials == null)
            {
                log.LogError("tried to send sms message with no credentials");
                return;
            }

            TwilioSmsSender sender = new TwilioSmsSender(log);

            try
            {
                await sender.SendMessage(
                    credentials,
                    phoneNumber,
                    message).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                log.LogError("error sending twilio message", ex);
            }
        }
Esempio n. 8
0
        public IActionResult Notify()
        {
            var json = string.Empty;

            using (var client = new System.Net.WebClient())
            {
                json = client.DownloadString($"{_azureSettings.SiteBaseUrl}api/events");
            }
            var events = JsonConvert.DeserializeObject <IEnumerable <EventModel> >(json).ToList();

            events = events.Where(x => x.Begins.Date == DateTime.Now.Date).ToList();

            var locations = events.Where(x => x.Location != null).Select(x => Subscription.SanitizeLocation(x.Location.Name)).Distinct().ToList();

            var subs = _handler.GetAll(null, locations).Where(x => !string.IsNullOrWhiteSpace(x.Location)).ToList();

            var sentTo = new List <string>();

            foreach (var sub in subs.Where(x => x.Type == Subscription.Types.Email))
            {
                if (!sentTo.Contains(sub.Subscriber))
                {
                    try
                    {
                        var n      = Environment.NewLine;
                        var _event = GetEvent(events, sub.Location);
                        EmailSender.Send(_azureSettings.SendgridApiKey,
                                         $"{_settings.Title} will be at {_event.Location.Name} today!",
                                         SubscriptionMessage(_event, sub),
                                         sub.Subscriber,
                                         _settings.ContactEmail
                                         );
                        sentTo.Add(sub.Subscriber);
                    }
                    catch (Exception ex) { ex.Ship(HttpContext); }
                }
            }

            var twilio = new TwilioHelper(_twilioAuthToken, _twilioSid, _twilioPhone);

            if (!twilio.IsValid)
            {
                new Exception("twilio settings invalid").Ship(HttpContext);
            }
            else
            {
                ISmsSender smsSender = new TwilioSmsSender(twilio);
                foreach (var sub in subs.Where(x => x.Type == Subscription.Types.Text))
                {
                    if (!sentTo.Contains(sub.Subscriber))
                    {
                        try
                        {
                            var _event = GetEvent(events, sub.Location);
                            smsSender.Send(twilio.Phone, $"+1{sub.Subscriber}", SubscriptionMessage(_event, sub));
                            sentTo.Add(sub.Subscriber);
                        }
                        catch (Exception ex) { ex.Ship(HttpContext); }
                    }
                }
            }

            return(Ok());
        }