diff --git a/src/BirdsiteLive.ActivityPub/ApDeserializer.cs b/src/BirdsiteLive.ActivityPub/ApDeserializer.cs index 17fa3a0..df385ef 100644 --- a/src/BirdsiteLive.ActivityPub/ApDeserializer.cs +++ b/src/BirdsiteLive.ActivityPub/ApDeserializer.cs @@ -34,12 +34,13 @@ namespace BirdsiteLive.ActivityPub id = accept.id, actor = accept.actor, context = accept.context, - apObject = new NestedActivity() + apObject = new ActivityFollow() { + id = accept.apObject.id, type = accept.apObject.type, actor = accept.apObject.actor, - context = accept.apObject.context, + context = accept.apObject.context?.ToString(), apObject = accept.apObject.apObject, } }; diff --git a/src/BirdsiteLive.ActivityPub/Models/ActivityAcceptFollow.cs b/src/BirdsiteLive.ActivityPub/Models/ActivityAcceptFollow.cs index 91ec40e..8cba0cc 100644 --- a/src/BirdsiteLive.ActivityPub/Models/ActivityAcceptFollow.cs +++ b/src/BirdsiteLive.ActivityPub/Models/ActivityAcceptFollow.cs @@ -5,6 +5,6 @@ namespace BirdsiteLive.ActivityPub public class ActivityAcceptFollow : Activity { [JsonPropertyName("object")] - public NestedActivity apObject { get; set; } + public ActivityFollow apObject { get; set; } } } \ No newline at end of file diff --git a/src/BirdsiteLive.Domain/ActivityPubService.cs b/src/BirdsiteLive.Domain/ActivityPubService.cs index 3a3137c..470be70 100644 --- a/src/BirdsiteLive.Domain/ActivityPubService.cs +++ b/src/BirdsiteLive.Domain/ActivityPubService.cs @@ -83,7 +83,7 @@ namespace BirdsiteLive.Domain id = $"{activity.apObject}#accepts/follows/{Guid.NewGuid()}", type = "Accept", actor = activity.apObject, - apObject = new NestedActivity() + apObject = new ActivityFollow() { id = activity.id, type = activity.type, @@ -100,8 +100,7 @@ namespace BirdsiteLive.Domain if (!string.IsNullOrWhiteSpace(inbox)) usedInbox = inbox; - var json = JsonSerializer.Serialize(data, - new JsonSerializerOptions() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }); + var json = JsonSerializer.Serialize(data); var date = DateTime.UtcNow.ToUniversalTime(); var httpDate = date.ToString("r"); diff --git a/src/BirdsiteLive.Domain/UserService.cs b/src/BirdsiteLive.Domain/UserService.cs index 2b38d90..ffd0b81 100644 --- a/src/BirdsiteLive.Domain/UserService.cs +++ b/src/BirdsiteLive.Domain/UserService.cs @@ -243,10 +243,11 @@ namespace BirdsiteLive.Domain actor = activity.apObject.apObject, apObject = new ActivityUndoFollow() { - id = activity.id, - type = activity.type, - actor = activity.actor, - apObject = activity.apObject + id = (activity.apObject as dynamic).id?.ToString(), + type = (activity.apObject as dynamic).type?.ToString(), + actor = (activity.apObject as dynamic).actor?.ToString(), + context = (activity.apObject as dynamic).context?.ToString(), + apObject = (activity.apObject as dynamic).@object?.ToString() } }; var result = await _activityPubService.PostDataAsync(acceptFollow, followerHost, activity.apObject.apObject); diff --git a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs index e450dfa..5811c74 100644 --- a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs +++ b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs @@ -55,16 +55,14 @@ namespace BirdsiteLive.Twitter "https://api.twitter.com/graphql/XjlydVWHFIDaAUny86oh2g/TweetDetail?variables=%7B%22focalTweetId%22%3A%22" + statusId + "%22,%22with_rux_injections%22%3Atrue,%22includePromotedContent%22%3Afalse,%22withCommunity%22%3Afalse,%22withQuickPromoteEligibilityTweetFields%22%3Afalse,%22withBirdwatchNotes%22%3Afalse,%22withSuperFollowsUserFields%22%3Afalse,%22withDownvotePerspective%22%3Afalse,%22withReactionsMetadata%22%3Afalse,%22withReactionsPerspective%22%3Afalse,%22withSuperFollowsTweetFields%22%3Afalse,%22withVoice%22%3Atrue,%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue,%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue,%22verified_phone_label_enabled%22%3Afalse,%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse,%22tweetypie_unmention_optimization_enabled%22%3Atrue,%22vibe_api_enabled%22%3Atrue,%22responsive_web_edit_tweet_api_enabled%22%3Atrue,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Afalse,%22view_counts_everywhere_api_enabled%22%3Atrue,%22longform_notetweets_consumption_enabled%22%3Atrue,%22tweet_awards_web_tipping_enabled%22%3Afalse,%22freedom_of_speech_not_reach_fetch_enabled%22%3Afalse,%22standardized_nudges_misinfo%22%3Atrue,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse,%22interactive_text_enabled%22%3Atrue,%22responsive_web_text_conversations_enabled%22%3Afalse,%22longform_notetweets_richtext_consumption_enabled%22%3Afalse,%22responsive_web_enhance_cards_enabled%22%3Atrue%7D"; + using var request = _twitterAuthenticationInitializer.MakeHttpRequest(new HttpMethod("GET"), reqURL); try { JsonDocument tweet; - using (var request = _twitterAuthenticationInitializer.MakeHttpRequest(new HttpMethod("GET"), reqURL)) - { - var httpResponse = await client.SendAsync(request); - httpResponse.EnsureSuccessStatusCode(); - var c = await httpResponse.Content.ReadAsStringAsync(); - tweet = JsonDocument.Parse(c); - } + var httpResponse = await client.SendAsync(request); + httpResponse.EnsureSuccessStatusCode(); + var c = await httpResponse.Content.ReadAsStringAsync(); + tweet = JsonDocument.Parse(c); var timeline = tweet.RootElement.GetProperty("data").GetProperty("threaded_conversation_with_injections_v2") @@ -77,6 +75,7 @@ namespace BirdsiteLive.Twitter catch (Exception e) { _logger.LogError(e, "Error retrieving tweet {TweetId}", statusId); + await _twitterAuthenticationInitializer.RefreshClient(request); return null; } } diff --git a/src/Tests/BirdsiteLive.Domain.Tests/ActivityServiceTests.cs b/src/Tests/BirdsiteLive.Domain.Tests/ActivityServiceTests.cs index 20525f6..5fed8b0 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/ActivityServiceTests.cs +++ b/src/Tests/BirdsiteLive.Domain.Tests/ActivityServiceTests.cs @@ -6,6 +6,7 @@ using BirdsiteLive.Domain.Factories; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using System.Text.Json; namespace BirdsiteLive.Domain.Tests @@ -38,8 +39,21 @@ namespace BirdsiteLive.Domain.Tests var activity = new ActivityAcceptFollow() { id = "awef", + context = "https://www.w3.org/ns/activitystreams", + type = "Accept", + actor = "https://mastodon.technology/users/testtest", + apObject = new ActivityFollow() + { + context = "https://www.w3.org/ns/activitystreams", + id = "abc", + type = "Follow", + actor = "https://mastodon.technology/users/testtest2", + apObject = "https://mastodon.technology/users/testtest3", + } + }; - var json = "{\"id\":\"awef\"}"; + var json = + """{"object":{"object":"https://mastodon.technology/users/testtest3","@context":"https://www.w3.org/ns/activitystreams","id":"abc","type":"Follow","actor":"https://mastodon.technology/users/testtest2"},"@context":"https://www.w3.org/ns/activitystreams","id":"awef","type":"Accept","actor":"https://mastodon.technology/users/testtest"}"""; #region Validations var req = service.BuildRequest(activity, "google.com", "tata", "awef"); @@ -70,6 +84,8 @@ namespace BirdsiteLive.Domain.Tests var req = service.BuildAcceptFollow(activity); + string s = JsonSerializer.Serialize(req); + Assert.AreEqual(req.actor, activityRes.actor); Assert.AreEqual(req.context, activityRes.context); diff --git a/src/Tests/BirdsiteLive.Domain.Tests/BirdsiteLive.Domain.Tests.csproj b/src/Tests/BirdsiteLive.Domain.Tests/BirdsiteLive.Domain.Tests.csproj index e00e2f6..fd8c60d 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/BirdsiteLive.Domain.Tests.csproj +++ b/src/Tests/BirdsiteLive.Domain.Tests/BirdsiteLive.Domain.Tests.csproj @@ -2,7 +2,7 @@ net6 - + 11 false diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs b/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs index ddaac8a..ef26e2e 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs +++ b/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs @@ -41,6 +41,11 @@ namespace BirdsiteLive.ActivityPub.Tests ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); + + await Task.Delay(1000); + await auth.MakeHttpClient(); + await Task.Delay(1000); + await auth.MakeHttpClient(); } [TestMethod] @@ -48,7 +53,7 @@ namespace BirdsiteLive.ActivityPub.Tests { var tweets = await _tweetService.GetTimelineAsync("kobebryant", 1218020971346444288); Assert.AreEqual(tweets[0].MessageContent, "Continuing to move the game forward @KingJames. Much respect my brother 💪🏾 #33644"); - Assert.AreEqual(tweets.Length, 8); + Assert.IsTrue(tweets.Length > 5); } [TestMethod] diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs b/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs index 480ee41..ed245bc 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs +++ b/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.Extensions.Logging; using System.Threading.Tasks; using BirdsiteLive.Twitter; @@ -18,6 +20,7 @@ namespace BirdsiteLive.ActivityPub.Tests [TestInitialize] public async Task TestInit() { + var logger1 = new Mock>(MockBehavior.Strict); var logger2 = new Mock>(MockBehavior.Strict); var logger3 = new Mock>(); @@ -33,6 +36,7 @@ namespace BirdsiteLive.ActivityPub.Tests ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); + } [TestMethod]