* NEW: Cookie使用時のReplyタブの更新に対応(/statuses/mentions_timeline.json 廃止に伴う対応)
* NEW: Cookie使用時のFavoritesタブの更新に対応
* NEW: Cookie使用時のFav追加・削除に対応
+ * NEW: 設定画面の更新間隔ページに24時間分の取得回数目安の表示を追加
+ * CHG: 更新間隔の初期設定を変更
* FIX: Cookie使用時にツイート検索の言語指定が効かない不具合を修正
* FIX: ツイート検索のキーワードを後から変更すると検索結果が表示されない不具合を修正
* FIX: Cookie使用時にステータスバーにRecentタブのレートリミットが表示されない不具合を修正
--- /dev/null
+// 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));
+ }
+ }
+}
--- /dev/null
+// 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));
+ }
+ }
+}
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);
#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
{
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)
ThemeManager.ApplyGlobalUIFont(settings.Local);
container.CultureService.Initialize();
+ container.TabInfo.LoadTabsFromSettings(settings.Tabs);
+ container.TabInfo.AddDefaultTabs();
Networking.Initialize();
settings.ApplySettings();
}
/// <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 {
<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>
<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>
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
//
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;
}
}
#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
{
{
public event EventHandler<IntervalChangedEventArgs>? IntervalChanged;
+ private TabTypeAggregation.Result tabCountByType;
+
public GetPeriodPanel()
=> this.InitializeComponent();
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))
MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
e.Cancel = true;
}
+
+ this.EstimateGraphqlRequests();
}
private void ReplyPeriod_Validating(object sender, CancelEventArgs e)
MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
e.Cancel = true;
}
+
+ this.EstimateGraphqlRequests();
}
private void ListsPeriod_Validating(object sender, CancelEventArgs e)
MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
e.Cancel = true;
}
+
+ this.EstimateGraphqlRequests();
}
private void UserTimeline_Validating(object sender, CancelEventArgs e)
MessageBox.Show(Properties.Resources.TimelinePeriod_ValidatingText1);
e.Cancel = true;
}
+
+ this.EstimateGraphqlRequests();
}
private bool ValidateIntervalStr(string str)
<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 && 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>
<data name=">>Label7.Parent"><value>$this</value></data>
<data name=">>Label7.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
<data name=">>Label7.ZOrder"><value>7</value></data>
+ <data name=">>labelGraphqlEstimate.Name"><value>labelGraphqlEstimate</value></data>
+ <data name=">>labelGraphqlEstimate.Parent"><value>$this</value></data>
+ <data name=">>labelGraphqlEstimate.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelGraphqlEstimate.ZOrder"><value>15</value></data>
+ <data name=">>labelNoteForGraphqlLimits.Name"><value>labelNoteForGraphqlLimits</value></data>
+ <data name=">>labelNoteForGraphqlLimits.Parent"><value>$this</value></data>
+ <data name=">>labelNoteForGraphqlLimits.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelNoteForGraphqlLimits.ZOrder"><value>14</value></data>
<data name=">>LabelPostAndGet.Name"><value>LabelPostAndGet</value></data>
<data name=">>LabelPostAndGet.Parent"><value>$this</value></data>
<data name=">>LabelPostAndGet.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
<data name=">>LabelPostAndGet.ZOrder"><value>4</value></data>
+ <data name=">>labelTabCountDM.Name"><value>labelTabCountDM</value></data>
+ <data name=">>labelTabCountDM.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountDM.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountDM.ZOrder"><value>19</value></data>
+ <data name=">>labelTabCountHome.Name"><value>labelTabCountHome</value></data>
+ <data name=">>labelTabCountHome.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountHome.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountHome.ZOrder"><value>21</value></data>
+ <data name=">>labelTabCountList.Name"><value>labelTabCountList</value></data>
+ <data name=">>labelTabCountList.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountList.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountList.ZOrder"><value>17</value></data>
+ <data name=">>labelTabCountMentions.Name"><value>labelTabCountMentions</value></data>
+ <data name=">>labelTabCountMentions.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountMentions.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountMentions.ZOrder"><value>20</value></data>
+ <data name=">>labelTabCountSearch.Name"><value>labelTabCountSearch</value></data>
+ <data name=">>labelTabCountSearch.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountSearch.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountSearch.ZOrder"><value>18</value></data>
+ <data name=">>labelTabCountUser.Name"><value>labelTabCountUser</value></data>
+ <data name=">>labelTabCountUser.Parent"><value>$this</value></data>
+ <data name=">>labelTabCountUser.Type"><value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></data>
+ <data name=">>labelTabCountUser.ZOrder"><value>16</value></data>
<data name=">>ListsPeriod.Name"><value>ListsPeriod</value></data>
<data name=">>ListsPeriod.Parent"><value>$this</value></data>
<data name=">>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>
--- /dev/null
+// 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
+ );
+ }
+}
--- /dev/null
+// 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
+ );
+ }
+}
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なら既読として処理
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;
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);
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();