Skip to content

Commit 805cd02

Browse files
committed
#1066 Added GetTweet to RawExecutors.TweetsV2
1 parent a575868 commit 805cd02

25 files changed

+471
-26
lines changed

Tweetinvi.NETCore.sln.DotSettings

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=InheritdocInvalidUsage/@EntryIndexedValue">HINT</s:String>
3+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ALL/@EntryIndexedValue">ALL</s:String>
34

45
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AND/@EntryIndexedValue">AND</s:String>
56
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue">API</s:String>

src/Tweetinvi.Controllers/Properties/Resources.cs

+5
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,11 @@ public static class Resources
408408
/// </summary>
409409
public static string Tweet_Get = "https://api.twitter.com/1.1/statuses/show.json?";
410410

411+
/// <summary>
412+
/// Looks up a localized string similar to https://api.twitter.com/1.1/statuses/show.json?.
413+
/// </summary>
414+
public static string TweetV2_Get = "https://api.twitter.com/2/tweets";
415+
411416
/// <summary>
412417
/// Looks up a localized string similar to https://api.twitter.com/1.1/statuses/retweeters/ids.json.
413418
/// </summary>

src/Tweetinvi.Controllers/Tweet/ITweetHelper.cs

-19
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Threading.Tasks;
2+
using Tweetinvi.Core.Controllers.V2;
3+
using Tweetinvi.Core.Web;
4+
using Tweetinvi.Models;
5+
using Tweetinvi.Models.V2;
6+
using Tweetinvi.Models.V2.Responses;
7+
using Tweetinvi.Parameters.V2;
8+
9+
namespace Tweetinvi.Controllers.Tweet
10+
{
11+
public class TweetsV2Controller : ITweetsV2Controller
12+
{
13+
private readonly ITweetsV2QueryExecutor _queryExecutor;
14+
15+
public TweetsV2Controller(ITweetsV2QueryExecutor queryExecutor)
16+
{
17+
_queryExecutor = queryExecutor;
18+
}
19+
20+
public Task<ITwitterResult<TweetResponseDTO>> GetTweetAsync(IGetTweetV2Parameters parameters, ITwitterRequest request)
21+
{
22+
return _queryExecutor.GetTweetAsync(parameters, request);
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Threading.Tasks;
2+
using Tweetinvi.Core.Web;
3+
using Tweetinvi.Models;
4+
using Tweetinvi.Models.V2.Responses;
5+
using Tweetinvi.Parameters.V2;
6+
7+
namespace Tweetinvi.Controllers.Tweet
8+
{
9+
public interface ITweetsV2QueryExecutor
10+
{
11+
Task<ITwitterResult<TweetResponseDTO>> GetTweetAsync(IGetTweetV2Parameters parameters, ITwitterRequest request);
12+
}
13+
14+
public class TweetsV2QueryExecutor : ITweetsV2QueryExecutor
15+
{
16+
private readonly ITweetsV2QueryGenerator _tweetQueryGenerator;
17+
private readonly ITwitterAccessor _twitterAccessor;
18+
19+
public TweetsV2QueryExecutor(
20+
ITweetsV2QueryGenerator tweetQueryGenerator,
21+
ITwitterAccessor twitterAccessor)
22+
{
23+
_tweetQueryGenerator = tweetQueryGenerator;
24+
_twitterAccessor = twitterAccessor;
25+
}
26+
27+
public Task<ITwitterResult<TweetResponseDTO>> GetTweetAsync(IGetTweetV2Parameters parameters, ITwitterRequest request)
28+
{
29+
request.Query.Url = _tweetQueryGenerator.GetTweetQuery(parameters);
30+
return _twitterAccessor.ExecuteRequestAsync<TweetResponseDTO>(request);
31+
}
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Text;
2+
using Tweetinvi.Controllers.Properties;
3+
using Tweetinvi.Core.Extensions;
4+
using Tweetinvi.Parameters.V2;
5+
6+
namespace Tweetinvi.Controllers.Tweet
7+
{
8+
public interface ITweetsV2QueryGenerator
9+
{
10+
string GetTweetQuery(IGetTweetV2Parameters parameters);
11+
}
12+
13+
public class TweetsV2QueryGenerator : ITweetsV2QueryGenerator
14+
{
15+
public string GetTweetQuery(IGetTweetV2Parameters parameters)
16+
{
17+
var query = new StringBuilder($"{Resources.TweetV2_Get}/{parameters.TweetId}");
18+
query.AddParameterToQuery("expansions", parameters.Expansions);
19+
query.AddParameterToQuery("media.fields", parameters.MediaFields);
20+
query.AddParameterToQuery("place.fields", parameters.PlaceFields);
21+
query.AddParameterToQuery("poll.fields", parameters.PollFields);
22+
query.AddParameterToQuery("tweet.fields", parameters.TweetFields);
23+
query.AddParameterToQuery("user.fields", parameters.UserFields);
24+
return query.ToString();
25+
}
26+
}
27+
}

src/Tweetinvi.Controllers/TweetinviControllersModule.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Tweetinvi.Controllers.Upload;
1212
using Tweetinvi.Controllers.User;
1313
using Tweetinvi.Core.Controllers;
14+
using Tweetinvi.Core.Controllers.V2;
1415
using Tweetinvi.Core.Injectinvi;
1516
using Tweetinvi.Core.QueryGenerators;
1617
using Tweetinvi.Core.Upload;
@@ -44,6 +45,9 @@ private void InitializeControllers(ITweetinviContainer container)
4445
container.RegisterType<IAccountActivityController, AccountActivityController>(RegistrationLifetime.InstancePerApplication);
4546

4647
container.RegisterType<IChunkedUploader, ChunkedUploader>();
48+
49+
// v2
50+
container.RegisterType<ITweetsV2Controller, TweetsV2Controller>(RegistrationLifetime.InstancePerApplication);
4751
}
4852

4953
private void InitializeQueryExecutors(ITweetinviContainer container)
@@ -62,6 +66,9 @@ private void InitializeQueryExecutors(ITweetinviContainer container)
6266
container.RegisterType<ISearchQueryExecutor, SearchQueryExecutor>();
6367
container.RegisterType<IUploadQueryExecutor, UploadQueryExecutor>();
6468
container.RegisterType<IUploadMediaStatusQueryExecutor, UploadMediaStatusQueryExecutor>();
69+
70+
// v2
71+
container.RegisterType<ITweetsV2QueryExecutor, TweetsV2QueryExecutor>();
6572
}
6673

6774
private void InitializeQueryGenerators(ITweetinviContainer container)
@@ -85,11 +92,13 @@ private void InitializeQueryGenerators(ITweetinviContainer container)
8592
container.RegisterType<ISearchQueryParameterGenerator, SearchQueryParameterGenerator>(RegistrationLifetime.InstancePerApplication);
8693

8794
container.RegisterType<IUploadQueryGenerator, UploadQueryGenerator>(RegistrationLifetime.InstancePerApplication);
95+
96+
// v2
97+
container.RegisterType<ITweetsV2QueryGenerator, TweetsV2QueryGenerator>(RegistrationLifetime.InstancePerApplication);
8898
}
8999

90100
private void InitializeHelpers(ITweetinviContainer container)
91101
{
92-
container.RegisterType<ITweetHelper, TweetHelper>();
93102
container.RegisterType<IUploadHelper, UploadHelper>(RegistrationLifetime.InstancePerApplication);
94103
}
95104
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Threading.Tasks;
2+
using Tweetinvi.Core.Web;
3+
using Tweetinvi.Models;
4+
using Tweetinvi.Models.V2.Responses;
5+
using Tweetinvi.Parameters.V2;
6+
7+
namespace Tweetinvi.Core.Controllers.V2
8+
{
9+
public interface ITweetsV2Controller
10+
{
11+
Task<ITwitterResult<TweetResponseDTO>> GetTweetAsync(IGetTweetV2Parameters parameters, ITwitterRequest request);
12+
}
13+
}

src/Tweetinvi.Core/Core/Extensions/StringExtension.cs

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Globalization;
4+
using System.Linq;
35
using System.Text;
46
using System.Text.RegularExpressions;
57
using Tweetinvi.Core.Helpers;
@@ -315,6 +317,11 @@ public static void AddParameterToQuery<T>(this StringBuilder queryBuilder, strin
315317
{
316318
var stringValue = parameterValue.ToString();
317319

320+
if (parameterValue is HashSet<string> hashsetValue)
321+
{
322+
stringValue = string.Join(",", hashsetValue);
323+
}
324+
318325
if (parameterValue is double)
319326
{
320327
stringValue = ((double) (object) parameterValue).ToString(CultureInfo.InvariantCulture);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System.Collections.Generic;
2+
using Tweetinvi.Parameters;
3+
using Tweetinvi.Parameters.V2;
4+
5+
namespace Tweetinvi.Core.Parameters
6+
{
7+
public interface IBaseTweetsV2Parameters : ICustomRequestParameters
8+
{
9+
HashSet<string> Expansions { get; set; }
10+
HashSet<string> MediaFields { get; set; }
11+
HashSet<string> PlaceFields { get; set; }
12+
HashSet<string> PollFields { get; set; }
13+
HashSet<string> TweetFields { get; set; }
14+
HashSet<string> UserFields { get; set; }
15+
}
16+
17+
public class BaseTweetsV2Parameters : CustomRequestParameters, IBaseTweetsV2Parameters
18+
{
19+
public BaseTweetsV2Parameters()
20+
{
21+
InitializeAllFields();
22+
this.WithAllFields();
23+
}
24+
25+
public virtual void ClearAllFields()
26+
{
27+
InitializeAllFields();
28+
}
29+
30+
private void InitializeAllFields()
31+
{
32+
Expansions = new HashSet<string>();
33+
MediaFields = new HashSet<string>();
34+
PlaceFields = new HashSet<string>();
35+
PollFields = new HashSet<string>();
36+
TweetFields = new HashSet<string>();
37+
UserFields = new HashSet<string>();
38+
}
39+
40+
public HashSet<string> Expansions { get; set; }
41+
public HashSet<string> MediaFields { get; set; }
42+
public HashSet<string> PlaceFields { get; set; }
43+
public HashSet<string> PollFields { get; set; }
44+
public HashSet<string> TweetFields { get; set; }
45+
public HashSet<string> UserFields { get; set; }
46+
}
47+
}

src/Tweetinvi.Core/Public/Client/IRawExecutors.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Tweetinvi.Client.Requesters;
2+
using Tweetinvi.Client.Requesters.V2;
23

34
namespace Tweetinvi.Client
45
{
@@ -58,5 +59,10 @@ public interface IRawExecutors
5859
/// Client to execute all actions related with users
5960
/// </summary>
6061
IUsersRequester Users { get; }
62+
63+
/// <summary>
64+
/// Client to execute all actions related with tweets in API v2
65+
/// </summary>
66+
ITweetsV2Requester TweetsV2 { get; }
6167
}
6268
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Threading.Tasks;
2+
using Tweetinvi.Core.Web;
3+
using Tweetinvi.Models.V2.Responses;
4+
using Tweetinvi.Parameters.V2;
5+
6+
namespace Tweetinvi.Client.Requesters.V2
7+
{
8+
public interface ITweetsV2Requester
9+
{
10+
Task<ITwitterResult<TweetResponseDTO>> GetTweet(IGetTweetV2Parameters parameters);
11+
}
12+
}

src/Tweetinvi.Core/Public/Models/V2/TweetDTO.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class TweetDTO
3333

3434
[JsonProperty("public_metrics")] public TweetPublicMetricsDTO public_metrics { get; set; }
3535

36-
[JsonProperty("referenced_tweets")] public ReferencedTweetDTO referenced_tweets { get; set; }
36+
[JsonProperty("referenced_tweets")] public ReferencedTweetDTO[] referenced_tweets { get; set; }
3737

3838
[JsonProperty("source")] public string source { get; set; }
3939

src/Tweetinvi.Core/Public/Parameters/StreamsV2Client/StartSampleStreamV2Parameters.cs src/Tweetinvi.Core/Public/Parameters/V2/StreamsV2Client/StartSampleStreamV2Parameters.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Tweetinvi.Parameters.StreamsV2Client
1+
namespace Tweetinvi.Parameters.V2
22
{
33
public interface IStartSampleStreamV2Parameters : ICustomRequestParameters
44
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Tweetinvi.Core.Parameters;
2+
3+
namespace Tweetinvi.Parameters.V2
4+
{
5+
public static class BaseTweetsV2ParametersExtensions
6+
{
7+
public static T WithAllFields<T>(this T parameters) where T : BaseTweetsV2Parameters
8+
{
9+
parameters.Expansions = TweetFields.Expansions.ALL;
10+
parameters.MediaFields = TweetFields.Media.ALL;
11+
parameters.PlaceFields = TweetFields.Place.ALL;
12+
parameters.PollFields = TweetFields.Polls.ALL;
13+
parameters.TweetFields = TweetFields.Tweet.ALL;
14+
parameters.UserFields = TweetFields.User.ALL;
15+
return parameters;
16+
}
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Tweetinvi.Core.Parameters;
2+
3+
namespace Tweetinvi.Parameters.V2
4+
{
5+
public interface IGetTweetV2Parameters : IBaseTweetsV2Parameters
6+
{
7+
public long TweetId { get; set; }
8+
}
9+
10+
public class GetTweetV2Parameters : BaseTweetsV2Parameters, IGetTweetV2Parameters
11+
{
12+
public GetTweetV2Parameters(long tweetId)
13+
{
14+
TweetId = tweetId;
15+
this.WithAllFields();
16+
}
17+
18+
public static GetTweetV2Parameters WithNoFields(long tweetId)
19+
{
20+
var parameters = new GetTweetV2Parameters(tweetId);
21+
parameters.ClearAllFields();
22+
return parameters;
23+
}
24+
25+
public long TweetId { get; set; }
26+
}
27+
}

0 commit comments

Comments
 (0)