Exemplo n.º 1
0
        public void ProcessRequest(HttpContext context)
        {
            var request = new SmsRequestExtended
            {
                ToCountry = HttpContext.Current.Server.UrlDecode(context.Request.Form["ToCountry"]),
                ToState = HttpContext.Current.Server.UrlDecode(context.Request.Form["ToState"]),
                SmsMessageSid = HttpContext.Current.Server.UrlDecode(context.Request.Form["SmsMessageSid"]),
                NumMedia = HttpContext.Current.Server.UrlDecode(context.Request.Form["NumMedia"]),
                ToCity = HttpContext.Current.Server.UrlDecode(context.Request.Form["ToCity"]),
                FromZip = HttpContext.Current.Server.UrlDecode(context.Request.Form["FromZip"]),
                SmsSid = HttpContext.Current.Server.UrlDecode(context.Request.Form["SmsSid"]),
                FromState = HttpContext.Current.Server.UrlDecode(context.Request.Form["FromState"]),
                SmsStatus = HttpContext.Current.Server.UrlDecode(context.Request.Form["SmsStatus"]),
                FromCity = HttpContext.Current.Server.UrlDecode(context.Request.Form["FromCity"]),
                Body = HttpContext.Current.Server.UrlDecode(context.Request.Form["Body"]),
                FromCountry = HttpContext.Current.Server.UrlDecode(context.Request.Form["FromCountry"]),
                To = HttpContext.Current.Server.UrlDecode(context.Request.Form["To"]),
                ToZip = HttpContext.Current.Server.UrlDecode(context.Request.Form["ToZip"]),
                MessageSid = HttpContext.Current.Server.UrlDecode(context.Request.Form["MessageSid"]),
                AccountSid = HttpContext.Current.Server.UrlDecode(context.Request.Form["AccountSid"]),
                From = HttpContext.Current.Server.UrlDecode(context.Request.Form["From"]),
                ApiVersion = HttpContext.Current.Server.UrlDecode(context.Request.Form["ApiVersion"]),
                MessageStatus = HttpContext.Current.Server.UrlDecode(context.Request.Form["MessageStatus"]),
            };

            if (string.IsNullOrEmpty(request.SmsSid))
            {
                var unknownRequest =
                    string.Join(",", context.Request.RequestType == "POST" ?
                        context.Request.Form.AllKeys.Select(k => k + ":" + HttpContext.Current.Server.UrlDecode(context.Request.Form[k])) :
                        context.Request.QueryString.AllKeys.Select(k => k + ":" + HttpContext.Current.Server.UrlDecode(context.Request.QueryString[k])));

                _smsManager.Log(string.Format("Unknown {0}: {1}", context.Request.RequestType, unknownRequest));
            }
            else
            {
                var log = Newtonsoft.Json.JsonConvert.SerializeObject(request);
                _smsManager.Log(log);

                var response = _smsManager.InterpretSms(request);
                context.Response.Clear();
                switch (response.Action)
                {
                    case SmsResponseType.SendResponse:
                        context.Response.ContentType = "text/xml";
                        context.Response.ContentEncoding = Encoding.UTF8;
                        context.Response.Write(response.ToString());
                        break;
                    case SmsResponseType.SendError:
                        context.Response.StatusCode = 500;
                        break;
                    default:
                        context.Response.StatusCode = 200;
                        break;
                }
                context.Response.End();
            }
        }
Exemplo n.º 2
0
        private List<TextMessage> SendToMembersOfGroupsUserIsLeaderOf(SmsRequestExtended request, SmsPerson dbPerson)
        {
            var leaderGroups = dbPerson.SmsGroupLeaders.Select(m => m.SmsGroup.Id).ToList();
            var groups =
                    _uow.SmsGroups.Find(g => leaderGroups.Contains(g.Id)).Include("SmsGroupMembers.SmsPerson").ToList();

            List<TextMessage> messages = new List<TextMessage>();
            foreach (var g in groups)
            {
                foreach (var m in g.SmsGroupMembers.Where(member => member.SmsPersonId != dbPerson.Id))
                {
                    messages.Add(new TextMessage { Request = request, ToPerson = m.SmsPerson, FromPerson = dbPerson });
                }
            }
            return messages;
        }
Exemplo n.º 3
0
        private void HandleRecievedSms(SmsRequestExtended request, SmsResponse response)
        {
            //			string reply;
            //			var dbReply = _uow.SmsReplys.Find(replys => replys.Request == request.Body).FirstOrDefault();
            //			reply = dbReply != null ? dbReply.Reply : "That is wrong! Keep trying";
            //			response.SmsReponse = reply;
            //			response.Action = SmsResponseType.SendResponse;
            long fromNum;
            if (!long.TryParse(new Regex(@"[^\d]").Replace(request.From, string.Empty).TrimStart(new[] { '1' }), out fromNum))
                throw new SmsException("Error: please send message from a numeric phone number: " + request.From + " is not accepted");

            var dbPerson = _uow
                    .SmsPerson
                    .Find(p => p.PhoneNumber == fromNum)
                    .Include("SmsGroupLeaders.SmsGroup")
                    .Include("SmsGroupMembers.SmsGroup")
                    .FirstOrDefault();
            if (dbPerson == null)
                throw new SmsException("Error: " + request.From + " is not a registered number");

            _uow.SmsLogs.Add(new SmsLog
            {
                SmsPersonId = dbPerson.Id,
                Message = request.Body,
                SmsDate = DateTime.UtcNow,
                MessageType = SmsMessageType.Recieved,
                MessageStatus = "recieved",
            });

            if (!dbPerson.SmsGroupLeaders.Any() && !dbPerson.SmsGroupMembers.Any())
                throw new SmsException("Error: " + request.From + " is not registered to any groups");

            if (dbPerson.SmsGroupMembers.Any(group => group.Id == 6) || dbPerson.SmsGroupLeaders.Any(group => group.Id == 6))
            {
                response.Action = SmsResponseType.SendResponse;
                response.SmsReponse = "This is the old number for the young mens group, please use (831)232-3231";
                return;
            }

            var leaders = SendToLeadersOfGroupsThatUserIsMemberOf(request, dbPerson);
            var members = SendToMembersOfGroupsUserIsLeaderOf(request, dbPerson);
            foreach (var message in leaders.Union(members).GroupBy(m => m.ToPerson.PhoneNumber).Select(m => m.First()))
            {
                this.SendSms(message);
            }
            response.Action = SmsResponseType.DoNothing;
        }
Exemplo n.º 4
0
 private void HandleDeliveredSms(SmsRequestExtended request)
 {
     var log = _uow.SmsLogs.Find(l => l.MessageId == request.SmsSid).FirstOrDefault();
     if (log != null)
     {
         log.MessageStatus = request.MessageStatus;
         _uow.SaveChanges();
     }
 }
Exemplo n.º 5
0
        public SmsResponse InterpretSms(SmsRequestExtended request)
        {
            var response = new SmsResponse();
            try
            {
                response.Action = SmsResponseType.DoNothing;
                switch (request.SmsStatus)
                {
                    case "delivered":
                        HandleDeliveredSms(request);
                        response.Action = SmsResponseType.DoNothing;
                        break;
                    case "received":
                        HandleRecievedSms(request, response);
                        break;
                }

            }
            catch (SmsException ex)
            {
                response.Action = SmsResponseType.SendResponse;
                response.SmsReponse = ex.Message;
            }
            catch (Exception ex)
            {
                response.Action = SmsResponseType.SendError;
                Log("Error: " + ex);
            }
            return response;
        }
Exemplo n.º 6
0
        private int SendToMembersOfGroupsUserIsLeaderOf(SmsRequestExtended request, SmsPerson dbPerson)
        {
            int messageSentCount = 0;
            var leaderGroups = dbPerson.SmsGroupLeaders.Select(m => m.SmsGroup.Id).ToList();
            var groups = _uow
                .SmsGroups
                .Find(g => leaderGroups.Contains(g.Id))
                .Include("SmsGroupMembers.SmsPerson")
                .ToList();

            foreach (var g in groups)
            {
                foreach (var m in g.SmsGroupMembers)
                {
                    SendSms(request, m.SmsPerson);
                    messageSentCount++;
                }
            }
            return messageSentCount;
        }
Exemplo n.º 7
0
        private void SendSms(SmsRequestExtended request, SmsPerson person)
        {
            var twilio = new TwilioRestClient(AccountSid, TwilioAuthToken);
            var message = twilio.SendMessage(TwilioNumber, "+1" + person.PhoneNumber, request.Body, @"http://benjaminjanderson.com/smslistener.ashx");

            _uow.SmsLogs.Add(new SmsLog
            {
                Message = request.Body,
                SmsDate = DateTime.UtcNow,
                MessageType = SmsMessageType.Sent,
                SmsPersonId = person.Id,
                MessageId = message.Sid,
                MessageStatus = "Sending",
            });
            _uow.SaveChanges();
        }
Exemplo n.º 8
0
        private void HandleRecievedSms(SmsRequestExtended request, SmsResponse response)
        {
            long fromNum;
            if (!long.TryParse(new Regex(@"[^\d]").Replace(request.From, string.Empty).TrimStart(new[] {'1'}), out fromNum))
                throw new SmsException("Error: please send message from a numeric phone number: " + request.From + " is not accepted");

            var dbPerson = _uow
                .SmsPerson
                .Find(p => p.PhoneNumber == fromNum)
                .Include("SmsGroupLeaders.SmsGroup")
                .Include("SmsGroupMembers.SmsGroup")
                .FirstOrDefault();
            if (dbPerson == null)
                throw new SmsException("Error: " + request.From + " is not a registered number");

            _uow.SmsLogs.Add(new SmsLog
            {
                SmsPersonId = dbPerson.Id,
                Message = request.Body,
                SmsDate = DateTime.UtcNow,
                MessageType = SmsMessageType.Recieved,
                MessageStatus = "recieved",
            });

            if (!dbPerson.SmsGroupLeaders.Any() && !dbPerson.SmsGroupMembers.Any())
                throw new SmsException("Error: " + request.From + " is not registered to any groups");

            SendToLeadersOfGroupsThatUserIsMemberOf(request, dbPerson);
            SendToMembersOfGroupsUserIsLeaderOf(request, dbPerson);
        }