OSDN Git Service

HttpTwitter.GetListMembersメソッドをTwitterApiクラスに置き換え
[opentween/open-tween.git] / OpenTween / Api / TwitterApi.cs
index 7b42c57..c8d1058 100644 (file)
@@ -21,6 +21,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading;
@@ -35,6 +36,8 @@ namespace OpenTween.Api
         public long CurrentUserId { get; private set; }
         public string CurrentScreenName { get; private set; }
 
+        public IApiConnection Connection => this.apiConnection;
+
         internal IApiConnection apiConnection;
 
         public void Initialize(string accessToken, string accessSecret, long userId, string screenName)
@@ -47,6 +50,65 @@ namespace OpenTween.Api
             this.CurrentScreenName = screenName;
         }
 
+        public Task<TwitterStatus[]> StatusesHomeTimeline(int? count = null, long? maxId = null, long? sinceId = null)
+        {
+            var endpoint = new Uri("statuses/home_timeline.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+
+            return this.apiConnection.GetAsync<TwitterStatus[]>(endpoint, param, "/statuses/home_timeline");
+        }
+
+        public Task<TwitterStatus[]> StatusesMentionsTimeline(int? count = null, long? maxId = null, long? sinceId = null)
+        {
+            var endpoint = new Uri("statuses/mentions_timeline.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+
+            return this.apiConnection.GetAsync<TwitterStatus[]>(endpoint, param, "/statuses/mentions_timeline");
+        }
+
+        public Task<TwitterStatus[]> StatusesUserTimeline(string screenName, int? count = null, long? maxId = null, long? sinceId = null)
+        {
+            var endpoint = new Uri("statuses/user_timeline.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["screen_name"] = screenName,
+                ["include_rts"] = "true",
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+
+            return this.apiConnection.GetAsync<TwitterStatus[]>(endpoint, param, "/statuses/user_timeline");
+        }
+
         public Task<TwitterStatus> StatusesShow(long statusId)
         {
             var endpoint = new Uri("statuses/show.json", UriKind.Relative);
@@ -54,9 +116,28 @@ namespace OpenTween.Api
             {
                 ["id"] = statusId.ToString(),
                 ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            return this.apiConnection.GetAsync<TwitterStatus>(endpoint, param, "/statuses/show/:id");
+        }
+
+        public Task<LazyJson<TwitterStatus>> StatusesUpdate(string status, long? replyToId, IReadOnlyList<long> mediaIds)
+        {
+            var endpoint = new Uri("statuses/update.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["status"] = status,
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
             };
 
-            return this.apiConnection.GetAsync<TwitterStatus>(endpoint, param);
+            if (replyToId != null)
+                param["in_reply_to_status_id"] = replyToId.ToString();
+            if (mediaIds != null && mediaIds.Count > 0)
+                param.Add("media_ids", string.Join(",", mediaIds));
+
+            return this.apiConnection.PostLazyAsync<TwitterStatus>(endpoint, param);
         }
 
         public Task<LazyJson<TwitterStatus>> StatusesDestroy(long statusId)
@@ -70,6 +151,182 @@ namespace OpenTween.Api
             return this.apiConnection.PostLazyAsync<TwitterStatus>(endpoint, param);
         }
 
+        public Task<LazyJson<TwitterStatus>> StatusesRetweet(long statusId)
+        {
+            var endpoint = new Uri("statuses/retweet.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["id"] = statusId.ToString(),
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            return this.apiConnection.PostLazyAsync<TwitterStatus>(endpoint, param);
+        }
+
+        public Task<TwitterLists> ListsOwnerships(string screenName, long? cursor = null)
+        {
+            var endpoint = new Uri("lists/ownerships.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["screen_name"] = screenName,
+            };
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterLists>(endpoint, param, "/lists/ownerships");
+        }
+
+        public Task<TwitterLists> ListsSubscriptions(string screenName, long? cursor = null)
+        {
+            var endpoint = new Uri("lists/subscriptions.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["screen_name"] = screenName,
+            };
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterLists>(endpoint, param, "/lists/subscriptions");
+        }
+
+        public Task<LazyJson<TwitterList>> ListsCreate(string name, string description = null, bool? @private = null)
+        {
+            var endpoint = new Uri("lists/create.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["name"] = name,
+            };
+
+            if (description != null)
+                param["description"] = description;
+            if (@private != null)
+                param["mode"] = @private.Value ? "private" : "public";
+
+            return this.apiConnection.PostLazyAsync<TwitterList>(endpoint, param);
+        }
+
+        public Task<LazyJson<TwitterList>> ListsUpdate(long listId, string name = null, string description = null, bool? @private = null)
+        {
+            var endpoint = new Uri("lists/update.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["list_id"] = listId.ToString(),
+            };
+
+            if (name != null)
+                param["name"] = name;
+            if (description != null)
+                param["description"] = description;
+            if (@private != null)
+                param["mode"] = @private.Value ? "private" : "public";
+
+            return this.apiConnection.PostLazyAsync<TwitterList>(endpoint, param);
+        }
+
+        public Task<LazyJson<TwitterList>> ListsDestroy(long listId)
+        {
+            var endpoint = new Uri("lists/destroy.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["list_id"] = listId.ToString(),
+            };
+
+            return this.apiConnection.PostLazyAsync<TwitterList>(endpoint, param);
+        }
+
+        public Task<TwitterStatus[]> ListsStatuses(long listId, int? count = null, long? maxId = null, long? sinceId = null, bool? includeRTs = null)
+        {
+            var endpoint = new Uri("lists/statuses.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["list_id"] = listId.ToString(),
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+            if (includeRTs != null)
+                param["include_rts"] = includeRTs.Value ? "true" : "false";
+
+            return this.apiConnection.GetAsync<TwitterStatus[]>(endpoint, param, "/lists/statuses");
+        }
+
+        public Task<TwitterUsers> ListsMembers(long listId, long? cursor = null)
+        {
+            var endpoint = new Uri("lists/members.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["list_id"] = listId.ToString(),
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterUsers>(endpoint, param, "/lists/members");
+        }
+
+        public Task<TwitterDirectMessage[]> DirectMessagesRecv(int? count = null, long? maxId = null, long? sinceId = null)
+        {
+            var endpoint = new Uri("direct_messages.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["full_text"] = "true",
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+
+            return this.apiConnection.GetAsync<TwitterDirectMessage[]>(endpoint, param, "/direct_messages");
+        }
+
+        public Task<TwitterDirectMessage[]> DirectMessagesSent(int? count = null, long? maxId = null, long? sinceId = null)
+        {
+            var endpoint = new Uri("direct_messages/sent.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["full_text"] = "true",
+                ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
+            };
+
+            if (count != null)
+                param["count"] = count.ToString();
+            if (maxId != null)
+                param["max_id"] = maxId.ToString();
+            if (sinceId != null)
+                param["since_id"] = sinceId.ToString();
+
+            return this.apiConnection.GetAsync<TwitterDirectMessage[]>(endpoint, param, "/direct_messages/sent");
+        }
+
+        public Task<LazyJson<TwitterDirectMessage>> DirectMessagesNew(string status, string sendTo)
+        {
+            var endpoint = new Uri("direct_messages/new.json", UriKind.Relative);
+            var param = new Dictionary<string, string>
+            {
+                ["text"] = status,
+                ["screen_name"] = sendTo,
+            };
+
+            return this.apiConnection.PostLazyAsync<TwitterDirectMessage>(endpoint, param);
+        }
+
         public Task<LazyJson<TwitterDirectMessage>> DirectMessagesDestroy(long statusId)
         {
             var endpoint = new Uri("direct_messages/destroy.json", UriKind.Relative);
@@ -88,9 +345,10 @@ namespace OpenTween.Api
             {
                 ["screen_name"] = screenName,
                 ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
             };
 
-            return this.apiConnection.GetAsync<TwitterUser>(endpoint, param);
+            return this.apiConnection.GetAsync<TwitterUser>(endpoint, param, "/users/show/:id");
         }
 
         public Task<LazyJson<TwitterUser>> UsersReportSpam(string screenName)
@@ -135,7 +393,7 @@ namespace OpenTween.Api
                 ["target_screen_name"] = targetScreenName,
             };
 
-            return this.apiConnection.GetAsync<TwitterFriendship>(endpoint, param);
+            return this.apiConnection.GetAsync<TwitterFriendship>(endpoint, param, "/friendships/show");
         }
 
         public Task<LazyJson<TwitterFriendship>> FriendshipsCreate(string screenName)
@@ -160,6 +418,46 @@ namespace OpenTween.Api
             return this.apiConnection.PostLazyAsync<TwitterFriendship>(endpoint, param);
         }
 
+        public Task<long[]> NoRetweetIds(long? cursor = null)
+        {
+            var endpoint = new Uri("friendships/no_retweets/ids.json", UriKind.Relative);
+
+            return this.apiConnection.GetAsync<long[]>(endpoint, null, "/friendships/no_retweets/ids");
+        }
+
+        public Task<TwitterIds> FollowersIds(long? cursor = null)
+        {
+            var endpoint = new Uri("followers/ids.json", UriKind.Relative);
+            var param = new Dictionary<string, string>();
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterIds>(endpoint, param, "/followers/ids");
+        }
+
+        public Task<TwitterIds> MutesUsersIds(long? cursor = null)
+        {
+            var endpoint = new Uri("mutes/users/ids.json", UriKind.Relative);
+            var param = new Dictionary<string, string>();
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterIds>(endpoint, param, "/mutes/users/ids");
+        }
+
+        public Task<TwitterIds> BlocksIds(long? cursor = null)
+        {
+            var endpoint = new Uri("blocks/ids.json", UriKind.Relative);
+            var param = new Dictionary<string, string>();
+
+            if (cursor != null)
+                param["cursor"] = cursor.ToString();
+
+            return this.apiConnection.GetAsync<TwitterIds>(endpoint, param, "/blocks/ids");
+        }
+
         public Task<LazyJson<TwitterUser>> BlocksCreate(string screenName)
         {
             var endpoint = new Uri("blocks/create.json", UriKind.Relative);
@@ -188,6 +486,7 @@ namespace OpenTween.Api
             var param = new Dictionary<string, string>
             {
                 ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
             };
 
             if (name != null)
@@ -214,6 +513,7 @@ namespace OpenTween.Api
             var param = new Dictionary<string, string>
             {
                 ["include_entities"] = "true",
+                ["include_ext_alt_text"] = "true",
             };
             var paramMedia = new Dictionary<string, IMediaItem>
             {
@@ -223,6 +523,49 @@ namespace OpenTween.Api
             return this.apiConnection.PostLazyAsync<TwitterUser>(endpoint, param, paramMedia);
         }
 
+        public Task<TwitterRateLimits> ApplicationRateLimitStatus()
+        {
+            var endpoint = new Uri("application/rate_limit_status.json", UriKind.Relative);
+
+            return this.apiConnection.GetAsync<TwitterRateLimits>(endpoint, null, "/application/rate_limit_status");
+        }
+
+        public Task<TwitterConfiguration> Configuration()
+        {
+            var endpoint = new Uri("help/configuration.json", UriKind.Relative);
+
+            return this.apiConnection.GetAsync<TwitterConfiguration>(endpoint, null, "/help/configuration");
+        }
+
+        public Task<LazyJson<TwitterUploadMediaResult>> MediaUpload(IMediaItem media)
+        {
+            var endpoint = new Uri("https://upload.twitter.com/1.1/media/upload.json");
+            var paramMedia = new Dictionary<string, IMediaItem>
+            {
+                ["media"] = media,
+            };
+
+            return this.apiConnection.PostLazyAsync<TwitterUploadMediaResult>(endpoint, null, paramMedia);
+        }
+
+        public Task<Stream> UserStreams(string replies = null, string track = null)
+        {
+            var endpoint = new Uri("https://userstream.twitter.com/1.1/user.json");
+            var param = new Dictionary<string, string>();
+
+            if (replies != null)
+                param["replies"] = replies;
+            if (track != null)
+                param["track"] = track;
+
+            return this.apiConnection.GetStreamAsync(endpoint, param);
+        }
+
+        public OAuthEchoHandler CreateOAuthEchoHandler(Uri authServiceProvider, Uri realm = null)
+        {
+            return ((TwitterApiConnection)this.apiConnection).CreateOAuthEchoHandler(authServiceProvider, realm);
+        }
+
         public void Dispose()
         {
             this.apiConnection?.Dispose();