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");