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(); } }
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; }
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; }
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(); } }
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; }
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; }
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(); }
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); }