Exemple #1
0
        //[return: TwilioSms(AccountSidSetting = "AC88d3904a49278c9b1d316cf637e93825", AuthTokenSetting = "TwilioAuthToken", From = "+15012296047")]
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log, ExecutionContext context)
        {
            var application = new Application(context);

            var data = await req.ReadAsStringAsync();

            var message = Models.TwilioSMSMessage.Parse(data);

            string responseText;

            using (var dbContext = new TailWaters.Data.Models.TailWatersContext(application.ContextOptions))
            {
                //Lookup Subscriber
                var subscriber = await dbContext.Subscribers.Where(t => t.Number == message.From).SingleOrDefaultAsync();

                //Create Subscriber if they do not already exist
                if (subscriber == null)
                {
                    subscriber = new Data.Models.Subscriber()
                    {
                        City        = message.FromCity,
                        State       = message.FromState,
                        Country     = message.FromCountry,
                        Number      = message.From,
                        Zip         = message.FromZip,
                        DateCreated = DateTime.UtcNow
                    };

                    dbContext.Subscribers.Add(subscriber);
                    await dbContext.SaveChangesAsync();

                    responseText = "You are now subscribed to Tail Waters";
                }
                else
                {
                    responseText = "You have already subscribed.";
                }
            }

            var response = new MessagingResponse()
                           .Message(responseText);

            var twiml = response.ToString();

            twiml = twiml.Replace("utf-16", "utf-8");

            return(new HttpResponseMessage
            {
                Content = new StringContent(twiml, Encoding.UTF8, "application/xml")
            });
        }
        public static async Task Run([TimerTrigger("0 0 0 * * *", RunOnStartup = true)] TimerInfo myTimer, ILogger log, ExecutionContext context)
        {
            var configuration = new Application(context)
                                .Configuration;

            //Get Day of the Week
            var day = DateTime.Today.DayOfWeek.ToString();

            //Retrieve HTM Doc
            var html = new HtmlDocument();

            html.LoadHtml(new WebClient().DownloadString($"{_url}/{day.Substring(0, 3)}.htm"));

            //Find Pertenant Node
            var grid  = html.DocumentNode.Descendants("Pre").Single();
            var lines = grid.InnerHtml.Split("\n").Where(t => t.Trim() != string.Empty).Skip(3).Take(25).ToArray();

            //Build Context Options
            var optionBuilder = new DbContextOptionsBuilder <Data.Models.TailWatersContext>();

            optionBuilder.UseSqlServer(configuration.GetConnectionString("TailWaters"));

            using (var dbContext = new TailWaters.Data.Models.TailWatersContext(optionBuilder.Options))
            {
                //Build Cache so we only have to make 2 queries
                var tailWatersCache = await dbContext.TailWaters.ToListAsync();

                var scheduleCache = await dbContext.Schedules.Where(t => t.DateCreated.Date == DateTime.UtcNow.Date).ToListAsync();

                //Parse Header Data
                var headers = lines.Take(1).Single().Split(" ").Where(t => t.Trim() != string.Empty).ToArray();
                for (int i = 1; i < headers.Count(); i++)
                {
                    var header    = headers[i];
                    var tailWater = tailWatersCache.SingleOrDefault(t => t.Acronym == header);

                    //Create Tailwater if it does not already exist(they may add a new one)
                    if (tailWater == null)
                    {
                        tailWater = new Data.Models.TailWater()
                        {
                            OperatorId = 1,
                            Acronym    = header,
                            Name       = header,
                            MaxFlow    = 0
                        };
                        await dbContext.TailWaters.AddAsync(tailWater);
                    }

                    //Pivot data and push to database
                    foreach (var line in lines.Skip(1))
                    {
                        var cols = line.Split(" ").Where(t => t.Trim() != string.Empty).ToArray();

                        var key   = int.Parse(cols[0]);
                        var value = double.Parse(cols[i]);

                        //Check for existing Schedule
                        var schedule = scheduleCache.Where(t => t.TailWater.Acronym == header && t.Hour == key).SingleOrDefault();
                        if (schedule == null)
                        {
                            tailWater.Schedules.Add(new Data.Models.Schedule()
                            {
                                Hour          = key,
                                ProjectedFlow = value,
                                DateCreated   = DateTime.UtcNow
                            });
                        }
                        else
                        {
                            schedule.ProjectedFlow = value;
                        }

                        //Update Max Flow. for now I am going to try to do it like this, later i want to make this a machine learning variable
                        if (value > tailWater.MaxFlow)
                        {
                            tailWater.MaxFlow = value;
                        }
                    }
                }

                await dbContext.SaveChangesAsync();
            }
        }