From 6a867f23055a30085a1adc579664a49178510d26 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 30 Jan 2021 00:22:29 -0500 Subject: [PATCH] removed dangerous initialization --- .../BirdsiteLive.Twitter.csproj | 4 ++ .../Tools/TwitterAuthenticationInitializer.cs | 64 +++++++++++++++++++ .../TwitterTweetsService.cs | 17 +++-- .../TwitterUserService.cs | 9 +-- src/BirdsiteLive/Startup.cs | 3 + 5 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs diff --git a/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj b/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj index 377d04d..438b4e1 100644 --- a/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj +++ b/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs b/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs new file mode 100644 index 0000000..28f8fee --- /dev/null +++ b/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using BirdsiteLive.Common.Settings; +using Microsoft.Extensions.Logging; +using Tweetinvi; + +namespace BirdsiteLive.Twitter.Tools +{ + public interface ITwitterAuthenticationInitializer + { + void EnsureAuthenticationIsInitialized(); + } + + public class TwitterAuthenticationInitializer : ITwitterAuthenticationInitializer + { + private readonly TwitterSettings _settings; + private readonly ILogger _logger; + private static bool _initialized; + private readonly SemaphoreSlim _semaphoregate = new SemaphoreSlim(1); + + #region Ctor + public TwitterAuthenticationInitializer(TwitterSettings settings, ILogger logger) + { + _settings = settings; + _logger = logger; + } + #endregion + + public void EnsureAuthenticationIsInitialized() + { + if (_initialized) return; + _semaphoregate.Wait(); + if (_initialized) return; + + try + { + InitTwitterCredentials(); + } + finally + { + _semaphoregate.Release(); + } + } + + private void InitTwitterCredentials() + { + for (;;) + { + try + { + Auth.SetApplicationOnlyCredentials(_settings.ConsumerKey, _settings.ConsumerSecret, true); + _initialized = true; + return; + } + catch (Exception e) + { + _logger.LogError(e, "Twitter Authentication Failed"); + Thread.Sleep(250); + } + } + } + } +} \ No newline at end of file diff --git a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs index 7fdf391..49684e8 100644 --- a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs +++ b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs @@ -5,6 +5,7 @@ using BirdsiteLive.Common.Settings; using BirdsiteLive.Statistics.Domain; using BirdsiteLive.Twitter.Extractors; using BirdsiteLive.Twitter.Models; +using BirdsiteLive.Twitter.Tools; using Microsoft.Extensions.Logging; using Tweetinvi; using Tweetinvi.Models; @@ -20,21 +21,20 @@ namespace BirdsiteLive.Twitter public class TwitterTweetsService : ITwitterTweetsService { - private readonly TwitterSettings _settings; + private readonly ITwitterAuthenticationInitializer _twitterAuthenticationInitializer; private readonly ITweetExtractor _tweetExtractor; private readonly ITwitterStatisticsHandler _statisticsHandler; private readonly ITwitterUserService _twitterUserService; private readonly ILogger _logger; #region Ctor - public TwitterTweetsService(TwitterSettings settings, ITweetExtractor tweetExtractor, ITwitterStatisticsHandler statisticsHandler, ITwitterUserService twitterUserService, ILogger logger) + public TwitterTweetsService(ITwitterAuthenticationInitializer twitterAuthenticationInitializer, ITweetExtractor tweetExtractor, ITwitterStatisticsHandler statisticsHandler, ITwitterUserService twitterUserService, ILogger logger) { - _settings = settings; + _twitterAuthenticationInitializer = twitterAuthenticationInitializer; _tweetExtractor = tweetExtractor; _statisticsHandler = statisticsHandler; _twitterUserService = twitterUserService; _logger = logger; - Auth.SetApplicationOnlyCredentials(_settings.ConsumerKey, _settings.ConsumerSecret, true); } #endregion @@ -42,8 +42,10 @@ namespace BirdsiteLive.Twitter { try { + _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); ExceptionHandler.SwallowWebExceptions = false; TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; + var tweet = Tweet.GetTweet(statusId); _statisticsHandler.CalledTweetApi(); if (tweet == null) return null; //TODO: test this @@ -58,12 +60,13 @@ namespace BirdsiteLive.Twitter public ExtractedTweet[] GetTimeline(string username, int nberTweets, long fromTweetId = -1) { - ExceptionHandler.SwallowWebExceptions = false; - TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; - var tweets = new List(); try { + _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); + ExceptionHandler.SwallowWebExceptions = false; + TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; + var user = _twitterUserService.GetUser(username); if (user == null || user.Protected) return new ExtractedTweet[0]; diff --git a/src/BirdsiteLive.Twitter/TwitterUserService.cs b/src/BirdsiteLive.Twitter/TwitterUserService.cs index 4bb9448..dd80c4d 100644 --- a/src/BirdsiteLive.Twitter/TwitterUserService.cs +++ b/src/BirdsiteLive.Twitter/TwitterUserService.cs @@ -3,6 +3,7 @@ using System.Linq; using BirdsiteLive.Common.Settings; using BirdsiteLive.Statistics.Domain; using BirdsiteLive.Twitter.Models; +using BirdsiteLive.Twitter.Tools; using Microsoft.Extensions.Logging; using Tweetinvi; using Tweetinvi.Models; @@ -16,22 +17,22 @@ namespace BirdsiteLive.Twitter public class TwitterUserService : ITwitterUserService { - private readonly TwitterSettings _settings; + private readonly ITwitterAuthenticationInitializer _twitterAuthenticationInitializer; private readonly ITwitterStatisticsHandler _statisticsHandler; private readonly ILogger _logger; #region Ctor - public TwitterUserService(TwitterSettings settings, ITwitterStatisticsHandler statisticsHandler, ILogger logger) + public TwitterUserService(ITwitterAuthenticationInitializer twitterAuthenticationInitializer, ITwitterStatisticsHandler statisticsHandler, ILogger logger) { - _settings = settings; + _twitterAuthenticationInitializer = twitterAuthenticationInitializer; _statisticsHandler = statisticsHandler; _logger = logger; - Auth.SetApplicationOnlyCredentials(_settings.ConsumerKey, _settings.ConsumerSecret, true); } #endregion public TwitterUser GetUser(string username) { + _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); ExceptionHandler.SwallowWebExceptions = false; IUser user; diff --git a/src/BirdsiteLive/Startup.cs b/src/BirdsiteLive/Startup.cs index 371e969..ab50932 100644 --- a/src/BirdsiteLive/Startup.cs +++ b/src/BirdsiteLive/Startup.cs @@ -10,6 +10,7 @@ using BirdsiteLive.DAL.Postgres.DataAccessLayers; using BirdsiteLive.DAL.Postgres.Settings; using BirdsiteLive.Models; using BirdsiteLive.Twitter; +using BirdsiteLive.Twitter.Tools; using Lamar; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -87,6 +88,8 @@ namespace BirdsiteLive services.For().DecorateAllWith(); services.For().Use().Singleton(); + services.For().Use().Singleton(); + services.Scan(_ => { _.Assembly("BirdsiteLive.Twitter");