public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { return args.Drop = Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)); } return false; }
public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { return(args.Drop = Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern))); } return(false); }
public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern))) { if (IsRemoveContent || !String.IsNullOrEmpty(_replacePattern)) { args.Content = Regex.Replace(args.Content, _matchPattern, (_replacePattern ?? String.Empty), RegexOptions.IgnoreCase); } args.IRCMessageType = _messageType; return(true); } } return(false); }
/// <summary> /// メッセージをフィルタします /// </summary> /// <param name="args"></param> /// <returns>メッセージを捨てるかどうか</returns> public Boolean ExecuteFilters(FilterArgs args) { TraceLogger.Filter.Information(String.Format("Filter: User: {0} / Message: {1}", args.User.ScreenName, args.Content.Replace('\n', ' '))); Trace.Indent(); try { foreach (FilterItem item in _items) { if (!item.Enabled) { continue; } Trace.Indent(); try { Boolean executed = item.Execute(args); if (args.Drop) { TraceLogger.Filter.Information(String.Format("=> Drop", item.GetType().Name, args.User.ScreenName, args.Content.Replace('\n', ' '))); return(false); } else if (executed) { TraceLogger.Filter.Information(String.Format("=> Execute Result: Filter: {0} / User: {1} / Message: {2}", item.GetType().Name, args.User.ScreenName, args.Content.Replace('\n', ' '))); } } finally { Trace.Unindent(); } } } finally { Trace.Unindent(); } return(true); }
public override Boolean Execute(FilterArgs args) { if (String.IsNullOrEmpty(_channelName)) { return(false); } if (!String.IsNullOrEmpty(_matchPattern)) { Boolean rerouteRequired = Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)); if (!rerouteRequired) { return(false); } IRCMessage msg; switch (args.IRCMessageType.ToUpperInvariant()) { case "NOTICE": msg = new NoticeMessage(_channelName, args.Content); break; case "PRIVMSG": default: msg = new PrivMsgMessage(_channelName, args.Content); break; } msg.SenderNick = args.User.ScreenName; msg.SenderHost = "twitter@" + Server.ServerName; args.Session.Send(msg); if (!_duplicate) { args.Drop = true; } return(true); } return(false); }
public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern))) { if (IsRemoveContent || !String.IsNullOrEmpty(_replacePattern)) { args.Content = Regex.Replace(args.Content, _matchPattern, (_replacePattern ?? String.Empty), RegexOptions.IgnoreCase); } args.IRCMessageType = _messageType; return true; } } return false; }
public override Boolean Execute(FilterArgs args) { if (String.IsNullOrEmpty(_channelName)) return false; if (!String.IsNullOrEmpty(_matchPattern)) { Boolean rerouteRequired = Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)); if (!rerouteRequired) return false; IRCMessage msg; switch (args.IRCMessageType.ToUpperInvariant()) { case "NOTICE": msg = new NoticeMessage(_channelName, args.Content); break; case "PRIVMSG": default: msg = new PrivMsgMessage(_channelName, args.Content); break; } msg.SenderNick = args.User.ScreenName; msg.SenderHost = "twitter@" + Server.ServerName; args.Session.Send(msg); if (!_duplicate) args.Drop = true; return true; } return false; }
public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern))) { Encoding encIn = (InputEncoding == null) ? Encoding.Default :(String.Compare(InputEncoding, "UTF-8", true) == 0) ? new UTF8Encoding(false) : Encoding.GetEncoding(InputEncoding); Encoding encOut = (OutputEncoding == null) ? Encoding.Default : (String.Compare(OutputEncoding, "UTF-8", true) == 0) ? new UTF8Encoding(false) : Encoding.GetEncoding(OutputEncoding); TraceLogger.Filter.Information(String.Format("Start: {0} ({1})", ProcessPath, Arguments)); ProcessStartInfo psInfo = new ProcessStartInfo(ProcessPath, Arguments); psInfo.RedirectStandardInput = true; psInfo.RedirectStandardOutput = true; psInfo.StandardOutputEncoding = encIn; // Process -> TIG のエンコーディング psInfo.UseShellExecute = false; psInfo.WindowStyle = ProcessWindowStyle.Hidden; psInfo.CreateNoWindow = true; Dictionary<String, String> headers = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); String content; using (System.Diagnostics.Process process = System.Diagnostics.Process.Start(psInfo)) using (StreamWriter sw = new StreamWriter(process.StandardInput.BaseStream, encOut)) { sw.WriteLine("Url: http://twitter.com/{0}/statuses/{1}", args.Status.User.ScreenName, args.Status.Id); WriteFieldsAndProperties(sw, "User", args.User); WriteFieldsAndProperties(sw, "Status", args.Status); sw.WriteLine("Filter-Drop: {0}", args.Drop); sw.WriteLine("Filter-IRCMessageType: {0}", args.IRCMessageType); sw.WriteLine(); if (XmlMode) Status.Serializer.Serialize(sw, args.Status); else sw.WriteLine(args.Content); sw.Close(); String output = process.StandardOutput.ReadToEnd(); if (String.IsNullOrEmpty(output)) return false; String[] parts = output.Split(new string[] {"\n\n"}, 2, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 1) { content = parts[0].Trim(); } else { if (parts.Length == 0) { TraceLogger.Filter.Information("Filter was recieved invalid data"); return false; } foreach (var line in parts[0].Split('\n')) { String[] headerParts = line.Split(new char[] {':'}, 2); if (headerParts.Length != 2) continue; headers[headerParts[0].Trim()] = headerParts[1].Trim(); } content = parts[1].Trim(); } if (process.WaitForExit(60*1000)) { TraceLogger.Filter.Information("Process Exited: " + process.ExitCode.ToString()); // 終了コード見る if (process.ExitCode == 0) { // 書き換え Boolean drop = args.Drop; if (headers.ContainsKey("Filter-Drop")) Boolean.TryParse(headers["Filter-Drop"], out drop); if (headers.ContainsKey("Filter-IRCMessageType")) args.IRCMessageType = headers["Filter-IRCMessageType"]; args.Content = content; } else { // 何もしない return false; } } } args.IRCMessageType = _messageType; return true; } } return false; }
/// <summary> /// メッセージをフィルタします /// </summary> /// <param name="args"></param> /// <returns>メッセージを捨てるかどうか</returns> public Boolean ExecuteFilters(FilterArgs args) { TraceLogger.Filter.Information(String.Format("Filter: User: {0} / Message: {1}",args.User.ScreenName, args.Content.Replace('\n', ' '))); Trace.Indent(); try { foreach (FilterItem item in _items) { if (!item.Enabled) continue; Trace.Indent(); try { Boolean executed = item.Execute(args); if (args.Drop) { TraceLogger.Filter.Information(String.Format("=> Drop", item.GetType().Name, args.User.ScreenName, args.Content.Replace('\n', ' '))); return false; } else if (executed) { TraceLogger.Filter.Information(String.Format("=> Execute Result: Filter: {0} / User: {1} / Message: {2}", item.GetType().Name, args.User.ScreenName, args.Content.Replace('\n', ' '))); } } finally { Trace.Unindent(); } } } finally { Trace.Unindent(); } return true; }
public abstract Boolean Execute(FilterArgs args);
public override Boolean Execute(FilterArgs args) { if (!String.IsNullOrEmpty(_matchPattern)) { if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) && ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern))) { Encoding encIn = (InputEncoding == null) ? Encoding.Default :(String.Compare(InputEncoding, "UTF-8", true) == 0) ? new UTF8Encoding(false) : Encoding.GetEncoding(InputEncoding); Encoding encOut = (OutputEncoding == null) ? Encoding.Default : (String.Compare(OutputEncoding, "UTF-8", true) == 0) ? new UTF8Encoding(false) : Encoding.GetEncoding(OutputEncoding); TraceLogger.Filter.Information(String.Format("Start: {0} ({1})", ProcessPath, Arguments)); ProcessStartInfo psInfo = new ProcessStartInfo(ProcessPath, Arguments); psInfo.RedirectStandardInput = true; psInfo.RedirectStandardOutput = true; psInfo.StandardOutputEncoding = encIn; // Process -> TIG のエンコーディング psInfo.UseShellExecute = false; psInfo.WindowStyle = ProcessWindowStyle.Hidden; psInfo.CreateNoWindow = true; Dictionary <String, String> headers = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); String content; using (System.Diagnostics.Process process = System.Diagnostics.Process.Start(psInfo)) using (StreamWriter sw = new StreamWriter(process.StandardInput.BaseStream, encOut)) { sw.WriteLine("Url: http://twitter.com/{0}/statuses/{1}", args.Status.User.ScreenName, args.Status.Id); WriteFieldsAndProperties(sw, "User", args.User); WriteFieldsAndProperties(sw, "Status", args.Status); sw.WriteLine("Filter-Drop: {0}", args.Drop); sw.WriteLine("Filter-IRCMessageType: {0}", args.IRCMessageType); sw.WriteLine(); if (XmlMode) { Status.Serializer.Serialize(sw, args.Status); } else { sw.WriteLine(args.Content); } sw.Close(); String output = process.StandardOutput.ReadToEnd(); if (String.IsNullOrEmpty(output)) { return(false); } String[] parts = output.Split(new string[] { "\n\n" }, 2, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 1) { content = parts[0].Trim(); } else { if (parts.Length == 0) { TraceLogger.Filter.Information("Filter was recieved invalid data"); return(false); } foreach (var line in parts[0].Split('\n')) { String[] headerParts = line.Split(new char[] { ':' }, 2); if (headerParts.Length != 2) { continue; } headers[headerParts[0].Trim()] = headerParts[1].Trim(); } content = parts[1].Trim(); } if (process.WaitForExit(60 * 1000)) { TraceLogger.Filter.Information("Process Exited: " + process.ExitCode.ToString()); // 終了コード見る if (process.ExitCode == 0) { // 書き換え Boolean drop = args.Drop; if (headers.ContainsKey("Filter-Drop")) { Boolean.TryParse(headers["Filter-Drop"], out drop); } if (headers.ContainsKey("Filter-IRCMessageType")) { args.IRCMessageType = headers["Filter-IRCMessageType"]; } args.Content = content; } else { // 何もしない return(false); } } } args.IRCMessageType = _messageType; return(true); } } return(false); }