{
var mock = new Mock<IApiConnection>();
mock.Setup(x =>
- x.PostJsonAsync(
+ x.PostJsonAsync<TwitterMessageEventSingle>(
new Uri("direct_messages/events/new.json", UriKind.Relative),
@"{
""event"": {
}
}")
)
- .Returns(Task.CompletedTask);
+ .ReturnsAsync(LazyJson.Create(new TwitterMessageEventSingle()));
twitterApi.apiConnection = mock.Object;
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\""),
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);
}
}
}
[DataContract]
+ public class TwitterMessageEventSingle
+ {
+ [DataMember(Name = "event")]
+ public TwitterMessageEvent Event { get; set; }
+ }
+
+ [DataContract]
public class TwitterMessageEvent
{
[DataMember(Name = "created_timestamp")]
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);
}}
}}";
- return this.apiConnection.PostJsonAsync(endpoint, json);
+ return this.apiConnection.PostJsonAsync<TwitterMessageEventSingle>(endpoint, json);
}
public Task DirectMessagesEventsDestroy(string eventId)
Task PostJsonAsync(Uri uri, string json);
+ Task<LazyJson<T>> PostJsonAsync<T>(Uri uri, string json);
+
Task DeleteAsync(Uri uri);
}
}
}
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);
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)
{
==== 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のサムネイル表示時にエラーが表示される場合がある不具合を修正
{
this._statuses.AddPost(post);
this._statuses.DistributePosts();
- this.RefreshTimeline();
}
+ this.RefreshTimeline();
}
}
}
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);
}
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();