OSDN Git Service

DM送信完了時のレスポンスを即座にDirectタブに反映させる
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 8 Jul 2019 19:00:23 +0000 (04:00 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Tue, 16 Jul 2019 13:00:08 +0000 (22:00 +0900)
OpenTween.Tests/Api/TwitterApiTest.cs
OpenTween.Tests/Connection/TwitterApiConnectionTest.cs
OpenTween/Api/DataModel/TwitterMessageEvent.cs
OpenTween/Api/TwitterApi.cs
OpenTween/Connection/IApiConnection.cs
OpenTween/Connection/TwitterApiConnection.cs
OpenTween/Resources/ChangeLog.txt
OpenTween/Tween.cs
OpenTween/Twitter.cs

index 65ca27c..40f9f8e 100644 (file)
@@ -696,7 +696,7 @@ namespace OpenTween.Api
             {
                 var mock = new Mock<IApiConnection>();
                 mock.Setup(x =>
-                    x.PostJsonAsync(
+                    x.PostJsonAsync<TwitterMessageEventSingle>(
                         new Uri("direct_messages/events/new.json", UriKind.Relative),
                         @"{
   ""event"": {
@@ -718,7 +718,7 @@ namespace OpenTween.Api
   }
 }")
                 )
-                .Returns(Task.CompletedTask);
+                .ReturnsAsync(LazyJson.Create(new TwitterMessageEventSingle()));
 
                 twitterApi.apiConnection = mock.Object;
 
index c375f8e..11d2623 100644 (file)
@@ -479,6 +479,40 @@ namespace OpenTween.Connection
 
                     Assert.Equal("{\"aaaa\": 1111}", body);
 
+                    return new HttpResponseMessage(HttpStatusCode.NoContent);
+                });
+
+                var endpoint = new Uri("hoge/tetete.json", UriKind.Relative);
+
+                await apiConnection.PostJsonAsync(endpoint, "{\"aaaa\": 1111}")
+                    .ConfigureAwait(false);
+
+                Assert.Equal(0, mockHandler.QueueCount);
+            }
+        }
+
+        [Fact]
+        public async Task PostJsonAsync_T_Test()
+        {
+            using (var mockHandler = new HttpMessageHandlerMock())
+            using (var http = new HttpClient(mockHandler))
+            using (var apiConnection = new TwitterApiConnection("", ""))
+            {
+                apiConnection.http = http;
+
+                mockHandler.Enqueue(async x =>
+                {
+                    Assert.Equal(HttpMethod.Post, x.Method);
+                    Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json",
+                        x.RequestUri.AbsoluteUri);
+
+                    Assert.Equal("application/json; charset=utf-8", x.Content.Headers.ContentType.ToString());
+
+                    var body = await x.Content.ReadAsStringAsync()
+                        .ConfigureAwait(false);
+
+                    Assert.Equal("{\"aaaa\": 1111}", body);
+
                     return new HttpResponseMessage(HttpStatusCode.OK)
                     {
                         Content = new StringContent("\"hogehoge\""),
@@ -487,9 +521,14 @@ namespace OpenTween.Connection
 
                 var endpoint = new Uri("hoge/tetete.json", UriKind.Relative);
 
-                await apiConnection.PostJsonAsync(endpoint, "{\"aaaa\": 1111}")
+                var response = await apiConnection.PostJsonAsync<string>(endpoint, "{\"aaaa\": 1111}")
                     .ConfigureAwait(false);
 
+                var result = await response.LoadJsonAsync()
+                    .ConfigureAwait(false);
+
+                Assert.Equal("hogehoge", result);
+
                 Assert.Equal(0, mockHandler.QueueCount);
             }
         }
index e1b97e0..d3d6129 100644 (file)
@@ -52,6 +52,13 @@ namespace OpenTween.Api.DataModel
     }
 
     [DataContract]
+    public class TwitterMessageEventSingle
+    {
+        [DataMember(Name = "event")]
+        public TwitterMessageEvent Event { get; set; }
+    }
+
+    [DataContract]
     public class TwitterMessageEvent
     {
         [DataMember(Name = "created_timestamp")]
index 4166226..f57b52d 100644 (file)
@@ -394,7 +394,7 @@ namespace OpenTween.Api
             return this.apiConnection.GetAsync<TwitterMessageEventList>(endpoint, param, "/direct_messages/events/list");
         }
 
-        public Task DirectMessagesEventsNew(long recipientId, string text, long? mediaId = null)
+        public Task<LazyJson<TwitterMessageEventSingle>> DirectMessagesEventsNew(long recipientId, string text, long? mediaId = null)
         {
             var endpoint = new Uri("direct_messages/events/new.json", UriKind.Relative);
 
@@ -424,7 +424,7 @@ namespace OpenTween.Api
   }}
 }}";
 
-            return this.apiConnection.PostJsonAsync(endpoint, json);
+            return this.apiConnection.PostJsonAsync<TwitterMessageEventSingle>(endpoint, json);
         }
 
         public Task DirectMessagesEventsDestroy(string eventId)
index 3c9822a..ed0a9a6 100644 (file)
@@ -44,6 +44,8 @@ namespace OpenTween.Connection
 
         Task PostJsonAsync(Uri uri, string json);
 
+        Task<LazyJson<T>> PostJsonAsync<T>(Uri uri, string json);
+
         Task DeleteAsync(Uri uri);
     }
 }
index 5333931..051f7ca 100644 (file)
@@ -327,6 +327,11 @@ namespace OpenTween.Connection
         }
 
         public async Task PostJsonAsync(Uri uri, string json)
+            => await this.PostJsonAsync<object>(uri, json)
+                         .IgnoreResponse()
+                         .ConfigureAwait(false);
+
+        public async Task<LazyJson<T>> PostJsonAsync<T>(Uri uri, string json)
         {
             var requestUri = new Uri(RestApiBase, uri);
             var request = new HttpRequestMessage(HttpMethod.Post, requestUri);
@@ -337,12 +342,16 @@ namespace OpenTween.Connection
 
                 try
                 {
-                    using (var response = await this.http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
-                        .ConfigureAwait(false))
-                    {
-                        await this.CheckStatusCode(response)
-                            .ConfigureAwait(false);
-                    }
+                    var response = await this.http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
+                        .ConfigureAwait(false);
+
+                    await this.CheckStatusCode(response)
+                        .ConfigureAwait(false);
+
+                    var result = new LazyJson<T>(response);
+                    response = null;
+
+                    return result;
                 }
                 catch (HttpRequestException ex)
                 {
index 795e506..7a84651 100644 (file)
@@ -3,6 +3,7 @@
 ==== Ver 2.3.2-dev(2019/xx/xx)
  * NEW: Twemoji 12.0.0 に対応しました
   - Unicode 12.0 で追加された絵文字が表示されるようになります
+ * CHG: DMの送信が完了したらDirectタブに送信したDMを即座に反映する
  * CHG: htn.to の短縮URLを展開する際に強制的にHTTPSを使用する
  * FIX: Twemojiを有効にすると絵文字の後に余分な文字が表示される場合がある不具合を修正
  * FIX: Tumblrのサムネイル表示時にエラーが表示される場合がある不具合を修正
index 5c539e4..459ddf7 100644 (file)
@@ -2734,8 +2734,8 @@ namespace OpenTween
                     {
                         this._statuses.AddPost(post);
                         this._statuses.DistributePosts();
-                        this.RefreshTimeline();
                     }
+                    this.RefreshTimeline();
                 }
             }
         }
index 39045f9..f0217b7 100644 (file)
@@ -381,7 +381,13 @@ namespace OpenTween
             var recipient = await this.Api.UsersShow(recipientName)
                 .ConfigureAwait(false);
 
-            await this.Api.DirectMessagesEventsNew(recipient.Id, body, mediaId)
+            var response = await this.Api.DirectMessagesEventsNew(recipient.Id, body, mediaId)
+                .ConfigureAwait(false);
+
+            var messageEventSingle = await response.LoadJsonAsync()
+                .ConfigureAwait(false);
+
+            await this.CreateDirectMessagesEventFromJson(messageEventSingle, read: true)
                 .ConfigureAwait(false);
         }
 
@@ -1232,6 +1238,24 @@ namespace OpenTween
 
             this.nextCursorDirectMessage = eventList.NextCursor;
 
+            await this.CreateDirectMessagesEventFromJson(eventList, read)
+                .ConfigureAwait(false);
+        }
+
+        private async Task CreateDirectMessagesEventFromJson(TwitterMessageEventSingle eventSingle, bool read)
+        {
+            var eventList = new TwitterMessageEventList
+            {
+                Apps = new Dictionary<string, TwitterMessageEventList.App>(),
+                Events = new[] { eventSingle.Event },
+            };
+
+            await this.CreateDirectMessagesEventFromJson(eventList, read)
+                .ConfigureAwait(false);
+        }
+
+        private async Task CreateDirectMessagesEventFromJson(TwitterMessageEventList eventList, bool read)
+        {
             var events = eventList.Events
                 .Where(x => x.Type == "message_create")
                 .ToArray();