From 0502b376dff09638018913c4b226c7b918749f4d Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Sat, 19 Oct 2013 21:33:17 +0900 Subject: [PATCH] =?utf8?q?=E6=8C=AF=E3=82=8A=E5=88=86=E3=81=91=E6=9D=A1?= =?utf8?q?=E4=BB=B6=E3=81=AEFilterBody=20(UseNameField=3Dfalse)=E3=81=8CRe?= =?utf8?q?tweetedBy=E3=81=AB=E5=90=AB=E3=81=BE=E3=82=8C=E3=82=8B=E3=82=B9?= =?utf8?q?=E3=82=AF=E3=83=AA=E3=83=BC=E3=83=B3=E5=90=8D=E3=81=AB=E3=83=9E?= =?utf8?q?=E3=83=83=E3=83=81=E3=81=97=E3=81=AA=E3=81=84=E3=83=90=E3=82=B0?= =?utf8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=20(thx=20@Shoichi=5FKublai!)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- OpenTween.Tests/PostFilterRuleTest.cs | 28 +++++++++++++++++++++++++++ OpenTween/PostFilterRule.cs | 36 ++++++++++++++++++++++------------- OpenTween/Resources/ChangeLog.txt | 1 + 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/OpenTween.Tests/PostFilterRuleTest.cs b/OpenTween.Tests/PostFilterRuleTest.cs index ea211d4d..62d41a96 100644 --- a/OpenTween.Tests/PostFilterRuleTest.cs +++ b/OpenTween.Tests/PostFilterRuleTest.cs @@ -337,6 +337,14 @@ namespace OpenTween post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + // RetweetedBy に FilterBody の文字列が全て含まれている + post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "aaabbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + + // RetweetedBy が null でなくても依然として ScreenName にはマッチする + post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test", RetweetedBy = "hoge" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + // FilterBody と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); @@ -353,6 +361,9 @@ namespace OpenTween post = new PostClass { ScreenName = "AaaBbb", TextFromApi = "test" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None)); + post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "AaaBbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None)); + // 大小文字を区別しない if (!exclude) filter.CaseSensitive = false; @@ -364,6 +375,9 @@ namespace OpenTween post = new PostClass { ScreenName = "AaaBbb", TextFromApi = "test" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + + post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "AaaBbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); } [TestCase(false, new[] { "aaa", "bbb" }, false)] @@ -417,6 +431,14 @@ namespace OpenTween post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + // RetweetedBy に FilterBody の文字列が全て含まれている + post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "aaabbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + + // RetweetedBy が null でなくても依然として ScreenName にはマッチする + post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge", RetweetedBy = "hoge" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + // FilterBody と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); @@ -433,6 +455,9 @@ namespace OpenTween post = new PostClass { ScreenName = "AaaBbb", Text = "t.co/hoge" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None)); + post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "AaaBbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None)); + // 大小文字を区別しない if (!exclude) filter.CaseSensitive = false; @@ -444,6 +469,9 @@ namespace OpenTween post = new PostClass { ScreenName = "AaaBbb", Text = "t.co/hoge" }; Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); + + post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "AaaBbb" }; + Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark)); } [TestCase(false, "hogehoge", false)] diff --git a/OpenTween/PostFilterRule.cs b/OpenTween/PostFilterRule.cs index a5bc6915..ce115383 100644 --- a/OpenTween/PostFilterRule.cs +++ b/OpenTween/PostFilterRule.cs @@ -427,12 +427,23 @@ namespace OpenTween else bodyExpr = this.MakeGenericFilter(postParam, "TextFromApi", body, useRegex, caseSensitive); + // useNameField = false の場合は ScreenName と RetweetedBy も filterBody のマッチ対象となる if (!useNameField) { - // useNameField = false の場合は ScreenName も filterBody のマッチ対象となる bodyExpr = Expression.OrElse( bodyExpr, this.MakeGenericFilter(postParam, "ScreenName", body, useRegex, caseSensitive)); + + // bodyExpr || x.RetweetedBy != null && + bodyExpr = Expression.OrElse( + bodyExpr, + Expression.AndAlso( + Expression.NotEqual( + Expression.Property( + postParam, + typeof(PostClass).GetProperty("RetweetedBy")), + Expression.Constant(null)), + this.MakeGenericFilter(postParam, "RetweetedBy", body, useRegex, caseSensitive))); } } @@ -476,17 +487,20 @@ namespace OpenTween ParameterExpression postParam, string targetFieldName, string pattern, bool useRegex, bool caseSensitive, bool exactMatch = false) { + // x. + var targetField = Expression.Property( + postParam, + typeof(PostClass).GetProperty(targetFieldName)); + if (useRegex) { var regex = new Regex(pattern, caseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase); - // regex.IsMatch(x.) + // regex.IsMatch(targetField) return Expression.Call( Expression.Constant(regex), typeof(Regex).GetMethod("IsMatch", new[] { typeof(string) }), - Expression.Property( - postParam, - typeof(PostClass).GetProperty(targetFieldName))); + targetField); } else { @@ -495,25 +509,21 @@ namespace OpenTween if (exactMatch) { // 完全一致 - // pattern.Equals(x., compOpt) + // pattern.Equals(targetField, compOpt) return Expression.Call( Expression.Constant(pattern), typeof(string).GetMethod("Equals", new[] { typeof(string), typeof(StringComparison) }), - Expression.Property( - postParam, - typeof(PostClass).GetProperty(targetFieldName)), + targetField, Expression.Constant(compOpt)); } else { // 部分一致 - // x..IndexOf(pattern, compOpt) != -1 + // targetField.IndexOf(pattern, compOpt) != -1 return Expression.NotEqual( Expression.Call( - Expression.Property( - postParam, - typeof(PostClass).GetProperty(targetFieldName)), + targetField, typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) }), Expression.Constant(pattern), Expression.Constant(compOpt)), diff --git a/OpenTween/Resources/ChangeLog.txt b/OpenTween/Resources/ChangeLog.txt index f5158839..8b5e6ee6 100644 --- a/OpenTween/Resources/ChangeLog.txt +++ b/OpenTween/Resources/ChangeLog.txt @@ -3,6 +3,7 @@ ==== Ver 1.1.4-beta1(2013/xx/xx) * FIX: 取得したプロフィール画像が壊れていた場合にOpenTweenが異常終了してしまう問題の修正 (thx @5px, @selvaggio!) * FIX: 取得した画像が壊れていた場合にメモリリークを起こす可能性のある箇所の修正 (thx @5px!) + * FIX: タブ振り分けルールの「単一条件」が公式RTした人のスクリーン名に対してヒットしない問題の修正 (thx @Shoichi_Kublai!) ==== Ver 1.1.3(2013/10/11) * タブ振り分けルールの挙動が若干変わりました -- 2.11.0