1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Xml.Linq;
  5. using clempaul.Dreamhost.ResponseData;
  6.  
  7. namespace clempaul.Dreamhost
  8. {
  9.     public class AnnouncementListRequests
  10.     {
  11.         DreamhostAPI api;
  12.  
  13.         internal AnnouncementListRequests(DreamhostAPI api)
  14.         {
  15.             this.api = api;
  16.         }
  17.  
  18.         #region announcement_list-list_lists
  19.  
  20.         public IEnumerable<AnnouncementList> ListLists()
  21.         {
  22.             XDocument response = api.SendCommand("announcement_list-list_lists");
  23.  
  24.             return from data in response.Element("dreamhost").Elements("data")
  25.                    select new AnnouncementList
  26.                    {
  27.                        account_id = data.Element("account_id").AsString(),
  28.                        listname = data.Element("listname").AsString(),
  29.                        domain = data.Element("domain").AsString(),
  30.                        name = data.Element("name").AsString(),
  31.                        start_date = data.Element("start_date").AsDateTime(),
  32.                        max_bounces = data.Element("max_bounces").AsInt(),
  33.                        num_subscribers = data.Element("num_subscribers").AsInt()
  34.                    };
  35.         }
  36.  
  37.         #endregion
  38.  
  39.         #region announcement_list-list_subscribers
  40.  
  41.         public IEnumerable<AnnouncementListSubscriber> ListSubscribers(string listname, string domain)
  42.         {
  43.             // Check parameters
  44.  
  45.             if (listname == string.Empty || listname == null)
  46.             {
  47.                 throw new Exception("Missing listname parameter");
  48.             }
  49.             else if (domain == string.Empty || domain == null)
  50.             {
  51.                 throw new Exception("Missing domain parameter");
  52.             }
  53.  
  54.             // Construct Request
  55.  
  56.             QueryData[] parameters = {
  57.                                          new QueryData("listname", listname),
  58.                                          new QueryData("domain", domain)
  59.                                      };
  60.  
  61.             XDocument response = api.SendCommand("announcement_list-list_subscribers", parameters);
  62.  
  63.             // Handle Response
  64.  
  65.             return from data in response.Element("dreamhost").Elements("data")
  66.                    select new AnnouncementListSubscriber
  67.                    {
  68.                        email = data.Element("email").AsString(),
  69.                        confirmed = data.Element("confirmed").AsBool(),
  70.                        subscribe_date = data.Element("subscribe_date").AsDateTime(),
  71.                        name = data.Element("name").AsString(),
  72.                        num_bounces = data.Element("num_bounces").AsInt()
  73.                    };
  74.         }
  75.  
  76.         /*
  77.          * Overloads
  78.          */
  79.  
  80.         public IEnumerable<AnnouncementListSubscriber> ListSubscribers(AnnouncementList list)
  81.         {
  82.             return this.ListSubscribers(list.listname, list.domain);
  83.         }
  84.  
  85.         #endregion
  86.  
  87.         #region announcement_list-add_subscriber
  88.  
  89.         public void AddSubscriber(string listname, string domain, string email, string name)
  90.         {
  91.             // Check parameters
  92.  
  93.             if (listname == null || listname == string.Empty)
  94.             {
  95.                 throw new Exception("Missing listname parameter");
  96.             }
  97.             else if (domain == null || domain == string.Empty)
  98.             {
  99.                 throw new Exception("Missing domain parameter");
  100.             }
  101.             else if (email == null || email == string.Empty)
  102.             {
  103.                 throw new Exception("Missing email parameter");
  104.             }
  105.  
  106.             // Build request
  107.  
  108.             List<QueryData> parameters = new List<QueryData>();
  109.  
  110.             parameters.Add(new QueryData("listname", listname));
  111.             parameters.Add(new QueryData("domain", domain));
  112.             parameters.Add(new QueryData("email", email));
  113.  
  114.             if (name != null && name != string.Empty)
  115.             {
  116.                 parameters.Add(new QueryData("name", name));
  117.             }
  118.  
  119.             api.SendCommand("announcement_list-add_subscriber", parameters);
  120.         }
  121.  
  122.         /*
  123.          * Overloads
  124.          */
  125.  
  126.         public void AddSubscriber(string listname, string domain, string email)
  127.         {
  128.             this.AddSubscriber(listname, domain, email, null);
  129.         }
  130.  
  131.         public void AddSubscriber(AnnouncementList list, string email, string name)
  132.         {
  133.             this.AddSubscriber(list.listname, list.domain, email, name);
  134.         }
  135.  
  136.         public void AddSubscriber(AnnouncementList list, string email)
  137.         {
  138.             this.AddSubscriber(list.listname, list.domain, email, null);
  139.         }
  140.  
  141.         #endregion
  142.  
  143.         #region announcement_list-remove_subscriber
  144.  
  145.         public void RemoveSubscriber(string listname, string domain, string email)
  146.         {
  147.             // Check parameters
  148.  
  149.             if (listname == null || listname == string.Empty)
  150.             {
  151.                 throw new Exception("Missing listname parameter");
  152.             }
  153.             else if (domain == null || domain == string.Empty)
  154.             {
  155.                 throw new Exception("Missing domain parameter");
  156.             }
  157.             else if (email == null || email == string.Empty)
  158.             {
  159.                 throw new Exception("Missing email parameter");
  160.             }
  161.  
  162.             // Build request
  163.  
  164.             QueryData[] parameters = {
  165.                                          new QueryData("listname", listname),
  166.                                          new QueryData("domain", domain),
  167.                                          new QueryData("email", email)
  168.                                      };
  169.  
  170.             api.SendCommand("announcement_list-remove_subscriber", parameters);
  171.         }
  172.  
  173.         /*
  174.          * Overloads
  175.          */
  176.  
  177.         public void RemoveSubscriber(AnnouncementList list, string email)
  178.         {
  179.             this.RemoveSubscriber(list.listname, list.domain, email);
  180.         }
  181.  
  182.         public void RemoveSubscriber(AnnouncementList list, AnnouncementListSubscriber subscriber)
  183.         {
  184.             this.RemoveSubscriber(list.listname, list.domain, subscriber.email);
  185.         }
  186.  
  187.         public void RemoveSubscriber(string listname, string domain, AnnouncementListSubscriber subscriber)
  188.         {
  189.             this.RemoveSubscriber(listname, domain, subscriber.email);
  190.         }
  191.  
  192.         #endregion
  193.  
  194.         #region announcement_list-post_announcement
  195.  
  196.         public void PostAnnouncement(string listname, string domain, string name, Announcement announcement)
  197.         {
  198.             // Check parameters
  199.  
  200.             if (listname == null || listname == string.Empty)
  201.             {
  202.                 throw new Exception("Missing listname parameter");
  203.             }
  204.             else if (domain == null || domain == string.Empty)
  205.             {
  206.                 throw new Exception("Missing domain parameter");
  207.             }
  208.             else if (announcement.message == null || announcement.message == string.Empty)
  209.             {
  210.                 throw new Exception("Missing message parameter");
  211.             }
  212.             else if (name == null || name == string.Empty)
  213.             {
  214.                 throw new Exception("Missing name parameter");
  215.             }
  216.  
  217.             // Build request
  218.  
  219.             List<QueryData> parameters = new List<QueryData>();
  220.  
  221.             parameters.Add(new QueryData("listname", listname));
  222.             parameters.Add(new QueryData("domain", domain));
  223.  
  224.             if (announcement.subject != null && announcement.subject != string.Empty)
  225.             {
  226.                 parameters.Add(new QueryData("subject", announcement.subject));
  227.             }
  228.  
  229.             parameters.Add(new QueryData("message", announcement.message));
  230.             parameters.Add(new QueryData("name", name));
  231.  
  232.             if (announcement.stamp != null)
  233.             {
  234.                 parameters.Add(new QueryData("stamp", announcement.stamp.AsTimestamp()));
  235.             }
  236.  
  237.             if (announcement.charset != null && announcement.charset != string.Empty)
  238.             {
  239.                 parameters.Add(new QueryData("charset", announcement.charset));
  240.             }
  241.  
  242.             if (announcement.type != null && announcement.type != string.Empty)
  243.             {
  244.                 parameters.Add(new QueryData("type", announcement.type));
  245.             }
  246.  
  247.             if (announcement.duplicate_ok != null)
  248.             {
  249.                 parameters.Add(new QueryData("duplicate_ok", announcement.duplicate_ok.AsBit()));
  250.             }
  251.  
  252.             api.SendCommand("announcement_list-post_announcement", parameters);
  253.  
  254.         }
  255.  
  256.         /*
  257.          * Overloads
  258.          */
  259.  
  260.         public void PostAnnouncement(AnnouncementList list, Announcement announcement)
  261.         {
  262.             this.PostAnnouncement(list.listname, list.domain, list.name, announcement);
  263.         }
  264.        
  265.         #endregion
  266.     }
  267. }
  268.