/// <summary> /// Sends the nightly/monthly emails for users that have requested it. /// </summary> private void SendNightlyEmails() { // get the list of people who have a subscription OTHER than simple monthly List <Profile> lstUsersToSend = Profile.UsersWithSubscriptions(~EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals), DateTime.Now.AddDays(-7)); if (!String.IsNullOrEmpty(UserRestriction)) { lstUsersToSend.RemoveAll(pf => pf.UserName.CompareOrdinalIgnoreCase(UserRestriction) != 0); } foreach (Profile pf in lstUsersToSend) { if (SendMailForUser(pf, Resources.Profile.EmailWeeklyMailSubject, String.Empty)) { pf.LastEmailDate = DateTime.Now; pf.FCommit(); } } // Now do the monthly/annual emails if (DateTime.Now.Day == 1) { lstUsersToSend = Profile.UsersWithSubscriptions(EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals), DateTime.Now.AddDays(1)); // We don't update the last-email sent on this because this email is asynchronous - i.e., not dependent on any other mail that was sent. foreach (Profile pf in lstUsersToSend) { SendMailForUser(pf, String.Format(CultureInfo.CurrentCulture, Resources.Profile.EmailMonthlySubject, DateTime.Now.AddMonths(-1).ToString("MMMM", CultureInfo.InvariantCulture)), "monthly"); } } }
/// <summary> /// Initializes the subscriptions from a bit-field of subscriptions /// </summary> /// <param name="u">The bit field</param> /// <returns>The array of subscriptions (which is also initialized in the Subscriptions property)</returns> public IEnumerable <EmailSubscription> FromUInt(UInt32 u) { SubscriptionFlags = u; Subscriptions = EmailSubscription.AvailableSubscriptions(); foreach (EmailSubscription es in Subscriptions) { es.IsSubscribed = ((u & es.Flag) != 0); } return(this.Subscriptions); }
/// <summary> /// Determines if the user has the specified subscription /// </summary> /// <param name="st"></param> /// <returns></returns> public bool HasSubscription(SubscriptionType st) { return((SubscriptionFlags & EmailSubscription.FlagForType(st)) != 0); }
/// <summary> /// Sends the nightly/monthly emails for users that have requested it. /// </summary> private void SendNightlyEmails() { // Find all users who have expiring currencies - they may trigger an early email. List <EarnedGratuity> lstUsersWithExpiringCurrencies = EarnedGratuity.GratuitiesForUser(null, Gratuity.GratuityTypes.CurrencyAlerts); if (!String.IsNullOrEmpty(UserRestriction)) { lstUsersWithExpiringCurrencies.RemoveAll(eg => eg.Username.CompareCurrentCultureIgnoreCase(UserRestriction) != 0); } // get the list of people who have a subscription OTHER than simple monthly List <Profile> lstUsersToSend = new List <Profile>(Profile.UsersWithSubscriptions(~EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals), DateTime.Now.AddDays(-7))); // And the list of people who have a subscription to expiring currencies List <Profile> lstUsersSubscribedForExpiration = new List <Profile>(Profile.UsersWithSubscriptions(EmailSubscription.FlagForType(SubscriptionType.Expiration), DateTime.Now.AddDays(-7))); if (!String.IsNullOrEmpty(UserRestriction)) { lstUsersToSend.RemoveAll(pf => pf.UserName.CompareOrdinalIgnoreCase(UserRestriction) != 0); } // See who has expiring currencies that require notification. foreach (EarnedGratuity eg in lstUsersWithExpiringCurrencies) { // Skip over anybody that's not also subscribed for expiration notices Profile pf = lstUsersSubscribedForExpiration.Find(profile => profile.UserName.CompareCurrentCultureIgnoreCase(eg.Username) == 0); if (pf == null) { continue; } IEnumerable <FlightCurrency.CurrencyStatusItem> expiringCurrencies = FlightCurrency.CurrencyStatusItem.CheckForExpiringCurrencies(eg.State, eg.Username, out string newState); if (newState.CompareOrdinal(eg.State) != 0) { eg.State = newState; eg.Commit(); } if (expiringCurrencies.Count() > 0) { if (SendMailForUser(pf, Resources.Profile.EmailCurrencyExpiringMailSubject, string.Empty)) { // Don't send the weekly mail, since we just pre-empted it. lstUsersToSend.RemoveAll(p => pf.UserName.CompareCurrentCultureIgnoreCase(eg.Username) == 0); pf.LastEmailDate = DateTime.Now; pf.FCommit(); } } } foreach (Profile pf in lstUsersToSend) { if (SendMailForUser(pf, Resources.Profile.EmailWeeklyMailSubject, String.Empty)) { pf.LastEmailDate = DateTime.Now; pf.FCommit(); } } // Now do the monthly/annual emails if (DateTime.Now.Day == 1) { lstUsersToSend = new List <Profile>(Profile.UsersWithSubscriptions(EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals), DateTime.Now.AddDays(1))); // We don't update the last-email sent on this because this email is asynchronous - i.e., not dependent on any other mail that was sent. foreach (Profile pf in lstUsersToSend) { SendMailForUser(pf, String.Format(CultureInfo.CurrentCulture, Resources.Profile.EmailMonthlySubject, DateTime.Now.AddMonths(-1).ToString("MMMM", CultureInfo.InvariantCulture)), "monthly"); } } }
/// <summary> /// Sends the nightly/monthly emails for users that have requested it. /// </summary> private void SendNightlyEmails() { // Find all users who qualify for expiring currency notifications - they may trigger an early email. List <EarnedGratuity> lstUsersWithExpiringCurrencies = EarnedGratuity.GratuitiesForUser(null, Gratuity.GratuityTypes.CurrencyAlerts); if (!String.IsNullOrEmpty(UserRestriction)) { lstUsersWithExpiringCurrencies.RemoveAll(eg => eg.Username.CompareCurrentCultureIgnoreCase(UserRestriction) != 0); } // And the list of people who have a subscription to expiring currencies List <Profile> lstUsersSubscribedForExpiration = new List <Profile>(Profile.UsersWithSubscriptions(EmailSubscription.FlagForType(SubscriptionType.Expiration), DateTime.Now.AddDays(-7))); // get the list of people who have a subscription OTHER than simple monthly or expiration List <Profile> lstUsersToSend = new List <Profile>(Profile.UsersWithSubscriptions(~(EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals) | EmailSubscription.FlagForType(SubscriptionType.Expiration)), DateTime.Now.AddDays(-7))); if (!String.IsNullOrEmpty(UserRestriction)) { lstUsersToSend.RemoveAll(pf => pf.UserName.CompareOrdinalIgnoreCase(UserRestriction) != 0); } // See who has expiring currencies that require notification. foreach (EarnedGratuity eg in lstUsersWithExpiringCurrencies) { // Skip over anybody that's not also subscribed for expiration notices Profile pf = lstUsersSubscribedForExpiration.Find(profile => profile.UserName.CompareCurrentCultureIgnoreCase(eg.Username) == 0); if (pf == null) { continue; } IEnumerable <CurrencyStatusItem> expiringCurrencies = CurrencyStatusItem.CheckForExpiringCurrencies(eg.State, eg.Username, out string newState); if (newState.CompareOrdinal(eg.State) != 0) { eg.State = newState; eg.Commit(); } if (expiringCurrencies.Any()) { if (SendMailForUser(pf, Resources.Profile.EmailCurrencyExpiringMailSubject, string.Empty)) { // Don't send the weekly mail, since we just pre-empted it. lstUsersToSend.RemoveAll(p => pf.UserName.CompareCurrentCultureIgnoreCase(eg.Username) == 0); pf.LastEmailDate = DateTime.Now; pf.FCommit(); } } } foreach (Profile pf in lstUsersToSend) { if (SendMailForUser(pf, Resources.Profile.EmailWeeklyMailSubject, String.Empty)) { pf.LastEmailDate = DateTime.Now; pf.FCommit(); } } // Now do the monthly/annual emails if (DateTime.Now.Day == 1) { lstUsersToSend = new List <Profile>(Profile.UsersWithSubscriptions(EmailSubscription.FlagForType(SubscriptionType.MonthlyTotals), DateTime.Now.AddDays(1))); // We don't update the last-email sent on this because this email is asynchronous - i.e., not dependent on any other mail that was sent. foreach (Profile pf in lstUsersToSend) { SendMailForUser(pf, String.Format(CultureInfo.CurrentCulture, Resources.Profile.EmailMonthlySubject, DateTime.Now.AddMonths(-1).ToString("MMMM", CultureInfo.InvariantCulture)), "monthly"); } } // Do a pending flights reminder - every week or so if (DateTime.Now.DayOfYear % 7 == 6) { IDictionary <string, int> usersWithPendingFlights = PendingFlight.UsersWithLotsOfPendingFlights(30); foreach (string szUser in usersWithPendingFlights.Keys) { Profile pf = Profile.GetUser(szUser); util.NotifyUser(Branding.ReBrand(Resources.Profile.PendingFlightsReminderSubject), Branding.ReBrand(String.Format(CultureInfo.CurrentCulture, Resources.Profile.PendingFlightsReminder, pf.UserFullName, usersWithPendingFlights[szUser])), new System.Net.Mail.MailAddress(pf.Email, pf.UserFullName), false, true); } } }