OSDN Git Service

TwitterCredentialOAuth1に渡す引数の誤りを修正
[opentween/open-tween.git] / OpenTween / Setting / SettingCommon.cs
index de6ca3e..c57f1ee 100644 (file)
@@ -30,21 +30,30 @@ using System;
 using System.Collections.Generic;
 using System.Windows.Forms;
 using System.Xml.Serialization;
+using OpenTween.Connection;
 using OpenTween.Thumbnail;
 
 namespace OpenTween
 {
+    [XmlSerializerAssembly(null, null)] // OpenTween アセンブリ内の XmlSerializerContract を使用させる
     public class SettingCommon : SettingBase<SettingCommon>
     {
         #region "Settingクラス基本"
-        public static SettingCommon Load()
-            => LoadSettings();
+        public static SettingCommon Load(string settingsPath)
+            => LoadSettings(settingsPath);
 
-        public void Save()
-            => SaveSettings(this);
+        public void Save(string settingsPath)
+            => SaveSettings(this, settingsPath);
         #endregion
 
         public List<UserAccount> UserAccounts = new();
+
+        public Guid? SelectedAccountKey { get; set; } = null;
+
+        [XmlIgnore]
+        public UserAccount? SelectedAccount
+            => this.UserAccounts.Find(x => x.UniqueKey == this.SelectedAccountKey);
+
         public string UserName = "";
 
         [XmlIgnore]
@@ -156,6 +165,13 @@ namespace OpenTween
         public bool TinyUrlResolve = true;
         public bool StartupVersion = true;
         public bool StartupFollowers = true;
+
+        /// <summary>
+        /// Twitter API v2 の使用を有効にする
+        /// </summary>
+        [XmlIgnore]
+        public bool EnableTwitterV2Api => false;
+
         public bool RestrictFavCheck = false;
         public bool AlwaysTop = false;
         public string CultureCode = "";
@@ -260,13 +276,108 @@ namespace OpenTween
 
         [XmlElement(ElementName = nameof(SkipUpdateVersion))]
         public string SkipUpdateVersionStr { get; set; } = "";
+
+        public void Validate()
+        {
+            if (this.TimelinePeriod < 0)
+                this.TimelinePeriod = 15;
+
+            if (this.ReplyPeriod < 0)
+                this.ReplyPeriod = 15;
+
+            if (this.DMPeriod < 0)
+                this.DMPeriod = 15;
+
+            if (this.PubSearchPeriod < 0)
+                this.PubSearchPeriod = 30;
+
+            if (this.UserTimelinePeriod < 0)
+                this.UserTimelinePeriod = 15;
+
+            if (this.ListsPeriod < 0)
+                this.ListsPeriod = 15;
+
+            if (!Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Timeline, this.CountApi))
+                this.CountApi = 60;
+
+            if (!Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Reply, this.CountApiReply))
+                this.CountApiReply = 40;
+
+            if (this.MoreCountApi != 0 && !Twitter.VerifyMoreApiResultCount(this.MoreCountApi))
+                this.MoreCountApi = 200;
+
+            if (this.FirstCountApi != 0 && !Twitter.VerifyFirstApiResultCount(this.FirstCountApi))
+                this.FirstCountApi = 100;
+
+            if (this.FavoritesCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Favorites, this.FavoritesCountApi))
+                this.FavoritesCountApi = 40;
+
+            if (this.ListCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.List, this.ListCountApi))
+                this.ListCountApi = 100;
+
+            if (this.SearchCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.PublicSearch, this.SearchCountApi))
+                this.SearchCountApi = 100;
+
+            if (this.UserTimelineCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.UserTimeline, this.UserTimelineCountApi))
+                this.UserTimelineCountApi = 20;
+
+            // 廃止サービスが選択されていた場合ux.nuへ読み替え
+            if (this.AutoShortUrlFirst < 0)
+                this.AutoShortUrlFirst = MyCommon.UrlConverter.Uxnu;
+
+            UserAccount? selectedAccount;
+            if (this.SelectedAccountKey != null)
+            {
+                selectedAccount = this.SelectedAccount;
+            }
+            else
+            {
+                selectedAccount = this.UserAccounts.Find(
+                    x => string.Equals(x.Username, this.UserName, StringComparison.InvariantCultureIgnoreCase)
+                );
+            }
+
+            this.SelectedAccountKey = selectedAccount?.UniqueKey;
+
+            if (selectedAccount?.UserId == 0)
+                selectedAccount.UserId = this.UserId;
+
+            if (MyCommon.IsNullOrEmpty(this.Token))
+                this.UserName = "";
+        }
     }
 
     public class UserAccount
     {
+        public Guid UniqueKey { get; set; } = Guid.NewGuid();
+
         public string Username = "";
         public long UserId = 0;
+
+        public APIAuthType TwitterAuthType { get; set; } = APIAuthType.OAuth1;
+
+        public string TwitterOAuth1ConsumerKey { get; set; } = "";
+
+        [XmlIgnore]
+        public string TwitterOAuth1ConsumerSecret { get; set; } = "";
+
+        public string TwitterOAuth1ConsumerSecretEncrypted
+        {
+            get => this.Encrypt(this.TwitterOAuth1ConsumerSecret);
+            set => this.TwitterOAuth1ConsumerSecret = this.Decrypt(value);
+        }
+
+        [XmlIgnore]
+        public string TwitterComCookie { get; set; } = "";
+
+        public string TwitterComCookieEncrypted
+        {
+            get => this.Encrypt(this.TwitterComCookie);
+            set => this.TwitterComCookie = this.Decrypt(value);
+        }
+
         public string Token = "";
+
         [XmlIgnore]
         public string TokenSecret = "";
 
@@ -276,6 +387,31 @@ namespace OpenTween
             set => this.TokenSecret = this.Decrypt(value);
         }
 
+        public TwitterAppToken GetTwitterAppToken()
+        {
+            return new()
+            {
+                AuthType = this.TwitterAuthType,
+                OAuth1CustomConsumerKey = MyCommon.IsNullOrEmpty(this.TwitterOAuth1ConsumerKey) ? null : ApiKey.Create(this.TwitterOAuth1ConsumerKey),
+                OAuth1CustomConsumerSecret = MyCommon.IsNullOrEmpty(this.TwitterOAuth1ConsumerSecret) ? null : ApiKey.Create(this.TwitterOAuth1ConsumerSecret),
+                TwitterComCookie = this.TwitterComCookie,
+            };
+        }
+
+        public ITwitterCredential GetTwitterCredential()
+        {
+            var appToken = this.GetTwitterAppToken();
+
+            return appToken.AuthType switch
+            {
+                APIAuthType.OAuth1
+                    => new TwitterCredentialOAuth1(appToken, this.Token, this.TokenSecret),
+                APIAuthType.TwitterComCookie
+                    => new TwitterCredentialCookie(appToken),
+                _ => new TwitterCredentialNone(),
+            };
+        }
+
         private string Encrypt(string password)
         {
             if (MyCommon.IsNullOrEmpty(password)) password = "";
@@ -316,4 +452,11 @@ namespace OpenTween
         public override string ToString()
             => this.Username;
     }
+
+    public enum APIAuthType
+    {
+        None,
+        OAuth1,
+        TwitterComCookie,
+    }
 }
\ No newline at end of file