diff --git a/src/BirdsiteLive.Domain/StatusService.cs b/src/BirdsiteLive.Domain/StatusService.cs index c669779..4983de1 100644 --- a/src/BirdsiteLive.Domain/StatusService.cs +++ b/src/BirdsiteLive.Domain/StatusService.cs @@ -46,6 +46,17 @@ namespace BirdsiteLive.Domain var extractedTags = _statusExtractor.Extract(tweet.MessageContent); _statisticsHandler.ExtractedStatus(extractedTags.tags.Count(x => x.type == "Mention")); + // Replace RT by a link + var content = extractedTags.content; + if (content.Contains("{RT}") && tweet.IsRetweet) + { + if (!string.IsNullOrWhiteSpace(tweet.RetweetUrl)) + content = content.Replace("{RT}", + $@"RT"); + else + content = content.Replace("{RT}", "RT"); + } + string inReplyTo = null; if (tweet.InReplyToStatusId != default) inReplyTo = $"https://{_instanceSettings.Domain}/users/{tweet.InReplyToAccount.ToLowerInvariant()}/statuses/{tweet.InReplyToStatusId}"; @@ -67,7 +78,7 @@ namespace BirdsiteLive.Domain cc = new string[0], sensitive = false, - content = $"

{extractedTags.content}

", + content = $"

{content}

", attachment = Convert(tweet.Media), tag = extractedTags.tags }; diff --git a/src/BirdsiteLive.Twitter/Extractors/TweetExtractor.cs b/src/BirdsiteLive.Twitter/Extractors/TweetExtractor.cs index 573385c..c432a35 100644 --- a/src/BirdsiteLive.Twitter/Extractors/TweetExtractor.cs +++ b/src/BirdsiteLive.Twitter/Extractors/TweetExtractor.cs @@ -26,25 +26,44 @@ namespace BirdsiteLive.Twitter.Extractors Media = ExtractMedia(tweet.Media), CreatedAt = tweet.CreatedAt.ToUniversalTime(), IsReply = tweet.InReplyToUserId != null, - IsThread = tweet.InReplyToUserId != null && tweet.InReplyToUserId == tweet.CreatedBy.Id + IsThread = tweet.InReplyToUserId != null && tweet.InReplyToUserId == tweet.CreatedBy.Id, + IsRetweet = tweet.IsRetweet || tweet.QuotedStatusId != null, + RetweetUrl = ExtractRetweetUrl(tweet) }; + return extractedTweet; } + private string ExtractRetweetUrl(ITweet tweet) + { + if (tweet.IsRetweet && tweet.FullText.Contains("https://t.co/")) + { + var retweetId = tweet.FullText.Split(new[] { "https://t.co/" }, StringSplitOptions.RemoveEmptyEntries).Last(); + return $"https://t.co/{retweetId}"; + } + + return null; + } + public string ExtractMessage(ITweet tweet) { var tweetUrls = tweet.Media.Select(x => x.URL).Distinct(); var message = tweet.FullText; foreach (var tweetUrl in tweetUrls) - message = message.Replace(tweetUrl, string.Empty).Trim(); + { + if(tweet.IsRetweet) + message = tweet.RetweetedTweet.FullText.Replace(tweetUrl, string.Empty).Trim(); + else + message = message.Replace(tweetUrl, string.Empty).Trim(); + } - if (tweet.QuotedTweet != null) message = $"[Quote RT]{Environment.NewLine}{message}"; + if (tweet.QuotedTweet != null) message = $"[Quote {{RT}}]{Environment.NewLine}{message}"; if (tweet.IsRetweet) { if (tweet.RetweetedTweet != null) - message = $"[RT @{tweet.RetweetedTweet.CreatedBy.ScreenName}]{Environment.NewLine}{tweet.RetweetedTweet.FullText}"; + message = $"[{{RT}} @{tweet.RetweetedTweet.CreatedBy.ScreenName}]{Environment.NewLine}{message}"; else - message = message.Replace("RT", "[RT]"); + message = message.Replace("RT", "[{{RT}}]"); } // Expand URLs diff --git a/src/BirdsiteLive.Twitter/Models/ExtractedTweet.cs b/src/BirdsiteLive.Twitter/Models/ExtractedTweet.cs index 1f6bcea..f7f4e59 100644 --- a/src/BirdsiteLive.Twitter/Models/ExtractedTweet.cs +++ b/src/BirdsiteLive.Twitter/Models/ExtractedTweet.cs @@ -13,5 +13,7 @@ namespace BirdsiteLive.Twitter.Models public string InReplyToAccount { get; set; } public bool IsReply { get; set; } public bool IsThread { get; set; } + public bool IsRetweet { get; set; } + public string RetweetUrl { get; set; } } } \ No newline at end of file diff --git a/src/BirdsiteLive/BirdsiteLive.csproj b/src/BirdsiteLive/BirdsiteLive.csproj index ddba39f..3766f3a 100644 --- a/src/BirdsiteLive/BirdsiteLive.csproj +++ b/src/BirdsiteLive/BirdsiteLive.csproj @@ -4,7 +4,7 @@ netcoreapp3.1 d21486de-a812-47eb-a419-05682bb68856 Linux - 0.12.0 + 0.12.1