OSDN Git Service

ミュート機能を実装
authorKimura Youichi <kim.upsilon@bucyou.net>
Thu, 26 Mar 2015 19:50:54 +0000 (04:50 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sun, 29 Mar 2015 02:00:20 +0000 (11:00 +0900)
OpenTween.Tests/TabInformationTest.cs
OpenTween/MyCommon.cs
OpenTween/Properties/Resources.Designer.cs
OpenTween/Properties/Resources.en.resx
OpenTween/Properties/Resources.resx
OpenTween/Resources/ChangeLog.txt
OpenTween/StatusDictionary.cs
OpenTween/Tween.cs

index 3b1babc..378646c 100644 (file)
@@ -164,6 +164,52 @@ namespace OpenTween
         }
 
         [Fact]
+        public void IsMuted_MuteTabRulesTest()
+        {
+            this.tabinfo.MuteUserIds = new HashSet<long> { };
+
+            this.tabinfo.AddTab("Mute", MyCommon.TabUsageType.Mute, null);
+            var muteTab = this.tabinfo.Tabs["Mute"];
+            muteTab.AddFilter(new PostFilterRule
+            {
+                FilterName = "foo",
+                MoveMatches = true,
+            });
+
+            var post = new PostClass
+            {
+                UserId = 12345L,
+                ScreenName = "foo",
+                Text = "hogehoge",
+            };
+            Assert.True(this.tabinfo.IsMuted(post));
+        }
+
+        [Fact]
+        public void IsMuted_MuteTabRules_NotInHomeTimelineTest()
+        {
+            this.tabinfo.MuteUserIds = new HashSet<long> { };
+
+            this.tabinfo.AddTab("Mute", MyCommon.TabUsageType.Mute, null);
+            var muteTab = this.tabinfo.Tabs["Mute"];
+            muteTab.AddFilter(new PostFilterRule
+            {
+                FilterName = "foo",
+                MoveMatches = true,
+            });
+
+            // ミュートタブによるミュートは Recent 以外のタブも対象とする
+            var post = new PostClass
+            {
+                UserId = 12345L,
+                ScreenName = "foo",
+                Text = "hogehoge",
+                RelTabName = "Search",
+            };
+            Assert.True(this.tabinfo.IsMuted(post));
+        }
+
+        [Fact]
         public void SetReadAllTab_MarkAsReadTest()
         {
             this.tabinfo.AddTab("search1", MyCommon.TabUsageType.PublicSearch, null);
index df08010..fb4d638 100644 (file)
@@ -160,6 +160,7 @@ namespace OpenTween
             public const string REPLY = "Reply";
             public const string DM = "Direct";
             public const string FAV = "Favorites";
+            public static readonly string MUTE = Properties.Resources.MuteTabName;
 
             //private string dummy;
 
@@ -743,6 +744,7 @@ namespace OpenTween
             Lists = 256,
             Related = 512,
             UserTimeline = 1024,
+            Mute = 2048,
             //RTMyTweet
             //RTByOthers
             //RTByMe
index e8bbf0e..e2c46b4 100644 (file)
@@ -1661,6 +1661,15 @@ namespace OpenTween.Properties {
         }
         
         /// <summary>
+        ///   (ミュート) に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string MuteTabName {
+            get {
+                return ResourceManager.GetString("MuteTabName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   を含むリストの管理 に類似しているローカライズされた文字列を検索します。
         /// </summary>
         internal static string MyLists1 {
index 60f4fd2..27ac734 100644 (file)
@@ -1122,4 +1122,7 @@ Available service: {1}</value>
   <data name="ChangeIconToolStripMenuItem_Confirm" xml:space="preserve">
     <value>Do you really want to change icon?</value>
   </data>
+  <data name="MuteTabName" xml:space="preserve">
+    <value>(Mute)</value>
+  </data>
 </root>
\ No newline at end of file
index 18b66a8..931024d 100644 (file)
   <data name="PlayableOverlayImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\PlayableOverlayImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="MuteTabName" xml:space="preserve">
+    <value>(ミュート)</value>
+  </data>
 </root>
\ No newline at end of file
index 3470c01..bd359ec 100644 (file)
@@ -1,6 +1,8 @@
 更新履歴
 
 ==== Ver 1.2.6-beta1(2015/xx/xx)
+ * NEW: ミュート機能を追加しました
+  - 設定したミュート条件はRecentだけでなく検索やリストなど全てのタブに適用されます
  * NEW: ツイートに含まれる絵文字を画像として表示できるようになりました (thx @takke!)
  * FIX: Mobypicture のサムネイルが表示されなくなっていた不具合を修正
  * FIX: 画像ファイルをD&Dした際のチェック処理が不十分になっていた不具合を修正
index 215d870..f27b2f9 100644 (file)
@@ -1030,6 +1030,9 @@ namespace OpenTween
         {
             lock (LockObj)
             {
+                if (this.IsMuted(Item))
+                    return;
+
                 if (string.IsNullOrEmpty(Item.RelTabName))
                 {
                     if (!Item.IsDm)
@@ -1066,9 +1069,6 @@ namespace OpenTween
                             if (BlockIds.Contains(Item.UserId))
                                 return;
 
-                            if (this.IsMuted(Item))
-                                return;
-
                             _statuses.Add(Item.StatusId, Item);
                         }
                         if (Item.RetweetedId != null)
@@ -1105,6 +1105,12 @@ namespace OpenTween
 
         public bool IsMuted(PostClass post)
         {
+            var muteTab = this.GetTabByType(MyCommon.TabUsageType.Mute);
+            if (muteTab != null && muteTab.AddFiltered(post) == MyCommon.HITRESULT.Move)
+                return true;
+
+            // これ以降は Twitter 標準のミュート機能に準じた判定
+
             // Recent以外のツイートと、リプライはミュート対象外
             // 参照: https://support.twitter.com/articles/20171399-muting-users-on-twitter
             if (!string.IsNullOrEmpty(post.RelTabName) || post.IsReply)
@@ -2088,11 +2094,13 @@ namespace OpenTween
             MyCommon.TabUsageType.Home |
             MyCommon.TabUsageType.Mentions |
             MyCommon.TabUsageType.DirectMessage |
-            MyCommon.TabUsageType.Favorites;
+            MyCommon.TabUsageType.Favorites |
+            MyCommon.TabUsageType.Mute;
 
         const MyCommon.TabUsageType DistributableTabTypeMask =
             MyCommon.TabUsageType.Mentions |
-            MyCommon.TabUsageType.UserDefined;
+            MyCommon.TabUsageType.UserDefined |
+            MyCommon.TabUsageType.Mute;
 
         const MyCommon.TabUsageType InnerStorageTabTypeMask =
             MyCommon.TabUsageType.DirectMessage |
index 9d0a1e7..7d28615 100644 (file)
@@ -1060,8 +1060,25 @@ namespace OpenTween
                     tab.TabType = MyCommon.TabUsageType.Favorites;
                 }
             }
+            if (_statuses.GetTabByType(MyCommon.TabUsageType.Mute) == null)
+            {
+                TabClass tab;
+                if (!_statuses.Tabs.TryGetValue(MyCommon.DEFAULTTAB.MUTE, out tab))
+                {
+                    _statuses.AddTab(MyCommon.DEFAULTTAB.MUTE, MyCommon.TabUsageType.Mute, null);
+                }
+                else
+                {
+                    tab.TabType = MyCommon.TabUsageType.Mute;
+                }
+            }
+
             foreach (var tab in _statuses.Tabs.Values)
             {
+                // ミュートタブは表示しない
+                if (tab.TabType == MyCommon.TabUsageType.Mute)
+                    continue;
+
                 if (tab.TabType == MyCommon.TabUsageType.Undefined)
                 {
                     tab.TabType = MyCommon.TabUsageType.UserDefined;
@@ -8078,6 +8095,7 @@ namespace OpenTween
             {
                 if (_statuses.Tabs[ListTab.TabPages[i].Text].TabType != MyCommon.TabUsageType.Related) tabSetting.Tabs.Add(_statuses.Tabs[ListTab.TabPages[i].Text]);
             }
+            tabSetting.Tabs.Add(this._statuses.GetTabByType(MyCommon.TabUsageType.Mute));
             tabSetting.Save();
         }