OSDN Git Service

ITwitterCredentialとアクセス手段ごとの具象クラスを追加
[opentween/open-tween.git] / OpenTween / AppendSettingDialog.cs
index 53298e7..703cd51 100644 (file)
@@ -6,57 +6,61 @@
 //           (c) 2010-2011 fantasticswallow (@f_swallow) <http://twitter.com/f_swallow>
 //           (c) 2011      kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
 // All rights reserved.
-// 
+//
 // This file is part of OpenTween.
-// 
+//
 // This program is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by the Free
 // Software Foundation; either version 3 of the License, or (at your option)
 // any later version.
-// 
+//
 // This program is distributed in the hope that it will be useful, but
 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-// for more details. 
-// 
+// for more details.
+//
 // You should have received a copy of the GNU General Public License along
 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
 // Boston, MA 02110-1301, USA.
 
+#nullable enable
+
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
+using System.IO;
 using System.Linq;
+using System.Net.Http;
+using System.Resources;
 using System.Text;
-using System.Windows.Forms;
 using System.Threading;
-using System.IO;
-using System.Resources;
+using System.Threading.Tasks;
+using System.Windows.Forms;
 using OpenTween.Api;
 using OpenTween.Connection;
-using OpenTween.Thumbnail;
-using System.Threading.Tasks;
 using OpenTween.Setting.Panel;
+using OpenTween.Thumbnail;
 
 namespace OpenTween
 {
     public partial class AppendSettingDialog : OTBaseForm
     {
-        private static AppendSettingDialog _instance = new AppendSettingDialog();
-        internal Twitter tw;
+        public event EventHandler<IntervalChangedEventArgs>? IntervalChanged;
 
-        private bool _ValidationError = false;
-
-        private long? InitialUserId;
-
-        public TwitterConfiguration TwitterConfiguration = TwitterConfiguration.DefaultConfiguration();
+        public AppendSettingDialog()
+        {
+            this.InitializeComponent();
 
-        private string _pin;
+            this.BasedPanel.StartAuthButton.Click += this.StartAuthButton_Click;
+            this.BasedPanel.CreateAccountButton.Click += this.CreateAccountButton_Click;
+            this.GetPeriodPanel.CheckPostAndGet.CheckedChanged += this.CheckPostAndGet_CheckedChanged;
+            this.ActionPanel.UReadMng.CheckedChanged += this.UReadMng_CheckedChanged;
 
-        public event EventHandler<IntervalChangedEventArgs> IntervalChanged;
+            this.Icon = Properties.Resources.MIcon;
+        }
 
         public void LoadConfig(SettingCommon settingCommon, SettingLocal settingLocal)
         {
@@ -75,13 +79,6 @@ namespace OpenTween
             this.CooperatePanel.LoadConfig(settingCommon);
             this.ConnectionPanel.LoadConfig(settingCommon);
             this.NotifyPanel.LoadConfig(settingCommon);
-
-            var activeUser = settingCommon.UserAccounts.FirstOrDefault(x => x.UserId == this.tw.UserId);
-            if (activeUser != null)
-            {
-                this.BasedPanel.AuthUserCombo.SelectedItem = activeUser;
-                this.InitialUserId = activeUser.UserId;
-            }
         }
 
         public void SaveConfig(SettingCommon settingCommon, SettingLocal settingLocal)
@@ -101,24 +98,6 @@ namespace OpenTween
             this.CooperatePanel.SaveConfig(settingCommon);
             this.ConnectionPanel.SaveConfig(settingCommon);
             this.NotifyPanel.SaveConfig(settingCommon);
-
-            var userAccountIdx = this.BasedPanel.AuthUserCombo.SelectedIndex;
-            if (userAccountIdx != -1)
-            {
-                var u = settingCommon.UserAccounts[userAccountIdx];
-                this.tw.Initialize(u.Token, u.TokenSecret, u.Username, u.UserId);
-
-                if (u.UserId == 0)
-                {
-                    this.tw.VerifyCredentials();
-                    u.UserId = this.tw.UserId;
-                }
-            }
-            else
-            {
-                this.tw.ClearAuthInfo();
-                this.tw.Initialize("", "", "", 0);
-            }
         }
 
         private void TreeViewSetting_BeforeSelect(object sender, TreeViewCancelEventArgs e)
@@ -137,104 +116,22 @@ namespace OpenTween
             if (pnl == null) return;
             pnl.Enabled = true;
             pnl.Visible = true;
-
-            if (pnl.Name == "PreviewPanel")
-            {
-                if (GrowlHelper.IsDllExists)
-                {
-                    this.PreviewPanel.IsNotifyUseGrowlCheckBox.Enabled = true;
-                }
-                else
-                {
-                    this.PreviewPanel.IsNotifyUseGrowlCheckBox.Enabled = false;
-                }
-            }
-        }
-
-        private void Save_Click(object sender, EventArgs e)
-        {
-            if (MyCommon.IsNetworkAvailable() &&
-                (this.ShortUrlPanel.ComboBoxAutoShortUrlFirst.SelectedIndex == (int)MyCommon.UrlConverter.Bitly || this.ShortUrlPanel.ComboBoxAutoShortUrlFirst.SelectedIndex == (int)MyCommon.UrlConverter.Jmp))
-            {
-                // bit.ly 短縮機能実装のプライバシー問題の暫定対応
-                // bit.ly 使用時はログインIDとAPIキーの指定を必須とする
-                // 参照: http://sourceforge.jp/projects/opentween/lists/archive/dev/2012-January/000020.html
-                if (string.IsNullOrEmpty(this.ShortUrlPanel.TextBitlyId.Text) || string.IsNullOrEmpty(this.ShortUrlPanel.TextBitlyPw.Text))
-                {
-                    MessageBox.Show("bit.ly のログイン名とAPIキーの指定は必須項目です。", Application.ProductName);
-                    _ValidationError = true;
-                    TreeViewSetting.SelectedNode = TreeViewSetting.Nodes["ConnectionNode"].Nodes["ShortUrlNode"]; // 動作タブを選択
-                    TreeViewSetting.Select();
-                    this.ShortUrlPanel.TextBitlyId.Focus();
-                    return;
-                }
-
-                if (!BitlyValidation(this.ShortUrlPanel.TextBitlyId.Text, this.ShortUrlPanel.TextBitlyPw.Text))
-                {
-                    MessageBox.Show(Properties.Resources.SettingSave_ClickText1);
-                    _ValidationError = true;
-                    TreeViewSetting.SelectedNode = TreeViewSetting.Nodes["ConnectionNode"].Nodes["ShortUrlNode"]; // 動作タブを選択
-                    TreeViewSetting.Select();
-                    this.ShortUrlPanel.TextBitlyId.Focus();
-                    return;
-                }
-                else
-                {
-                    _ValidationError = false;
-                }
-            }
-            else
-            {
-                _ValidationError = false;
-            }
-
-#if UA
-            //フォロー
-            if (this.FollowCheckBox.Checked)
-            {
-                //現在の設定内容で通信
-                HttpConnection.ProxyType ptype;
-                if (RadioProxyNone.Checked)
-                {
-                    ptype = HttpConnection.ProxyType.None;
-                }
-                else if (RadioProxyIE.Checked)
-                {
-                    ptype = HttpConnection.ProxyType.IE;
-                }
-                else
-                {
-                    ptype = HttpConnection.ProxyType.Specified;
-                }
-                string padr = TextProxyAddress.Text.Trim();
-                int pport = int.Parse(TextProxyPort.Text.Trim());
-                string pusr = TextProxyUser.Text.Trim();
-                string ppw = TextProxyPassword.Text.Trim();
-                HttpConnection.InitializeConnection(20, ptype, padr, pport, pusr, ppw);
-
-                string ret = tw.PostFollowCommand(ApplicationSettings.FeedbackTwitterName);
-            }
-#endif
         }
 
         private void Setting_FormClosing(object sender, FormClosingEventArgs e)
         {
-            if (MyCommon._endingFlag) return;
+            if (MyCommon.EndingFlag) return;
 
-            if (tw != null && string.IsNullOrEmpty(tw.Username) && e.CloseReason == CloseReason.None)
+            if (this.BasedPanel.AuthUserCombo.SelectedIndex == -1 && e.CloseReason == CloseReason.None)
             {
                 if (MessageBox.Show(Properties.Resources.Setting_FormClosing1, "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
                 {
                     e.Cancel = true;
                 }
             }
-            if (_ValidationError)
-            {
-                e.Cancel = true;
-            }
-            if (e.Cancel == false && TreeViewSetting.SelectedNode != null)
+            if (e.Cancel == false && this.TreeViewSetting.SelectedNode != null)
             {
-                var curPanel = (SettingPanelBase)TreeViewSetting.SelectedNode.Tag;
+                var curPanel = (SettingPanelBase)this.TreeViewSetting.SelectedNode.Tag;
                 curPanel.Visible = false;
                 curPanel.Enabled = false;
             }
@@ -242,28 +139,26 @@ namespace OpenTween
 
         private void Setting_Load(object sender, EventArgs e)
         {
-            this.TreeViewSetting.Nodes["BasedNode"].Tag = BasedPanel;
-            this.TreeViewSetting.Nodes["BasedNode"].Nodes["PeriodNode"].Tag = GetPeriodPanel;
-            this.TreeViewSetting.Nodes["BasedNode"].Nodes["StartUpNode"].Tag = StartupPanel;
-            this.TreeViewSetting.Nodes["BasedNode"].Nodes["GetCountNode"].Tag = GetCountPanel;
-            //this.TreeViewSetting.Nodes["BasedNode"].Nodes["UserStreamNode"].Tag = UserStreamPanel;
-            this.TreeViewSetting.Nodes["ActionNode"].Tag = ActionPanel;
-            this.TreeViewSetting.Nodes["ActionNode"].Nodes["TweetActNode"].Tag = TweetActPanel;
-            this.TreeViewSetting.Nodes["PreviewNode"].Tag = PreviewPanel;
-            this.TreeViewSetting.Nodes["PreviewNode"].Nodes["TweetPrvNode"].Tag = TweetPrvPanel;
-            this.TreeViewSetting.Nodes["PreviewNode"].Nodes["NotifyNode"].Tag = NotifyPanel;
-            this.TreeViewSetting.Nodes["FontNode"].Tag = FontPanel;
-            this.TreeViewSetting.Nodes["FontNode"].Nodes["FontNode2"].Tag = FontPanel2;
-            this.TreeViewSetting.Nodes["ConnectionNode"].Tag = ConnectionPanel;
-            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["ProxyNode"].Tag = ProxyPanel;
-            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["CooperateNode"].Tag = CooperatePanel;
-            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["ShortUrlNode"].Tag = ShortUrlPanel;
+            this.TreeViewSetting.Nodes["BasedNode"].Tag = this.BasedPanel;
+            this.TreeViewSetting.Nodes["BasedNode"].Nodes["PeriodNode"].Tag = this.GetPeriodPanel;
+            this.TreeViewSetting.Nodes["BasedNode"].Nodes["StartUpNode"].Tag = this.StartupPanel;
+            this.TreeViewSetting.Nodes["BasedNode"].Nodes["GetCountNode"].Tag = this.GetCountPanel;
+            this.TreeViewSetting.Nodes["ActionNode"].Tag = this.ActionPanel;
+            this.TreeViewSetting.Nodes["ActionNode"].Nodes["TweetActNode"].Tag = this.TweetActPanel;
+            this.TreeViewSetting.Nodes["PreviewNode"].Tag = this.PreviewPanel;
+            this.TreeViewSetting.Nodes["PreviewNode"].Nodes["TweetPrvNode"].Tag = this.TweetPrvPanel;
+            this.TreeViewSetting.Nodes["PreviewNode"].Nodes["NotifyNode"].Tag = this.NotifyPanel;
+            this.TreeViewSetting.Nodes["FontNode"].Tag = this.FontPanel;
+            this.TreeViewSetting.Nodes["FontNode"].Nodes["FontNode2"].Tag = this.FontPanel2;
+            this.TreeViewSetting.Nodes["ConnectionNode"].Tag = this.ConnectionPanel;
+            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["ProxyNode"].Tag = this.ProxyPanel;
+            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["CooperateNode"].Tag = this.CooperatePanel;
+            this.TreeViewSetting.Nodes["ConnectionNode"].Nodes["ShortUrlNode"].Tag = this.ShortUrlPanel;
 
             this.TreeViewSetting.SelectedNode = this.TreeViewSetting.Nodes[0];
             this.TreeViewSetting.ExpandAll();
 
-            //TreeViewSetting.SelectedNode = TreeViewSetting.TopNode;
-            ActiveControl = BasedPanel.StartAuthButton;
+            this.ActiveControl = this.BasedPanel.StartAuthButton;
         }
 
         private void UReadMng_CheckedChanged(object sender, EventArgs e)
@@ -278,293 +173,187 @@ namespace OpenTween
             }
         }
 
-        public string RecommendStatusText { get; set; }
-
-        private bool StartAuth()
+        private async void StartAuthButton_Click(object sender, EventArgs e)
         {
-            //現在の設定内容で通信
-            ProxyType ptype;
-            if (this.ProxyPanel.RadioProxyNone.Checked)
-            {
-                ptype = ProxyType.None;
-            }
-            else if (this.ProxyPanel.RadioProxyIE.Checked)
-            {
-                ptype = ProxyType.IE;
-            }
-            else
-            {
-                ptype = ProxyType.Specified;
-            }
-            string padr = this.ProxyPanel.TextProxyAddress.Text.Trim();
-            int pport = int.Parse(this.ProxyPanel.TextProxyPort.Text.Trim());
-            string pusr = this.ProxyPanel.TextProxyUser.Text.Trim();
-            string ppw = this.ProxyPanel.TextProxyPassword.Text.Trim();
-
-            //通信基底クラス初期化
-            Networking.DefaultTimeout = TimeSpan.FromSeconds(20);
-            Networking.SetWebProxy(ptype, padr, pport, pusr, ppw);
-            HttpTwitter.TwitterUrl = this.ConnectionPanel.TwitterAPIText.Text.Trim();
-            tw.Initialize("", "", "", 0);
-            //this.AuthStateLabel.Text = Properties.Resources.AuthorizeButton_Click4;
-            //this.AuthUserLabel.Text = "";
-            string pinPageUrl = "";
-            string rslt = tw.StartAuthentication(ref pinPageUrl);
-            if (string.IsNullOrEmpty(rslt))
+            using (ControlTransaction.Disabled(this.BasedPanel.StartAuthButton))
             {
-                string pin = AuthDialog.DoAuth(this, pinPageUrl);
-                if (!string.IsNullOrEmpty(pin))
+                try
                 {
-                    this._pin = pin;
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-            else
-            {
-                MessageBox.Show(Properties.Resources.AuthorizeButton_Click2 + Environment.NewLine + rslt, "Authenticate", MessageBoxButtons.OK);
-                return false;
-            }
-        }
+                    this.ApplyNetworkSettings();
 
-        private bool PinAuth()
-        {
-            string pin = this._pin;   //PIN Code
+                    var appToken = this.SelectAuthType();
+                    if (appToken == null)
+                        return;
 
-            string rslt = tw.Authenticate(pin);
-            if (string.IsNullOrEmpty(rslt))
-            {
-                MessageBox.Show(Properties.Resources.AuthorizeButton_Click1, "Authenticate", MessageBoxButtons.OK);
-                //this.AuthStateLabel.Text = Properties.Resources.AuthorizeButton_Click3;
-                //this.AuthUserLabel.Text = tw.Username;
-                int idx = -1;
-                UserAccount user = new UserAccount();
-                user.Username = tw.Username;
-                user.UserId = tw.UserId;
-                user.Token = tw.AccessToken;
-                user.TokenSecret = tw.AccessTokenSecret;
-
-                foreach (object u in this.BasedPanel.AuthUserCombo.Items)
-                {
-                    if (((UserAccount)u).Username.ToLower() == tw.Username.ToLower())
+                    UserAccount newAccount;
+                    if (appToken.AuthType == APIAuthType.TwitterComCookie)
                     {
-                        idx = this.BasedPanel.AuthUserCombo.Items.IndexOf(u);
-                        break;
+                        newAccount = new()
+                        {
+                            TwitterAuthType = appToken.AuthType,
+                            TwitterComCookie = appToken.TwitterComCookie,
+                        };
+
+                        using var twitterApi = new TwitterApi();
+                        twitterApi.Initialize(new TwitterCredentialCookie(appToken), 0L, "");
+                        var twitterUser = await twitterApi.AccountVerifyCredentials();
+                        newAccount.UserId = twitterUser.Id;
+                        newAccount.Username = twitterUser.ScreenName;
                     }
+                    else
+                    {
+                        var account = await this.PinAuth(appToken);
+                        if (account == null)
+                            return;
+                        newAccount = account;
+                    }
+
+                    var authUserCombo = this.BasedPanel.AuthUserCombo;
+
+                    var oldAccount = authUserCombo.Items.Cast<UserAccount>()
+                        .FirstOrDefault(x => x.UserId == newAccount.UserId);
+
+                    int idx;
+                    if (oldAccount != null)
+                    {
+                        idx = authUserCombo.Items.IndexOf(oldAccount);
+                        authUserCombo.Items[idx] = newAccount;
+                    }
+                    else
+                    {
+                        idx = authUserCombo.Items.Add(newAccount);
+                    }
+
+                    authUserCombo.SelectedIndex = idx;
+
+                    MessageBox.Show(
+                        this,
+                        Properties.Resources.AuthorizeButton_Click1,
+                        "Authenticate",
+                        MessageBoxButtons.OK);
                 }
-                if (idx > -1)
-                {
-                    this.BasedPanel.AuthUserCombo.Items.RemoveAt(idx);
-                    this.BasedPanel.AuthUserCombo.Items.Insert(idx, user);
-                    this.BasedPanel.AuthUserCombo.SelectedIndex = idx;
-                }
-                else
+                catch (TwitterApiException ex)
                 {
-                    this.BasedPanel.AuthUserCombo.SelectedIndex = this.BasedPanel.AuthUserCombo.Items.Add(user);
-                }
-                //if (TwitterApiInfo.AccessLevel = ApiAccessLevel.ReadWrite)
-                //{
-                //    this.AuthStateLabel.Text += "(xAuth)";
-                //}
-                //else if (TwitterApiInfo.AccessLevel == ApiAccessLevel.ReadWriteAndDirectMessage)
-                //{
-                //    this.AuthStateLabel.Text += "(OAuth)";
-                //}
-                return true;
-            }
-            else
-            {
-                MessageBox.Show(Properties.Resources.AuthorizeButton_Click2 + Environment.NewLine + rslt, "Authenticate", MessageBoxButtons.OK);
-                //this.AuthStateLabel.Text = Properties.Resources.AuthorizeButton_Click4;
-                //this.AuthUserLabel.Text = "";
-                return false;
-            }
-        }
+                    var message = Properties.Resources.AuthorizeButton_Click2 + Environment.NewLine +
+                        string.Join(Environment.NewLine, ex.LongMessages);
 
-        private void StartAuthButton_Click(object sender, EventArgs e)
-        {
-            //this.Save.Enabled = false;
-            if (StartAuth())
-            {
-                if (PinAuth())
-                {
-                    //this.Save.Enabled = true;
+                    MessageBox.Show(this, message, "Authenticate", MessageBoxButtons.OK);
                 }
             }
         }
 
-        private void CheckPostAndGet_CheckedChanged(object sender, EventArgs e)
+        /// <summary>
+        /// 現在設定画面に入力されているネットワーク関係の設定を適用します
+        /// </summary>
+        public void ApplyNetworkSettings()
         {
-            this.GetPeriodPanel.LabelPostAndGet.Visible = this.GetPeriodPanel.CheckPostAndGet.Checked && !tw.UserStreamEnabled;
-        }
+            ProxyType proxyType;
+            if (this.ProxyPanel.RadioProxyNone.Checked)
+                proxyType = ProxyType.None;
+            else if (this.ProxyPanel.RadioProxyIE.Checked)
+                proxyType = ProxyType.IE;
+            else
+                proxyType = ProxyType.Specified;
 
-        private void Setting_Shown(object sender, EventArgs e)
-        {
-            do
-            {
-                Thread.Sleep(10);
-                if (this.Disposing || this.IsDisposed) return;
-            } while (!this.IsHandleCreated);
-            this.TopMost = this.PreviewPanel.CheckAlwaysTop.Checked;
+            var proxyAddress = this.ProxyPanel.TextProxyAddress.Text.Trim();
+            var proxyPort = int.Parse(this.ProxyPanel.TextProxyPort.Text.Trim());
+            var proxyUser = this.ProxyPanel.TextProxyUser.Text.Trim();
+            var proxyPassword = this.ProxyPanel.TextProxyPassword.Text.Trim();
+            Networking.SetWebProxy(proxyType, proxyAddress, proxyPort, proxyUser, proxyPassword);
+
+            var timeout = int.Parse(this.ConnectionPanel.ConnectionTimeOut.Text.Trim());
+            Networking.DefaultTimeout = TimeSpan.FromSeconds(timeout);
+
+            var uploadImageTimeout = int.Parse(this.ConnectionPanel.UploadImageTimeout.Text.Trim());
+            Networking.UploadImageTimeout = TimeSpan.FromSeconds(uploadImageTimeout);
 
-            this.GetPeriodPanel.LabelPostAndGet.Visible = this.GetPeriodPanel.CheckPostAndGet.Checked && !tw.UserStreamEnabled;
-            this.GetPeriodPanel.LabelUserStreamActive.Visible = tw.UserStreamEnabled;
+            Networking.ForceIPv4 = this.ConnectionPanel.checkBoxForceIPv4.Checked;
+
+            TwitterApiConnection.RestApiHost = this.ConnectionPanel.TwitterAPIText.Text.Trim();
         }
 
-        public static AppendSettingDialog Instance
+        private TwitterAppToken? SelectAuthType()
         {
-            get { return _instance; }
+            using var dialog = new AuthTypeSelectDialog();
+
+            var ret = dialog.ShowDialog(this);
+            if (ret != DialogResult.OK)
+                return null;
+
+            return dialog.Result;
         }
 
-        private bool BitlyValidation(string id, string apikey)
+        private async Task<UserAccount?> PinAuth(TwitterAppToken appToken)
         {
-            if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(apikey))
-            {
-                return false;
-            }
+            var requestToken = await TwitterApiConnection.GetRequestTokenAsync(appToken);
 
-            string req = "http://api.bit.ly/v3/validate";
-            string content = "";
-            Dictionary<string, string> param = new Dictionary<string, string>();
+            var pinPageUrl = TwitterApiConnection.GetAuthorizeUri(requestToken);
 
-            param.Add("login", ApplicationSettings.BitlyLoginId);
-            param.Add("apiKey", ApplicationSettings.BitlyApiKey);
-            param.Add("x_login", id);
-            param.Add("x_apiKey", apikey);
-            param.Add("format", "txt");
+            var browserPath = this.ActionPanel.BrowserPathText.Text;
+            var pin = AuthDialog.DoAuth(this, pinPageUrl, browserPath);
+            if (MyCommon.IsNullOrEmpty(pin))
+                return null; // キャンセルされた場合
 
-            if (!(new HttpVarious()).PostData(req, param, out content))
-            {
-                return true;             // 通信エラーの場合はとりあえずチェックを通ったことにする
-            }
-            else if (content.Trim() == "1")
-            {
-                return true;             // 検証成功
-            }
-            else if (content.Trim() == "0")
-            {
-                return false;            // 検証失敗 APIキーとIDの組み合わせが違う
-            }
-            else
+            var accessTokenResponse = await TwitterApiConnection.GetAccessTokenAsync(requestToken, pin);
+
+            return new UserAccount
             {
-                return true;             // 規定外応答:通信エラーの可能性があるためとりあえずチェックを通ったことにする
-            }
+                TwitterAuthType = appToken.AuthType,
+                TwitterOAuth1ConsumerKey = appToken.OAuth1CustomConsumerKey?.Value ?? "",
+                TwitterOAuth1ConsumerSecret = appToken.OAuth1CustomConsumerSecret?.Value ?? "",
+                Username = accessTokenResponse["screen_name"],
+                UserId = long.Parse(accessTokenResponse["user_id"]),
+                Token = accessTokenResponse["oauth_token"],
+                TokenSecret = accessTokenResponse["oauth_token_secret"],
+            };
         }
 
-        private void Cancel_Click(object sender, EventArgs e)
-        {
-            _ValidationError = false;
-        }
+        private void CheckPostAndGet_CheckedChanged(object sender, EventArgs e)
+            => this.GetPeriodPanel.LabelPostAndGet.Visible = this.GetPeriodPanel.CheckPostAndGet.Checked;
 
-        //private void CheckEventNotify_CheckedChanged(object sender, EventArgs e)
-        //                Handles CheckEventNotify.CheckedChanged, CheckFavoritesEvent.CheckStateChanged,
-        //                        CheckUnfavoritesEvent.CheckStateChanged, CheckFollowEvent.CheckStateChanged,
-        //                        CheckListMemberAddedEvent.CheckStateChanged, CheckListMemberRemovedEvent.CheckStateChanged,
-        //                        CheckListCreatedEvent.CheckStateChanged, CheckUserUpdateEvent.CheckStateChanged
-        //{
-        //    EventNotifyEnabled = CheckEventNotify.Checked;
-        //    GetEventNotifyFlag(EventNotifyFlag, IsMyEventNotifyFlag);
-        //    ApplyEventNotifyFlag(EventNotifyEnabled, EventNotifyFlag, IsMyEventNotifyFlag);
-        //}
-
-        //private void CheckForceEventNotify_CheckedChanged(object sender, EventArgs e)
-        //{
-        //    _MyForceEventNotify = CheckEventNotify.Checked;
-        //}
-
-        //private void CheckFavEventUnread_CheckedChanged(object sender, EventArgs e)
-        //{
-        //    _MyFavEventUnread = CheckFavEventUnread.Checked;
-        //}
-
-        //private void ComboBoxTranslateLanguage_SelectedIndexChanged(object sender, EventArgs e)
-        //{
-        //    _MyTranslateLanguage = (new Google()).GetLanguageEnumFromIndex(ComboBoxTranslateLanguage.SelectedIndex);
-        //}
-
-        //private void ComboBoxEventNotifySound_VisibleChanged(object sender, EventArgs e)
-        //{
-        //    SoundFileListup();
-        //}
-
-        //private void ComboBoxEventNotifySound_SelectedIndexChanged(object sender, EventArgs e)
-        //{
-        //   if (_soundfileListup) return;
-
-        //    _MyEventSoundFile = (string)ComboBoxEventNotifySound.SelectedItem;
-        //}
-
-        private void OpenUrl(string url)
+        private void Setting_Shown(object sender, EventArgs e)
         {
-            string myPath = url;
-            string path = this.ActionPanel.BrowserPathText.Text;
-            try
-            {
-                if (!string.IsNullOrEmpty(path))
-                {
-                    if (path.StartsWith("\"") && path.Length > 2 && path.IndexOf("\"", 2) > -1)
-                    {
-                        int sep = path.IndexOf("\"", 2);
-                        string browserPath = path.Substring(1, sep - 1);
-                        string arg = "";
-                        if (sep < path.Length - 1)
-                        {
-                            arg = path.Substring(sep + 1);
-                        }
-                        myPath = arg + " " + myPath;
-                        System.Diagnostics.Process.Start(browserPath, myPath);
-                    }
-                    else
-                    {
-                        System.Diagnostics.Process.Start(path, myPath);
-                    }
-                }
-                else
-                {
-                    System.Diagnostics.Process.Start(myPath);
-                }
-            }
-            catch(Exception)
+            do
             {
-//              MessageBox.Show("ブラウザの起動に失敗、またはタイムアウトしました。" + ex.ToString());
+                Thread.Sleep(10);
+                if (this.Disposing || this.IsDisposed) return;
             }
-        }
+            while (!this.IsHandleCreated);
+            this.TopMost = this.PreviewPanel.CheckAlwaysTop.Checked;
 
-        private void CreateAccountButton_Click(object sender, EventArgs e)
-        {
-            this.OpenUrl("https://twitter.com/signup");
+            this.GetPeriodPanel.LabelPostAndGet.Visible = this.GetPeriodPanel.CheckPostAndGet.Checked;
         }
 
-        public AppendSettingDialog()
+        private async Task OpenUrl(string url)
         {
-            InitializeComponent();
-
-            this.BasedPanel.StartAuthButton.Click += this.StartAuthButton_Click;
-            this.BasedPanel.CreateAccountButton.Click += this.CreateAccountButton_Click;
-            this.GetPeriodPanel.CheckPostAndGet.CheckedChanged += this.CheckPostAndGet_CheckedChanged;
-            this.ActionPanel.UReadMng.CheckedChanged += this.UReadMng_CheckedChanged;
-
-            this.Icon = Properties.Resources.MIcon;
+            var browserPathWithArgs = this.ActionPanel.BrowserPathText.Text;
+            await MyCommon.OpenInBrowserAsync(this, browserPathWithArgs, url);
         }
 
+        private async void CreateAccountButton_Click(object sender, EventArgs e)
+            => await this.OpenUrl("https://twitter.com/signup");
+
         private void GetPeriodPanel_IntervalChanged(object sender, IntervalChangedEventArgs e)
-        {
-            if (this.IntervalChanged != null)
-                this.IntervalChanged(sender, e);
-        }
+            => this.IntervalChanged?.Invoke(sender, e);
     }
 
     public class IntervalChangedEventArgs : EventArgs
     {
-        public bool UserStream;
         public bool Timeline;
         public bool Reply;
         public bool DirectMessage;
         public bool PublicSearch;
         public bool Lists;
         public bool UserTimeline;
+
+        public static IntervalChangedEventArgs ResetAll => new()
+        {
+            Timeline = true,
+            Reply = true,
+            DirectMessage = true,
+            PublicSearch = true,
+            Lists = true,
+            UserTimeline = true,
+        };
     }
 }