Commits

lfoust committed 31d4ce0

Worked on Tag, Stats, and user methods.

  • Participants
  • Parent commits 52d6215
  • Branches V2.0

Comments (0)

Files changed (26)

File trunk/data/V2.0 Upgrade Checklist.xlsx

Binary file modified.

File trunk/data/~$V2.0 Upgrade Checklist.xlsx

Binary file added.

File trunk/source/Stacky.Net35/Stacky.Net35.csproj

     <Compile Include="..\Stacky\Entities\SiteInfo.cs">
       <Link>Entities\SiteInfo.cs</Link>
     </Compile>
-    <Compile Include="..\Stacky\Entities\SiteStats.cs">
-      <Link>Entities\SiteStats.cs</Link>
-    </Compile>
     <Compile Include="..\Stacky\Entities\SiteStyle.cs">
       <Link>Entities\SiteStyle.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Enums\AnswerSort.cs">
       <Link>Enums\AnswerSort.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Enums\AnswerTimePeriod.cs">
+      <Link>Enums\AnswerTimePeriod.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Enums\BadgeClass.cs">
       <Link>Enums\BadgeClass.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\StackyClient\StackyClient.cs">
       <Link>StackyClient\StackyClient.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\StackyClient\SuggestedEditMethods.cs">
+      <Link>StackyClient\SuggestedEditMethods.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\UrlClient.cs">
       <Link>UrlClient.cs</Link>
     </Compile>

File trunk/source/Stacky.Net35/StackyClient/StatsMethods.cs

 {
     public partial class StackyClient
     {
-        public virtual SiteStats GetSiteStats()
+        public virtual SiteInfo GetSiteStats()
         {
-            return MakeRequest<SiteStats>("stats", null, new
+            return MakeRequest<SiteInfo>("info", null, new
             {
                 site = this.SiteUrlName
             }).Items.FirstOrDefault();

File trunk/source/Stacky.Net35/StackyClientAsync/StatsMethods.cs

     public partial class StackyClientAsync
 #endif
     {
-        public virtual void GetSiteStats(Action<SiteStats> onSuccess, Action<ApiException> onError)
+        public virtual void GetSiteStats(Action<SiteInfo> onSuccess, Action<ApiException> onError)
         {
-            MakeRequest<SiteStats>("stats", null, new
+            MakeRequest<SiteInfo>("stats", null, new
             {
                 site = this.SiteUrlName
             }, results => onSuccess(results.Items.FirstOrDefault()), onError);

File trunk/source/Stacky.Silverlight/Stacky.Silverlight.csproj

     <Compile Include="..\Stacky\Entities\SiteInfo.cs">
       <Link>Entities\SiteInfo.cs</Link>
     </Compile>
-    <Compile Include="..\Stacky\Entities\SiteStats.cs">
-      <Link>Entities\SiteStats.cs</Link>
-    </Compile>
     <Compile Include="..\Stacky\Entities\SiteStyle.cs">
       <Link>Entities\SiteStyle.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Enums\AnswerSort.cs">
       <Link>Enums\AnswerSort.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Enums\AnswerTimePeriod.cs">
+      <Link>Enums\AnswerTimePeriod.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Enums\BadgeClass.cs">
       <Link>Enums\BadgeClass.cs</Link>
     </Compile>

File trunk/source/Stacky.WindowsPhone/Stacky.WindowsPhone.csproj

     <Compile Include="..\Stacky\Entities\SiteInfo.cs">
       <Link>Entities\SiteInfo.cs</Link>
     </Compile>
-    <Compile Include="..\Stacky\Entities\SiteStats.cs">
-      <Link>Entities\SiteStats.cs</Link>
-    </Compile>
     <Compile Include="..\Stacky\Entities\SiteStyle.cs">
       <Link>Entities\SiteStyle.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Enums\AnswerSort.cs">
       <Link>Enums\AnswerSort.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Enums\AnswerTimePeriod.cs">
+      <Link>Enums\AnswerTimePeriod.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Enums\BadgeClass.cs">
       <Link>Enums\BadgeClass.cs</Link>
     </Compile>

File trunk/source/Stacky/Entities/SiteInfo.cs

 
 namespace Stacky
 {
+    /// <summary>
+    /// See: http://api.stackexchange.com/docs/types/info
+    /// </summary>
     public class SiteInfo : Entity
     {
-        [JsonProperty("main_site")]
-        public Site MainSite { get; set; }
+        private int totalQuestions;
+        [JsonProperty("total_questions")]
+        public int TotalQuestions
+        {
+            get { return totalQuestions; }
+            set { totalQuestions = value; NotifyOfPropertyChange(() => TotalQuestions); }
+        }
 
-        [JsonProperty("related_sites")]
-        public System.Collections.Generic.IEnumerable<RelatedSite> RelatedSites { get; set; }
+        private int totalUnanswered;
+        [JsonProperty("total_unanswered")]
+        public int TotalUnanswered
+        {
+            get { return totalUnanswered; }
+            set { totalUnanswered = value; NotifyOfPropertyChange(() => TotalUnanswered); }
+        }
+
+        private int totalAccepted;
+        [JsonProperty("total_accepted")]
+        public int TotalAccepted
+        {
+            get { return totalAccepted; }
+            set { totalAccepted = value; NotifyOfPropertyChange(() => TotalAccepted); }
+        }
+
+        private int totalAnswers;
+        [JsonProperty("total_answers")]
+        public int TotalAnswers
+        {
+            get { return totalAnswers; }
+            set { totalAnswers = value; NotifyOfPropertyChange(() => TotalAnswers); }
+        }
+
+        private int questionsPerMinute;
+        [JsonProperty("questions_per_minute")]
+        public int QuestionsPerMinute
+        {
+            get { return questionsPerMinute; }
+            set { questionsPerMinute = value; NotifyOfPropertyChange(() => QuestionsPerMinute); }
+        }
+
+        private int answersPerMinute;
+        [JsonProperty("answers_per_minute")]
+        public int AnswersPerMinute
+        {
+            get { return answersPerMinute; }
+            set { answersPerMinute = value; NotifyOfPropertyChange(() => AnswersPerMinute); }
+        }
+
+        private int totalComments;
+        [JsonProperty("total_comments")]
+        public int TotalComments
+        {
+            get { return totalComments; }
+            set { totalComments = value; NotifyOfPropertyChange(() => TotalComments); }
+        }
+
+        private int totalVotes;
+        [JsonProperty("total_votes")]
+        public int TotalVotes
+        {
+            get { return totalVotes; }
+            set { totalVotes = value; NotifyOfPropertyChange(() => TotalVotes); }
+        }
+
+        private int totalBadges;
+        [JsonProperty("total_badges")]
+        public int TotalBadges
+        {
+            get { return totalBadges; }
+            set { totalBadges = value; NotifyOfPropertyChange(() => TotalBadges); }
+        }
+
+        private int badgesPerMinute;
+        [JsonProperty("badges_per_minute")]
+        public int BadgesPerMinute
+        {
+            get { return badgesPerMinute; }
+            set { badgesPerMinute = value; NotifyOfPropertyChange(() => BadgesPerMinute); }
+        }
+
+        private int totalUsers;
+        [JsonProperty("total_users")]
+        public int TotalUsers
+        {
+            get { return totalUsers; }
+            set { totalUsers = value; NotifyOfPropertyChange(() => TotalUsers); }
+        }
+
+        private int newActiveUsers;
+        [JsonProperty("new_active_users")]
+        public int NewActiveUsers
+        {
+            get { return newActiveUsers; }
+            set { newActiveUsers = value; NotifyOfPropertyChange(() => NewActiveUsers); }
+        }
+
+        private string apiRevision;
+        [JsonProperty("api_revision")]
+        public string ApiRevision
+        {
+            get { return apiRevision; }
+            set { apiRevision = value; NotifyOfPropertyChange(() => ApiRevision); }
+        }
+
+        private Site site;
+        [JsonProperty("site")]
+        public Site Site
+        {
+            get { return site; }
+            set { site = value; NotifyOfPropertyChange(() => Site); }
+        }
     }
 }

File trunk/source/Stacky/Entities/SiteStats.cs

-using Newtonsoft.Json;
-
-namespace Stacky
-{
-    /// <summary>
-    /// Represents site statistics.
-    /// </summary>
-    public class SiteStats : Entity
-    {
-        private int totalQuestions;
-        private int totalUnanswered;
-        private int totalAccepted;
-        private int totalAnswers;
-        private int totalComments;
-        private int totalVotes;
-        private int totalBadges;
-        private int totalUsers;
-        private double questionsPerMinute;
-        private double answersPerMinute;
-        private double badgesPerMinute;
-        private double viewsPerDay;
-        private ApiVersion apiVersion;
-        private Site site;
-
-        /// <summary>
-        /// Gets or sets the total questions.
-        /// </summary>
-        /// <value>The total questions.</value>
-        [JsonProperty("total_questions")]
-        public int TotalQuestions
-        {
-            get { return totalQuestions; }
-            set { totalQuestions = value; NotifyOfPropertyChange(() => TotalQuestions); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total unanswered questions.
-        /// </summary>
-        /// <value>The total unanswered questions.</value>
-        [JsonProperty("total_unanswered")]
-        public int TotalUnanswered
-        {
-            get { return totalUnanswered; }
-            set { totalUnanswered = value; NotifyOfPropertyChange(() => TotalUnanswered); }
-        }
-
-        /// <summary>
-        /// Gets or sets the count of questions with accept answers, or equivalently count of answers accepted.
-        /// </summary>
-        [JsonProperty("total_accepted")]
-        public int TotalAccepted
-        {
-            get { return totalAccepted; }
-            set { totalAccepted = value; NotifyOfPropertyChange(() => TotalAccepted); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total answers.
-        /// </summary>
-        /// <value>The total answers.</value>
-        [JsonProperty("total_answers")]
-        public int TotalAnswers
-        {
-            get { return totalAnswers; }
-            set { totalAnswers = value; NotifyOfPropertyChange(() => TotalAnswers); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total comments.
-        /// </summary>
-        /// <value>The total comments.</value>
-        [JsonProperty("total_comments")]
-        public int TotalComments
-        {
-            get { return totalComments; }
-            set { totalComments = value; NotifyOfPropertyChange(() => TotalComments); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total votes.
-        /// </summary>
-        /// <value>The total votes.</value>
-        [JsonProperty("total_votes")]
-        public int TotalVotes
-        {
-            get { return totalVotes; }
-            set { totalVotes = value; NotifyOfPropertyChange(() => TotalVotes); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total badges.
-        /// </summary>
-        /// <value>The total badges.</value>
-        [JsonProperty("total_badges")]
-        public int TotalBadges
-        {
-            get { return totalBadges; }
-            set { totalBadges = value; NotifyOfPropertyChange(() => TotalBadges); }
-        }
-
-        /// <summary>
-        /// Gets or sets the total users.
-        /// </summary>
-        /// <value>The total users.</value>
-        [JsonProperty("total_users")]
-        public int TotalUsers
-        {
-            get { return totalUsers; }
-            set { totalUsers = value; NotifyOfPropertyChange(() => TotalUsers); }
-        }
-
-        /// <summary>
-        /// Gets or sets the questions per minute.
-        /// </summary>
-        /// <value>The questions per minute.</value>
-        [JsonProperty("questions_per_minute")]
-        public double QuestionsPerMinute
-        {
-            get { return questionsPerMinute; }
-            set { questionsPerMinute = value; NotifyOfPropertyChange(() => QuestionsPerMinute); }
-        }
-
-        /// <summary>
-        /// Gets or sets the answers per minute.
-        /// </summary>
-        /// <value>The answers per minute.</value>
-        [JsonProperty("answers_per_minute")]
-        public double AnswersPerMinute
-        {
-            get { return answersPerMinute; }
-            set { answersPerMinute = value; NotifyOfPropertyChange(() => AnswersPerMinute); }
-        }
-
-        /// <summary>
-        /// Gets or sets the badges per minute.
-        /// </summary>
-        /// <value>The badges per minute.</value>
-        [JsonProperty("badges_per_minute")]
-        public double BadgesPerMinute
-        {
-            get { return badgesPerMinute; }
-            set { badgesPerMinute = value; NotifyOfPropertyChange(() => BadgesPerMinute); }
-        }
-
-        /// <summary>
-        /// Gets or sets the average views per day on all questions.
-        /// </summary>
-        [JsonProperty("views_per_day")]
-        public double ViewsPerDay
-        {
-            get { return viewsPerDay; }
-            set { viewsPerDay = value; NotifyOfPropertyChange(() => ViewsPerDay); }
-        }
-
-        /// <summary>
-        /// Gets or sets the <see cref="ApiVersion">API version</see>.
-        /// </summary>
-        /// <value>The <see cref="ApiVersion">API version</see>.</value>
-        [JsonProperty("api_version")]
-        public ApiVersion ApiVersion
-        {
-            get { return apiVersion; }
-            set { apiVersion = value; NotifyOfPropertyChange(() => ApiVersion); }
-        }
-
-        /// <summary>
-        /// Gets or sets the display name.
-        /// </summary>
-        /// <value>The display name.</value>
-        [JsonProperty("site")]
-        public Site Site
-        {
-            get { return site; }
-            set { site = value; NotifyOfPropertyChange(() => Site); }
-        }
-    }
-}

File trunk/source/Stacky/Entities/SuggestedEdit.cs

 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using Newtonsoft.Json;
 
 namespace Stacky
 {
+    /// <summary>
+    /// See: http://api.stackexchange.com/docs/types/suggested-edit
+    /// </summary>
     public class SuggestedEdit : Entity
     {
         private int id;

File trunk/source/Stacky/Entities/Tag.cs

 {
     /// <summary>
     /// Represents a tag.
+    /// See: http://api.stackexchange.com/docs/types/tag
     /// </summary>
     public class Tag : Entity
     {
         private string name;
-        private int count;
-        private string restrictedTo;
-        private bool fulfillsRequired;
-        private int? userId;
-
-        /// <summary>
-        /// Gets or sets the name.
-        /// </summary>
-        /// <value>The name.</value>
         [JsonProperty("name")]
         public string Name
         {
             set { name = value; NotifyOfPropertyChange(() => Name); }
         }
 
-        /// <summary>
-        /// Gets or sets the count.
-        /// </summary>
-        /// <value>The count.</value>
+        private int count;
         [JsonProperty("count")]
         public int Count
         {
             set { count = value; NotifyOfPropertyChange(() => Count); }
         }
 
-        /// <summary>
-        /// Gets or sets the restricted to.
-        /// </summary>
-        /// <value>The restricted to.</value>
-        [JsonProperty("restricted_to")]
-        public string RestrictedTo
+        private bool isRequired;
+        [JsonProperty("is_required")]
+        public bool IsRequired
         {
-            get { return restrictedTo; }
-            set { restrictedTo = value; NotifyOfPropertyChange(() => RestrictedTo); }
+            get { return isRequired; }
+            set { isRequired = value; NotifyOfPropertyChange(() => IsRequired); }
         }
 
-        /// <summary>
-        /// Gets or sets a value indicating whether the tag fulfills the post requirement.
-        /// </summary>
-        /// <value><c>true</c> if the tag fulfills the post requirement; otherwise, <c>false</c>.</value>
-        [JsonProperty("fulfills_required")]
-        public bool FulfillsRequired
+        private bool isModeratorOnly;
+        [JsonProperty("is_moderator_only")]
+        public bool IsModeratorOnly
         {
-            get { return fulfillsRequired; }
-            set { fulfillsRequired = value; NotifyOfPropertyChange(() => FulfillsRequired); }
+            get { return isModeratorOnly; }
+            set { isModeratorOnly = value; NotifyOfPropertyChange(() => IsModeratorOnly); }
         }
 
-        /// <summary>
-        /// Gets or sets the user id.
-        /// </summary>
-        /// <value>The user id.</value>
+        private int userid;
         [JsonProperty("user_id")]
-        public int? UserId
+        public int UserId
         {
-            get { return userId; }
-            set { userId = value; NotifyOfPropertyChange(() => UserId); }
+            get { return userid; }
+            set { userid = value; NotifyOfPropertyChange(() => UserId); }
         }
     }
 }

File trunk/source/Stacky/Entities/TagScore.cs

+namespace Stacky
+{
+    using Newtonsoft.Json;
+
+    public class TagScore : Entity
+    {
+        private ShallowUser user;
+        [JsonProperty("user")]
+        public ShallowUser User
+        {
+            get { return user; }
+            set { user = value; NotifyOfPropertyChange(() => User); }
+        }
+
+        private int score;
+        [JsonProperty("score")]
+        public int Score
+        {
+            get { return score; }
+            set { score = value; NotifyOfPropertyChange(() => Score); }
+        }
+
+        private int postCount;
+        [JsonProperty("post_count")]
+        public int PostCount
+        {
+            get { return postCount; }
+            set { postCount = value; NotifyOfPropertyChange(() => PostCount); }
+        }
+    }
+}

File trunk/source/Stacky/Entities/TagSynonym.cs

 
 namespace Stacky
 {
+    /// <summary>
+    /// See: http://api.stackexchange.com/docs/types/tag-synonym
+    /// </summary>
     public class TagSynonym : Entity
     {
-        private string fromTag;
-        private string toTag;
-        private int appliedCount;
-        private DateTime creationDate;
-        private DateTime lastAppliedDate;
-
         /// <summary>
         /// Gets or sets the from tag.
         /// </summary>
+        private string fromTag;
         [JsonProperty("from_tag")]
         public string FromTag
         {
         /// <summary>
         /// Gets or sets the to tag.
         /// </summary>
+        private string toTag;
         [JsonProperty("to_tag")]
         public string ToTag
         {
         /// <summary>
         /// Gets or sets the applied count
         /// </summary>
+        private int appliedCount;
         [JsonProperty("applied_count")]
         public int AppliedCount
         {
         /// <summary>
         /// Gets or sets the last applied date
         /// </summary>
+        private DateTime lastAppliedDate;
         [JsonProperty("last_applied_date"), JsonConverter(typeof(UnixDateTimeConverter))]
         public DateTime LastAppliedDate
         {
         /// <summary>
         /// Gets or sets the creation date
         /// </summary>
+        private DateTime creationDate;
         [JsonProperty("creation_date"), JsonConverter(typeof(UnixDateTimeConverter))]
         public DateTime CreationDate
         {

File trunk/source/Stacky/Entities/TagWiki.cs

 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using Newtonsoft.Json;
 
 namespace Stacky
 {
+    /// <summary>
+    /// See: http://api.stackexchange.com/docs/types/tag-wiki
+    /// </summary>
     public class TagWiki : Entity
     {
         private string tagName;
-        private string wikiBody;
-        private string wikiExcerpt;
-        private DateTime bodyLastEditDate;
-        private DateTime excerptLastEditDate;
-        private ShallowUser lastBodyEditor;
-        private ShallowUser lastExcerptEditor;
-
         [JsonProperty("tag_name")]
         public string TagName
         {
             set { tagName = value; NotifyOfPropertyChange(() => TagName); }
         }
 
-        [JsonProperty("wiki_body")]
-        public string WikiBody
+        private string body;
+        [JsonProperty("body")]
+        public string Body
         {
-            get { return wikiBody; }
-            set { wikiBody = value; NotifyOfPropertyChange(() => WikiBody); }
+            get { return body; }
+            set { body = value; NotifyOfPropertyChange(() => Body); }
         }
 
-        [JsonProperty("wiki_excerpt")]
-        public string WikiExcerpt
+        private string excerpt;
+        [JsonProperty("excerpt")]
+        public string Excerpt
         {
-            get { return wikiExcerpt; }
-            set { wikiExcerpt = value; NotifyOfPropertyChange(() => WikiExcerpt); }
+            get { return excerpt; }
+            set { excerpt = value; NotifyOfPropertyChange(() => Excerpt); }
         }
 
+        private DateTime bodyLastEditDate;
         [JsonProperty("body_last_edit_date"), JsonConverter(typeof(UnixDateTimeConverter))]
         public DateTime BodyLastEditDate
         {
             set { bodyLastEditDate = value; NotifyOfPropertyChange(() => BodyLastEditDate); }
         }
 
+        private DateTime excerptLastEditDate;
         [JsonProperty("excerpt_last_edit_date"), JsonConverter(typeof(UnixDateTimeConverter))]
         public DateTime ExcerptLastEditDate
         {
             set { excerptLastEditDate = value; NotifyOfPropertyChange(() => ExcerptLastEditDate); }
         }
 
+        private ShallowUser lastBodyEditor;
+        [JsonProperty("last_body_editor")]
+        public ShallowUser LastBodyEditor
+        {
+            get { return lastBodyEditor; }
+            set { lastBodyEditor = value; NotifyOfPropertyChange(() => LastBodyEditor); }
+        }
+
+        private ShallowUser lastExcerptEditor;
         [JsonProperty("last_excerpt_editor")]
         public ShallowUser LastExcerptEditor
         {
             get { return lastExcerptEditor; }
             set { lastExcerptEditor = value; NotifyOfPropertyChange(() => LastExcerptEditor); }
         }
-
-        [JsonProperty("last_body_editor")]
-        public ShallowUser LastBodyEditor
-        {
-            get { return lastBodyEditor; }
-            set { lastBodyEditor = value; NotifyOfPropertyChange(() => LastBodyEditor); }
-        }
     }
-}
+}

File trunk/source/Stacky/Enums/AnswerTimePeriod.cs

+namespace Stacky
+{
+    using System.Runtime.Serialization;
+
+    public enum AnswerTimePeriod
+    {
+        [EnumMember]
+        AllTime,
+        Month
+    }
+}

File trunk/source/Stacky/Enums/TagSort.cs

         /// Popular.
         /// </summary>
         Popular,
+        Activity,
         /// <summary>
         /// Name.
         /// </summary>

File trunk/source/Stacky/Enums/UserSort.cs

         /// <summary>
         /// Name.
         /// </summary>
-        Name
+        Name,
+        /// <summary>
+        /// Modified
+        /// </summary>
+        Modified
     }
 }

File trunk/source/Stacky/Stacky.csproj

     <Compile Include="Entities\ShallowUser.cs" />
     <Compile Include="Entities\Site.cs" />
     <Compile Include="Entities\SiteInfo.cs" />
-    <Compile Include="Entities\SiteStats.cs" />
     <Compile Include="Entities\SiteStyle.cs" />
     <Compile Include="Entities\SortArgsAttribute.cs" />
     <Compile Include="Entities\SuggestedEdit.cs" />
     <Compile Include="Entities\Tag.cs" />
+    <Compile Include="Entities\TagScore.cs" />
     <Compile Include="Entities\TagSynonym.cs" />
     <Compile Include="Entities\TagWiki.cs" />
+    <Compile Include="Enums\AnswerTimePeriod.cs" />
     <Compile Include="Enums\TimelineType.cs" />
     <Compile Include="Entities\TopTag.cs" />
     <Compile Include="Entities\TopUser.cs" />
     <Compile Include="StackyClient\RevisionMethods.cs" />
     <Compile Include="StackyClient\StackyClient.cs" />
     <Compile Include="StackyClient\StatsMethods.cs" />
+    <Compile Include="StackyClient\SuggestedEditMethods.cs" />
     <Compile Include="StackyClient\TagMethods.cs" />
     <Compile Include="StackyClient\UserMethods.cs" />
     <Compile Include="UrlClient.cs" />

File trunk/source/Stacky/StackyClient/StatsMethods.cs

 {
     public partial class StackyClient
     {
-        public virtual SiteStats GetSiteStats()
+        public virtual SiteInfo GetSiteStats()
         {
-            return MakeRequest<SiteStats>("stats", null, new
+            return MakeRequest<SiteInfo>("info", null, new
             {
                 site = this.SiteUrlName
             }).Items.FirstOrDefault();

File trunk/source/Stacky/StackyClient/SuggestedEditMethods.cs

+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Stacky
+{
+    public partial class StackyClient
+    {
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits
+        /// </summary>
+        public IPagedList<SuggestedEdit> GetSuggestedEdits(SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            return Execute<SuggestedEdit>("suggested-edits", null,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits-by-ids
+        /// </summary>
+        public IPagedList<SuggestedEdit> GetSuggestedEdits(IEnumerable<int> ids, SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            return Execute<SuggestedEdit>("suggested-edits", new string[] { ids.Vectorize() },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits-by-ids
+        /// </summary>
+        public SuggestedEdit GetSuggestedEdit(int id, SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            return GetSuggestedEdits(id.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter).FirstOrDefault();
+        }
+    }
+}

File trunk/source/Stacky/StackyClient/TagMethods.cs

 {
     public partial class StackyClient
     {
-        public virtual IPagedList<Tag> GetTags(TagSort sortBy = TagSort.Popular, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/tags
+        /// </summary>
+        public IPagedList<Tag> GetTags(TagSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string inName = null, string filter = null)
         {
-            return GetTags("tags", null, sortBy.ToString().ToLower(), GetSortDirection(sortDirection), page, pageSize);
-        }
-
-        private IPagedList<Tag> GetTags(string method, string[] urlParameters, string sort, string order, int? page = null, int? pageSize = null)
-        {
-            var response = MakeRequest<Tag>(method, urlParameters, new
+            var response = MakeRequest<Tag>("tags", null, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sort,
-                order = order
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = min ?? null,
+                max = max ?? null,
+                inname = inName,
+                filter = filter
             });
             return new PagedList<Tag>(response);
         }
 
-        public virtual IPagedList<Tag> GetTagsByUser(int userId, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/tag-synonyms
+        /// </summary>
+        public IPagedList<TagSynonym> GetTagSynonyms(TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            return GetTagsByUser(userId.ToArray(), page, pageSize);
+            return Execute<TagSynonym>("tags", new string[] { "synonyms" },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual IPagedList<Tag> GetTagsByUser(IEnumerable<int> userIds, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/synonyms-by-tags
+        /// </summary>
+        public IPagedList<TagSynonym> GetTagSynonyms(IEnumerable<string> tags, TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            //TODO: does this method support sort and order?
-            return GetTags("users", new string[] { userIds.Vectorize(), "tags" }, null, null, page, pageSize);
+            return Execute<TagSynonym>("tags", new string[] { tags.Vectorize(), "synonyms" },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual IPagedList<TagSynonym> GetAllTagSynonyms(TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/synonyms-by-tags
+        /// </summary>
+        public IPagedList<TagSynonym> GetTagSynonyms(string tag, TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            var response = MakeRequest<TagSynonym>("tags", new string[] { "synonyms" }, new
+            return GetTagSynonyms(new string[] { tag }, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-answerers-on-tags
+        /// </summary>
+        public IPagedList<TagScore> GetTagTopAnswerers(string tag, int? page = null, int? pageSize = null, AnswerTimePeriod period = AnswerTimePeriod.AllTime, string filter = null)
+        {
+            var response = MakeRequest<TagScore>("tags", new string[] { tag, "top-answerers", GetEnumValue(period) }, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sortBy.ToString(),
-                order = GetSortDirection(sortDirection),
-                max = max,
-                min = min
+                filter = filter
             });
-            return new PagedList<TagSynonym>(response);
+            return new PagedList<TagScore>(response);
         }
 
-        public virtual IPagedList<TagSynonym> GetTagSynonyms(string tag, TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null, DateTime? fromDate = null, DateTime? toDate = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-askers-on-tags
+        /// </summary>
+        public IPagedList<TagScore> GetTagTopAskers(string tag, int? page = null, int? pageSize = null, AnswerTimePeriod period = AnswerTimePeriod.AllTime, string filter = null)
         {
-            return GetTagSynonyms(new string[] { tag }, sortBy, sortDirection, page, pageSize, min, max, fromDate, toDate);
-        }
-
-        public virtual IPagedList<TagSynonym> GetTagSynonyms(IEnumerable<string> tags, TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            var response = MakeRequest<TagSynonym>("tags", new string[] { tags.Vectorize(), "synonyms" }, new
+            var response = MakeRequest<TagScore>("tags", new string[] { tag, "top-askers", GetEnumValue(period) }, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sortBy.ToString(),
-                order = GetSortDirection(sortDirection),
-                max = max,
-                min = min,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
+                filter = filter
             });
-            return new PagedList<TagSynonym>(response);
+            return new PagedList<TagScore>(response);
         }
 
-        public IEnumerable<TagWiki> GetTagWikis(string tag)
-        {
-            return GetTagWikis(new string[] { tag });
-        }
-
-        public IEnumerable<TagWiki> GetTagWikis(IEnumerable<string> tags)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/wikis-by-tags
+        /// </summary>
+        public IPagedList<TagWiki> GetTagWikis(IEnumerable<string> tags, int? page = null, int? pageSize = 0, string filter = null)
         {
             var response = MakeRequest<TagWiki>("tags", new string[] { tags.Vectorize(), "wikis" }, new
             {
-                site = this.SiteUrlName
+                site = this.SiteUrlName,
+                page = page ?? null,
+                pagesize = pageSize ?? null,
+                filter = filter
             });
-            return response.Items;
+            return new PagedList<TagWiki>(response);
         }
 
         /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
+        /// See: http://api.stackexchange.com/docs/wikis-by-tags
         /// </summary>
-        /// <param name="tag">The name of the tag to query</param>
-        /// <param name="period">The period of time to query</param>
-        /// <returns></returns>
-        public IEnumerable<TopUser> GetTopAskers(string tag, TopUserPeriod period)
+        public IPagedList<TagWiki> GetTagWikis(string tag, int? page = null, int? pageSize = 0, string filter = null)
         {
-            return GetTopAskers(new string[] { tag }, period);
-        }
-
-        /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="tags">The list of tags to query</param>
-        /// <param name="period">The time period to query</param>
-        /// <returns></returns>
-        public IEnumerable<TopUser> GetTopAskers(IEnumerable<string> tags, TopUserPeriod period)
-        {
-            var sortArgs = period.GetAttribute<SortArgsAttribute>();
-            var response = MakeRequest<TopUser>("tags", new string[] { tags.Vectorize(), "top-askers", sortArgs.Sort }, new
-            {
-                site = this.SiteUrlName
-            });
-            return response.Items;
-        }
-
-        /// <summary>
-        /// Returns the top 30 question answerers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="tag">The name of the tag to query</param>
-        /// <param name="period">The period of time to query</param>
-        /// <returns></returns>
-        public IEnumerable<TopUser> GetTopAnswerers(string tag, TopUserPeriod period)
-        {
-            return GetTopAnswerers(new string[] { tag }, period);
-        }
-
-        /// <summary>
-        /// Returns the top 30 question answerers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="tags">The list of tags to query</param>
-        /// <param name="period">The time period to query</param>
-        /// <returns></returns>
-        public IEnumerable<TopUser> GetTopAnswerers(IEnumerable<string> tags, TopUserPeriod period)
-        {
-            var sortArgs = period.GetAttribute<SortArgsAttribute>();
-            var response = MakeRequest<TopUser>("tags", new string[] { tags.Vectorize(), "top-answerers", sortArgs.Sort }, new
-            {
-                site = this.SiteUrlName
-            });
-            return response.Items;
+            return GetTagWikis(new string[] { tag }, page, pageSize, filter);
         }
     }
 }

File trunk/source/Stacky/StackyClient/UserMethods.cs

 {
     public partial class StackyClient
     {
-        public virtual IPagedList<User> GetUsers(UserSort sortBy = UserSort.Reputation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, string filter = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/users
+        /// </summary>
+        public IPagedList<User> GetUsers(UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            var response = MakeRequest<User>("users", null, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                filter = filter,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null
-            });
-            return new PagedList<User>(response);
-        }
-
-        public virtual IPagedList<User> GetUsers(IEnumerable<int> userIds, UserSort sortBy = UserSort.Reputation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, string filter = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-           var response = MakeRequest<User>("users", new string[] { userIds.Vectorize() }, new
-           {
-               site = this.SiteUrlName,
-               page = page ?? null,
-               pagesize = pageSize ?? null,
-               filter = filter,
-               sort = sortBy.ToString().ToLower(),
-               order = GetSortDirection(sortDirection),
-               fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-               todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-               min = min ?? null,
-               max = max ?? null
-           });
-           return new PagedList<User>(response);
-        }
-
-        public virtual User GetUser(int userId)
-        {
-            return GetUsers(userId.ToArray()).FirstOrDefault();
-        }
-
-        public virtual IPagedList<Comment> GetUserMentions(int userId, UserMentionSort sortBy = UserMentionSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            return GetUserMentions(userId.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max);
-        }
-
-        public virtual IPagedList<Comment> GetUserMentions(IEnumerable<int> userIds, UserMentionSort sortBy = UserMentionSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            var response = MakeRequest<Comment>("users", new string[] { userIds.Vectorize(), "mentioned" }, new
-            {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                min = min ?? null,
-                max = max ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection)
-            });
-            return new PagedList<Comment>(response);
-        }
-
-        public virtual IPagedList<UserEvent> GetUserTimeline(int userId, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            return GetUserTimeline(userId.ToArray(), page, pageSize, fromDate, toDate);
-        }
-
-        public virtual IPagedList<UserEvent> GetUserTimeline(IEnumerable<int> userIds, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            var response = MakeRequest<UserEvent>("users", new string[] { userIds.Vectorize(), "timeline" }, new
-            {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                page = page ?? null,
-                pagesize = pageSize ?? null
-            });
-            return new PagedList<UserEvent>(response);
-        }
-
-        public virtual IPagedList<Reputation> GetUserReputation(int userId, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            return GetUserReputation(userId.ToArray(), page, pageSize, fromDate, toDate);
-        }
-
-        public virtual IPagedList<Reputation> GetUserReputation(IEnumerable<int> userIds, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            var response = MakeRequest<Reputation>("users", new string[] { userIds.Vectorize(), "reputation" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            });
-            return new PagedList<Reputation>(response);
-        }
-
-        public virtual IPagedList<User> GetModerators(int? page = null, int? pageSize = null, UserSort sortBy = UserSort.Reputation, SortDirection sortDirection = SortDirection.Descending, string filter = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            var response = MakeRequest<User>("users", new string[] { "moderators" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                filter = filter,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            });
-            return new PagedList<User>(response);
+            return Execute<User, Int32>("users", null,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userId which have no answers.
-        /// Questions returns by this method actually have zero undeleted answers.
+        /// See: http://api.stackexchange.com/docs/users-by-ids
         /// </summary>
-        public virtual IPagedList<Question> GetNoAnswerQuestions(int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public IPagedList<User> GetUsers(IEnumerable<int> ids, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            return GetNoAnswerQuestions(userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
+            return Execute<User, Int32>("users", new string[] { ids.Vectorize() },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userIds which have no answers.
-        /// Questions returns by this method actually have zero undeleted answers.
+        /// See: http://api.stackexchange.com/docs/users-by-ids
         /// </summary>
-        public virtual IPagedList<Question> GetNoAnswerQuestions(IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public User GetUser(int id, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            var response = MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "no-answers" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            });
-            return new PagedList<Question>(response);
+            return GetUsers(id.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter).FirstOrDefault();
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userId which have at least one answer, but no accepted answer.
-        /// Questions returned by this method have answers, but the owner has not opted to accept any of them.
+        /// See: http://api.stackexchange.com/docs/answers-on-users
         /// </summary>
-        public virtual IPagedList<Question> GetUnacceptedQuestions(int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public IPagedList<Answer> GetUserAnswers(IEnumerable<int> ids, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            return GetUnacceptedQuestions(userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
+            return Execute<Answer>("users", new string[] { ids.Vectorize(), "answers" },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userIds which have at least one answer, but no accepted answer.
-        /// Questions returned by this method have answers, but the owner has not opted to accept any of them.
+        /// See: http://api.stackexchange.com/docs/answers-on-users
         /// </summary>
-        public virtual IPagedList<Question> GetUnacceptedQuestions(IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public IPagedList<Answer> GetUserAnswers(int id, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            var response = MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "unaccepted" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            });
-            return new PagedList<Question>(response);
-        }
-
-        public virtual IPagedList<Question> GetUnansweredQuestions(int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
-        {
-            return GetUnansweredQuestions(userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
-        }
-
-        public virtual IPagedList<Question> GetUnansweredQuestions(IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
-        {
-            var response = MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "unanswered" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            });
-            return new PagedList<Question>(response);
+            return GetUserAnswers(id.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in resposne to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/badges-on-users
         /// </summary>
-        public virtual IEnumerable<Answer> GetTopTaggedAnswers(int userId, string tag, bool? includeBody = null, bool? includeComments = null)
+        public IPagedList<Badge> GetUserBadges(IEnumerable<int> ids, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, BadgeMinMax? min = null, BadgeMinMax? max = null, string filter = null)
         {
-            return GetTopTaggedAnswers(userId, new string[] { tag }, includeBody, includeComments);
+            return Execute<Badge, BadgeMinMax>("users", new string[] { ids.Vectorize(), "badges" },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in response to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/badges-on-users
         /// </summary>
-        public virtual IEnumerable<Answer> GetTopTaggedAnswers(int userId, IEnumerable<string> tags, bool? includeBody = null, bool? includeComments = null)
+        public IPagedList<Badge> GetUserBadges(int id, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, BadgeMinMax? min = null, BadgeMinMax? max = null, string filter = null)
         {
-            if (tags == null)
-                throw new ArgumentNullException("tags");
-
-            var response = MakeRequest<Answer>("users", new string[] { userId.ToString(), "tags", tags.Vectorize(), "top-answers" }, new
-            {
-                site = this.SiteUrlName,
-                body = includeBody,
-                comments = includeComments
-            });
-            return response.Items;
+            return GetUserBadges(id.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 questions a user has asked with the given tags.
+        /// See: http://api.stackexchange.com/docs/comments-on-users
         /// </summary>
-        public virtual IEnumerable<Question> GetTopTaggedQuestions(int userId, string tag, bool? includeBody = null, bool? includeComments = null, bool? includeAnswers = null)
+        public IPagedList<Comment> GetUserComments(IEnumerable<int> ids, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            return GetTopTaggedQuestions(userId, new string[] { tag }, includeBody, includeComments, includeAnswers);
+            return Execute<Comment>("users", new string[] { ids.Vectorize(), "comments" },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 questions a user has asked with the given tags.
+        /// See: http://api.stackexchange.com/docs/comments-on-users
         /// </summary>
-        public virtual IEnumerable<Question> GetTopTaggedQuestions(int userId, IEnumerable<string> tags, bool? includeBody = null, bool? includeComments = null, bool? includeAnswers = null)
+        public IPagedList<Comment> GetUserComments(int id, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            if (tags == null)
-                throw new ArgumentNullException("tags");
-
-            var response = MakeRequest<Question>("users", new string[] { userId.ToString(), "tags", tags.Vectorize(), "top-questions" }, new
-            {
-                site = this.SiteUrlName,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            });
-            return response.Items;
+            return GetUserComments(id.ToArray(), sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns a single user's top 30 tags by answer score.
+        /// See: http://api.stackexchange.com/docs/comments-by-users-to-user
         /// </summary>
-        public virtual IEnumerable<TopTag> GetTopAnswerTags(int userId)
+        public IPagedList<Comment> GetUserCommentsTo(IEnumerable<int> fromIds, IEnumerable<int> toIds, UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            var response = MakeRequest<TopTag>("users", new string[] { userId.ToString(), "top-answer-tags" }, new
-            {
-                site = this.SiteUrlName,
-                id = userId
-            });
-            return response.Items;
-        }
-
-        /// <summary>
-        /// Returns a single user's top 30 tags by question score.
-        /// </summary>
-        public virtual IEnumerable<TopTag> GetTopQuestionTags(int userId)
-        {
-            var response = MakeRequest<TopTag>("users", new string[] { userId.ToString(), "top-question-tags" }, new
-            {
-                site = this.SiteUrlName,
-                id = userId
-            });
-            return response.Items;
+            return Execute<Comment>("users", new string[] { fromIds.Vectorize(), "comments", toIds.Vectorize() },
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
     }
 }

File trunk/source/Stacky/StackyClientAsync/StatsMethods.cs

     public partial class StackyClientAsync : StackyClientBase
 #endif
     {
-        public virtual void GetSiteStats(Action<SiteStats> onSuccess, Action<ApiException> onError = null)
+        public virtual void GetSiteStats(Action<SiteInfo> onSuccess, Action<ApiException> onError = null)
         {
-            MakeRequest<SiteStats>("stats", null, new
+            MakeRequest<SiteInfo>("stats", null, new
             {
                 site = this.SiteUrlName
             }, results => onSuccess(results.Items.FirstOrDefault()), onError);

File trunk/source/Tests/Stacky.IntegrationTests/SiteStatsTests.cs

         }
 
         [TestMethod]
-        public void ContainsViewsPerDay()
+        public void ContainsQuestionsPerMinute()
         {
             var stats = Client.GetSiteStats();
             Assert.IsNotNull(stats);
-            Assert.IsTrue(stats.ViewsPerDay > 0);
+            Assert.IsTrue(stats.QuestionsPerMinute > 0);
         }
     }
 }

File trunk/source/Tests/Stacky.IntegrationTests/TagTests.cs

             ClientAsync.GetTags(tags => Assert.IsNotNull(tags), error => Assert.Fail());
         }
 
-        [TestMethod]
-        public void Tag_GetTagsByUser()
-        {
-            var tags = Client.GetTagsByUser(1464);
-            Assert.IsNotNull(tags);
-        }
+        //[TestMethod]
+        //public void Tag_GetTagsByUser()
+        //{
+        //    var tags = Client.GetTagsByUser(1464);
+        //    Assert.IsNotNull(tags);
+        //}
 
         [TestMethod]
         public void Tag_GetTagsByUser_Async()
             ClientAsync.GetTagsByUser(1464, tags => Assert.IsNotNull(tags), error => Assert.Fail());
         }
 
-        [TestMethod]
-        public void Tag_GetAllTagSynonyms()
-        {
-            var synonyms = Client.GetAllTagSynonyms();
-            Assert.IsNotNull(synonyms);
-            Assert.IsTrue(synonyms.TotalItems > 0);
-        }
+        //[TestMethod]
+        //public void Tag_GetAllTagSynonyms()
+        //{
+        //    var synonyms = Client.GetAllTagSynonyms();
+        //    Assert.IsNotNull(synonyms);
+        //    Assert.IsTrue(synonyms.TotalItems > 0);
+        //}
 
         [TestMethod]
         public void Tag_GetTagSynonyms()
             Assert.IsNotNull(synonyms);
         }
 
-        [TestMethod]
-        public void Tag_GetTagWikis()
-        {
-            var wikis = Client.GetTagWikis("java");
-            Assert.IsNotNull(wikis);
-            foreach (var wiki in wikis)
-            {
-                Assert.IsNotNull(wiki.LastBodyEditor);
-                Assert.IsNotNull(wiki.LastExcerptEditor);
-            }
-        }
+        //[TestMethod]
+        //public void Tag_GetTagWikis()
+        //{
+        //    var wikis = Client.GetTagWikis("java");
+        //    Assert.IsNotNull(wikis);
+        //    foreach (var wiki in wikis)
+        //    {
+        //        Assert.IsNotNull(wiki.LastBodyEditor);
+        //        Assert.IsNotNull(wiki.LastExcerptEditor);
+        //    }
+        //}
 
-        [TestMethod]
-        public void Tag_GetTopAskers()
-        {
-            var topUsers = Client.GetTopAskers("java", TopUserPeriod.AllTime);
-            Assert.IsNotNull(topUsers);
-            Assert.IsTrue(topUsers.Count() > 0);
-        }
+        //[TestMethod]
+        //public void Tag_GetTopAskers()
+        //{
+        //    var topUsers = Client.GetTopAskers("java", TopUserPeriod.AllTime);
+        //    Assert.IsNotNull(topUsers);
+        //    Assert.IsTrue(topUsers.Count() > 0);
+        //}
 
-        [TestMethod]
-        public void Tag_GetTopAnsweres()
-        {
-            var topUsers = Client.GetTopAnswerers("java", TopUserPeriod.AllTime);
-            Assert.IsNotNull(topUsers);
-            Assert.IsTrue(topUsers.Count() > 0);
-        }
+        //[TestMethod]
+        //public void Tag_GetTopAnsweres()
+        //{
+        //    var topUsers = Client.GetTopAnswerers("java", TopUserPeriod.AllTime);
+        //    Assert.IsNotNull(topUsers);
+        //    Assert.IsTrue(topUsers.Count() > 0);
+        //}
     }
 }

File trunk/source/Tests/Stacky.IntegrationTests/UserTests.cs

             Assert.IsTrue(users.TotalItems > 0);
         }
 
-        [TestMethod]
-        public void User_GetUserMentions()
-        {
-            var mentions = Client.GetUserMentions(22656);
-            Assert.IsNotNull(mentions);
-        }
+        //[TestMethod]
+        //public void User_GetUserMentions()
+        //{
+        //    var mentions = Client.GetUserMentions(22656);
+        //    Assert.IsNotNull(mentions);
+        //}
 
-        [TestMethod]
-        public void User_GetUserMentions_ContainsPagingInformation()
-        {
-            var mentions = Client.GetUserMentions(22656);
-            Assert.IsNotNull(mentions);
-            Assert.IsTrue(mentions.PageSize > 0);
-            Assert.IsTrue(mentions.CurrentPage > 0);
-            Assert.IsTrue(mentions.TotalItems > 0);
-        }
+        //[TestMethod]
+        //public void User_GetUserMentions_ContainsPagingInformation()
+        //{
+        //    var mentions = Client.GetUserMentions(22656);
+        //    Assert.IsNotNull(mentions);
+        //    Assert.IsTrue(mentions.PageSize > 0);
+        //    Assert.IsTrue(mentions.CurrentPage > 0);
+        //    Assert.IsTrue(mentions.TotalItems > 0);
+        //}
 
         [TestMethod]
         public void User_GetQuestionAnswers()
             Assert.IsTrue(answers.TotalItems > 0);
         }
 
-        [TestMethod]
-        public void User_GetUserTimeline()
-        {
-            var events = Client.GetUserTimeline(22656);
-            Assert.IsNotNull(events);
-        }
+        //[TestMethod]
+        //public void User_GetUserTimeline()
+        //{
+        //    var events = Client.GetUserTimeline(22656);
+        //    Assert.IsNotNull(events);
+        //}
 
-        [TestMethod]
-        public void User_GetUserTimeline_ContainsPagingInformation()
-        {
-            var events = Client.GetUserTimeline(22656);
-            Assert.IsNotNull(events);
-            Assert.IsTrue(events.PageSize > 0);
-            Assert.IsTrue(events.CurrentPage > 0);
-            Assert.IsTrue(events.TotalItems > 0);
-        }
+        //[TestMethod]
+        //public void User_GetUserTimeline_ContainsPagingInformation()
+        //{
+        //    var events = Client.GetUserTimeline(22656);
+        //    Assert.IsNotNull(events);
+        //    Assert.IsTrue(events.PageSize > 0);
+        //    Assert.IsTrue(events.CurrentPage > 0);
+        //    Assert.IsTrue(events.TotalItems > 0);
+        //}
 
-        [TestMethod]
-        public void User_GetUserReputation()
-        {
-            var rep = Client.GetUserReputation(22656);
-            Assert.IsNotNull(rep);
-        }
+        //[TestMethod]
+        //public void User_GetUserReputation()
+        //{
+        //    var rep = Client.GetUserReputation(22656);
+        //    Assert.IsNotNull(rep);
+        //}
 
-        [TestMethod]
-        public void User_GetUserReputation_ContainsPagingInformation()
-        {
-            var rep = Client.GetUserReputation(22656);
-            Assert.IsNotNull(rep);
-            Assert.IsTrue(rep.PageSize > 0);
-            Assert.IsTrue(rep.CurrentPage > 0);
-            Assert.IsTrue(rep.TotalItems > 0);
-        }
+        //[TestMethod]
+        //public void User_GetUserReputation_ContainsPagingInformation()
+        //{
+        //    var rep = Client.GetUserReputation(22656);
+        //    Assert.IsNotNull(rep);
+        //    Assert.IsTrue(rep.PageSize > 0);
+        //    Assert.IsTrue(rep.CurrentPage > 0);
+        //    Assert.IsTrue(rep.TotalItems > 0);
+        //}
 
         [TestMethod]
         public void User_Returns_Badge_Counts()
             Assert.IsTrue(user.BadgeCounts.Bronze > 0);
         }
 
-        [TestMethod]
-        public void GetModerators()
-        {
-            var users = Client.GetModerators();
-            Assert.IsNotNull(users);
-        }
+        //[TestMethod]
+        //public void GetModerators()
+        //{
+        //    var users = Client.GetModerators();
+        //    Assert.IsNotNull(users);
+        //}
 
-        [TestMethod]
-        public void User_GetNoAnswerQuestions()
-        {
-            var questions = Client.GetNoAnswerQuestions(238232);
-            Assert.IsNotNull(questions);
-        }
+        //[TestMethod]
+        //public void User_GetNoAnswerQuestions()
+        //{
+        //    var questions = Client.GetNoAnswerQuestions(238232);
+        //    Assert.IsNotNull(questions);
+        //}
 
-        [TestMethod]
-        public void User_GetUnacceptedQuestions()
-        {
-            var questions = Client.GetUnacceptedQuestions(38403);
-            Assert.IsNotNull(questions);
-        }
+        //[TestMethod]
+        //public void User_GetUnacceptedQuestions()
+        //{
+        //    var questions = Client.GetUnacceptedQuestions(38403);
+        //    Assert.IsNotNull(questions);
+        //}
 
-        [TestMethod]
-        public void User_GetUnansweredQuestions()
-        {
-            var questions = Client.GetUnansweredQuestions(38403);
-            Assert.IsNotNull(questions);
-        }
+        //[TestMethod]
+        //public void User_GetUnansweredQuestions()
+        //{
+        //    var questions = Client.GetUnansweredQuestions(38403);
+        //    Assert.IsNotNull(questions);
+        //}
 
-        [TestMethod]
-        public void User_GetTopTaggedAnswers()
-        {
-            var answers = Client.GetTopTaggedAnswers(646, "c#");
-            Assert.IsNotNull(answers);
-        }
+        //[TestMethod]
+        //public void User_GetTopTaggedAnswers()
+        //{
+        //    var answers = Client.GetTopTaggedAnswers(646, "c#");
+        //    Assert.IsNotNull(answers);
+        //}
 
-        [TestMethod]
-        public void User_GetTopTaggedQuestions()
-        {
-            var questions = Client.GetTopTaggedQuestions(646, "c#");
-            Assert.IsNotNull(questions);
-        }
+        //[TestMethod]
+        //public void User_GetTopTaggedQuestions()
+        //{
+        //    var questions = Client.GetTopTaggedQuestions(646, "c#");
+        //    Assert.IsNotNull(questions);
+        //}
 
-        [TestMethod]
-        public void User_GetTopAnswerTags()
-        {
-            var topTags = Client.GetTopAnswerTags(646);
-            Assert.IsNotNull(topTags);
-        }
+        //[TestMethod]
+        //public void User_GetTopAnswerTags()
+        //{
+        //    var topTags = Client.GetTopAnswerTags(646);
+        //    Assert.IsNotNull(topTags);
+        //}
 
-        [TestMethod]
-        public void User_GetTopQuestionTags()
-        {
-            var topTags = Client.GetTopQuestionTags(646);
-            Assert.IsNotNull(topTags);
-        }
+        //[TestMethod]
+        //public void User_GetTopQuestionTags()
+        //{
+        //    var topTags = Client.GetTopQuestionTags(646);
+        //    Assert.IsNotNull(topTags);
+        //}
     }
 }