Эх сурвалжийг харах

improved public interface

randoman 6 жил өмнө
parent
commit
60e1c87841
43 өөрчлөгдсөн 446 нэмэгдсэн , 338 устгасан
  1. 0 3
      src/Translators/BaiduTranslate/BaiduTranslate.csproj
  2. 11 11
      src/Translators/BaiduTranslate/BaiduTranslateEndpoint.cs
  3. 49 44
      src/Translators/BingTranslate/BingTranslateEndpoint.cs
  4. 0 3
      src/Translators/BingTranslateLegitimate/BingTranslateLegitimate.csproj
  5. 7 7
      src/Translators/BingTranslateLegitimate/BingTranslateLegitimateEndpoint.cs
  6. 0 3
      src/Translators/CustomTranslate/CustomTranslate.csproj
  7. 7 7
      src/Translators/CustomTranslate/CustomTranslateEndpoint.cs
  8. 0 3
      src/Translators/GoogleTranslate/GoogleTranslate.csproj
  9. 53 48
      src/Translators/GoogleTranslate/GoogleTranslateEndpoint.cs
  10. 0 3
      src/Translators/GoogleTranslateLegitimate/GoogleTranslateLegitimate.csproj
  11. 9 8
      src/Translators/GoogleTranslateLegitimate/GoogleTranslateLegitimateEndpoint.cs
  12. 0 3
      src/Translators/LecPowerTranslator15/LecPowerTranslator15.csproj
  13. 8 9
      src/Translators/LecPowerTranslator15/LecPowerTranslator15Endpoint.cs
  14. 2 2
      src/Translators/ReverseTranslator/ReverseTranslatorEndpoint.cs
  15. 0 3
      src/Translators/WatsonTranslate/WatsonTranslate.csproj
  16. 16 17
      src/Translators/WatsonTranslate/WatsonTranslateEndpoint.cs
  17. 0 3
      src/Translators/YandexTranslate/YandexTranslate.csproj
  18. 8 8
      src/Translators/YandexTranslate/YandexTranslateEndpoint.cs
  19. 1 1
      src/XUnity.AutoTranslator.Plugin.BepIn/AutoTranslatorPlugin.cs
  20. 1 1
      src/XUnity.AutoTranslator.Plugin.Core/AutoTranslationPlugin.cs
  21. 13 0
      src/XUnity.AutoTranslator.Plugin.Core/AutoTranslatorSettings.cs
  22. 1 7
      src/XUnity.AutoTranslator.Plugin.Core/AutoTranslatorState.cs
  23. 5 5
      src/XUnity.AutoTranslator.Plugin.Core/Configuration/Settings.cs
  24. 2 4
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ExtProtocol/ExtProtocolEndpoint.cs
  25. 18 15
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/HttpEndpoint.cs
  26. 15 8
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/HttpTranslationContext.cs
  27. 9 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpRequestCreationContext.cs
  28. 11 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpResponseInspectionContext.cs
  29. 13 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpTranslationContext.cs
  30. 13 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpTranslationExtractionContext.cs
  31. 15 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/IInitializationContext.cs
  32. 2 2
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ITranslateEndpoint.cs
  33. 14 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ITranslationContext.cs
  34. 23 15
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/InitializationContext.cs
  35. 6 6
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/TranslationContext.cs
  36. 7 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwRequestCreationContext.cs
  37. 13 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwTranslationContext.cs
  38. 9 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwTranslationExtractionContext.cs
  39. 21 12
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwEndpoint.cs
  40. 38 0
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwRequestInfo.cs
  41. 8 23
      src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwTranslationContext.cs
  42. 15 51
      src/XUnity.AutoTranslator.Plugin.Core/Extensions/IniKeyExtensions.cs
  43. 3 3
      src/XUnity.AutoTranslator.Plugin.Core/Web/XUnityWebResponse.cs

+ 0 - 3
src/Translators/BaiduTranslate/BaiduTranslate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-        <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 11 - 11
src/Translators/BaiduTranslate/BaiduTranslateEndpoint.cs

@@ -29,17 +29,17 @@ namespace BaiduTranslate
 
       public override string FriendlyName => "Baidu Translator";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _appId = context.Config.Preferences[ "Baidu" ][ "BaiduAppId" ].GetOrDefault( "" );
-         _appSecret = context.Config.Preferences[ "Baidu" ][ "BaiduAppSecret" ].GetOrDefault( "" );
+         _appId = context.GetOrCreateSetting( "Baidu", "BaiduAppId", "" );
+         _appSecret = context.GetOrCreateSetting( "Baidu", "BaiduAppSecret", "" );
          if( string.IsNullOrEmpty( _appId ) ) throw new ArgumentException( "The BaiduTranslate endpoint requires an App Id which has not been provided." );
          if( string.IsNullOrEmpty( _appSecret ) ) throw new ArgumentException( "The BaiduTranslate endpoint requires an App Secret which has not been provided." );
 
-         context.HttpSecurity.EnableSslFor( "api.fanyi.baidu.com" );
+         context.EnableSslFor( "api.fanyi.baidu.com" );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          string salt = DateTime.UtcNow.Millisecond.ToString();
          var md5 = CreateMD5( _appId + context.UntranslatedText + salt + _appSecret );
@@ -54,20 +54,20 @@ namespace BaiduTranslate
                salt,
                md5 ) );
 
-         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslationState.UserAgent ) ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" : AutoTranslationState.UserAgent;
+         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" : AutoTranslatorSettings.UserAgent;
          request.Headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
 
-         return request;
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( HttpTranslationContext context )
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
       {
-         if( context.ResultData.StartsWith( "{\"error" ) )
+         var data = context.Response.Data;
+         if( data.StartsWith( "{\"error" ) )
          {
             return;
          }
-
-         var data = context.ResultData;
+         
          var obj = JSON.Parse( data );
          var lineBuilder = new StringBuilder( data.Length );
 

+ 49 - 44
src/Translators/BingTranslate/BingTranslateEndpoint.cs

@@ -63,15 +63,31 @@ namespace BingTranslate
 
       public override string FriendlyName => "Bing Translator";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
          // Configure service points / service point manager
-         context.HttpSecurity.EnableSslFor( "www.bing.com" );
+         context.EnableSslFor( "www.bing.com" );
 
          if( !SupportedLanguages.Contains( context.DestinationLanguage ) ) throw new Exception( $"The destination language {context.DestinationLanguage} is not supported." );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override IEnumerator OnBeforeTranslate( IHttpTranslationContext context )
+      {
+         if( !_hasSetup || AutoTranslatorState.TranslationCount % _resetAfter == 0 )
+         {
+            _resetAfter = RandomNumbers.Next( 75, 125 );
+            _hasSetup = true;
+
+            // Setup TKK and cookies
+            var enumerator = SetupIGAndIID();
+            while( enumerator.MoveNext() )
+            {
+               yield return enumerator.Current;
+            }
+         }
+      }
+
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          _translationCount++;
          string address = null;
@@ -96,7 +112,30 @@ namespace BingTranslate
          request.Cookies = _cookieContainer;
          AddHeaders( request, true );
 
-         return request;
+         context.Complete( request );
+      }
+
+      public override void OnInspectResponse( IHttpResponseInspectionContext context )
+      {
+         InspectResponse( context.Response );
+      }
+
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
+      {
+         var obj = JSON.Parse( context.Response.Data );
+
+         var code = obj[ "statusCode" ].AsInt;
+         if( code != 200 )
+         {
+            return;
+         }
+
+         var token = obj[ "translationResponse" ].ToString();
+         token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
+
+         var translated = token;
+
+         context.Complete( translated );
       }
 
       private XUnityWebRequest CreateWebSiteRequest()
@@ -111,7 +150,7 @@ namespace BingTranslate
 
       private void AddHeaders( XUnityWebRequest request, bool isTranslationRequest )
       {
-         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslationState.UserAgent ) ? DefaultUserAgent : AutoTranslationState.UserAgent;
+         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? DefaultUserAgent : AutoTranslatorSettings.UserAgent;
 
          if( AcceptLanguage != null )
          {
@@ -139,7 +178,7 @@ namespace BingTranslate
          }
       }
 
-      public override void InspectTranslationResponse( HttpTranslationContext context, XUnityWebResponse response )
+      private void InspectResponse( XUnityWebResponse response )
       {
          CookieCollection cookies = response.NewCookies;
 
@@ -147,23 +186,7 @@ namespace BingTranslate
          _cookieContainer.Add( cookies );
       }
 
-      public override IEnumerator OnBeforeTranslate( HttpTranslationContext context )
-      {
-         if( !_hasSetup || AutoTranslationState.TranslationCount % _resetAfter == 0 )
-         {
-            _resetAfter = RandomNumbers.Next( 75, 125 );
-            _hasSetup = true;
-
-            // Setup TKK and cookies
-            var enumerator = SetupIGAndIID( context );
-            while( enumerator.MoveNext() )
-            {
-               yield return enumerator.Current;
-            }
-         }
-      }
-
-      public IEnumerator SetupIGAndIID( HttpTranslationContext context )
+      public IEnumerator SetupIGAndIID()
       {
          XUnityWebResponse response = null;
 
@@ -194,7 +217,7 @@ namespace BingTranslate
             }
          }
 
-         InspectTranslationResponse( context, response );
+         InspectResponse( response );
 
          // failure
          if( response.Error != null )
@@ -204,7 +227,7 @@ namespace BingTranslate
          }
 
          // failure
-         if( response.Result == null )
+         if( response.Data == null )
          {
             XuaLogger.Current.Warn( null, "An error occurred while setting up BingTranslate IG. Proceeding without..." );
             yield break;
@@ -212,7 +235,7 @@ namespace BingTranslate
 
          try
          {
-            var html = response.Result;
+            var html = response.Data;
 
             _ig = Lookup( "ig\":\"", html );
             _iid = Lookup( ".init(\"/feedback/submission?\",\"", html );
@@ -245,23 +268,5 @@ namespace BingTranslate
          }
          return null;
       }
-
-      public override void ExtractTranslatedText( HttpTranslationContext context )
-      {
-         var obj = JSON.Parse( context.ResultData );
-
-         var code = obj[ "statusCode" ].AsInt;
-         if( code != 200 )
-         {
-            return;
-         }
-
-         var token = obj[ "translationResponse" ].ToString();
-         token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
-
-         var translated = token;
-
-         context.Complete( translated );
-      }
    }
 }

+ 0 - 3
src/Translators/BingTranslateLegitimate/BingTranslateLegitimate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 7 - 7
src/Translators/BingTranslateLegitimate/BingTranslateLegitimateEndpoint.cs

@@ -41,18 +41,18 @@ namespace BingTranslateLegitimate
 
       public override string FriendlyName => "Bing Translator (Authenticated)";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _key = context.Config.Preferences[ "BingLegitimate" ][ "OcpApimSubscriptionKey" ].GetOrDefault( "" );
+         _key = context.GetOrCreateSetting( "BingLegitimate", "OcpApimSubscriptionKey", "" );
          if( string.IsNullOrEmpty( _key ) ) throw new Exception( "The BingTranslateLegitimate endpoint requires an API key which has not been provided." );
 
          // Configure service points / service point manager
-         context.HttpSecurity.EnableSslFor( "api.cognitive.microsofttranslator.com" );
+         context.EnableSslFor( "api.cognitive.microsofttranslator.com" );
 
          if( !SupportedLanguages.Contains( context.DestinationLanguage ) ) throw new Exception( $"The destination language {context.DestinationLanguage} is not supported." );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          var request = new XUnityWebRequest(
             "POST",
@@ -69,12 +69,12 @@ namespace BingTranslateLegitimate
          }
          request.Headers[ "Ocp-Apim-Subscription-Key" ] = _key;
 
-         return request;
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( HttpTranslationContext context )
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
       {
-         var arr = JSON.Parse( context.ResultData );
+         var arr = JSON.Parse( context.Response.Data );
 
          var token = arr.AsArray[ 0 ]?.AsObject[ "translations" ]?.AsArray[ 0 ]?.AsObject[ "text" ]?.ToString();
          token = token.Substring( 1, token.Length - 2 ).UnescapeJson();

+ 0 - 3
src/Translators/CustomTranslate/CustomTranslate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 7 - 7
src/Translators/CustomTranslate/CustomTranslateEndpoint.cs

@@ -26,18 +26,18 @@ namespace CustomTranslate
 
       public override string FriendlyName => _friendlyName;
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _endpoint = context.Config.Preferences[ "Custom" ][ "Url" ].GetOrDefault( "" );
+         _endpoint = context.GetOrCreateSetting( "Custom", "Url", "" );
          if( string.IsNullOrEmpty( _endpoint ) ) throw new ArgumentException( "The custom endpoint requires a url which has not been provided." );
 
          var uri = new Uri( _endpoint );
-         context.HttpSecurity.EnableSslFor( uri.Host );
+         context.EnableSslFor( uri.Host );
 
          _friendlyName += " (" + uri.Host + ")";
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          var request = new XUnityWebRequest(
             string.Format(
@@ -47,12 +47,12 @@ namespace CustomTranslate
                context.DestinationLanguage,
                WWW.EscapeURL( context.UntranslatedText ) ) );
 
-         return request;
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( HttpTranslationContext context )
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
       {
-         context.Complete( context.ResultData );
+         context.Complete( context.Response.Data );
       }
    }
 }

+ 0 - 3
src/Translators/GoogleTranslate/GoogleTranslate.csproj

@@ -9,9 +9,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Reference Include="ExIni">
-      <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-    </Reference>
     <Reference Include="UnityEngine">
       <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
     </Reference>

+ 53 - 48
src/Translators/GoogleTranslate/GoogleTranslateEndpoint.cs

@@ -56,14 +56,29 @@ namespace GoogleTranslate
 
       public override string FriendlyName => "Google! Translate";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         context.HttpSecurity.EnableSslFor( "translate.google.com", "translate.googleapis.com" );
+         context.EnableSslFor( "translate.google.com", "translate.googleapis.com" );
 
          if( !SupportedLanguages.Contains( context.DestinationLanguage ) ) throw new Exception( $"The destination language {context.DestinationLanguage} is not supported." );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override IEnumerator OnBeforeTranslate( IHttpTranslationContext context )
+      {
+         if( !_hasSetup || AutoTranslatorState.TranslationCount % 100 == 0 )
+         {
+            _hasSetup = true;
+
+            // Setup TKK and cookies
+            var enumerator = SetupTKK();
+            while( enumerator.MoveNext() )
+            {
+               yield return enumerator.Current;
+            }
+         }
+      }
+
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          XUnityWebRequest request;
          if( context.DestinationLanguage == "romaji" )
@@ -89,7 +104,35 @@ namespace GoogleTranslate
          request.Cookies = _cookieContainer;
          AddHeaders( request, true );
 
-         return request;
+         context.Complete( request );
+      }
+
+      public override void OnInspectResponse( IHttpResponseInspectionContext context )
+      {
+         InspectResponse( context.Response );
+      }
+
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
+      {
+         var dataIndex = context.DestinationLanguage == "romaji" ? 3 : 0;
+
+         var data = context.Response.Data;
+         var arr = JSON.Parse( data );
+         var lineBuilder = new StringBuilder( data.Length );
+
+         foreach( JSONNode entry in arr.AsArray[ 0 ].AsArray )
+         {
+            var token = entry.AsArray[ dataIndex ].ToString();
+            token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
+
+            if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
+
+            lineBuilder.Append( token );
+         }
+
+         var translated = lineBuilder.ToString();
+
+         context.Complete( translated );
       }
 
       private XUnityWebRequest CreateWebSiteRequest()
@@ -104,7 +147,7 @@ namespace GoogleTranslate
 
       private void AddHeaders( XUnityWebRequest request, bool isTranslationRequest )
       {
-         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslationState.UserAgent ) ? DefaultUserAgent : AutoTranslationState.UserAgent;
+         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? DefaultUserAgent : AutoTranslatorSettings.UserAgent;
          if( AcceptLanguage != null )
          {
             request.Headers[ HttpRequestHeader.AcceptLanguage ] = AcceptLanguage;
@@ -123,7 +166,7 @@ namespace GoogleTranslate
          }
       }
 
-      public override void InspectTranslationResponse( HttpTranslationContext context, XUnityWebResponse response )
+      private void InspectResponse( XUnityWebResponse response )
       {
          CookieCollection cookies = response.NewCookies;
          foreach( Cookie cookie in cookies )
@@ -136,22 +179,7 @@ namespace GoogleTranslate
          _cookieContainer.Add( cookies );
       }
 
-      public override IEnumerator OnBeforeTranslate( HttpTranslationContext context )
-      {
-         if( !_hasSetup || AutoTranslationState.TranslationCount % 100 == 0 )
-         {
-            _hasSetup = true;
-
-            // Setup TKK and cookies
-            var enumerator = SetupTKK( context );
-            while( enumerator.MoveNext() )
-            {
-               yield return enumerator.Current;
-            }
-         }
-      }
-
-      public IEnumerator SetupTKK( HttpTranslationContext context )
+      public IEnumerator SetupTKK()
       {
          XUnityWebResponse response = null;
 
@@ -181,7 +209,7 @@ namespace GoogleTranslate
             }
          }
 
-         InspectTranslationResponse( context, response );
+         InspectResponse( response );
 
          // failure
          if( response.Error != null )
@@ -191,7 +219,7 @@ namespace GoogleTranslate
          }
 
          // failure
-         if( response.Result == null )
+         if( response.Data == null )
          {
             XuaLogger.Current.Warn( null, "An error occurred while setting up GoogleTranslate TKK. Using fallback TKK values instead." );
             yield break;
@@ -199,7 +227,7 @@ namespace GoogleTranslate
 
          try
          {
-            var html = response.Result;
+            var html = response.Data;
 
             bool found = false;
             string[] lookups = new[] { "tkk:'", "TKK='" };
@@ -297,28 +325,5 @@ namespace GoogleTranslate
 
          return p.ToString( CultureInfo.InvariantCulture ) + "." + ( p ^ m ).ToString( CultureInfo.InvariantCulture );
       }
-
-      public override void ExtractTranslatedText( HttpTranslationContext context )
-      {
-         var dataIndex = context.DestinationLanguage == "romaji" ? 3 : 0;
-
-         var data = context.ResultData;
-         var arr = JSON.Parse( data );
-         var lineBuilder = new StringBuilder( data.Length );
-
-         foreach( JSONNode entry in arr.AsArray[ 0 ].AsArray )
-         {
-            var token = entry.AsArray[ dataIndex ].ToString();
-            token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
-
-            if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
-
-            lineBuilder.Append( token );
-         }
-
-         var translated = lineBuilder.ToString();
-
-         context.Complete( translated );
-      }
    }
 }

+ 0 - 3
src/Translators/GoogleTranslateLegitimate/GoogleTranslateLegitimate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 9 - 8
src/Translators/GoogleTranslateLegitimate/GoogleTranslateLegitimateEndpoint.cs

@@ -33,18 +33,18 @@ namespace GoogleTranslateLegitimate
 
       public override string FriendlyName => "Google! Translate (Authenticated)";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _key = context.Config.Preferences[ "GoogleLegitimate" ][ "GoogleAPIKey" ].GetOrDefault( "" );
+         _key = context.GetOrCreateSetting( "GoogleLegitimate", "GoogleAPIKey", "" );
          if( string.IsNullOrEmpty( _key ) ) throw new Exception( "The GoogleTranslateLegitimate endpoint requires an API key which has not been provided." );
 
          // Configure service points / service point manager
-         context.HttpSecurity.EnableSslFor( "translation.googleapis.com" );
+         context.EnableSslFor( "translation.googleapis.com" );
 
          if( !SupportedLanguages.Contains( context.DestinationLanguage ) ) throw new Exception( $"The destination language {context.DestinationLanguage} is not supported." );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          var b = new StringBuilder();
          b.Append( "{" );
@@ -60,13 +60,14 @@ namespace GoogleTranslateLegitimate
             string.Format( HttpsServicePointTemplateUrl, WWW.EscapeURL( _key ) ),
             data );
 
-         return request;
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( HttpTranslationContext context )
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
       {
-         var obj = JSON.Parse( context.ResultData );
-         var lineBuilder = new StringBuilder( context.ResultData.Length );
+         var data = context.Response.Data;
+         var obj = JSON.Parse( data );
+         var lineBuilder = new StringBuilder( data.Length );
 
          foreach( JSONNode entry in obj.AsObject[ "data" ].AsObject[ "translations" ].AsArray )
          {

+ 0 - 3
src/Translators/LecPowerTranslator15/LecPowerTranslator15.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 8 - 9
src/Translators/LecPowerTranslator15/LecPowerTranslator15Endpoint.cs

@@ -15,24 +15,23 @@ namespace LecPowerTranslator15
 
       public override string FriendlyName => "LEC Power Translator 15";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         var pathToLec = context.Config.Preferences[ "LecPowerTranslator15" ][ "InstallationPath" ].GetOrDefault( "" );
+         var pathToLec = context.GetOrCreateSetting( "LecPowerTranslator15", "InstallationPath", "" );
          if( string.IsNullOrEmpty( pathToLec ) ) throw new Exception( "The LecPowerTranslator15 requires the path to the installation folder." );
 
-         var path1 = context.Config.DataPath;
-         var exePath1 = Path.Combine( path1, @"Translators\Lec.ExtProtocol.exe" );
-         var file1Exists = File.Exists( exePath1 );
-         if( !file1Exists )
+         var exePath = Path.Combine( context.PluginDirectory, @"Translators\Lec.ExtProtocol.exe" );
+         var fileExists = File.Exists( exePath );
+         if( !fileExists )
          {
-            throw new Exception( $"Could not find any executable at '{exePath1}'" );
+            throw new Exception( $"Could not find any executable at '{exePath}'" );
          }
 
          _arguments = Convert.ToBase64String( Encoding.UTF8.GetBytes( pathToLec ) );
 
-         if( file1Exists )
+         if( fileExists )
          {
-            _exePath = exePath1;
+            _exePath = exePath;
          }
          else
          {

+ 2 - 2
src/Translators/ReverseTranslator/ReverseTranslatorEndpoint.cs

@@ -15,12 +15,12 @@ namespace ReverseTranslator
 
       public int MaxConcurrency => 50;
 
-      public void Initialize( InitializationContext context )
+      public void Initialize( IInitializationContext context )
       {
 
       }
 
-      public IEnumerator Translate( TranslationContext context )
+      public IEnumerator Translate( ITranslationContext context )
       {
          var reversedText = new string( context.UntranslatedText.Reverse().ToArray() );
          context.Complete( reversedText );

+ 0 - 3
src/Translators/WatsonTranslate/WatsonTranslate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 16 - 17
src/Translators/WatsonTranslate/WatsonTranslateEndpoint.cs

@@ -9,7 +9,6 @@ using XUnity.AutoTranslator.Plugin.Core;
 using XUnity.AutoTranslator.Plugin.Core.Configuration;
 using XUnity.AutoTranslator.Plugin.Core.Constants;
 using XUnity.AutoTranslator.Plugin.Core.Endpoints;
-using XUnity.AutoTranslator.Plugin.Core.Endpoints.Http;
 using XUnity.AutoTranslator.Plugin.Core.Endpoints.Www;
 using XUnity.AutoTranslator.Plugin.Core.Extensions;
 using XUnity.AutoTranslator.Plugin.Core.Utilities;
@@ -21,7 +20,7 @@ namespace WatsonTranslate
    {
       private static readonly string RequestTemplate = "{{\"text\":[\"{2}\"],\"model_id\":\"{0}-{1}\"}}";
 
-      private string _template;
+      private string _fullUrl;
       private string _url;
       private string _key;
 
@@ -33,40 +32,40 @@ namespace WatsonTranslate
 
       public override string FriendlyName => "Watson Language Translator";
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _url = context.Config.Preferences[ "Watson" ][ "Url" ].GetOrDefault( "" );
-         _key = context.Config.Preferences[ "Watson" ][ "Key" ].GetOrDefault( "" );
+         _url = context.GetOrCreateSetting( "Watson", "Url", "" );
+         _key = context.GetOrCreateSetting( "Watson", "Key", "" );
          if( string.IsNullOrEmpty( _url ) ) throw new Exception( "The WatsonTranslate endpoint requires a url which has not been provided." );
          if( string.IsNullOrEmpty( _key ) ) throw new Exception( "The WatsonTranslate endpoint requires a key which has not been provided." );
 
-         _template = _url.TrimEnd( '/' ) + "/v3/translate?version=2018-05-01";
+         _fullUrl = _url.TrimEnd( '/' ) + "/v3/translate?version=2018-05-01";
 
          if( context.SourceLanguage != "ja" ) throw new Exception( "Current implementation only supports japanese-to-english." );
          if( context.DestinationLanguage != "en" ) throw new Exception( "Current implementation only supports japanese-to-english." );
       }
 
-      public override void CreateTranslationRequest( WwwTranslationContext context )
+      public override void OnCreateRequest( IWwwRequestCreationContext context )
       {
-         context.SetServiceUrl( _template );
-         context.SetRequestObject(
+         var request = new WwwRequestInfo(
+            _fullUrl,
             string.Format(
                RequestTemplate,
                context.SourceLanguage,
                context.DestinationLanguage,
                TextHelper.EscapeJson( context.UntranslatedText ) ) );
 
-         var headers = new Dictionary<string, string>();
-         headers[ "User-Agent" ] = string.IsNullOrEmpty( AutoTranslationState.UserAgent ) ? "curl/7.55.1" : AutoTranslationState.UserAgent;
-         headers[ "Accept" ] = "application/json";
-         headers[ "Content-Type" ] = "application/json";
-         headers[ "Authorization" ] = "Basic " + Convert.ToBase64String( Encoding.ASCII.GetBytes( "apikey:" + _key ) );
-         context.SetHeaders( headers );
+         request.Headers[ "User-Agent" ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? "curl/7.55.1" : AutoTranslatorSettings.UserAgent;
+         request.Headers[ "Accept" ] = "application/json";
+         request.Headers[ "Content-Type" ] = "application/json";
+         request.Headers[ "Authorization" ] = "Basic " + Convert.ToBase64String( Encoding.ASCII.GetBytes( "apikey:" + _key ) );
+
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( WwwTranslationContext context )
+      public override void OnExtractTranslation( IWwwTranslationExtractionContext context )
       {
-         var data = context.ResultData;
+         var data = context.ResponseData;
          var obj = JSON.Parse( data );
          var lineBuilder = new StringBuilder( data.Length );
 

+ 0 - 3
src/Translators/YandexTranslate/YandexTranslate.csproj

@@ -9,9 +9,6 @@
    </ItemGroup>
 
    <ItemGroup>
-      <Reference Include="ExIni">
-         <HintPath>..\..\..\libs\ExIni.dll</HintPath>
-      </Reference>
       <Reference Include="UnityEngine">
          <HintPath>..\..\..\libs\UnityEngine.dll</HintPath>
       </Reference>

+ 8 - 8
src/Translators/YandexTranslate/YandexTranslateEndpoint.cs

@@ -30,18 +30,18 @@ namespace YandexTranslate
       {
       }
 
-      public override void Initialize( InitializationContext context )
+      public override void Initialize( IInitializationContext context )
       {
-         _key = context.Config.Preferences[ "Yandex" ][ "YandexAPIKey" ].GetOrDefault( "" );
+         _key = context.GetOrCreateSetting( "Yandex", "YandexAPIKey", "" );
          if( string.IsNullOrEmpty( _key ) ) throw new Exception( "The YandexTranslate endpoint requires an API key which has not been provided." );
 
-         context.HttpSecurity.EnableSslFor( "translate.yandex.net" );
+         context.EnableSslFor( "translate.yandex.net" );
          
          if( context.SourceLanguage != "ja" ) throw new Exception( "Current implementation only supports japanese-to-english." );
          if( context.DestinationLanguage != "en" ) throw new Exception( "Current implementation only supports japanese-to-english." );
       }
 
-      public override XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context )
+      public override void OnCreateRequest( IHttpRequestCreationContext context )
       {
          var request = new XUnityWebRequest(
             string.Format(
@@ -51,16 +51,16 @@ namespace YandexTranslate
                WWW.EscapeURL( context.UntranslatedText ),
                _key ) );
 
-         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslationState.UserAgent ) ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.183 Safari/537.36 Vivaldi/1.96.1147.55" : AutoTranslationState.UserAgent;
+         request.Headers[ HttpRequestHeader.UserAgent ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.183 Safari/537.36 Vivaldi/1.96.1147.55" : AutoTranslatorSettings.UserAgent;
          request.Headers[ HttpRequestHeader.Accept ] = "*/*";
          request.Headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
 
-         return request;
+         context.Complete( request );
       }
 
-      public override void ExtractTranslatedText( HttpTranslationContext context )
+      public override void OnExtractTranslation( IHttpTranslationExtractionContext context )
       {
-         var data = context.ResultData;
+         var data = context.Response.Data;
          var obj = JSON.Parse( data );
          var lineBuilder = new StringBuilder( data.Length );
 

+ 1 - 1
src/XUnity.AutoTranslator.Plugin.BepIn/AutoTranslatorPlugin.cs

@@ -29,7 +29,7 @@ namespace XUnity.AutoTranslator.Plugin.BepIn
       {
          get
          {
-            return ( _file ?? ( _file = ReloadConfig() ) ); ;
+            return ( _file ?? ( _file = ReloadConfig() ) );
          }
       }
 

+ 1 - 1
src/XUnity.AutoTranslator.Plugin.Core/AutoTranslationPlugin.cs

@@ -168,7 +168,7 @@ namespace XUnity.AutoTranslator.Plugin.Core
          _httpSecurity = new HttpSecurity();
          try
          {
-            var context = new InitializationContext( Config.Current, _httpSecurity, Settings.FromLanguage, Settings.Language );
+            var context = new InitializationContext( _httpSecurity, Settings.FromLanguage, Settings.Language );
 
             _configuredEndpoints = KnownEndpoints.CreateEndpoints( gameObject, context )
                .OrderBy( x => x.Error != null )

+ 13 - 0
src/XUnity.AutoTranslator.Plugin.Core/AutoTranslatorSettings.cs

@@ -0,0 +1,13 @@
+using XUnity.AutoTranslator.Plugin.Core.Configuration;
+
+namespace XUnity.AutoTranslator.Plugin.Core
+{
+   public static class AutoTranslatorSettings
+   {
+      public static string UserAgent => Settings.UserAgent;
+
+      public static string SourceLanguage => Settings.FromLanguage;
+
+      public static string DestinationLanguage => Settings.Language;
+   }
+}

+ 1 - 7
src/XUnity.AutoTranslator.Plugin.Core/AutoTranslationState.cs → src/XUnity.AutoTranslator.Plugin.Core/AutoTranslatorState.cs

@@ -6,14 +6,8 @@ using XUnity.AutoTranslator.Plugin.Core.Configuration;
 
 namespace XUnity.AutoTranslator.Plugin.Core
 {
-   public static class AutoTranslationState
+   public static class AutoTranslatorState
    {
       public static int TranslationCount => Settings.TranslationCount;
-
-      public static string UserAgent => Settings.UserAgent;
-
-      public static string SourceLanguage => Settings.FromLanguage;
-
-      public static string DestinationLanguage => Settings.Language;
    }
 }

+ 5 - 5
src/XUnity.AutoTranslator.Plugin.Core/Configuration/Settings.cs

@@ -105,10 +105,10 @@ namespace XUnity.AutoTranslator.Plugin.Core.Configuration
          }
 
 
-         ServiceEndpoint = Config.Current.Preferences[ "Service" ][ "Endpoint" ].GetOrDefault( KnownEndpointNames.GoogleTranslate, true );
+         ServiceEndpoint = Config.Current.Preferences[ "Service" ][ "Endpoint" ].GetOrDefault( KnownEndpointNames.GoogleTranslate );
 
          Language = Config.Current.Preferences[ "General" ][ "Language" ].GetOrDefault( DefaultLanguage );
-         FromLanguage = Config.Current.Preferences[ "General" ][ "FromLanguage" ].GetOrDefault( DefaultFromLanguage, true );
+         FromLanguage = Config.Current.Preferences[ "General" ][ "FromLanguage" ].GetOrDefault( DefaultFromLanguage );
 
          TranslationDirectory = Config.Current.Preferences[ "Files" ][ "Directory" ].GetOrDefault( @"Translation" );
          OutputFile = Config.Current.Preferences[ "Files" ][ "OutputFile" ].GetOrDefault( @"Translation\_AutoGeneratedTranslations.{lang}.txt" );
@@ -133,12 +133,12 @@ namespace XUnity.AutoTranslator.Plugin.Core.Configuration
          TrimAllText = Config.Current.Preferences[ "Behaviour" ][ "TrimAllText" ].GetOrDefault( ClrTypes.AdvEngine == null );
          UseStaticTranslations = Config.Current.Preferences[ "Behaviour" ][ "UseStaticTranslations" ].GetOrDefault( true );
          OverrideFont = Config.Current.Preferences[ "Behaviour" ][ "OverrideFont" ].GetOrDefault( string.Empty );
-         ResizeUILineSpacingScale = Config.Current.Preferences[ "Behaviour" ][ "ResizeUILineSpacingScale" ].GetOrDefault<float?>( null, true );
+         ResizeUILineSpacingScale = Config.Current.Preferences[ "Behaviour" ][ "ResizeUILineSpacingScale" ].GetOrDefault<float?>( null );
          ForceUIResizing = Config.Current.Preferences[ "Behaviour" ][ "ForceUIResizing" ].GetOrDefault( false );
-         IgnoreTextStartingWith = Config.Current.Preferences[ "Behaviour" ][ "IgnoreTextStartingWith" ].GetOrDefault( "\\u180e;", true )
+         IgnoreTextStartingWith = Config.Current.Preferences[ "Behaviour" ][ "IgnoreTextStartingWith" ].GetOrDefault( "\\u180e;" )
             ?.Split( new[] { ';' }, StringSplitOptions.RemoveEmptyEntries ).Select( x => x.UnescapeJson() ).ToArray() ?? new string[ 0 ];
          TextGetterCompatibilityMode = Config.Current.Preferences[ "Behaviour" ][ "TextGetterCompatibilityMode" ].GetOrDefault( false );
-         GameLogTextPaths = Config.Current.Preferences[ "Behaviour" ][ "GameLogTextPaths" ].GetOrDefault( "", true )
+         GameLogTextPaths = Config.Current.Preferences[ "Behaviour" ][ "GameLogTextPaths" ].GetOrDefault( "" )
             ?.Split( new[] { ';' }, StringSplitOptions.RemoveEmptyEntries ).ToHashSet() ?? new HashSet<string>();
          GameLogTextPaths.RemoveWhere( x => !x.StartsWith( "/" ) ); // clean up to ensure no 'empty' entries
 

+ 2 - 4
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ExtProtocol/ExtProtocolEndpoint.cs

@@ -25,11 +25,11 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.ExtProtocol
 
       public abstract string FriendlyName { get; }
 
-      public abstract void Initialize( InitializationContext context );
+      public abstract void Initialize( IInitializationContext context );
 
       public int MaxConcurrency => 1;
 
-      public IEnumerator Translate( TranslationContext context )
+      public IEnumerator Translate( ITranslationContext context )
       {
          var result = new StreamReaderResult();
          try
@@ -114,8 +114,6 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.ExtProtocol
          finally
          {
             result = null;
-
-            context.FailIfNotCompleted();
          }
       }
 

+ 18 - 15
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/HttpEndpoint.cs

@@ -13,19 +13,17 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
 
       public int MaxConcurrency => 1;
 
-      public abstract void Initialize( InitializationContext context );
+      public abstract void Initialize( IInitializationContext context );
 
-      public abstract void ExtractTranslatedText( HttpTranslationContext context );
+      public abstract void OnExtractTranslation( IHttpTranslationExtractionContext context );
 
-      public abstract XUnityWebRequest CreateTranslationRequest( HttpTranslationContext context );
+      public abstract void OnCreateRequest( IHttpRequestCreationContext context );
 
-      public virtual void InspectTranslationResponse( HttpTranslationContext context, XUnityWebResponse response )
-      {
-      }
+      public virtual void OnInspectResponse( IHttpResponseInspectionContext context ) { }
 
-      public virtual IEnumerator OnBeforeTranslate( HttpTranslationContext context ) => null;
+      public virtual IEnumerator OnBeforeTranslate( IHttpTranslationContext context ) => null;
 
-      public IEnumerator Translate( TranslationContext context )
+      public IEnumerator Translate( ITranslationContext context )
       {
          var httpContext = new HttpTranslationContext( context );
 
@@ -43,9 +41,15 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
          try
          {
             // prepare request
+            OnCreateRequest( httpContext );
+            if( httpContext.Request == null )
+            {
+               httpContext.Fail( "No request object was provided by the translator.", null );
+               yield break;
+            }
+
             var client = new XUnityWebClient();
-            var request = CreateTranslationRequest( httpContext );
-            response = client.Send( request );
+            response = client.Send( httpContext.Request );
          }
          catch( Exception e )
          {
@@ -66,7 +70,8 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
             }
          }
 
-         InspectTranslationResponse( httpContext, response );
+         httpContext.Response = response;
+         OnInspectResponse( httpContext );
 
          // failure
          if( response.Error != null )
@@ -76,18 +81,16 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
          }
 
          // failure
-         if( response.Result == null )
+         if( response.Data == null )
          {
             httpContext.Fail( "Error occurred while retrieving translation. Nothing was returned.", null );
             yield break;
          }
 
-         httpContext.ResultData = response.Result;
-
          try
          {
             // attempt to extract translation from data
-            ExtractTranslatedText( httpContext );
+            OnExtractTranslation( httpContext );
          }
          catch( Exception e )
          {

+ 15 - 8
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/HttpTranslationContext.cs

@@ -2,14 +2,15 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using XUnity.AutoTranslator.Plugin.Core.Web;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
 {
-   public class HttpTranslationContext
+   internal class HttpTranslationContext : IHttpTranslationContext, IHttpRequestCreationContext, IHttpResponseInspectionContext, IHttpTranslationExtractionContext
    {
-      private readonly TranslationContext _context;
+      private readonly ITranslationContext _context;
 
-      internal HttpTranslationContext( TranslationContext context )
+      internal HttpTranslationContext( ITranslationContext context )
       {
          _context = context;
       }
@@ -17,16 +18,22 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
       public string UntranslatedText => _context.UntranslatedText;
       public string SourceLanguage => _context.SourceLanguage;
       public string DestinationLanguage => _context.DestinationLanguage;
-      public string ResultData { get; internal set; }
+      public XUnityWebResponse Response { get; internal set; }
+      public XUnityWebRequest Request { get; internal set; }
 
-      public void Complete( string translatedText )
+      public void Fail( string reason, Exception exception )
       {
-         _context.Complete( translatedText );
+         _context.Fail( reason, exception );
       }
 
-      public void Fail( string reason, Exception exception )
+      void IHttpRequestCreationContext.Complete( XUnityWebRequest request )
       {
-         _context.Fail( reason, exception );
+         Request = request;
+      }
+
+      void IHttpTranslationExtractionContext.Complete( string translatedText )
+      {
+         _context.Complete( translatedText );
       }
    }
 }

+ 9 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpRequestCreationContext.cs

@@ -0,0 +1,9 @@
+using XUnity.AutoTranslator.Plugin.Core.Web;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
+{
+   public interface IHttpRequestCreationContext : IHttpTranslationContext
+   {
+      void Complete( XUnityWebRequest request );
+   }
+}

+ 11 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpResponseInspectionContext.cs

@@ -0,0 +1,11 @@
+using XUnity.AutoTranslator.Plugin.Core.Web;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
+{
+   public interface IHttpResponseInspectionContext : IHttpTranslationContext
+   {
+      XUnityWebRequest Request { get; }
+
+      XUnityWebResponse Response { get; }
+   }
+}

+ 13 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpTranslationContext.cs

@@ -0,0 +1,13 @@
+using System;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
+{
+   public interface IHttpTranslationContext
+   {
+      string UntranslatedText { get; }
+      string SourceLanguage { get; }
+      string DestinationLanguage { get; }
+
+      void Fail( string reason, Exception exception );
+   }
+}

+ 13 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Http/IHttpTranslationExtractionContext.cs

@@ -0,0 +1,13 @@
+using XUnity.AutoTranslator.Plugin.Core.Web;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Http
+{
+   public interface IHttpTranslationExtractionContext : IHttpTranslationContext
+   {
+      XUnityWebRequest Request { get; }
+
+      XUnityWebResponse Response { get; }
+
+      void Complete( string translatedText );
+   }
+}

+ 15 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/IInitializationContext.cs

@@ -0,0 +1,15 @@
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
+{
+   public interface IInitializationContext
+   {
+      string PluginDirectory { get; }
+
+      T GetOrCreateSetting<T>( string section, string key, T defaultValue );
+      T GetOrCreateSetting<T>( string section, string key );
+
+      void EnableSslFor( params string[] hosts );
+
+      string SourceLanguage { get; }
+      string DestinationLanguage { get; }
+   }
+}

+ 2 - 2
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ITranslateEndpoint.cs

@@ -28,12 +28,12 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
       /// <summary>
       /// Called during initialization. Use this to initialize plugin or throw exception if impossible.
       /// </summary>
-      void Initialize( InitializationContext context );
+      void Initialize( IInitializationContext context );
 
       /// <summary>
       /// Attempt to translated the provided untranslated text. Will be used in a "coroutine", so it can be implemented
       /// in an async fashion.
       /// </summary>
-      IEnumerator Translate( TranslationContext context );
+      IEnumerator Translate( ITranslationContext context );
    }
 }

+ 14 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/ITranslationContext.cs

@@ -0,0 +1,14 @@
+using System;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
+{
+   public interface ITranslationContext
+   {
+      string UntranslatedText { get; }
+      string SourceLanguage { get; }
+      string DestinationLanguage { get; }
+
+      void Complete( string translatedText );
+      void Fail( string reason, Exception exception );
+   }
+}

+ 23 - 15
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/InitializationContext.cs

@@ -3,35 +3,26 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using XUnity.AutoTranslator.Plugin.Core.Configuration;
+using XUnity.AutoTranslator.Plugin.Core.Extensions;
 using XUnity.AutoTranslator.Plugin.Core.Web;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
 {
-   public class InitializationContext
+   internal class InitializationContext : IInitializationContext
    {
+      private HttpSecurity _security;
+
       internal InitializationContext(
-         IConfiguration config,
          HttpSecurity httpSecurity,
          string sourceLanguage,
          string destinationLanguage )
       {
-         Config = config;
-         HttpSecurity = httpSecurity;
+         _security = httpSecurity;
+
          SourceLanguage = sourceLanguage;
          DestinationLanguage = destinationLanguage;
       }
 
-      /// <summary>
-      /// Gets the configuration of the plugin, including the directory where
-      /// the configuration file is placed.
-      /// </summary>
-      public IConfiguration Config { get; }
-
-      /// <summary>
-      /// Gets the HttpSecurity class which enables setting up SSL for endpoints.
-      /// </summary>
-      public HttpSecurity HttpSecurity { get; }
-
       /// <summary>
       /// Gets the source language.
       /// </summary>
@@ -41,5 +32,22 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
       /// Gets the destination language.
       /// </summary>
       public string DestinationLanguage { get; }
+
+      public string PluginDirectory => Config.Current.DataPath;
+
+      public void EnableSslFor( params string[] hosts )
+      {
+         _security.EnableSslFor( hosts );
+      }
+
+      public T GetOrCreateSetting<T>( string section, string key, T defaultValue )
+      {
+         return Config.Current.Preferences[ section ][ key ].GetOrDefault<T>( defaultValue );
+      }
+
+      public T GetOrCreateSetting<T>( string section, string key )
+      {
+         return Config.Current.Preferences[ section ][ key ].GetOrDefault<T>( default( T ) );
+      }
    }
 }

+ 6 - 6
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/TranslationContext.cs

@@ -2,7 +2,7 @@
 
 namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
 {
-   public class TranslationContext
+   internal class TranslationContext : ITranslationContext
    {
       private Action<string> _complete;
       private Action<string, Exception> _fail;
@@ -26,7 +26,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
       public string SourceLanguage { get; }
       public string DestinationLanguage { get; }
 
-      internal bool Completed { get; set; }
+      internal bool IsDone { get; private set; }
 
       public void Complete( string translatedText )
       {
@@ -43,7 +43,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
          }
          finally
          {
-            Completed = true;
+            IsDone = true;
          }
       }
 
@@ -55,15 +55,15 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints
          }
          finally
          {
-            Completed = true;
+            IsDone = true;
          }
       }
 
       internal void FailIfNotCompleted()
       {
-         if( !Completed )
+         if( !IsDone )
          {
-            Fail( "The translation request was not completed before returning from translator!", null );
+            Fail( "The translation request was not completed before returning from translator.", null );
          }
       }
    }

+ 7 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwRequestCreationContext.cs

@@ -0,0 +1,7 @@
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
+{
+   public interface IWwwRequestCreationContext : IWwwTranslationContext
+   {
+      void Complete( WwwRequestInfo requestInfo );
+   }
+}

+ 13 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwTranslationContext.cs

@@ -0,0 +1,13 @@
+using System;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
+{
+   public interface IWwwTranslationContext
+   {
+      string UntranslatedText { get; }
+      string SourceLanguage { get; }
+      string DestinationLanguage { get; }
+
+      void Fail( string reason, Exception exception );
+   }
+}

+ 9 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/IWwwTranslationExtractionContext.cs

@@ -0,0 +1,9 @@
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
+{
+   public interface IWwwTranslationExtractionContext : IWwwTranslationContext
+   {
+      string ResponseData { get; }
+
+      void Complete( string translatedText );
+   }
+}

+ 21 - 12
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwEndpoint.cs

@@ -19,17 +19,17 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
 
       public abstract string FriendlyName { get; }
 
-      public abstract void Initialize( InitializationContext context );
+      public int MaxConcurrency => 1;
 
-      public abstract void CreateTranslationRequest( WwwTranslationContext context );
+      public abstract void Initialize( IInitializationContext context );
 
-      public abstract void ExtractTranslatedText( WwwTranslationContext context );
+      public abstract void OnCreateRequest( IWwwRequestCreationContext context );
 
-      public virtual IEnumerator OnBeforeTranslate( WwwTranslationContext context ) => null;
+      public abstract void OnExtractTranslation( IWwwTranslationExtractionContext context );
 
-      public int MaxConcurrency => 1;
+      public virtual IEnumerator OnBeforeTranslate( IWwwTranslationContext context ) => null;
 
-      public IEnumerator Translate( TranslationContext context )
+      public IEnumerator Translate( ITranslationContext context )
       {
          var wwwContext = new WwwTranslationContext( context );
 
@@ -47,13 +47,20 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
          try
          {
             // prepare request
-            CreateTranslationRequest( wwwContext );
-            var url = wwwContext.ServiceUrl;
-            var data = wwwContext.Data;
-            var headers = wwwContext.Headers ?? new Dictionary<string, string>();
+            OnCreateRequest( wwwContext );
+            if( wwwContext.RequestInfo == null )
+            {
+               wwwContext.Fail( "No request object was provided by the translator.", null );
+               yield break;
+            }
+
+            var request = wwwContext.RequestInfo;
+            var url = request.Address;
+            var data = request.Data;
+            var headers = request.Headers;
 
             // execute request
-            www = WwwConstructor.Invoke( new object[] { url, data != null ? Encoding.UTF8.GetBytes( data ) : null, headers } );
+            www = WwwConstructor.Invoke( new object[] { request.Address, data != null ? Encoding.UTF8.GetBytes( data ) : null, headers } );
          }
          catch( Exception e )
          {
@@ -97,7 +104,9 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
                yield break;
             }
 
-            ExtractTranslatedText( wwwContext );
+            wwwContext.ResponseData = text;
+
+            OnExtractTranslation( wwwContext );
          }
          catch( Exception e )
          {

+ 38 - 0
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwRequestInfo.cs

@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
+{
+   public class WwwRequestInfo
+   {
+      private Dictionary<string, string> _headers;
+
+      public WwwRequestInfo( string address )
+      {
+         Address = address;
+      }
+
+      public WwwRequestInfo( string address, string data )
+      {
+         Address = address;
+         Data = data;
+      }
+
+      public string Address { get; set; }
+
+      public string Data { get; set; }
+
+      public Dictionary<string, string> Headers
+      {
+         get
+         {
+            if( _headers == null ) _headers = new Dictionary<string, string>();
+
+            return _headers;
+         }
+         set
+         {
+            _headers = value;
+         }
+      }
+   }
+}

+ 8 - 23
src/XUnity.AutoTranslator.Plugin.Core/Endpoints/Www/WwwTranslationContext.cs

@@ -1,15 +1,14 @@
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
 {
-   public class WwwTranslationContext
+   internal class WwwTranslationContext : IWwwTranslationContext, IWwwRequestCreationContext, IWwwTranslationExtractionContext
    {
-      private readonly TranslationContext _context;
+      private readonly ITranslationContext _context;
 
-      internal WwwTranslationContext( TranslationContext context )
+      internal WwwTranslationContext( ITranslationContext context )
       {
          _context = context;
       }
@@ -17,30 +16,16 @@ namespace XUnity.AutoTranslator.Plugin.Core.Endpoints.Www
       public string UntranslatedText => _context.UntranslatedText;
       public string SourceLanguage => _context.SourceLanguage;
       public string DestinationLanguage => _context.DestinationLanguage;
-      public string ResultData { get; internal set; }
 
-      internal string ServiceUrl { get; private set; }
-      internal string Data { get; private set; }
-      internal Dictionary<string, string> Headers { get; private set; }
+      public string ResponseData { get; internal set; }
+      internal WwwRequestInfo RequestInfo { get; private set; }
 
-      public void SetServiceUrl( string serviceUrl )
+      void IWwwRequestCreationContext.Complete( WwwRequestInfo requestInfo )
       {
-         if( string.IsNullOrEmpty( serviceUrl ) ) throw new ArgumentNullException( nameof( serviceUrl ), "Received empty service url from translator." );
-
-         ServiceUrl = serviceUrl;
-      }
-
-      public void SetRequestObject( string data )
-      {
-         Data = data;
-      }
-
-      public void SetHeaders( Dictionary<string, string> headers )
-      {
-         Headers = headers;
+         RequestInfo = requestInfo;
       }
 
-      public void Complete( string translatedText )
+      void IWwwTranslationExtractionContext.Complete( string translatedText )
       {
          _context.Complete( translatedText );
       }

+ 15 - 51
src/XUnity.AutoTranslator.Plugin.Core/Extensions/IniKeyExtensions.cs

@@ -8,74 +8,37 @@ using XUnity.AutoTranslator.Plugin.Core.Extensions;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Extensions
 {
-   public static class IniKeyExtensions
+   internal static class IniKeyExtensions
    {
-      public static T GetOrDefault<T>( this IniKey that, T defaultValue, bool allowEmpty = false )
+      public static T GetOrDefault<T>( this IniKey that, T defaultValue )
       {
          var typeOfT = typeof( T ).UnwrapNullable();
-         if( allowEmpty )
+         var value = that.Value;
+
+         if( value == null ) // we want to use the default value, because it is null, the config has just been created
          {
-            var value = that.Value;
-            if( value == null ) // we want to use the default value, because it is null, the config has just been created
+            if( defaultValue != null )
             {
-               if( defaultValue != null )
+               if( typeOfT.IsEnum )
                {
-                  if( typeOfT.IsEnum )
-                  {
-                     that.Value = Enum.GetName( typeOfT, defaultValue );
-                  }
-                  else
-                  {
-                     that.Value = Convert.ToString( defaultValue, CultureInfo.InvariantCulture );
-                  }
+                  that.Value = Enum.GetName( typeOfT, defaultValue );
                }
                else
                {
-                  that.Value = string.Empty;
+                  that.Value = Convert.ToString( defaultValue, CultureInfo.InvariantCulture );
                }
-               return defaultValue;
             }
             else
             {
-               // there exists a value in the config, so we do not want to set anything
-               // we just want to return what we can find, default not included
-               if( !string.IsNullOrEmpty( value ) )
-               {
-                  if( typeOfT.IsEnum )
-                  {
-                     return (T)Enum.Parse( typeOfT, that.Value, true );
-                  }
-                  else
-                  {
-                     return (T)Convert.ChangeType( that.Value, typeOfT, CultureInfo.InvariantCulture );
-                  }
-               }
-               return default( T );
+               that.Value = string.Empty;
             }
+            return defaultValue;
          }
          else
          {
-            var value = that.Value;
-            if( string.IsNullOrEmpty( value ) )
-            {
-               if( defaultValue != null )
-               {
-                  if( typeOfT.IsEnum )
-                  {
-                     that.Value = Enum.GetName( typeOfT, defaultValue );
-                  }
-                  else
-                  {
-                     that.Value = Convert.ToString( defaultValue, CultureInfo.InvariantCulture );
-                  }
-               }
-               else
-               {
-                  that.Value = string.Empty;
-               }
-               return defaultValue;
-            }
-            else
+            // there exists a value in the config, so we do not want to set anything
+            // we just want to return what we can find, default not included
+            if( !string.IsNullOrEmpty( value ) )
             {
                if( typeOfT.IsEnum )
                {
@@ -86,6 +49,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Extensions
                   return (T)Convert.ChangeType( that.Value, typeOfT, CultureInfo.InvariantCulture );
                }
             }
+            return default( T );
          }
       }
    }

+ 3 - 3
src/XUnity.AutoTranslator.Plugin.Core/Web/XUnityWebResponse.cs

@@ -6,19 +6,19 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
    public class XUnityWebResponse : CustomYieldInstructionShim
    {
-      public void SetCompleted( HttpStatusCode code, string result, WebHeaderCollection headers, CookieCollection newCookies, Exception error )
+      public void SetCompleted( HttpStatusCode code, string data, WebHeaderCollection headers, CookieCollection newCookies, Exception error )
       {
          IsCompleted = true;
 
          Code = code;
-         Result = result;
+         Data = data;
          Headers = headers;
          NewCookies = newCookies;
          Error = error;
       }
 
       public HttpStatusCode Code { get; set; }
-      public string Result { get; private set; }
+      public string Data { get; private set; }
       public WebHeaderCollection Headers { get; private set; }
       public CookieCollection NewCookies { get; private set; }
       public Exception Error { get; private set; }