public static string MakeHttpWebRequest(string requestUrl, string apiKey, TeamSupport.Data.Logs log, Settings settings, string apiCallCountKey, ref int currentApiCallCount) { string responseText = string.Empty; HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; request.ContentType = "application/json"; request.Headers.Add(String.Format("X-FullContact-APIKey:{0}", apiKey)); try { using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Accepted) { throw new Exception(String.Format( "Error when connecting to FullContact: Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription)); } currentApiCallCount++; settings.WriteInt(apiCallCountKey, currentApiCallCount); using (var reader = new StreamReader(response.GetResponseStream(), ASCIIEncoding.UTF8)) { responseText = reader.ReadToEnd(); } if (response.StatusCode == HttpStatusCode.Accepted || (responseText.Contains("status") && responseText.Contains("202") && responseText.Contains("Queued") && responseText.Contains("retry"))) { log.WriteEvent(responseText); responseText = null; } // Get the headers associated with the response. WebHeaderCollection headerCollection = response.Headers; String[] remaining = headerCollection.GetValues(RateLimitHeaders.Remaining.GetDescription()); String[] reset = headerCollection.GetValues(RateLimitHeaders.Reset.GetDescription()); String[] limit = headerCollection.GetValues(RateLimitHeaders.Limit.GetDescription()); string rateLimitHeadersString = string.Empty; if (limit.Any() && limit.Length > 0) { rateLimitHeadersString = string.Format("{0}: {1}", RateLimitHeaders.Limit.GetDescription(), limit[0]); } if (reset.Any() && reset.Length > 0) { rateLimitHeadersString += string.Format("\t{0}: {1}", RateLimitHeaders.Reset.GetDescription(), reset[0]); } if (remaining.Any() && remaining.Length > 0) { rateLimitHeadersString += string.Format("\t{0}: {1}", RateLimitHeaders.Remaining.GetDescription(), remaining[0]); log.WriteEvent(rateLimitHeadersString); int remainingCount = int.Parse(remaining[0]); if (remainingCount == 1) { //wait if (reset.Any() && reset.Length > 0) { int resetSeconds = int.Parse(reset[0]); log.WriteEvent(string.Format("Rate Limit reached. Sleeping {0} seconds until it resets.", resetSeconds)); System.Threading.Thread.Sleep(resetSeconds * 1000); log.WriteEvent("After sleep. Continuing..."); } } } else { log.WriteEvent(rateLimitHeadersString); } } } catch (WebException webEx) { log.WriteEvent(requestUrl); log.WriteException(webEx); } catch (Exception ex) { log.WriteException(ex); } return(responseText); }
public static TimeSpan CalculatePausedTime(LoginUser loginUser, Organization organization, SlaTrigger slaTrigger, DateTime pausedOn, DateTime resumedOn, SlaTickets.BusinessHours businessHours, List <DateTime> daysToPause, CalendarEvents holidays, Logs logs = null) { TimeSpan pausedTime = new TimeSpan(); int adjustedMinutes = 0; bool slaUseBusinessHours = slaTrigger.UseBusinessHours; int slaBusinessDays = businessHours.BusinessDays; DateTime?slaDayStart = businessHours.DayStartUtc; DateTime?slaDayEnd = businessHours.DayEndUtc; int startOfDayMinutes = slaDayStart.Value.Minute + (slaDayStart.Value.Hour * 60); int endOfDayMinutes = slaDayEnd.Value.Minute + (slaDayEnd.Value.Hour * 60); int minutesInOneDay = (24 * 60); //When converted the input to UTC the end time might be less than the start time. E.g. central 8 to 22, is stored as utc 14 to 4 if (businessHours.DayEndUtc.Hour < businessHours.DayStartUtc.Hour && businessHours.DayEndUtc.Day > businessHours.DayStartUtc.Day) { adjustedMinutes = slaDayStart.Value.Minute + slaDayStart.Value.Hour * 60; slaDayStart = slaDayStart.Value.AddMinutes(-adjustedMinutes); slaDayEnd = slaDayEnd.Value.AddMinutes(-adjustedMinutes); pausedOn = pausedOn.AddMinutes(-adjustedMinutes); resumedOn = resumedOn.AddMinutes(-adjustedMinutes); startOfDayMinutes = slaDayStart.Value.Minute + (slaDayStart.Value.Hour * 60); endOfDayMinutes = slaDayEnd.Value.Minute + (slaDayEnd.Value.Hour * 60); } if (pausedOn.Date == resumedOn.Date && (slaUseBusinessHours || (!slaUseBusinessHours && !slaTrigger.NoBusinessHours)) && //the last condition means it is using sla custom hours ( (!SlaTickets.IsValidDay(pausedOn, slaBusinessDays, daysToPause, holidays) && !SlaTickets.IsValidDay(resumedOn, slaBusinessDays, daysToPause, holidays)) || (pausedOn.TimeOfDay.TotalSeconds < slaDayStart.Value.TimeOfDay.TotalSeconds && resumedOn.TimeOfDay.TotalSeconds < slaDayStart.Value.TimeOfDay.TotalSeconds) || (pausedOn.TimeOfDay.TotalSeconds > slaDayEnd.Value.TimeOfDay.TotalSeconds && resumedOn.TimeOfDay.TotalSeconds > slaDayEnd.Value.TimeOfDay.TotalSeconds) ) ) { if (logs != null) { logs.WriteEvent("Paused and Resumed on the same non-valid day and time (non-business day, holiday, day to pause, outside business hours), so no time to add."); } } else if (pausedOn.Date == resumedOn.Date && (slaUseBusinessHours || (!slaUseBusinessHours && !slaTrigger.NoBusinessHours)) && //the last condition means it is using sla custom hours ( (SlaTickets.IsValidDay(pausedOn, slaBusinessDays, daysToPause, holidays) && SlaTickets.IsValidDay(resumedOn, slaBusinessDays, daysToPause, holidays)) && (pausedOn.TimeOfDay.TotalSeconds > slaDayStart.Value.TimeOfDay.TotalSeconds && pausedOn.TimeOfDay.TotalSeconds < slaDayEnd.Value.TimeOfDay.TotalSeconds) && (resumedOn.TimeOfDay.TotalSeconds > slaDayStart.Value.TimeOfDay.TotalSeconds && resumedOn.TimeOfDay.TotalSeconds < slaDayEnd.Value.TimeOfDay.TotalSeconds) ) ) { pausedTime = resumedOn - pausedOn; if (logs != null) { logs.WriteEvent("Paused and Resumed on the same valid day and time (business day, non-holiday, not day to pause, inside business hours), simple resumedon - pausedon."); } } else { if ((slaUseBusinessHours && slaBusinessDays == 0) || (!slaUseBusinessHours && DateTime.Compare(slaDayStart.Value, slaDayEnd.Value) == 0 && slaBusinessDays == 127) || //127 means all days are selected. slaTrigger.NoBusinessHours) { pausedTime = resumedOn - pausedOn; logs.WriteEvent("24/7, simple resumedon - pausedon."); } else { //Make sure endOfDayMinutes is greater than startOfDayMinutes if (startOfDayMinutes >= endOfDayMinutes) { //Add 1 day worth of minutes endOfDayMinutes = endOfDayMinutes + minutesInOneDay; } int minutesInBusinessDay = endOfDayMinutes - startOfDayMinutes; //Make sure the pausedon and resumedon are business days while (!SlaTickets.IsValidDay(pausedOn, slaBusinessDays, daysToPause, holidays)) { pausedOn = SlaTickets.GetNextBusinessDay(pausedOn, slaBusinessDays); } while (!SlaTickets.IsValidDay(resumedOn, slaBusinessDays, daysToPause, holidays)) { resumedOn = SlaTickets.GetNextBusinessDay(resumedOn, slaBusinessDays); } //If the pause spans to more than one (and same) days then loop, set a tempResumedOn to end of business days and moving the pausedOn to next business day start of day while (DateTime.Compare(pausedOn, resumedOn) < 0) { DateTime tempResumedOn = new DateTime(); if (DateTime.Compare(pausedOn.Date, resumedOn.Date) < 0) { tempResumedOn = new DateTime(pausedOn.Year, pausedOn.Month, pausedOn.Day, slaDayEnd.Value.Hour, slaDayEnd.Value.Minute, 0); } else if (DateTime.Compare(pausedOn.Date, resumedOn.Date) == 0) { tempResumedOn = resumedOn; } //...do the calculation int secondsPaused = 0; while (pausedOn.Date < tempResumedOn.Date) { int pausedOnSecond = (pausedOn.Minute + (pausedOn.Hour * 60)) * 60; if (pausedOnSecond < (startOfDayMinutes * 60) || pausedOnSecond > (endOfDayMinutes * 60)) { pausedOnSecond = startOfDayMinutes * 60; } secondsPaused = (endOfDayMinutes * 60) - pausedOnSecond; pausedTime = pausedTime.Add(TimeSpan.FromSeconds(secondsPaused)); pausedOn = SlaTickets.GetNextBusinessDay(pausedOn, slaBusinessDays); pausedOn = new DateTime(pausedOn.Year, pausedOn.Month, pausedOn.Day, slaDayStart.Value.Hour, slaDayStart.Value.Minute, 0); } //same day if (pausedOn.Date == tempResumedOn.Date && pausedOn.TimeOfDay < tempResumedOn.TimeOfDay) { int resumedOnMinute = tempResumedOn.Minute + (tempResumedOn.Hour * 60); int resumedOnSecond = resumedOnSecond = (resumedOnMinute * 60) + tempResumedOn.Second; if (resumedOnMinute < startOfDayMinutes) { resumedOnMinute = startOfDayMinutes; resumedOnSecond = resumedOnSecond = (resumedOnMinute * 60) + tempResumedOn.Second; } if (resumedOnMinute > endOfDayMinutes) { resumedOnMinute = endOfDayMinutes; resumedOnSecond = resumedOnSecond = (resumedOnMinute * 60) + tempResumedOn.Second; } if (resumedOnSecond < (startOfDayMinutes * 60)) { resumedOnSecond = (startOfDayMinutes * 60); } if (resumedOnSecond > (endOfDayMinutes * 60)) { resumedOnSecond = (endOfDayMinutes * 60); } secondsPaused = resumedOnSecond - ((((pausedOn.Hour * 60) + pausedOn.Minute) * 60) + pausedOn.Second); pausedTime = pausedTime.Add(TimeSpan.FromSeconds(secondsPaused)); } //get the next valid day to start pausedOn = SlaTickets.GetNextBusinessDay(pausedOn, slaBusinessDays); pausedOn = new DateTime(pausedOn.Year, pausedOn.Month, pausedOn.Day, slaDayStart.Value.Hour, slaDayStart.Value.Minute, 0); while (!SlaTickets.IsValidDay(pausedOn, slaBusinessDays, daysToPause, holidays)) { pausedOn = SlaTickets.GetNextBusinessDay(pausedOn, slaBusinessDays); pausedOn = new DateTime(pausedOn.Year, pausedOn.Month, pausedOn.Day, slaDayStart.Value.Hour, slaDayStart.Value.Minute, 0); } } } } return(pausedTime); }