Selaa lähdekoodia

Fix #2

Support for both WebClient and WWW
Scrublord1336 6 vuotta sitten
vanhempi
commit
671ed0e109

+ 2 - 0
src/XUnity.AutoTranslator.Plugin.Core/Constants/Types.cs

@@ -18,6 +18,8 @@ namespace XUnity.AutoTranslator.Plugin.Core.Constants
 
       public static readonly Type UILabel = FindType( "UILabel" );
 
+      public static readonly Type WWW = FindType( "UnityEngine.WWW" );
+
       private static Type FindType( string name )
       {
          return AppDomain.CurrentDomain.GetAssemblies()

+ 1 - 1
src/XUnity.AutoTranslator.Plugin.Core/Web/IKnownEndpoint.cs → src/XUnity.AutoTranslator.Plugin.Core/IKnownEndpoint.cs

@@ -4,7 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
-namespace XUnity.AutoTranslator.Plugin.Core.Web
+namespace XUnity.AutoTranslator.Plugin.Core
 {
    public interface IKnownEndpoint
    {

+ 3 - 2
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownEndpoints.cs → src/XUnity.AutoTranslator.Plugin.Core/KnownEndpoints.cs

@@ -3,12 +3,13 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using XUnity.AutoTranslator.Plugin.Core.Constants;
+using XUnity.AutoTranslator.Plugin.Core.Web;
 
-namespace XUnity.AutoTranslator.Plugin.Core.Web
+namespace XUnity.AutoTranslator.Plugin.Core
 {
    public static class KnownEndpoints
    {
-      public static KnownHttpEndpoint FindEndpoint( string identifier )
+      public static IKnownEndpoint FindEndpoint( string identifier )
       {
          if( string.IsNullOrEmpty( identifier ) ) return null;
 

+ 7 - 7
src/XUnity.AutoTranslator.Plugin.Core/Web/ExciteTranslateEndpoint.cs

@@ -11,8 +11,8 @@ using XUnity.AutoTranslator.Plugin.Core.Extensions;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
-    public class ExciteTranslateEndpoint : KnownHttpEndpoint
-    {
+    public class ExciteTranslateEndpoint : KnownWwwEndpoint
+   {
         private static readonly string HttpsServicePointTemplateUrl = "https://www.excite.co.jp/world/?wb_lp={0}{1}&before={2}";
 
         // Author: Johnny Cee (https://stackoverflow.com/questions/10709821/find-text-in-string-with-c-sharp)
@@ -38,12 +38,12 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
             ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "www.excite.co.jp", "excite.co.jp" );
         }
 
-      public override void ApplyHeaders( WebHeaderCollection headers )
+      public override void ApplyHeaders( Dictionary<string, string> headers )
       {
-         headers[ HttpRequestHeader.UserAgent ] = "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53";
-         headers[ HttpRequestHeader.Accept ] = "text/html";
-         headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
-         headers[ "DNT" ] = "1";
+         headers[ "User-Agent" ] = "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53";
+         headers[ "Accept" ] = "text/html";
+         //headers[ "Accept-Charset" ] = "UTF-8";
+         //headers[ "DNT" ] = "1";
       }
 
         public override bool TryExtractTranslated(string result, out string translated)

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

@@ -43,30 +43,27 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
             _isSettingUp = false;
          }
 
-         var client = GetClient();
-         var url = GetServiceUrl( untranslatedText, from, to );
          Logger.Current.Debug( "Starting translation for: " + untranslatedText );
-
          DownloadResult result = null;
          try
          {
+            var client = GetClient();
+            var url = GetServiceUrl( untranslatedText, from, to );
             ApplyHeaders( client.Headers );
             result = client.GetDownloadResult( new Uri( url ) );
          }
          catch( Exception e )
          {
-            Logger.Current.Error( e, "Error occurred while retrieving translation." );
+            Logger.Current.Debug( e, "Error occurred while setting up translation request." );
          }
 
          if( result != null )
          {
             try
             {
-               Logger.Current.Debug( "Yielding for translation." );
                _runningTranslations++;
                yield return result;
                _runningTranslations--;
-               Logger.Current.Debug( "Yield completed." );
 
                try
                {

+ 137 - 0
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownWwwEndpoint.cs

@@ -0,0 +1,137 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Net;
+using System.Reflection;
+using Harmony;
+using UnityEngine;
+using XUnity.AutoTranslator.Plugin.Core.Configuration;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Web
+{
+   public abstract class KnownWwwEndpoint : IKnownEndpoint
+   {
+      protected static readonly ConstructorInfo WwwConstructor = Constants.Types.WWW.GetConstructor( new[] { typeof( string ), typeof( byte[] ), typeof( Dictionary<string, string> ) } );
+
+      private static int _runningTranslations = 0;
+      private static int _maxConcurrency = 1;
+      private static bool _isSettingUp = false;
+
+      public KnownWwwEndpoint()
+      {
+      }
+
+      public bool IsBusy => _isSettingUp || _runningTranslations >= _maxConcurrency;
+
+      public IEnumerator Translate( string untranslatedText, string from, string to, Action<string> success, Action failure )
+      {
+         try
+         {
+            _isSettingUp = true;
+
+            var setup = OnBeforeTranslate( Settings.TranslationCount );
+            if( setup != null )
+            {
+               while( setup.MoveNext() )
+               {
+                  yield return setup.Current;
+               }
+            }
+         }
+         finally
+         {
+            _isSettingUp = false;
+         }
+
+         Logger.Current.Debug( "Starting translation for: " + untranslatedText );
+         object www = null;
+         try
+         {
+            var headers = new Dictionary<string, string>();
+            ApplyHeaders( headers );
+            var url = GetServiceUrl( untranslatedText, from, to );
+            www = WwwConstructor.Invoke( new object[] { url, null, headers } );
+         }
+         catch( Exception e )
+         {
+            Logger.Current.Debug( e, "Error occurred while setting up translation request." );
+         }
+
+         if( www != null )
+         {
+            _runningTranslations++;
+            yield return www;
+            _runningTranslations--;
+
+            try
+            {
+               string error = null;
+               try
+               {
+                  error = (string)AccessTools.Property( Constants.Types.WWW, "error" ).GetValue( www, null );
+               }
+               catch( Exception e )
+               {
+                  error = e.ToString();
+               }
+
+               if( error != null )
+               {
+                  Logger.Current.Error( "Error occurred while retrieving translation." + Environment.NewLine + error );
+                  failure();
+               }
+               else
+               {
+                  var text = (string)AccessTools.Property( Constants.Types.WWW, "text" ).GetValue( www, null ); ;
+
+                  if( text != null )
+                  {
+                     if( TryExtractTranslated( text, out var translatedText ) )
+                     {
+                        Logger.Current.Debug( $"Translation for '{untranslatedText}' succeded. Result: {translatedText}" );
+
+                        translatedText = translatedText ?? string.Empty;
+                        success( translatedText );
+                     }
+                     else
+                     {
+                        Logger.Current.Error( "Error occurred while extracting translation." );
+                        failure();
+                     }
+                  }
+                  else
+                  {
+                     Logger.Current.Error( "Error occurred while extracting text from response." );
+                     failure();
+                  }
+               }
+            }
+            catch( Exception e )
+            {
+               Logger.Current.Error( e, "Error occurred while retrieving translation." );
+               failure();
+            }
+         }
+      }
+
+      public virtual void OnUpdate()
+      {
+      }
+
+      public virtual bool ShouldGetSecondChanceAfterFailure()
+      {
+         return false;
+      }
+
+      public abstract string GetServiceUrl( string untranslatedText, string from, string to );
+
+      public abstract void ApplyHeaders( Dictionary<string, string> headers );
+
+      public abstract bool TryExtractTranslated( string result, out string translated );
+
+      public virtual IEnumerator OnBeforeTranslate( int translationCount )
+      {
+         return null;
+      }
+   }
+}