OSDN Git Service

Merge pull request #310 from opentween/interval-settings
authorupsilon <kim.upsilon@bucyou.net>
Sat, 27 Jan 2024 06:26:59 +0000 (15:26 +0900)
committerGitHub <noreply@github.com>
Sat, 27 Jan 2024 06:26:59 +0000 (15:26 +0900)
設定画面の更新間隔ページに24時間分の取得回数目安の表示を追加

17 files changed:
CHANGELOG.txt
OpenTween.Tests/Setting/Panel/GraphqlRequestEstimationTest.cs [new file with mode: 0644]
OpenTween.Tests/Setting/Panel/TabTypeAggregationTest.cs [new file with mode: 0644]
OpenTween.Tests/TweenMainTest.cs
OpenTween/AppendSettingDialog.cs
OpenTween/ApplicationEvents.cs
OpenTween/Properties/Resources.Designer.cs
OpenTween/Properties/Resources.en.resx
OpenTween/Properties/Resources.resx
OpenTween/Setting/Panel/GetPeriodPanel.Designer.cs
OpenTween/Setting/Panel/GetPeriodPanel.cs
OpenTween/Setting/Panel/GetPeriodPanel.en.resx
OpenTween/Setting/Panel/GetPeriodPanel.resx
OpenTween/Setting/Panel/GraphqlRequestEstimation.cs [new file with mode: 0644]
OpenTween/Setting/Panel/TabTypeAggregation.cs [new file with mode: 0644]
OpenTween/Setting/SettingCommon.cs
OpenTween/Tween.cs

index d1f0841..f15a5e2 100644 (file)
@@ -4,6 +4,8 @@
  * NEW: Cookie使用時のReplyタブの更新に対応(/statuses/mentions_timeline.json 廃止に伴う対応)
  * NEW: Cookie使用時のFavoritesタブの更新に対応
  * NEW: Cookie使用時のFav追加・削除に対応
+ * NEW: 設定画面の更新間隔ページに24時間分の取得回数目安の表示を追加
+ * CHG: 更新間隔の初期設定を変更
  * FIX: Cookie使用時にツイート検索の言語指定が効かない不具合を修正
  * FIX: ツイート検索のキーワードを後から変更すると検索結果が表示されない不具合を修正
  * FIX: Cookie使用時にステータスバーにRecentタブのレートリミットが表示されない不具合を修正
diff --git a/OpenTween.Tests/Setting/Panel/GraphqlRequestEstimationTest.cs b/OpenTween.Tests/Setting/Panel/GraphqlRequestEstimationTest.cs
new file mode 100644 (file)
index 0000000..131b54a
--- /dev/null
@@ -0,0 +1,68 @@
+// OpenTween - Client of Twitter
+// Copyright (c) 2024 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.
+//
+// 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.
+
+using Xunit;
+
+namespace OpenTween.Setting.Panel
+{
+    public class GraphqlRequestEstimationTest
+    {
+        [Fact]
+        public void CalcDailyRequestCount_Test()
+        {
+            var tabCounts = new TabTypeAggregation.Result(
+                HomeTabs: 1,
+                MentionsTabs: 1,
+                DMTabs: 1,
+                SearchTabs: 2,
+                ListTabs: 1,
+                UserTabs: 1
+            );
+            var intervals = new GraphqlRequestEstimation.Intervals(
+                Home: 90, // 960 requests / day
+                Search: 180, // 480 requests / day
+                List: 180, // 480 requests / day
+                User: 600 // 144 requests / day
+            );
+            Assert.Equal(2544, GraphqlRequestEstimation.CalcDailyRequestCount(intervals, tabCounts));
+        }
+
+        [Fact]
+        public void CalcDailyRequestCount_DisableAutoRefreshTest()
+        {
+            var tabCounts = new TabTypeAggregation.Result(
+                HomeTabs: 1,
+                MentionsTabs: 1,
+                DMTabs: 1,
+                SearchTabs: 2,
+                ListTabs: 1,
+                UserTabs: 1
+            );
+            var intervals = new GraphqlRequestEstimation.Intervals(
+                Home: 0, // 0 は自動更新の無効化を表す
+                Search: 0,
+                List: 0,
+                User: 0
+            );
+            Assert.Equal(0, GraphqlRequestEstimation.CalcDailyRequestCount(intervals, tabCounts));
+        }
+    }
+}
diff --git a/OpenTween.Tests/Setting/Panel/TabTypeAggregationTest.cs b/OpenTween.Tests/Setting/Panel/TabTypeAggregationTest.cs
new file mode 100644 (file)
index 0000000..074f50f
--- /dev/null
@@ -0,0 +1,48 @@
+// OpenTween - Client of Twitter
+// Copyright (c) 2024 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.
+//
+// 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.
+
+using OpenTween.Models;
+using Xunit;
+
+namespace OpenTween.Setting.Panel
+{
+    public class TabTypeAggregationTest
+    {
+        [Fact]
+        public void Aggregate_Test()
+        {
+            var tabinfo = new TabInformations();
+            tabinfo.AddDefaultTabs();
+            tabinfo.AddTab(new PublicSearchTabModel("search1"));
+            tabinfo.AddTab(new PublicSearchTabModel("search2"));
+
+            var expected = new TabTypeAggregation.Result(
+                HomeTabs: 1,
+                MentionsTabs: 1,
+                DMTabs: 1,
+                SearchTabs: 2,
+                ListTabs: 0,
+                UserTabs: 0
+            );
+            Assert.Equal(expected, TabTypeAggregation.Aggregate(tabinfo));
+        }
+    }
+}
index 5736707..526fbf0 100644 (file)
@@ -59,6 +59,8 @@ namespace OpenTween
                 BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.SetField);
             field.SetValue(null, tabinfo);
 
+            tabinfo.AddDefaultTabs();
+
             using var tweenMain = new TweenMain(settings, tabinfo, accounts, imageCache, iconAssets, thumbnailGenerator);
             var context = new TestContext(settings, tabinfo);
 
index 703cd51..0f8dfed 100644 (file)
 #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.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using OpenTween.Api;
 using OpenTween.Connection;
+using OpenTween.Models;
 using OpenTween.Setting.Panel;
-using OpenTween.Thumbnail;
 
 namespace OpenTween
 {
@@ -322,6 +315,7 @@ namespace OpenTween
             this.TopMost = this.PreviewPanel.CheckAlwaysTop.Checked;
 
             this.GetPeriodPanel.LabelPostAndGet.Visible = this.GetPeriodPanel.CheckPostAndGet.Checked;
+            this.GetPeriodPanel.UpdateTabCounts(TabInformations.GetInstance());
         }
 
         private async Task OpenUrl(string url)
index 9eb8b8b..a7bf44a 100644 (file)
@@ -73,6 +73,8 @@ namespace OpenTween
 
             ThemeManager.ApplyGlobalUIFont(settings.Local);
             container.CultureService.Initialize();
+            container.TabInfo.LoadTabsFromSettings(settings.Tabs);
+            container.TabInfo.AddDefaultTabs();
 
             Networking.Initialize();
             settings.ApplySettings();
index cf608ae..e89cb6d 100644 (file)
@@ -1159,6 +1159,24 @@ namespace OpenTween.Properties {
         }
         
         /// <summary>
+        ///   graphql エンドポイントのリクエスト回数目安: {0:#,0} 回 / 24 時間 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string GetPeriodPanel_LabelGraphqlEstimate {
+            get {
+                return ResourceManager.GetString("GetPeriodPanel_LabelGraphqlEstimate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   (タブ数: {0}) に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string GetPeriodPanel_LabelTabCount {
+            get {
+                return ResourceManager.GetString("GetPeriodPanel_LabelTabCount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Recent更新完了 に類似しているローカライズされた文字列を検索します。
         /// </summary>
         internal static string GetTimelineWorker_RunWorkerCompletedText1 {
index 824d295..a0fd66a 100644 (file)
        <data name="GetFriendshipInfo6"><value>Faild to get relation info.</value></data>
        <data name="GetFriendshipInfo7"><value>Really Unfollow?</value></data>
        <data name="GetFriendshipInfo8"><value>Confirm Unfollow</value></data>
+       <data name="GetPeriodPanel_LabelGraphqlEstimate"><value>Estimated number of requests for graphql endpoint: {0:#,0} requests / 24 hours</value></data>
+       <data name="GetPeriodPanel_LabelTabCount"><value>(Tabs: {0})</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText1"><value>Recent refreshed</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText10"><value>Initial fetch completed</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText11"><value>DMRcv refreshed</value></data>
index bb846f4..3e3c865 100644 (file)
        <data name="GetFriendshipInfo6"><value>フォロー状況取得失敗</value></data>
        <data name="GetFriendshipInfo7"><value>フォロー解除しますか?</value></data>
        <data name="GetFriendshipInfo8"><value>フォロー解除確認</value></data>
+       <data name="GetPeriodPanel_LabelGraphqlEstimate"><value>graphql エンドポイントのリクエスト回数目安: {0:#,0} 回 / 24 時間</value></data>
+       <data name="GetPeriodPanel_LabelTabCount"><value>(タブ数: {0})</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText1"><value>Recent更新完了</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText10"><value>起動時読込完了</value></data>
        <data name="GetTimelineWorker_RunWorkerCompletedText11"><value>DMRcv更新完了</value></data>
index 41fd4ba..222a731 100644 (file)
             this.CheckPostAndGet = new System.Windows.Forms.CheckBox();
             this.Label5 = new System.Windows.Forms.Label();
             this.DMPeriod = new System.Windows.Forms.TextBox();
+            this.labelTabCountHome = new System.Windows.Forms.Label();
+            this.labelTabCountMentions = new System.Windows.Forms.Label();
+            this.labelTabCountDM = new System.Windows.Forms.Label();
+            this.labelTabCountSearch = new System.Windows.Forms.Label();
+            this.labelTabCountList = new System.Windows.Forms.Label();
+            this.labelTabCountUser = new System.Windows.Forms.Label();
+            this.labelGraphqlEstimate = new System.Windows.Forms.Label();
+            this.labelNoteForGraphqlLimits = new System.Windows.Forms.Label();
             this.SuspendLayout();
             // 
             // Label21
@@ -54,6 +62,7 @@
             // 
             resources.ApplyResources(this.UserTimelinePeriod, "UserTimelinePeriod");
             this.UserTimelinePeriod.Name = "UserTimelinePeriod";
+            this.UserTimelinePeriod.Validating += new System.ComponentModel.CancelEventHandler(this.UserTimeline_Validating);
             // 
             // TimelinePeriod
             // 
             this.DMPeriod.Name = "DMPeriod";
             this.DMPeriod.Validating += new System.ComponentModel.CancelEventHandler(this.DMPeriod_Validating);
             // 
+            // labelTabCountHome
+            // 
+            resources.ApplyResources(this.labelTabCountHome, "labelTabCountHome");
+            this.labelTabCountHome.Name = "labelTabCountHome";
+            // 
+            // labelTabCountMentions
+            // 
+            resources.ApplyResources(this.labelTabCountMentions, "labelTabCountMentions");
+            this.labelTabCountMentions.Name = "labelTabCountMentions";
+            // 
+            // labelTabCountDM
+            // 
+            resources.ApplyResources(this.labelTabCountDM, "labelTabCountDM");
+            this.labelTabCountDM.Name = "labelTabCountDM";
+            // 
+            // labelTabCountSearch
+            // 
+            resources.ApplyResources(this.labelTabCountSearch, "labelTabCountSearch");
+            this.labelTabCountSearch.Name = "labelTabCountSearch";
+            // 
+            // labelTabCountList
+            // 
+            resources.ApplyResources(this.labelTabCountList, "labelTabCountList");
+            this.labelTabCountList.Name = "labelTabCountList";
+            // 
+            // labelTabCountUser
+            // 
+            resources.ApplyResources(this.labelTabCountUser, "labelTabCountUser");
+            this.labelTabCountUser.Name = "labelTabCountUser";
+            // 
+            // labelGraphqlEstimate
+            // 
+            resources.ApplyResources(this.labelGraphqlEstimate, "labelGraphqlEstimate");
+            this.labelGraphqlEstimate.Name = "labelGraphqlEstimate";
+            // 
+            // labelNoteForGraphqlLimits
+            // 
+            resources.ApplyResources(this.labelNoteForGraphqlLimits, "labelNoteForGraphqlLimits");
+            this.labelNoteForGraphqlLimits.BackColor = System.Drawing.SystemColors.ActiveCaption;
+            this.labelNoteForGraphqlLimits.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
+            this.labelNoteForGraphqlLimits.Name = "labelNoteForGraphqlLimits";
+            // 
             // GetPeriodPanel
             // 
             resources.ApplyResources(this, "$this");
             this.Controls.Add(this.CheckPostAndGet);
             this.Controls.Add(this.Label5);
             this.Controls.Add(this.DMPeriod);
+            this.Controls.Add(this.labelNoteForGraphqlLimits);
+            this.Controls.Add(this.labelGraphqlEstimate);
+            this.Controls.Add(this.labelTabCountUser);
+            this.Controls.Add(this.labelTabCountList);
+            this.Controls.Add(this.labelTabCountSearch);
+            this.Controls.Add(this.labelTabCountDM);
+            this.Controls.Add(this.labelTabCountMentions);
+            this.Controls.Add(this.labelTabCountHome);
             this.Name = "GetPeriodPanel";
             this.ResumeLayout(false);
             this.PerformLayout();
         internal System.Windows.Forms.CheckBox CheckPostAndGet;
         internal System.Windows.Forms.Label Label5;
         internal System.Windows.Forms.TextBox DMPeriod;
+        private System.Windows.Forms.Label labelTabCountHome;
+        private System.Windows.Forms.Label labelTabCountMentions;
+        private System.Windows.Forms.Label labelTabCountDM;
+        private System.Windows.Forms.Label labelTabCountSearch;
+        private System.Windows.Forms.Label labelTabCountList;
+        private System.Windows.Forms.Label labelTabCountUser;
+        private System.Windows.Forms.Label labelGraphqlEstimate;
+        private System.Windows.Forms.Label labelNoteForGraphqlLimits;
     }
 }
index bf099b6..2be635e 100644 (file)
 #nullable enable
 
 using System;
-using System.Collections.Generic;
 using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
 using System.Windows.Forms;
+using OpenTween.Models;
 
 namespace OpenTween.Setting.Panel
 {
@@ -41,6 +37,8 @@ namespace OpenTween.Setting.Panel
     {
         public event EventHandler<IntervalChangedEventArgs>? IntervalChanged;
 
+        private TabTypeAggregation.Result tabCountByType;
+
         public GetPeriodPanel()
             => this.InitializeComponent();
 
@@ -114,6 +112,38 @@ namespace OpenTween.Setting.Panel
                 this.IntervalChanged?.Invoke(this, arg);
         }
 
+        public void UpdateTabCounts(TabInformations tabInfo)
+        {
+            var tabCountByType = TabTypeAggregation.Aggregate(tabInfo);
+            this.tabCountByType = tabCountByType;
+
+            static string GetLabelText(int tabCount)
+                => string.Format(Properties.Resources.GetPeriodPanel_LabelTabCount, tabCount);
+
+            this.labelTabCountHome.Text = GetLabelText(tabCountByType.HomeTabs);
+            this.labelTabCountMentions.Text = GetLabelText(tabCountByType.MentionsTabs);
+            this.labelTabCountDM.Text = GetLabelText(tabCountByType.DMTabs);
+            this.labelTabCountSearch.Text = GetLabelText(tabCountByType.SearchTabs);
+            this.labelTabCountList.Text = GetLabelText(tabCountByType.ListTabs);
+            this.labelTabCountUser.Text = GetLabelText(tabCountByType.UserTabs);
+
+            this.EstimateGraphqlRequests();
+        }
+
+        private void EstimateGraphqlRequests()
+        {
+            var intervals = new GraphqlRequestEstimation.Intervals(
+                Home: int.Parse(this.TimelinePeriod.Text),
+                Search: int.Parse(this.PubSearchPeriod.Text),
+                List: int.Parse(this.ListsPeriod.Text),
+                User: int.Parse(this.UserTimelinePeriod.Text)
+            );
+            var estimate = GraphqlRequestEstimation.CalcDailyRequestCount(intervals, this.tabCountByType);
+
+            this.labelGraphqlEstimate.Text =
+                string.Format(Properties.Resources.GetPeriodPanel_LabelGraphqlEstimate, estimate);
+        }
+
         private void TimelinePeriod_Validating(object sender, CancelEventArgs e)
         {
             if (!this.ValidateIntervalStr(this.TimelinePeriod.Text))
@@ -121,6 +151,8 @@ namespace OpenTween.Setting.Panel
                 MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
                 e.Cancel = true;
             }
+
+            this.EstimateGraphqlRequests();
         }
 
         private void ReplyPeriod_Validating(object sender, CancelEventArgs e)
@@ -148,6 +180,8 @@ namespace OpenTween.Setting.Panel
                 MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
                 e.Cancel = true;
             }
+
+            this.EstimateGraphqlRequests();
         }
 
         private void ListsPeriod_Validating(object sender, CancelEventArgs e)
@@ -157,6 +191,8 @@ namespace OpenTween.Setting.Panel
                 MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
                 e.Cancel = true;
             }
+
+            this.EstimateGraphqlRequests();
         }
 
         private void UserTimeline_Validating(object sender, CancelEventArgs e)
@@ -166,6 +202,8 @@ namespace OpenTween.Setting.Panel
                 MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
                 e.Cancel = true;
             }
+
+            this.EstimateGraphqlRequests();
         }
 
         private bool ValidateIntervalStr(string str)
index 949f84f..8512067 100644 (file)
        <data name="Label69.Text"><value>Reply Fetching Interval (sec.)</value></data>
        <data name="Label7.Size" type="System.Drawing.Size, System.Drawing"><value>149, 12</value></data>
        <data name="Label7.Text"><value>Public Search Interval (sec.)</value></data>
+       <data name="labelGraphqlEstimate.Size" type="System.Drawing.Size, System.Drawing"><value>383, 12</value></data>
+       <data name="labelGraphqlEstimate.Text"><value>Estimated number of requests for graphql endpoint: 0 requests / 24 hours</value></data>
+       <data name="labelNoteForGraphqlLimits.Size" type="System.Drawing.Size, System.Drawing"><value>383, 12</value></data>
+       <data name="labelNoteForGraphqlLimits.Text"><value>When using cookies, the upper limit is 2,111 requests / 24 hours (approx.)</value></data>
        <data name="LabelPostAndGet.Size" type="System.Drawing.Size, System.Drawing"><value>358, 12</value></data>
        <data name="LabelPostAndGet.Text"><value>Because "Post &amp;&amp; fetch" is enabled, the API for each post consumed.</value></data>
+       <data name="labelTabCountDM.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountDM.Text"><value>(Tabs: 0)</value></data>
+       <data name="labelTabCountHome.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountHome.Text"><value>(Tabs: 0)</value></data>
+       <data name="labelTabCountList.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountList.Text"><value>(Tabs: 0)</value></data>
+       <data name="labelTabCountMentions.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountMentions.Text"><value>(Tabs: 0)</value></data>
+       <data name="labelTabCountSearch.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountSearch.Text"><value>(Tabs: 0)</value></data>
+       <data name="labelTabCountUser.Size" type="System.Drawing.Size, System.Drawing"><value>50, 12</value></data>
+       <data name="labelTabCountUser.Text"><value>(Tabs: 0)</value></data>
 </root>
index 83e1391..aac6890 100644 (file)
        <data name="&gt;&gt;Label7.Parent"><value>$this</value></data>
        <data name="&gt;&gt;Label7.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
        <data name="&gt;&gt;Label7.ZOrder"><value>7</value></data>
+       <data name="&gt;&gt;labelGraphqlEstimate.Name"><value>labelGraphqlEstimate</value></data>
+       <data name="&gt;&gt;labelGraphqlEstimate.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelGraphqlEstimate.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelGraphqlEstimate.ZOrder"><value>15</value></data>
+       <data name="&gt;&gt;labelNoteForGraphqlLimits.Name"><value>labelNoteForGraphqlLimits</value></data>
+       <data name="&gt;&gt;labelNoteForGraphqlLimits.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelNoteForGraphqlLimits.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelNoteForGraphqlLimits.ZOrder"><value>14</value></data>
        <data name="&gt;&gt;LabelPostAndGet.Name"><value>LabelPostAndGet</value></data>
        <data name="&gt;&gt;LabelPostAndGet.Parent"><value>$this</value></data>
        <data name="&gt;&gt;LabelPostAndGet.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
        <data name="&gt;&gt;LabelPostAndGet.ZOrder"><value>4</value></data>
+       <data name="&gt;&gt;labelTabCountDM.Name"><value>labelTabCountDM</value></data>
+       <data name="&gt;&gt;labelTabCountDM.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountDM.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountDM.ZOrder"><value>19</value></data>
+       <data name="&gt;&gt;labelTabCountHome.Name"><value>labelTabCountHome</value></data>
+       <data name="&gt;&gt;labelTabCountHome.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountHome.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountHome.ZOrder"><value>21</value></data>
+       <data name="&gt;&gt;labelTabCountList.Name"><value>labelTabCountList</value></data>
+       <data name="&gt;&gt;labelTabCountList.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountList.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountList.ZOrder"><value>17</value></data>
+       <data name="&gt;&gt;labelTabCountMentions.Name"><value>labelTabCountMentions</value></data>
+       <data name="&gt;&gt;labelTabCountMentions.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountMentions.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountMentions.ZOrder"><value>20</value></data>
+       <data name="&gt;&gt;labelTabCountSearch.Name"><value>labelTabCountSearch</value></data>
+       <data name="&gt;&gt;labelTabCountSearch.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountSearch.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountSearch.ZOrder"><value>18</value></data>
+       <data name="&gt;&gt;labelTabCountUser.Name"><value>labelTabCountUser</value></data>
+       <data name="&gt;&gt;labelTabCountUser.Parent"><value>$this</value></data>
+       <data name="&gt;&gt;labelTabCountUser.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+       <data name="&gt;&gt;labelTabCountUser.ZOrder"><value>16</value></data>
        <data name="&gt;&gt;ListsPeriod.Name"><value>ListsPeriod</value></data>
        <data name="&gt;&gt;ListsPeriod.Parent"><value>$this</value></data>
        <data name="&gt;&gt;ListsPeriod.Type"><value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
        <data name="CheckPostAndGet.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="CheckPostAndGet.Location" type="System.Drawing.Point, System.Drawing"><value>45, 38</value></data>
        <data name="CheckPostAndGet.Size" type="System.Drawing.Size, System.Drawing"><value>84, 16</value></data>
-       <data name="CheckPostAndGet.TabIndex" type="System.Int32, mscorlib"><value>25</value></data>
+       <data name="CheckPostAndGet.TabIndex" type="System.Int32, mscorlib"><value>3</value></data>
        <data name="CheckPostAndGet.Text"><value>投稿時取得</value></data>
        <data name="DMPeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="DMPeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 92</value></data>
        <data name="DMPeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="DMPeriod.TabIndex" type="System.Int32, mscorlib"><value>29</value></data>
+       <data name="DMPeriod.TabIndex" type="System.Int32, mscorlib"><value>8</value></data>
        <data name="Label21.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label21.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label21.Location" type="System.Drawing.Point, System.Drawing"><value>23, 182</value></data>
        <data name="Label21.Size" type="System.Drawing.Size, System.Drawing"><value>144, 12</value></data>
-       <data name="Label21.TabIndex" type="System.Int32, mscorlib"><value>34</value></data>
+       <data name="Label21.TabIndex" type="System.Int32, mscorlib"><value>16</value></data>
        <data name="Label21.Text"><value>UserTimeline更新間隔(秒)</value></data>
        <data name="Label3.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label3.Location" type="System.Drawing.Point, System.Drawing"><value>23, 20</value></data>
        <data name="Label3.Size" type="System.Drawing.Size, System.Drawing"><value>130, 12</value></data>
-       <data name="Label3.TabIndex" type="System.Int32, mscorlib"><value>23</value></data>
+       <data name="Label3.TabIndex" type="System.Int32, mscorlib"><value>0</value></data>
        <data name="Label3.Text"><value>タイムライン更新間隔(秒)</value></data>
        <data name="Label33.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label33.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label33.Location" type="System.Drawing.Point, System.Drawing"><value>23, 153</value></data>
        <data name="Label33.Size" type="System.Drawing.Size, System.Drawing"><value>102, 12</value></data>
-       <data name="Label33.TabIndex" type="System.Int32, mscorlib"><value>32</value></data>
+       <data name="Label33.TabIndex" type="System.Int32, mscorlib"><value>13</value></data>
        <data name="Label33.Text"><value>Lists更新間隔(秒)</value></data>
        <data name="Label5.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label5.Location" type="System.Drawing.Point, System.Drawing"><value>23, 95</value></data>
        <data name="Label5.Size" type="System.Drawing.Size, System.Drawing"><value>94, 12</value></data>
-       <data name="Label5.TabIndex" type="System.Int32, mscorlib"><value>28</value></data>
+       <data name="Label5.TabIndex" type="System.Int32, mscorlib"><value>7</value></data>
        <data name="Label5.Text"><value>DM更新間隔(秒)</value></data>
        <data name="Label69.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label69.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label69.Location" type="System.Drawing.Point, System.Drawing"><value>23, 66</value></data>
        <data name="Label69.Size" type="System.Drawing.Size, System.Drawing"><value>123, 12</value></data>
-       <data name="Label69.TabIndex" type="System.Int32, mscorlib"><value>26</value></data>
+       <data name="Label69.TabIndex" type="System.Int32, mscorlib"><value>4</value></data>
        <data name="Label69.Text"><value>Mentions更新間隔(秒)</value></data>
        <data name="Label7.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="Label7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
        <data name="Label7.Location" type="System.Drawing.Point, System.Drawing"><value>23, 124</value></data>
        <data name="Label7.Size" type="System.Drawing.Size, System.Drawing"><value>137, 12</value></data>
-       <data name="Label7.TabIndex" type="System.Int32, mscorlib"><value>30</value></data>
+       <data name="Label7.TabIndex" type="System.Int32, mscorlib"><value>10</value></data>
        <data name="Label7.Text"><value>Twitter検索更新間隔(秒)</value></data>
+       <data name="labelGraphqlEstimate.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelGraphqlEstimate.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelGraphqlEstimate.Location" type="System.Drawing.Point, System.Drawing"><value>23, 244</value></data>
+       <data name="labelGraphqlEstimate.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>3, 15, 3, 0</value></data>
+       <data name="labelGraphqlEstimate.Size" type="System.Drawing.Size, System.Drawing"><value>290, 12</value></data>
+       <data name="labelGraphqlEstimate.TabIndex" type="System.Int32, mscorlib"><value>20</value></data>
+       <data name="labelGraphqlEstimate.Text"><value>graphql エンドポイントのリクエスト回数目安: 0 回 / 24 時間</value></data>
+       <data name="labelNoteForGraphqlLimits.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelNoteForGraphqlLimits.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelNoteForGraphqlLimits.Location" type="System.Drawing.Point, System.Drawing"><value>23, 266</value></data>
+       <data name="labelNoteForGraphqlLimits.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>3, 10, 3, 0</value></data>
+       <data name="labelNoteForGraphqlLimits.Size" type="System.Drawing.Size, System.Drawing"><value>311, 12</value></data>
+       <data name="labelNoteForGraphqlLimits.TabIndex" type="System.Int32, mscorlib"><value>21</value></data>
+       <data name="labelNoteForGraphqlLimits.Text"><value>Cookie 使用時は 2,111 回 / 24 時間 (推定) の制限があります</value></data>
        <data name="LabelPostAndGet.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
        <data name="LabelPostAndGet.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
-       <data name="LabelPostAndGet.Location" type="System.Drawing.Point, System.Drawing"><value>23, 279</value></data>
+       <data name="LabelPostAndGet.Location" type="System.Drawing.Point, System.Drawing"><value>23, 217</value></data>
        <data name="LabelPostAndGet.Size" type="System.Drawing.Size, System.Drawing"><value>285, 12</value></data>
-       <data name="LabelPostAndGet.TabIndex" type="System.Int32, mscorlib"><value>36</value></data>
+       <data name="LabelPostAndGet.TabIndex" type="System.Int32, mscorlib"><value>19</value></data>
        <data name="LabelPostAndGet.Text"><value>投稿時取得が有効のため、投稿のたびにAPIを消費します。</value></data>
+       <data name="labelTabCountDM.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountDM.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountDM.Location" type="System.Drawing.Point, System.Drawing"><value>337, 95</value></data>
+       <data name="labelTabCountDM.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountDM.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountDM.TabIndex" type="System.Int32, mscorlib"><value>9</value></data>
+       <data name="labelTabCountDM.Text"><value>(タブ数: 0)</value></data>
+       <data name="labelTabCountHome.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountHome.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountHome.Location" type="System.Drawing.Point, System.Drawing"><value>337, 20</value></data>
+       <data name="labelTabCountHome.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountHome.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountHome.TabIndex" type="System.Int32, mscorlib"><value>2</value></data>
+       <data name="labelTabCountHome.Text"><value>(タブ数: 0)</value></data>
+       <data name="labelTabCountList.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountList.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountList.Location" type="System.Drawing.Point, System.Drawing"><value>337, 153</value></data>
+       <data name="labelTabCountList.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountList.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountList.TabIndex" type="System.Int32, mscorlib"><value>15</value></data>
+       <data name="labelTabCountList.Text"><value>(タブ数: 0)</value></data>
+       <data name="labelTabCountMentions.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountMentions.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountMentions.Location" type="System.Drawing.Point, System.Drawing"><value>337, 66</value></data>
+       <data name="labelTabCountMentions.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountMentions.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountMentions.TabIndex" type="System.Int32, mscorlib"><value>6</value></data>
+       <data name="labelTabCountMentions.Text"><value>(タブ数: 0)</value></data>
+       <data name="labelTabCountSearch.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountSearch.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountSearch.Location" type="System.Drawing.Point, System.Drawing"><value>337, 124</value></data>
+       <data name="labelTabCountSearch.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountSearch.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountSearch.TabIndex" type="System.Int32, mscorlib"><value>12</value></data>
+       <data name="labelTabCountSearch.Text"><value>(タブ数: 0)</value></data>
+       <data name="labelTabCountUser.AutoSize" type="System.Boolean, mscorlib"><value>True</value></data>
+       <data name="labelTabCountUser.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>NoControl</value></data>
+       <data name="labelTabCountUser.Location" type="System.Drawing.Point, System.Drawing"><value>337, 182</value></data>
+       <data name="labelTabCountUser.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"><value>10, 0, 10, 0</value></data>
+       <data name="labelTabCountUser.Size" type="System.Drawing.Size, System.Drawing"><value>54, 12</value></data>
+       <data name="labelTabCountUser.TabIndex" type="System.Int32, mscorlib"><value>18</value></data>
+       <data name="labelTabCountUser.Text"><value>(タブ数: 0)</value></data>
        <data name="ListsPeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="ListsPeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 150</value></data>
        <data name="ListsPeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="ListsPeriod.TabIndex" type="System.Int32, mscorlib"><value>33</value></data>
+       <data name="ListsPeriod.TabIndex" type="System.Int32, mscorlib"><value>14</value></data>
        <data name="PubSearchPeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="PubSearchPeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 121</value></data>
        <data name="PubSearchPeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="PubSearchPeriod.TabIndex" type="System.Int32, mscorlib"><value>31</value></data>
+       <data name="PubSearchPeriod.TabIndex" type="System.Int32, mscorlib"><value>11</value></data>
        <data name="ReplyPeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="ReplyPeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 63</value></data>
        <data name="ReplyPeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="ReplyPeriod.TabIndex" type="System.Int32, mscorlib"><value>27</value></data>
+       <data name="ReplyPeriod.TabIndex" type="System.Int32, mscorlib"><value>5</value></data>
        <data name="TimelinePeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="TimelinePeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 17</value></data>
        <data name="TimelinePeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="TimelinePeriod.TabIndex" type="System.Int32, mscorlib"><value>24</value></data>
+       <data name="TimelinePeriod.TabIndex" type="System.Int32, mscorlib"><value>1</value></data>
        <data name="UserTimelinePeriod.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"><value>Disable</value></data>
        <data name="UserTimelinePeriod.Location" type="System.Drawing.Point, System.Drawing"><value>259, 179</value></data>
        <data name="UserTimelinePeriod.Size" type="System.Drawing.Size, System.Drawing"><value>65, 19</value></data>
-       <data name="UserTimelinePeriod.TabIndex" type="System.Int32, mscorlib"><value>35</value></data>
+       <data name="UserTimelinePeriod.TabIndex" type="System.Int32, mscorlib"><value>17</value></data>
 </root>
diff --git a/OpenTween/Setting/Panel/GraphqlRequestEstimation.cs b/OpenTween/Setting/Panel/GraphqlRequestEstimation.cs
new file mode 100644 (file)
index 0000000..e023d6f
--- /dev/null
@@ -0,0 +1,50 @@
+// OpenTween - Client of Twitter
+// Copyright (c) 2024 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.
+//
+// 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
+
+namespace OpenTween.Setting.Panel
+{
+    public class GraphqlRequestEstimation
+    {
+        public static int CalcDailyRequestCount(Intervals intervals, TabTypeAggregation.Result tabCounts)
+        {
+            const int dayInSeconds = 1 * 24 * 60 * 60;
+
+            static int CalcDailyCount(int interval, int tabCount)
+                => interval == 0 ? 0 : dayInSeconds / interval * tabCount;
+
+            var homeDailyCount = CalcDailyCount(intervals.Home, tabCounts.HomeTabs);
+            var searchDailyCount = CalcDailyCount(intervals.Search, tabCounts.SearchTabs);
+            var listDailyCount = CalcDailyCount(intervals.List, tabCounts.ListTabs);
+            var userDaylyCount = CalcDailyCount(intervals.User, tabCounts.UserTabs);
+
+            return homeDailyCount + searchDailyCount + listDailyCount + userDaylyCount;
+        }
+
+        public readonly record struct Intervals(
+            int Home,
+            int Search,
+            int List,
+            int User
+        );
+    }
+}
diff --git a/OpenTween/Setting/Panel/TabTypeAggregation.cs b/OpenTween/Setting/Panel/TabTypeAggregation.cs
new file mode 100644 (file)
index 0000000..e338c80
--- /dev/null
@@ -0,0 +1,58 @@
+// OpenTween - Client of Twitter
+// Copyright (c) 2024 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.
+//
+// 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.Linq;
+using OpenTween.Models;
+
+namespace OpenTween.Setting.Panel
+{
+    public class TabTypeAggregation
+    {
+        public static Result Aggregate(TabInformations tabInfo)
+        {
+            var countByTabTypes = tabInfo.Tabs.GroupBy(x => x.TabType)
+                .ToDictionary(x => x.Key, x => x.Count());
+
+            int GetCountByTabType(MyCommon.TabUsageType tabType)
+                => countByTabTypes.TryGetValue(tabType, out var count) ? count : 0;
+
+            return new(
+                HomeTabs: GetCountByTabType(MyCommon.TabUsageType.Home),
+                MentionsTabs: GetCountByTabType(MyCommon.TabUsageType.Mentions),
+                DMTabs: GetCountByTabType(MyCommon.TabUsageType.DirectMessage),
+                SearchTabs: GetCountByTabType(MyCommon.TabUsageType.PublicSearch),
+                ListTabs: GetCountByTabType(MyCommon.TabUsageType.Lists),
+                UserTabs: GetCountByTabType(MyCommon.TabUsageType.UserTimeline)
+            );
+        }
+
+        public readonly record struct Result(
+            int HomeTabs,
+            int MentionsTabs,
+            int DMTabs,
+            int SearchTabs,
+            int ListTabs,
+            int UserTabs
+        );
+    }
+}
index c57f1ee..dbc4a94 100644 (file)
@@ -114,11 +114,11 @@ namespace OpenTween
 
         public long UserId = 0;
         public List<string> TabList = new();
-        public int TimelinePeriod = 90;
+        public int TimelinePeriod = 180;
         public int ReplyPeriod = 180;
         public int DMPeriod = 600;
-        public int PubSearchPeriod = 180;
-        public int ListsPeriod = 180;
+        public int PubSearchPeriod = 360;
+        public int ListsPeriod = 360;
 
         /// <summary>
         /// 起動時読み込み分を既読にするか。trueなら既読として処理
@@ -230,7 +230,7 @@ namespace OpenTween
         public int SearchCountApi = 100;
         public int FavoritesCountApi = 40;
         public int UserTimelineCountApi = 20;
-        public int UserTimelinePeriod = 600;
+        public int UserTimelinePeriod = 360;
         public bool OpenUserTimeline = true;
         public int ListCountApi = 100;
         public int UseImageService = 0;
index a273dc6..3f7878b 100644 (file)
@@ -301,10 +301,6 @@ namespace OpenTween
             this.NotifyIcon1.Icon = this.iconAssets.IconTray; // タスクトレイ
             this.TabImage.Images.Add(this.iconAssets.IconTab); // タブ見出し
 
-            // <<<<<<<<<設定関連>>>>>>>>>
-            // 設定読み出し
-            this.LoadConfig();
-
             // 現在の DPI と設定保存時の DPI との比を取得する
             var configScaleFactor = this.settings.Local.GetConfigScaleFactor(this.CurrentAutoScaleDimensions);
 
@@ -765,12 +761,6 @@ namespace OpenTween
             e.Graphics.DrawString(txt, e.Font, fore, e.Bounds, this.sfTab);
         }
 
-        private void LoadConfig()
-        {
-            this.statuses.LoadTabsFromSettings(this.settings.Tabs);
-            this.statuses.AddDefaultTabs();
-        }
-
         private void TimerInterval_Changed(object sender, IntervalChangedEventArgs e)
         {
             this.RefreshTimelineScheduler();