private async Task <SubscribeResult> SubscribeOrInviteAsync(string addresses, string message, SubscribeAction action, SubscribeOptions options = SubscribeOptions.None) { var result = new SubscribeResult(); if (!String.IsNullOrWhiteSpace(addresses)) { var req = new RestRequest(Method.POST); req.AddParameter("subscribees", addresses); req.AddParameter("subscribe_or_invite", action == SubscribeAction.Subscribe ? 0 : 1); req.AddParameter("send_welcome_msg_to_this_batch", options.HasFlag(SubscribeOptions.SendWelcomeMessage).ToInt()); req.AddParameter("send_notifications_to_list_owner", options.HasFlag(SubscribeOptions.NotifyOwner).ToInt()); if (!String.IsNullOrWhiteSpace(message)) { // want to end with two CR, to separate from the message body message = message.TrimEnd() + "\n\n"; req.AddParameter("invitation", message); } var resp = await this.GetClient().ExecuteAdminRequestAsync(_addPage, req).ConfigureAwait(false); var doc = resp.Content.GetHtmlDocument(); string verb = action == SubscribeAction.Invite ? "invited" : "subscribed"; string xpath = String.Format("//h5[contains(translate(text(), 'SI', 'si'), 'successfully {0}')]/following-sibling::ul[1]/li", verb); foreach (var node in doc.DocumentNode.SafeSelectNodes(xpath)) { result.Subscribed.Add(node.InnerText.Trim()); } verb = action == SubscribeAction.Invite ? "inviting" : "subscribing"; xpath = String.Format("//h5[contains(translate(text(), 'ESI', 'esi'),'error {0}')]/following-sibling::ul[1]/li", verb); foreach (var node in doc.DocumentNode.SafeSelectNodes(xpath)) { var match = Regex.Match(node.InnerText, "(.*) -- (.*)"); var email = match.Groups[1].Value; var reason = match.Groups[2].Value; if (Regex.IsMatch(reason, "Already", RegexOptions.IgnoreCase)) { result.AlreadyMembers.Add(email); } else if (Regex.IsMatch(reason, "Bad/Invalid", RegexOptions.IgnoreCase)) { result.BadEmails.Add(email); } } if (action == SubscribeAction.Subscribe && _emailListPopulated) { await PopulateEmailListAsync().ConfigureAwait(false); } } return(result); }
public async Task Subscribe_Sends_Right_Params(string message, SubscribeOptions options) { await _list.Membership.SubscribeAsync("*****@*****.**", message, options); var welcome = options.HasFlag(SubscribeOptions.SendWelcomeMessage); var owner = options.HasFlag(SubscribeOptions.NotifyOwner); _request.Should().NotBeNull(); _parmStrings.Should().Contain("[email protected]"); _parmStrings.Should().Contain("subscribe_or_invite=0"); _parmStrings.Should().Contain($"send_welcome_msg_to_this_batch={welcome.ToInt()}"); _parmStrings.Should().Contain($"send_notifications_to_list_owner={owner.ToInt()}"); if (!String.IsNullOrEmpty(message)) { _parmStrings.Should().Contain($"invitation={message}\n\n"); } }
private SubscribeResult SubscribeOrInvite(string members, SubscribeAction action, SubscribeOptions options = SubscribeOptions.None) { var result = new SubscribeResult(); if (!String.IsNullOrWhiteSpace(members)) { var req = new RestRequest(); req.AddParameter("subscribees", members); req.AddParameter("subscribe_or_invite", action == SubscribeAction.Subscribe ? 0 : 1); req.AddParameter("send_welcome_msg_to_this_batch", options.HasFlag(SubscribeOptions.SendWelcomeMessage).ToInt()); req.AddParameter("send_notifications_to_list_owner", options.HasFlag(SubscribeOptions.NotifyOwner).ToInt()); var resp = this.GetClient().ExecutePostAdminRequest(_addPage, req); var doc = GetHtmlDocument(resp.Content); string verb = action == SubscribeAction.Invite ? "invited" : "subscribed"; string xpath = String.Format("//h5[contains(translate(text(), 'SI', 'si'), 'successfully {0}')]/following-sibling::ul[1]/li", verb); foreach (var node in doc.DocumentNode.SafeSelectNodes(xpath)) result.Subscribed.Add(node.InnerText.Trim()); verb = action == SubscribeAction.Invite ? "inviting" : "subscribing"; xpath = String.Format("//h5[contains(translate(text(), 'ESI', 'esi'),'error {0}')]/following-sibling::ul[1]/li", verb); foreach (var node in doc.DocumentNode.SafeSelectNodes(xpath)) { var match = Regex.Match(node.InnerText, "(.*) -- (.*)"); var email = match.Groups[1].Value; var reason = match.Groups[2].Value; if (Regex.IsMatch(reason, "Already", RegexOptions.IgnoreCase)) result.AlreadyMembers.Add(email); else if (Regex.IsMatch(reason, "Bad/Invalid", RegexOptions.IgnoreCase)) result.BadEmails.Add(email); } if (action == SubscribeAction.Subscribe && _emailListPopulated) PopulateEmailList(); } return result; }